2012-05-11
Twitterでアレな発言してる人の過去ログ3200件取得して表示するだけのスクリプト
動機
Twitterでアレな発言してたりアレな言動している人とかを公式RT、非公式RT、Togetterまとめ人、フォロワーで見かけたときにログを漁るのには公式はリッチで重すぎた。いや、リッチなのは普段いいが、いくらAutoPagerしてくれても重いのもは重い。なのでAPI叩いて一気に3200件全件取得したら一覧性がよいとおもったので。
ネットストーキングしたい人に需要があるならウェブサービスにすることを考えなくもないと @altnight が言っていたので、ネットストーカー志望の人は彼に頼んだらいいかもしれません。
技術的な内容(なんてない)
まあ初歩的なプログラミングです。サルにでもできる。たぶんPerlやRubyでも簡単に書けると思う。
Pythonだとtweepyってライブラリがすごく便利なのでこれを使用。OAuthは取得してないのでパブリックな人しか読めないけど、そもそもアレな人はパブリック公開だから問題ないし、やろうと思えば自分用のアクセストークンは一瞬で取得できるので省略。
使用方法としては
python arena_hito_tl.py altnight
みたいに第一引数に与えてやることにしました。
たぶん1時間くらいでできた。t.coの展開は前同じのを作ったので流用。発言取得番号だけenumerateしてるところでちょっと微妙で、本当は1,2,3...200,201,202...3199.3200みたいにしたかったけど、なんか計算がうまくいかなかったから諦めた。
あと何気にツイートの日時がタイムゾーンの関係で9時間ずれるので補正するんだけど datetime.timedelta はつかったことなかったのでちょっと手間取った。といっても + するだけだった。ポリフォーズムすごい。
あとこれ普通にprintしてtmuxのコピーモードで閲覧してたけど、実際使うなら > のリダイレクトがちゃんとできるかファイルに保存できないとダルいね。まあ自分が使うようだからてきとうである。
所要時間は1時間くらい。enumerateまわりで試行錯誤しなかったらあと20分くらいは縮まったと思うけど。
コード
#-*- coding:utf-8 -*- """ TLを3200件なり指定しただけとってくる簡単なスクリプト argv[1] type 1. tweet with OAuth 2. tweet with not OAuth 3. list argv[2] page argv[3] user argv[4] list """ import sys import re import datetime import codecs import tweepy CONSUMER_KEY = "your key" CONSUMER_SECRET = "your key" ACCESS_TOKEN = "your key" ACCESS_TOKEN_SECRET = "your key" def help(): print __doc__ sys.exit() def expandTCO(arg): """t.coの展開""" text = arg.text for url in arg.entities["urls"]: if not url: continue else: for i in arg.entities["urls"]: if re.search(i["url"], text): text = re.sub(i["url"], i["expanded_url"], text) return text def set_type(_type, page): """tweetを取ってくる種類の設定""" if _type == '1': # tweet with OAuth api = set_OAuth() return api.user_timeline(sys.argv[3], include_entities=True, include_rts=True, count=200, page=page) elif _type == '2': # tweet with not OAuth return tweepy.api.user_timeline(sys.argv[3], include_entities=True, include_rts=True, count=200, page=page) elif _type == '3': # list api = set_OAuth() return api.list_timeline(sys.argv[3], sys.argv[4], include_entities=True, include_rts=True, count=20, page=page) else: raise Exception def set_OAuth(): """OAuthをとりつける""" auth = tweepy.OAuthHandler(CONSUMER_KEY, CONSUMER_SECRET) auth.set_access_token(ACCESS_TOKEN, ACCESS_TOKEN_SECRET) api = tweepy.API(auth) return api def main(): #help if sys.argv[1] == '-h': help() #main result = '' for i, page in enumerate(range(1, int(sys.argv[2])+1)): for ii, arg in enumerate(set_type(sys.argv[1], page)): #公式RTならargを入れ替える if hasattr(arg, "retweeted_status"): arg = arg.retweeted_status text = expandTCO(arg) result += u"page%d,%d %s:%s:%s\n" % (i+1 ,ii+1, (datetime.timedelta(hours=9) + arg.created_at).strftime("%Y/%m/%d %H:%m:%S"), arg.user.screen_name, text, ) with codecs.open(sys.argv[3] + '_tweet.txt', 'w', 'utf-8') as f: f.write(result) if __name__ == "__main__": main()
いちおうGistにもおいておいた
Twitterでアレな発言してる人の過去ログ3200件取得して表示するだけのスクリプト — Gist
追記
2012/07/19時点のバージョン
その後ちょくちょく使うことがあったので -h で help()を追加(__doc__呼び出してるだけ)。 あと関数に分けたり、OAuth使うかいなかとかのtype、あとはprintしないでファイルにちゃんと保存するようにしました。たまにこの記事にアクセスがある程度に需要があるらしい。
- 64 http://www.google.co.jp/url?sa=t&rct=j&q=&esrc=s&source=web&cd=2&ved=0CHQQFjAB&url=http://d.hatena.ne.jp/atasatamatara/20110204/1296805108&ei=Sz6tT9zsDcjbmAWosNXQDA&usg=AFQjCNHD98yW0uqK0miytjfUtYHvZsupug&sig2=wpEQ-UbG-ciVEkPvqQDcRQ
- 44 http://www.google.co.jp/url?sa=t&rct=j&q=&esrc=s&source=web&cd=1&ved=0CHAQFjAA&url=http://d.hatena.ne.jp/atasatamatara/20090825/1251163850&ei=A0GtT_zECcuTiQfo3r2BCQ&usg=AFQjCNHGigYEDjEDZ_kw9ms8qG6WO7aC5w&sig2=J6InZ9CZeUitD_snYq2OEg
- 38 http://www.google.co.jp/url?sa=t&rct=j&q=&esrc=s&source=web&cd=3&ved=0CHYQFjAC&url=http://d.hatena.ne.jp/atasatamatara/20120317/1331964953&ei=Ky-tT7DOLuqImQXdrLzWDA&usg=AFQjCNG7B-F_JiiGqyKOP3PaOkDq3vRGAQ
- 31 http://www.google.co.jp/url?sa=t&rct=j&q=&esrc=s&source=web&cd=4&ved=0CEUQFjAD&url=http://d.hatena.ne.jp/atasatamatara/20120316/1331926385&ei=HriJT9anJPHMmAWT_uDRCQ&usg=AFQjCNE6kakLUQg1rTLWseN_gsLF1XWy4w&sig2=P93tCqBH4d-S5Xoq9jJq_g
- 23 http://www.google.co.jp/url?sa=t&rct=j&q=&esrc=s&source=web&cd=5&ved=0CGoQFjAE&url=http://d.hatena.ne.jp/atasatamatara/20110204/1296805948&ei=b_2vT-uFCKPKmAXM142RCQ&usg=AFQjCNFQeutLLlUGPrh-JF2NHhOf6p_QKg&sig2=0A8vM6I3GyVwMdpWkU_vEw
- 21 http://pipes.yahoo.com/pipes/pipe.info?_id=8dda7c5265619c2fb368495a3d11b784
- 14 http://www.google.co.jp/url?sa=t&rct=j&q=&esrc=s&source=web&cd=7&ved=0CHUQFjAG&url=http://d.hatena.ne.jp/atasatamatara/20120419/1334839171&ei=w-ajT7jTIIyziQenvqTDCA&usg=AFQjCNEvJlgoVuV-tXghttsNrKXxhixgcg&sig2=mgUNzbZmLULzi4ttIn2m2Q
- 8 http://reader.livedoor.com/reader/
- 8 http://www.google.co.jp/url?sa=t&rct=j&q=&esrc=s&source=web&cd=6&sqi=2&ved=0CG8QFjAF&url=http://d.hatena.ne.jp/atasatamatara/20120426/1335433063&ei=gXmuT4-aHMXbmAXpp4yVCQ&usg=AFQjCNG8beUWyVFCmrgeK7nzlMSelbr9EA&sig2=9K4-OY-StBWgc1RjnNCKAg
- 7 http://www.google.co.jp/url?sa=t&rct=j&q=unite.vim&source=web&cd=4&ved=0CDwQFjAD&url=http://d.hatena.ne.jp/atasatamatara/20120305/1330954392&ei=IadqT-2_K6bBiQfaqNHoBQ&usg=AFQjCNGc1FsDSVtZK0pXb_0Z9Sj5-oWjZg