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が流れる