Keep on moving

あんまりまとまってないことを書きますよ

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の情報ってないものですね