Tweepyを触ってみる ~pythonでTwitter APIをいじる~

何となくPythonTwitterを触ってみたいなぁと思って調べてみました。
PythonからTwitterAPIをいじるモジュールとして,

というのが一般的な様です.
Tweepyが簡単そうだったので, とりあえず使ってみましたので簡単にご紹介します.

とりあえず,

"中野"を含むツイートを何件かとってくる

みたいな簡単なものを作ってみましょう.
順を追って説明していきます.
GitHubソースコードはおいてあります.

tweepyのインストール

簡単です. pip使っていれればOKです.

pip install tweepy

これでもうtweepy使えます.

Consumer key等の取得

TwitterAPIをいじるためには登録が必要です.
といっても, Twitterアカウント持ってればすぐに出来ます.
例えばHELLO APIを参考にして,

  • Consumer key
  • Consumer secret
  • Access token
  • Access token secret

を取得します.
この後アプリケーションで使うので, 保存しましょう.
私はkeys.pyというファイルにディクショナリ形式で持っておきました.

KEYS = {
        'consumer_key':'********',
        'consumer_secret':'*********',
        'access_token':'*********',
        'access_secret':'*********',
        }

OAuth認証

tweepyはOAuth認証のインタフェースも整備されているので,
簡単に認証が出来ます.
以下の様にConsumer key等を指定してOAuthHandlerのインスタンスを生成します.

def authorize(consumer_key, consumer_secret, access_token, access_secret):
    """ Authorize using OAuth.
    """
    auth = tweepy.OAuthHandler(consumer_key, consumer_secret)
    auth.set_access_token(access_token, access_secret)
    return auth

REST APIを使ってみる

REST APIを使用する場合は, tweepyのAPIクラスを使用します. TwitterREST APIについてはこちら.
ここでは, 100件の"中野"を含むツイートをとってきて,

をコンソールに表示してみます.

def search_rest(api, keyword, search_count=100):
    search_result = api.search(keyword, count=search_count)
    for i, twt in enumerate(search_result):
        print '---%3d---' % (i + 1)
        print twt.created_at
        print twt.user.name
        print twt.text + '\n'

--- 1---
2014-01-13 04:03:45
AAA
I'm at @Bar_Zingaro (バー・ジンガロ) (中野区, 東京都) http://t.co/Pc1w83hRE8
・・・
---100---
2014-01-13 03:55:59

RT @chicago0812: 成人式となると中野か杉並の成人式に呼ばれた談志家元が開口一番「よーし!今日はテメェらに覚醒剤の打ち方から教えてやる!」とやって翌日の新聞で大問題になったことを思い出す…。

と, こんな感じで表示されます. (過激なのが出てきましたね...)
REST APIの検索だと, 最大数が100と決まっているので, search関数の引数count
大きい数字を与えても, 100より大きくはならないので注意が必要です.
また, search関数の引数によって指定した日付までに投稿されたツイートを
とってくるという様なことも出来ます.

後々, この辺についてもまとめたいと思います.

Streaming APIを使ってみる

TwitterではStreaming APIが用意されています.
ドキュメントはこちら.
Streaming APIを使えば流れているTweetをリアルタイムで取得できます.
Streaming APIでは,

  • User Streams
  • Public Streams
  • Site Streams

という3種類のStreamを取得できます. 今回は"中野"を含むツイートを検索するということなので,
Public Streamsを扱うことになります.
更にいえば, 絞り込むを行うためのfilterを使用することになります.

Tweepyでは, それに対応したfilter関数を使用します.
引数で色々指定できますが, "中野"を含むツイートを探すだけなので,
引数はtrackのみを指定します.

Streamingを使用するときは, インスタンス化のときに指定した
リスナーのコールバック関数が呼ばれるので, 以下のようなコードになります.
この例では, 10件のデータを取得できたらシステムを終了するようにしています.

class MyStreamListener(tweepy.StreamListener):
    def __init__(self):
        self.count = 0
    
    def on_data(self, data):
        self.count += 1
        new_line = unicode(data, 'unicode_escape').encode('utf-8')
        new_line = new_line.replace('\\', '')
        print self.count, new_line
        if self.count == 10:
            sys.exit(0)
        return True
        
def search_stream(auth, keyword):
    stream = tweepy.Stream(auth, MyStreamListener())
    stream.filter(track=[keyword])

ひとつ注意が必要なのは, StreamingはTwitterイマを取得するものなので,
過去ツイートの検索は出来ません.
"中野"をキーワードに指定すると, 実は, なかなか更新されなかったりします...

on_data()で取得できるdataは, JSON形式の文字列となります.
また, 日本語は'\u3042'などのコードでかえってくるので,
UTF-8エンコードしてあげるなどの一手間が必要になります.

おわりに

さらっとでしたが, Tweepyの紹介でした.
Tweepy面白いので, もう少し詳細に調べて遊んでみようと重います.
そして, とってきたJSONデータをpandasに突っ込んで遊んでみる
みたいなこともやってみようと思います.

では!!