Twitter Streaming APIでTweetの流れを眺める

Tweet全体をstatuses/sampleで眺めても、興味の無い話題ばかりなので、statuses/filterで単語を指定してTweetを絞り込んで眺める。

いかにも非同期なのでTwistedでする(9.0.0リリース記念(嘘))。

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

from twisted.internet import reactor
from twisted.web import client  # HTTPPageDownloader, HTTPClientFactory
import base64  # for Basic authorization
import urllib
import simplejson
import sys

class StreamLineProtocol(client.HTTPPageDownloader):
    """
    Protocol class
    lineReceived()で、受信したJSONデータを行毎に解析、表示
    """
    def connectionLost(self, reason):
        print("connection failed: " + reason.getErrorMessage())
        reactor.stop()
    def lineReceived(self, line):
        if line.strip() is not "":
            # print(line)
            try:
                elems = simplejson.loads(line)
                print "%s :: %s\n  %s" %\
                    (elems['user']['screen_name'], elems['created_at'], elems['text'])
            except ValueError:
                pass

class StreamClientFactory(client.HTTPClientFactory):
    """
    Factory class
    protocolの登録のみ
    """
    protocol = StreamLineProtocol

if __name__ == "__main__":
    # Twitter Streaming APIを利用するためには Twitter ID/PW が必要
    user = 'YOUR_TWITTER_ID'
    password = 'YOUR_PASSWORD'
    # filterのための単語をコマンドラインで指定(この単語が含まれるtweetのみstreamされる)
    # 単語を複数指定する場合はコンマ区切り ex:perl,python,ruby
    trackword = sys.argv[1]
    # Twitter Streaming API filter用URL
    url = "http://stream.twitter.com/1/statuses/filter.json"
    # Basic認証のためにトークンを作る(後でHTTPリクエストヘッダに加える)
    auth_header = "Basic " + base64.encodestring("%s:%s"%(user,password)).strip()
    postdata = urllib.urlencode({
        'track':trackword
        })
    # 何故かPOSTデータを上手く渡せなかったので、method="POST"にしてURLにGETのようにデータ付け加えた
    # 何か勘違いしているかもしれない
    scf = StreamClientFactory(url + "?%s" % postdata, method="POST",
                              headers={"Authorization":auth_header}, postdata=postdata)
    scheme, host, port, path = client._parse(url)
    reactor.connectTCP(host, port, scf)
    reactor.run()
$ python tw_streamingfilter.py python  # pythonという単語が含まれるTweetが流れる

Twitter全体で見ても、Pythonの話題って意外に少ないのね。