流れてきた"はてなボトル"をTwitterに流すPythonスクリプト




id:antipopさんたちが作成した「はてなボトル」は楽しいですね.さっそく登録しまして使いはじめました.

はてなBottleに登録するとBottleでメールボックスが一杯になってしまう難点があります.また,Bottleの到着メールの期限は30分ぐらいなので,メールボックスをスルーさせたり,3時間おきにメールを送ってもらう設定にするとボトルが自分のものではなくなってしまいます.

はてなボトルのBottleはいわば「連投」です.連投といえばTwitter
一日中twitterにはりついている人ならばBottleはメールボックスよりもTwitterに届いたほうが確認しやすいです.

というわけではてなBottleとTwitterをつなぐスクリプトを書いてみました.これに使うTwitterBotのアカウントを用意してfollowすればいいと思います.

コード

#!/usr/bin/python
import imaplib, re, twitter

server = "imap.gmail.com"
gmail_address = "Gmailのアドレス"
gmail_password = "Gmailのパスワード"
twitter_sname = 'Twiterのアカウント'
twitter_password = 'Twitterのパスワード'

M = imaplib.IMAP4_SSL(server)
M.login(gmail_address, gmail_password)
# ラベルがメールボックス名になる.(専用のフィルタを用意しとく必要あり)
M.select('HatenaBottle')

# 未読メッセージ
_, [data] = M.search(None, 'UNSEEN')
message_count = 0

title_list =  [M.fetch(i, '(BODY[HEADER.FIELDS (SUBJECT)])')[1][0][1].strip()
       for i in data.split(' ') if len(i) > 0 and i.isdigit]
p = re.compile('(?P<reply_url>http://bottle.hatelabo.jp/b/\d+)')
uids = [i for i in data.split(' ') if len(i) > 0 and i.isdigit]
message_list =  [
    M.fetch(i, '(BODY[TEXT])')[1][0][1].strip()
    for i in uids]
reply_url_list = [
    p.search(message).group('reply_url')
    for message in message_list if p.search(message)]

status = None
api = twitter.Api(username=twitter_sname, password=twitter_password)
for reply_url in reply_url_list:
    status = api.PostUpdate(u'New bottle: %s' % reply_url)

if status:
    for i in uids:
        M.store(i, '+FLAGS', '\SEEN')

M.logout()

Mac OS10.5のPython2.5で動作を確認しました.

普通の環境にはtwitterモジュールは入っていないと思うので,Pythonでtwitterを試してみたっす。 – kishi-r.comなどを参考にして適宜インストールしてください.

easy_installでsimplejsonが入らなかったのでGoogle Code Archive - Long-term storage for Google Code Project Hosting.からソースを落として展開し,

sudo python setup.py install

しました.
python-twitter

sudo easy_install python-twitter

でインストールできました.
このようにimport twitterインタラクティブシェル上で行ってもエラーが出なければインストール成功です.

使い方

GmailでHatenaBottle用のフィルタをつくります.ここではInboxをスキップし,"HatenaBottle"というラベルが貼られるようにしました.

上のスクリプトの中のgmailのアカウントやtwitterのアカウントを設定して,3分毎にcronなどで実行すればok.

ずーっとTwitterにはりついているあなたならBottleにすばやく反応できるはず.


いろいろ

  • これだけのスクリプトを書くのに4時間orz.まぁいくつか新しいことを覚えたのでいいとする.
  • imaplib便利.引数とか返り値とか説明がないけど.
  • リストの内包表記を覚えた.おもしろい.
  • 上のreply_url_llistの作成時に同じ箏を2回やってるのはどうにかならないかな.
  • pdb.set_trace()は便利.import pdbして,インタクティブシェルに移りたいところに挿入して使う.
  • そういえば「if __name__ == "__main__"」ってなんだろう.
  • エラー処理は省いた.Twitterが落ちてるときとかどうしよう.
  • GmailTwitterのパスワードが平文で保存されるのは怖い

スパムメールに載っているURLの統計をとったりとか,いろいろ.

おまけ

これPlaggerでできたか!