雑記

2010年1月24日日曜日

Pythonで遊んでみる その2(Twitter;短縮URLのリンク先確認)

性懲りも無くまたPython使ってみた。
Twitterで短縮URLの飛び先がリンク切れになっていないか?そもそもちゃんと自分が意図したURLになってるかな?と気になって寝られなくなり、簡単だがbitly用のリンク一覧スクリプトを書いてみた。
botなんかで自動的にツイートしてると、(主にバグが原因で)URLが表示されていなかったりリンク切れになってたり、しかも膨大な数のツイートになると目視とか無理。
雑なのであまり参考にならないかもしれませんが。以下ソース

やってることは単に
1. 特定のユーザーのTLから1ツイートづつ読み込む
2. 短縮URLがあったらリンク先に飛んでみる
3.リンク先に飛んでみて、レスポンスコードとメッセージを取得
4. ログファイルにstatusesとか飛び先のURLをwriteする
5. ページ送り
6. 1に戻る

import feedparser, urllib2, re, time, sys

fp = open("bitly_check.log", "a+")

screen_name = "HogeHuga"
count = 200
page = 1

while 1:
    r = urllib2.urlopen("http://twitter.com/statuses/user_timeline.atom?screen_name=%s&count=%d&page=%d" % (screen_name, count, page)).read()
    feed = feedparser.parse(r)
    regex = re.compile('http\:\/\/bit.ly\/[0-9a-zA-Z]+')

    if feed.entries:
        for entry in feed.entries:
            bitlyUrl = regex.findall(str(entry.content))
            if len(bitlyUrl) > 0:
                try:
                    content = urllib2.urlopen(bitlyUrl[0])
                    fp.write("%s\t%s\t%d\t%s\n" % (entry.link, content.geturl(), content.code, content.msg))
                except urllib2.HTTPError, e:
                    fp.write("%s\t%s\t%d\t%s\n" % (entry.link, content.geturl(), e.code, e.msg))
                except urllib2.URLError, e:
                    fp.write("%s\t%s\t\t%s\n" % (entry.link, content.geturl(), e))
                time.sleep(10)
            else:
                fp.write("%s\tNoLink\t\t\n" % entry.link)
                time.sleep(1)

    else:
        fp.close()
        sys.exit()

    page += 1
    time.sleep(10)

fp.close()

※ ちなみにTwitter APIの仕様で、3200件以上前のツイートは上記の方法では取得できません。
Pythonはまだまだ勉強中なので、もっとスマートな方法を考えてみたいなぁ・・・。