未来は僕以外の手の中

SI屋がIT技術やビジネスのことなどを気ままに書き綴ってみるなど

pythonでTwitter botを作ってみる


追記(2010/11/01):

twitterではBasic認証が廃止されてしまったので、以下の方法ではAPIが使えななっています。いずれOAuth認証ネタでも書きたいところですなぁ。。。


とあるネタでTwitter botを作る事になった。
pythonで作ったので、その時のメモなど。

目標ボット

 ・フォロワーが新規発言をすると、一定確率でコメントを返す。

導入準備

他言語に比べると情報は少ないものの、一応pythonでの情報も出回っているのでそれを参考に。

 python-twitterまとめ 〜導入まで


python-twitterなる便利なモジュールがあるのでそれを利用する。

実行テスト

上記サイトを参考につぶやきテスト(というか丸移し)

import twitter
api = twitter.Api("ユーザ名", "パスワード")
status = api.PostUpdate("Hello, python-twitter!!")

# 日本語投稿の場合はUnicodeにする
status = api.PostUpdate("python-twitterでの書き込み!")

これだけで書き込み完了。こりゃ便利だ!

bot実装

とりあえずドキュメント見ながら色々と試していく。

どうやら以下の4つのクラスが存在するらしい。

クラス内容
ApiTLやフォロワーなどの各種情報を取得したり、tweetを送信したりする
DirectMessageダイレクトメッセージの情報を管理
Statusつぶやき(tweet)の情報を管理
Userユーザの情報を管理


とりあえず
 1.(botの)フォロワーのユーザ情報を抽出
 2.各ユーザの最新tweetを取得
という流れでやってみる。

import twitter
api = twitter.Api("ユーザ名", "パスワード")

users = api.GetFollowers() # フォロワーのUser情報を取得
for u in users:
    print u.name, u.screen_name

    s = u.status # UserのStatusを取得
    if s:
        print s.id, s.text


結果の一例はこちら↓

Naoya_S billest001
4702798105 腹減ったなぁ

何もつぶやいていないユーザの場合u.status=Noneとなる。


また非公開ユーザの場合、こちらが許可されていないのに
ユーザのtweet情報を取得(u.status)しようとするとエラーが発生する。
(取得するには、botがそのユーザをフォローして許可されておく必要がある。)


tweetにはIDがついてるので、各ユーザごとに最新tweetIDを
辞書(ハッシュ)で格納しておけば最新情報を保持できそう。


そんなこんなでおおざっぱに実装するとこんな感じ↓

from random import randint
from collections import defaultdict
from time import *
from twitter import *

api = Api(username='ユーザ名', password='パスワード') # ログイン

# フォロワーの最新tweetの取得および投稿
def get_and_tweet(tweet_list):
    users = api.GetFollowers() # フォロワーのUser情報を取得
    for u in users:
        s = u.status
        if not s:
            continue
        
        # 一応リネーム
        user_name = u.screen_name
        tweet_id = s.id

        if tweet_id > tweet_list[user_name]:
            # 新tweet情報の保存
            tweet_list[user_name] = tweet_id 

            # 10%の確率でbotコメント発動
            if randint(1, 100) <= 10:
                sentence = u"@%s 誰に許可取って発言してんの?" % user_name
                status = api.PostUpdate(sentence) # Post

def main():
    # 各々の最新tweetID格納
    tweet_list = defaultdict(int)

    # 60秒おきにTL巡回、最新tweetを補足
    while(1):
        try:
            get_and_tweet(tweet_list)
        except urllib2.URLError:
            print u"エラーが発生したナリ。"
        
        sleep(60) # 1分間70リクエスト規制に注意

if __name__ == '__main__':
    main()

twitterAPI規制についてはこちらなどを参照。


実際に作ったのはもうちょい色々とやってるけど、基本はこんな感じ。
twitterAPIのおかげでだいぶ簡単にbotを作る事ができる。


今回は非公開内輪ネタbotなのでここでは紹介しませんが、
いずれもうちょっと有益な一般公開botなどを作ってみたいところ。

...アイデアないけど\^o^/