PythonでTwitterのUser Streamに繋ぐ方法をメモ。
tweepyはUser Streamに対応してなかったので、既存のStreaming APIをUser Stream用に拡張してみた。
以下、ソースコード。
あとは、起動しっぱなしにしとけば自動でタイムラインがガサーっと流れ込んできます。なにか処理があるのであれば、StreamListenerクラスのon_statusメソッド(ツイートが流れてきたときのイベントハンドラ)をオーバーライドしましょう。これでUser Streamも自由自在ですね!
ともあれ、コネクション張りっぱなしでOKなレンサバてどこなんでしょ?GAEだとコネクションすら張れない(HTTPSConnectionが直接使えない)ので別のトコを探さなければならないのです。。。
tweepyはUser Streamに対応してなかったので、既存のStreaming APIをUser Stream用に拡張してみた。
以下、ソースコード。
#! /usr/bin/env python
# -*- coding: utf-8 -*-
from tweepy import OAuthHandler, Stream, StreamListener, TweepError, API
import logging
def get_oauth():
"""
ツイッターOAuth情報の取得
"""
consumer_key = '適宜埋める'
consumer_secret = '適宜埋める'
access_key = "適宜埋める"
access_secret = "適宜埋める"
auth = OAuthHandler(consumer_key, consumer_secret)
auth.set_access_token(access_key, access_secret)
return auth
class UserStream(Stream):
"""
Twitter User Streamクラス
"""
def user_stream(self, follow=None, track=None, async=False, locations=None):
"""
Twitter User Streamを開く
"""
self.parameters = {"delimited": "length", }
self.headers['Content-type'] = "application/x-www-form-urlencoded"
if self.running:
raise TweepError('Stream object already connected!')
self.scheme = "https"
self.host = 'userstream.twitter.com'
self.url = '/2/user.json'
if follow:
self.parameters['follow'] = ','.join(map(str, follow))
if track:
self.parameters['track'] = ','.join(map(str, track))
if locations and len(locations) > 0:
assert len(locations) % 4 == 0
self.parameters['locations'] = ','.join(['%.2f' % l for l in locations])
self.body = urllib.urlencode(self.parameters)
logging.debug("[ User Stream URL ]: %s://%s%s" % (self.scheme, self.host, self.url))
logging.debug("[ Request Body ] :" + self.body)
self._start(async)
class CustomeStreamListener(StreamListener):
"""
Twitter Stream のリスナークラス
"""
def on_status(self, status):
"""
ステータス取得時のイベントハンドラ
"""
print status.text
if __name__ == '__main__':
auth = get_oauth()
stream = UserStream(auth, CustomeStreamListener(api=API(auth_handler=auth)))
# User Streams使うならタイムアウト設定しちゃだめ
stream.timeout = None
stream.user_stream()
タイムアウトに注意
一番重要?なのは、timeoutを設定しないこと。デフォルトではtimeoutが設定されてしまうので、明示的にタイムアウトをなしに設定しないとUser Streamに繋げても速攻で切断されちゃうのです。あとは、起動しっぱなしにしとけば自動でタイムラインがガサーっと流れ込んできます。なにか処理があるのであれば、StreamListenerクラスのon_statusメソッド(ツイートが流れてきたときのイベントハンドラ)をオーバーライドしましょう。これでUser Streamも自由自在ですね!
ともあれ、コネクション張りっぱなしでOKなレンサバてどこなんでしょ?GAEだとコネクションすら張れない(HTTPSConnectionが直接使えない)ので別のトコを探さなければならないのです。。。

