PyCurl&TornadoでTwitter Stream APIを使う
TornadoからWebSocket経由でTwitter Stream APIを使いたいんだけどPyCurlでエラーとなってなかなかうまくいかない。
ちょっと気分を変えてPyCurlで動かしてみました。なんでPyCurlかっていうとTornadoは内部で使ってるからです。*1
実際にたたいてみる
Googleで検索してみたところ↓の記事を見つけました。
Tutorial: consuming Twitter's real-time stream API in Python
ほぼこのままで動きました。以下のコードはPitを使うようにした以外は↑のページの写経です。
import pycurl,json from pit import Pit STREAM_URL = "http://chirpstream.twitter.com/2b/user.json" def on_receive(data): print data config = Pit.get('twitter.com') user = config['username'] passwd = config['password'] conn = pycurl.Curl() conn.setopt(pycurl.USERPWD, "%s:%s" % (user, passwd)) conn.setopt(pycurl.URL, STREAM_URL) conn.setopt(pycurl.WRITEFUNCTION, on_receive) conn.perform()
Tornadoの場合
TornadoとChirpUserStreamsでTweetの流れを眺める - DiaryExceptionを参考に。
↓のコードは↑のサイトのコードをシンプルにしてPitを使って見た版。
import tornado.httpclient from pit import Pit config = Pit.get('twitter.com') user = config['username'] passwd = config['password'] url = "http://chirpstream.twitter.com/2b/user.json" def callback(line): print line if __name__ == "__main__": http_client = tornado.httpclient.HTTPClient() try: request = tornado.httpclient.HTTPRequest(url, streaming_callback=callback, auth_username=user, auth_password=passwd, connect_timeout=0, request_timeout=0) http_client.fetch(request) except tornado.httpclient.HTTPError, e: print "Error:", e
ついでにtornado.httpclientでstreaming_callbackに関数を設定すると下の設定をするとTornado内部では以下の用に設定します。
conn.setopt(pycurl.WRITEFUNCTION, on_receive)
まとめ
PyCurlでstream APIを使ってデータを扱うのは簡単にできることがわかりました。
うまく扱えばDB,ファイルへの保存がすぐに出来そうです。
先人達に感謝。
参考
↓これをやってみたいのですがなかなかうまくいきません>
PyCurlの使い方
Pitの使い方
*1:でもあんまりPyCurlの情報ってないものですね