PythonでTwitterのUser Streamに繋ぐ方法をメモ。
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が直接使えない)ので別のトコを探さなければならないのです。。。