Posted by & filed under diary, programming.


この間続き.

今度はTL取得とそれに反応する簡単なものを作ってみた.

TL取得は,Python Twitterを使えば簡単にできる.問題は,“どうやって重複させないでTLを取得するか?”

sinceという時間を指定するオプションがあったので,それを使おうとして,でもうまく行かなくて四苦八苦してたら,隣にsince_idというtweet idを指定するオプションがある事に気づいた.それを使ったらあっさりと成功.英語だから面倒くさくても説明はきちんと読まないとダメだな…

TLを取得できたら,あとは正規表現で何か文字列を抜き出し,それに対する反応を定義してやるだけ.

一つ注意しておくべき点としては, Python の標準ライブラリで,正規表現を実装する reモジュール はマルチバイト文字列に対応していない.そのため,そのままの日本語テキストでは正規表現が利用できない.

が, Unicode には対応しているので,日本語文字列を Unicode に変換してやれば問題ない.

文字列を Unicode に変換するには,

hoge = u"日本語"  # ” ”の前に 'u' をつける
hoge = unicode("日本語", "utf-8")  # 明示的に指定したい場合

を使う.ちなみに, Python のサポートする Unicode 文字列は UCS-2 と UCS-4 なので,ファイルエンコーディングが UTF-8 の場合でも変換が必要となる.

試しなので,凝った抽出ではなく,単純に単語のマッチングで済ませた.

反応するようにした単語は「むくり」と「ぱたり」.それぞれ,起きたときと寝るときによく呟かれる単語だ.

これにそれぞれ,「おはよう」と「おやすみ」と挨拶を返すようにした.

#!/usr/bin/env python
# -*- coding=utf-8 -*-
'''
「むくり」と「ぱたり」に反応するBOT
'''
import twitter
import re
from time import sleep

# 初期値定義
since = 0
mukuri = re.compile(u"むくり")
patari = re.compile(u"ぱたり")

# twitter ログイン
api = twitter.Api(username='twitter username', password='twitter password')

while 1:  # 無限ループ
    # TL取得
    tl = api.GetFriendsTimeline(since_id=since)
    for tweet in tl:
        since = tweet.id
        if mukuri.search(tweet.text) is not None:
            text = "@" + tweet.user.screen_name + " おはよう"
            api.PostUpdate(text.decode('utf-8'), in_reply_to_status_id=tweet.id)
        if patari.search(tweet.text) is not None:
            text = "@" + tweet.user.screen_name + " おやすみ"
            api.PostUpdate(text.decode('utf-8'), in_reply_to_status_id=tweet.id)
    sleep(60*5)  # 5分おきに実行

今度はどんな機能をくっつけるかなー