なかなか便利
tweepyのソース読んだり、ぐぐったりしながらなんとか形になった。ここで言う擬似ストリーミングはツイッターのStreaming APIではなく、Rest APIを自動で投げて表示させるって意味なので全然Streamingじゃないですね。
リストにStreaming APIが提供されてないことに気づくまでバカみたいに探しててバカみたいだった。バカみたいだった。
記事執筆現在、API1.1のリストタイムラインの取得制限は180回/15分なので、単純計算で5秒に一回投げれます。スクリプトでは読み上げ時間も+8秒ぐらいで余裕を持たせてます。リストの流速によっては取得漏れが発生すると思いますが、それぐらいだとそもそも読み上げが追いつきません。リスト廃人とかじゃなかったら大丈夫だと思います。
英語用のリストを英語で読ませたり、単に気になるリストを読み上げさせたりと結構おもしろいです。
また、whileの無限ループと引数のsince_idで擬似ストリーミングを実装してるので、同じ手法を使えば特定のidだとかリスト以外でも使えるはずです。サーバーに負担かからない程度の自重は必要だとは思います。
ホームタイムラインバージョン
PythonでTwitterのタイムラインをストリーミングで読み上げさせるfor Mac[tweepy] « haya14busa
tweepyだとか読み上げコマンドだったり仕様について書いてるので参照してください
コード
twList.py
#!/usr/bin/env python
# -*- coding:utf-8 -*-
#
# リストのTLを擬似ストリーミングで読み上げさせる
#
# Author: haya14busa
# URL: http://haya14busa.com
# Require: SayKotoeri, Saykana or SayKotoeri2
# License: MIT License
# OS: for Mac Only
import tweepy
from datetime import timedelta
import time
from subprocess import call
import re
import sys, codecs
sys.stdout = codecs.getwriter('utf_8')(sys.stdout)
sys.stdin = codecs.getreader('utf_8')(sys.stdin)
def get_oauth():
CONSUMER_KEY='**********'
CONSUMER_SECRET='**********'
ACCESS_TOKEN_KEY='**********'
ACCESS_TOKEN_SECRET='**********'
auth = tweepy.OAuthHandler(CONSUMER_KEY, CONSUMER_SECRET)
auth.set_access_token(ACCESS_TOKEN_KEY, ACCESS_TOKEN_SECRET)
return auth
def str_replace(string):
string = re.sub('&.+;', ' ', string)
# remove URL
string = re.sub('(https?|ftp)(:\/\/[-_.!~*\'()a-zA-Z0-9;\/?:\@&=+\$,%#]+)', 'URL', string)
# remove quote
string = re.sub('"', ' ', string)
string = re.sub("'", ' ', string)
string = re.sub('\/', ' ', string)
string = re.sub('RT', 'Retweet', string)
return string
def showTL(api, read_id):
try:
tl = api.list_timeline('[owner_name]', '[slug]', count=10, since_id = read_id)
tl.reverse()
for status in tl:
status.created_at += timedelta(hours=9) # add 9 hours for Japanese time
print u'---{name}/@{screen}---\n {text}\nvia {src} {created}'.format(
name = status.author.name,
screen = status.author.screen_name,
text = status.text,
src = status.source,
created = status.created_at)
read_text = str_replace(status.text.encode('utf_8'))
call(['SayKotoeri -s "-s 120" "{text}" >/dev/null 2>&1'.format(text=read_text)], shell=True)
# call(['say -v "kyoko" "{text}"'.format(text=read_text)], shell=False) # Kyoko
# call(['say "{text}"'.format(text=read_text)], shell=False) # for English
else:
global lastSinceId
lastSinceId = tl[-1].id
except Exception, e:
time.sleep(10)
pass
def main():
auth = get_oauth()
api = tweepy.API(auth_handler=auth)
lastGetTime = time.time() - 8
global lastSinceId
lastSinceId = None
while True:
if time.time() > lastGetTime + 8:
lastGetTime = time.time()
showTL(api, lastSinceId)
else:
time.sleep(1)
if __name__ == "__main__":
main()
使い方
Twitter Developersに登録してCONSUMER_KEY, CONSUMER_SECRET, ACCESS_TOKEN_KEY, ACCESS_TOKEN_SECRETをそれぞれ取得してコードの該当位置に書き込んでください。また[owner_name]と[slug]をリストの所有者のスクリーンネームと、リストの名前に置き換えてください。
また、読み上げコマンド含め好きなように編集して使ってください。デフォルトだと一般的なゆっくりの声です。英語用リストだとsayコマンドに変更するとなかなかネイティブな発音が聴けて楽しいです。
あとはターミナルでpython twaloud.py 終了はCtrl-Cで強制終了してください。