TwitterのStreaming APIを使ってみた

PythonでStreaming APIを使ったので、そのときのことをメモ。

目的

今回の目的は、リプライ かつ 日本語のツイートを取得することでした。
だから、guess_languageというライブラリを利用しています。
また、ファイルが大きくなるのを防ぐために1000ツイートで書き込むファイルを変えています。

APIはsample.jsonを利用しています。これだと全ツイートの1%を取得できるんでしたっけ?

コード

# -*- coding: utf-8 -*-

import json
import urllib2
import oauth2 as oauth
import guess_language

def is_japanese(text):
    """"ツイートが日本語かどうか判定する"""

    if guess_language.guessLanguage(text) == 'ja':
        return 1
    return 0

def streaming():
    """Streaming APIを利用してツイートを取得"""

    CONSUMER_KEY = '*****'
    CONSUMER_SECRET = '*****'
    ACCESS_TOKEN_KEY = '******'
    ACCESS_TOKEN_SECRET = '******'
    
    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/sample.json'
    params = {}

    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())

    i = 0 #ツイート数
    j = 0 #ファイル番号

    f = open('tweet/tweets.' + str(j) + '.tlg', 'w')
     
    for r in res:

        try:
            data = json.loads(r)
            reply_id = str(data['id'])
            reply_text = data['text'].encode('utf_8').replace('\n', '')
            tweet_id = str(data['in_reply_to_status_id'])
        except:
            continue

        if tweet_id != 'None' and is_japanese(reply_text):
            f.write(reply_id + '\t' + tweet_id + '\n' + reply_text + '\n\n')
            i += 1
            
            if i % 1000 == 0:
                i = 0
                f.close()
                j += 1
                f = open('tweet/tweets.' + str(j) + '.tlg', 'w')
    f.close()

if __name__ == '__main__':
    streaming()

例外処理を書いているのは、ときどきAPIが空のリクエストを返すらしいからです。

これとOauth認証でツイートの情報を取得を組み合わせると、ツイートとリプライの組みを取得できます。