python-oauth2でTwitterのStreaming APIに接続
3ヶ月ぶりの更新.
この間何もしなかったわけじゃなくて主に修論関係で
とか色々やってたんだけどアウトプットめんどくさいっすね…修論終わったら(自分のためにも)書きます.
で,今回はそれらとは全く関係なくTwitterのStreaming APIにPythonのoauth2ライブラリを使って接続する話です.
Twitter API × Pythonに関しては既にpython-twitterとかtweepyみたいな便利なライブラリあるんでそっち使えよって話ですが,まあちょっとした勉強になるし.あとTwitterの野郎がたまに予告なしでAPIの仕様変更するせいでライブラリの更新が間に合わなかったりすることがあるので,低レベルでAPI触れるようになっといて損はないですよー,と
ググッてみるとbasic認証で接続した例はちょくちょく見つかるんですが,oauth認証使ってる例がほとんどないです.REST APIのbasic認証が去年廃止になったように,Streamingの方もいずれ廃止になると予告されてるのでこれはイカンですね.
単にPublic Timeline流すだけだとつまらないので,読書メーター,ブクログ,メディアマーカーの3大(?)読書管理サービスにTwitter連携機能があるのを利用してこれらのサービス経由のツイートを抽出します.
これによって読書データをTwitterアカウントと紐付けて取得できるので,ソーシャルレコメンドサービス作ったりできるんじゃないかなー,と.
# -*- coding: utf-8 -*- import json import urllib2 import oauth2 as oauth def streaming(): consumer = oauth.Consumer(key=CONSUMER_KEY, secret=CONSUMER_SECRET) token = oauth.Token(key=ACCESS_TOKEN_KEY, secret=ACCESS_TOKEN_SECRET) # エンドポイントURL url = 'https://stream.twitter.com/1/statuses/filter.json' # 検索条件.カンマ区切りはORでスペース区切りはAND params = {'track': 'bookmeter,booklog,mediamarker'} request = oauth.Request.from_consumer_and_token(consumer, token, http_url=url, parameters=params) request.sign_request(oauth.SignatureMethod_HMAC_SHA1(), consumer, token) res = urllib2.urlopen(request.to_url()) for r in res: data = json.loads(r) print data['user']['id'], data['user']['screen_name'], data['text'] print if __name__ == '__main__': streaming()
consumerとtokenを元にリクエストオブジェクトを作成→HMAC_SHA1で暗号化→urlopenでレスポンス取得
の流れですね.へっぽこプログラマの冬見さんにはよくわからないのですが,レスポンスをループにかけるとデータ吐き続けてくれます.ジェネレータとかいうやつでしたっけ違ってたらすいません.
実行するとこんな感じのがぬるぬる流れてきます(00000000, ********にはそれぞれTwitterのidとscreen_nameが表示されますがプライバシーのために伏せてあります).
00000000 ******** RT @********: 【生徒会探偵キリカ1 (講談社ラノベ文庫)/杉井光】徹頭徹尾、いつもの杉井光作品だった。そして面白さは杉井作品でも上位なんじゃないかと思った。 →http://t.co/5D5X2R7f #bookmeter 00000000 ******** 【20歳のときに知っておきたかったこと スタンフォード大学集中講義/ティナ・シーリグ】を読んだ本に追加 →http://t.co/lHUYIZoR #bookmeter 00000000 ******** 【ソードアート・オンライン〈7〉マザーズ・ロザリオ (電撃文庫)/川原 礫】を読んだ本に追加 →http://t.co/15IkAE90 #bookmeter 00000000 ******** 【死ぬ気まんまん/佐野洋子】佐野家の家訓「命と金は惜しむな」は今後実行したい。お医者さんとの対談は蛇足だと思う。 →http://t.co/qeMPC92X #bookmeter 00000000 ******** 【本棚登録】『カッシアの物語』アリー・コンディ http://t.co/BHRScRrp 00000000 ******** 【本棚登録】『ジョナサンと宇宙クジラ (ハヤカワ文庫SF)』ロバート・フランクリン ヤング http://t.co/GhjOxGi4 00000000 ******** 【数学入門/橋口 秀子 他】を読んだ本に追加 →http://t.co/pQyQCzXl #bookmeter
嬉しいことにt.coの短縮URLを展開するとURLにasin(Amazonで使われている書籍コード)が埋め込まれてるのでAmazonのAPI使えば書籍情報も取ってこれるよ!!
もっともツイート内に"bookmeter", "booklog", "mediamarker"のいずれかが入ってさえいれば抽出されるので必ずしも読了報告ツイートばかり出てくるわけじゃありません.まあその辺は一旦取ってきてからこっちでフィルター作ればいいよね.
あとStreaming APIはたまに接続確認用に空のレスポンスを返してくるらしいのですが,上のコードだとエラーになるので要注意.
まあでも思ったより簡単ですよねー