python-oauth2でTwitterのStreaming APIに接続

3ヶ月ぶりの更新.

この間何もしなかったわけじゃなくて主に修論関係で

とか色々やってたんだけどアウトプットめんどくさいっすね…修論終わったら(自分のためにも)書きます.

で,今回はそれらとは全く関係なくTwitterのStreaming APIPythonのoauth2ライブラリを使って接続する話です.

Twitter API × Pythonに関しては既にpython-twitterとかtweepyみたいな便利なライブラリあるんでそっち使えよって話ですが,まあちょっとした勉強になるし.あとTwitterの野郎がたまに予告なしでAPIの仕様変更するせいでライブラリの更新が間に合わなかったりすることがあるので,低レベルでAPI触れるようになっといて損はないですよー,と

ググッてみるとbasic認証で接続した例はちょくちょく見つかるんですが,oauth認証使ってる例がほとんどないです.REST APIbasic認証が去年廃止になったように,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で使われている書籍コード)が埋め込まれてるのでAmazonAPI使えば書籍情報も取ってこれるよ!!

もっともツイート内に"bookmeter", "booklog", "mediamarker"のいずれかが入ってさえいれば抽出されるので必ずしも読了報告ツイートばかり出てくるわけじゃありません.まあその辺は一旦取ってきてからこっちでフィルター作ればいいよね.

あとStreaming APIはたまに接続確認用に空のレスポンスを返してくるらしいのですが,上のコードだとエラーになるので要注意.

まあでも思ったより簡単ですよねー