Hatena::ブログ(Diary)

AtAsAtAmAtArA

2012-05-11

Twitterでアレな発言してる人の過去ログ3200件取得して表示するだけのスクリプト

動機

Twitterでアレな発言してたりアレな言動している人とかを公式RT非公式RTTogetterまとめ人、フォロワーで見かけたときにログを漁るのには公式はリッチで重すぎた。いや、リッチなのは普段いいが、いくらAutoPagerしてくれても重いのもは重い。なのでAPI叩いて一気に3200件全件取得したら一覧性がよいとおもったので。

ネットストーキングしたい人に需要があるならウェブサービスにすることを考えなくもないと @altnight が言っていたので、ネットストーカー志望の人は彼に頼んだらいいかもしれません。

技術的な内容(なんてない)

まあ初歩的なプログラミングです。サルにでもできる。たぶんPerlRubyでも簡単に書けると思う。

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しないでファイルにちゃんと保存するようにしました。たまにこの記事にアクセスがある程度に需要があるらしい。

スパム対策のためのダミーです。もし見えても何も入力しないでください
ゲスト


画像認証

トラックバック - http://d.hatena.ne.jp/atasatamatara/20120511/1336741655
リンク元