tweepyがUser Streamsに対応していた

ふとgithubのtweepyのコード(tweepy/tweepy/streaming.py at master · tweepy/tweepy · GitHub)を眺めてたら、userstreamなんてメソッドがあることに気づきました。つい数ヶ月前くらいまで「tweepyはUser Streamに対応してなかったので自力で対応した」なんて記事を幾つか見かけたので、てっきり未だに対応してないのかと思ってました。

PyPIにあるtweepyもこのgithubのtweepyもバージョンは1.7.1なんだけど、PyPIから落としてきたtweepy/streaming.pyにはuserstreamというメソッドはありません。

さっそく使ってみたけど…

動かない。ていうかコード見る限りsecureオプションの判定が抜けてる気が。httpsじゃなくてhttpになってるんじゃないかなーと思ってたら、どうやらやはりmasterのuserstreamは壊れてるみたいです。

tweepy userstream was broken, so i fixed it
https://github.com/tweepy/tweepy/pull/112

というわけでこの人がfixしたものを使います。

$ git clone git://github.com/nickhudkins/tweepy.git
$ cd tweepy
$ python setup.py install

gitコマンドがない場合はgithubから直接zipなりダウンロード/解凍すればいいんですけど、git便利なので入れといたほうがいいですよ。

ホームタイムラインをぼーっと眺めるだけのコード

abstractedly.py

#!/usr/bin/env python
#-*- coding:utf-8 -*-

from tweepy.streaming import StreamListener, Stream
from tweepy.auth import OAuthHandler
from tweepy.api import API
from datetime import timedelta

def get_oauth():
    # 以下4つのキー等は適宜取得して置き換えてください。
    consumer_key = 'XXXXXXXXXXXXXXXXXXXXXX'
    consumer_secret = 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'
    access_key = 'xxxxxxx-XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'
    access_secret = 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'
    auth = OAuthHandler(consumer_key, consumer_secret)
    auth.set_access_token(access_key, access_secret)
    return auth

class AbstractedlyListener(StreamListener):
    """ Let's stare abstractedly at the User Streams ! """
    def on_status(self, status):
        # Ubuntuの時は気づかなかったんだけど、Windowsで動作確認してたら
        # created_atがUTC(世界標準時)で返ってきてた。
        # なので日本時間にするために9時間プラスする。
        status.created_at += timedelta(hours=9)
        # format() が使えるのは Python 2.6 以上
        print(u"{text}".format(text=status.text))
        print(u"{name}({screen}) {created} via {src}\n".format(
            name=status.author.name, screen=status.author.screen_name,
            created=status.created_at, src=status.source))
        # Python 2.5 以下はこっち
        #print u"%s" % status.text
        #print u"%s(%s) %s via %s\n" % (status.author.name,
        #        status.author.screen_name,
        #        status.created_at, status.source)

if __name__ == '__main__':
    auth = get_oauth()
    stream = Stream(auth, AbstractedlyListener(), secure=True)
    stream.userstream()

保存して実行。

$ python abstractedly.py

終了させるときはCtrl+cで止めてください。(Ubuntuと違ってWindowsではなかなか止まらないので、止まるまで長押しで)

tweepy使うといろいろ簡単に出来ていいですね。