自分の過去発言を呟くbotを作った

Twitterの垢を取ったのが2008年4月23日。取ったはいいけどほぼ放置してる時期が長くて、本格的に使うようになったのは2009年の末ごろからだけど、それでももう1年半以上経った。廃人レベルではないけどそこそこのペースでpostしてて、だいぶツイートが溜まってきた。
というわけで、自分の過去発言をランダムに呟くbotを作ってフォローすれば、「ああ、そんなこともあったなあ」と懐かしい気分になったり、「うわあこんな痛いこと言ってる…」と自分への戒めになったりするだろうと思い、作った次第です。
botを作る」と言っても全部ゼロから自分で作るのは糞面倒臭いので、既存のサービスであるtwitbotを使いました。
twittbot - 簡単にbotを作成
http://twittbot.net/
これはbot用の垢を作成して認証し、つぶやく内容を登録するだけでbotが作れるという優れもの(他にもリプライに反応できるようにしたりとか色んな機能がついてるけど、今回作ったbotには必要なし)。
つぶやきを登録するときには、一行=1ツイートの形式で複数行入力すればまとめて登録できるので、必要な作業は

  • 過去のツイートの取得
  • 取得したツイートの加工

の2点です。

1. 過去のツイートの取得

API使って取得してもいいんですけどそれだと過去3200件しか取得できないので、ご存知Twilogを活用します。
Twilogには保存してあるlogをcsvファイルでダウンロードできる機能があるのでそこから落とす。ちなみに形式は[id], [ツイート日時], [本文]です。

2. 取得したツイートの加工

csvファイルをダウンロードしましたが、これがそのまま使えるわけじゃない。さっきも書いたようにtwitbotに登録する形式は、一行=1ツイートのテキストなのでidなんかは余計な情報。それに問題はそれだけじゃない。
過去のツイートには@付きのものも含まれてるわけで、それをbotにそのまま呟かせたら@の相手に迷惑。それにハッシュ付きのツイートなんかも混ぜたままだとマズい(カープの試合中にbotが「うおっしゃ勝った!! #carp」なんて呟いたら迷惑この上ない)。なので、リプライの@、ハッシュタグの#が含まれるツイートは除外する必要があります。
更に言うと、折角だから過去の投稿の本文だけじゃなくて、それをいつ呟いたのかもわかった方が面白い。幸い先にダウンロードしたcsvには2列目にツイート日時が入ってるので、これを加工して本文の後ろに「(2011/01/01 12:00:00)」みたいにくっつけることが可能。ただし元の本文が長い場合は日時を入れると140字オーバーするので、その場合は元の本文を削って140字以内に収める必要がある。URLが末尾にあるツイートだと削ったときにURLが途中で切れるのでそれを避けるために削った本文がURLの一部だった場合はURLごと削除する…
なーんてやることは色々あって、これを手動でやるのは面倒なので(そもそもツイートが15000件以上あるので無理)Pythonスクリプト書きました。一応ソースコード貼っときます

# coding: utf-8

import csv
import random
import re
import gzip

reader = csv.reader(gzip.open('<Twilogからダウンロードしたファイル>', 'rb'))
outfile = open('<加工結果を書き出すファイル>', 'w')
r = re.compile(ur"(https?|ftp)(:\/\/[-_.!~*\'()a-zA-Z0-9;\/?:\@&=+\$,%#]+)$")

tweets = [(row[2].decode('utf8').replace(u'\n', u''), row[1].decode('utf8'))
              for row in reader
              if row[2].find('@') == -1 and row[2].find('#') == -1]
random.shuffle(tweets)
for tweet in tweets:
    dt = '(%s/%s/%s %s:%s:%s)' % (tweet[1][:2], tweet[1][2:4], tweet[1][4:6],
                                           tweet[1][7:9], tweet[1][9:11], tweet[1][11:13])
    if len(tweet[0]) > 121:
        text = r.sub('', tweet[0])[:118] + '...' + dt 
    else:
        text = tweet[0] + dt
    outfile.write(text)
    outfile.write('\n')
outfile.close()

実行後に作成されたテキストファイルを開いて、twitbotのつぶやき登録フォームにそのままコピペすれば完成!!!
できたbotはこちら→ @who_you_me_bot
全国の冬見ファンはこれをフォローするしかないね!!!
…そんな奴いねえよ
と思いきや8人の方がフォローしてくれてるので感謝感激雨あられですね。