TwitterTimeTrackというものをちょっと前につくって、
自分ではけっこう便利に使っています。
Twitterからbotに対してメッセージを投げると、あとでiCalendar形式で取ってこれる、というものなのですが、
今回はここでも使っているTwitterのbotを書く方法を書いてみます。
方針
- ダイレクトメッセージを受けとり、内容をパースして応答を返す
- botはJabberでTwitterに接続して常駐
- Rubyで
準備
Twitter アカウント
bot用のTwitterアカウントを用意します。
Jabber ID
botがTwitterに常駐するために、Jabber IDが必要です。
ここでは、Jabber.JPを使わせてもらうことにしました。
GMailのメールアドレスが使える場合には、Jabber IDを別にとる必要がないのでお手軽です。
しかしGMailのサブアカウントではGTalkに接続できなかったので、今回は別の方法をとりました。
ライブラリ
コード
# 簡単なTwitter bot
#
require 'rubygems'
require 'xmpp4r'
require 'kconv'
class Reciever
attr_accessor :client
# user : Jabber ID
# pass : パスワード
def initialize(user, pass)
@end = false
Jabber::debug = true
# Jabber クライアントをサーバに接続
@client = Jabber::Client.new(Jabber::JID.new(user), false)
@client.connect
@client.auth(pass)
@client.send(Jabber::Presence::new)
thread = Thread.current
# 受信メッセージをパースするコールバック
@client.add_message_callback do |message|
unless message.type == :error
if message.body =~ /Direct from (.*):/ # DirectMessage が誰からのものか
sender = $1
msg = message.body.split(/\r?\n/)
msg.shift # Direct from ... を削る
msg.pop # 末尾の行も削る
body = msg.join
#
# ここからあとで、自分の好きなことをする :)
#
if body =~ /!abort/ # abort といわれたら終わる
@client.send(Jabber::Message::new(message.from, "d #{sender} aborting...").set_type(:chat))
thread.wakeup
else
# ここでは単にechoするだけ
xxx = Kconv.toutf8("d #{sender}\n#{message.body}")
@client.send(Jabber::Message::new(message.from, xxx).set_type(:chat))
end # if body
end # if direct
end # unless error
end # callback
@watcher = Thread.new do
while not @end
# 自分の生存をJabberサーバにアピール
@client.send(Jabber::Presence::new)
sleep 30
end
end
end
def close
@client.close
@end = true
@watcher.join
end
end # Reciever
このRecieverクラスをmain側からつくってやればできあがり。
終了するときは、Ctrl-Cとかで。
bodyを正規表現でパースしてるとこで、自分の好きなことを書いてやればよいでしょう。
自動Follow
botにメッセージを送るためには、自分のアカウントから
にぽたん研究所::Twitter でイチイチ follow するのが面倒くさい のRuby版を書き、.procmailrc に
:0
* ^To:.*2c@deadbeaf.org
| counter_follow.rb
とかしています。
Ruby版
#!/opt/local/bin/ruby
require 'open-uri'
ID = 'jabber bot ID'
PASSWORD = 'jabber bot password'
msg = ARGF.read
msg =~ /\s+http:\/\/twitter.com\/(\w+)$/
screen_name = $1
exit 1 unless screen_name
auth = {'Authorization' => 'Basic '+[ID+':'+PASSWORD].pack('m')}
open('http://twitter.com/friendships/create/'+screen_name+'.json', auth)
使い方
いまつくったbotアカウントをfollowします。
follow bot_account
botアカウントに対してダイレクトメッセージを投げます。
d bot_account hello bot !
まとめ
簡単なTwitter botづくりのレシピをまとめました。
つくってみると、いろんなバッドノウハウ
(送信するメッセージはchat typeじゃないとおかしくなる場合がある、
定期的に何かメッセージを投げないと、応答しなくなる)
にぶちあたるので、自分で何かbotをつくてみようかと考えている方の参考になれば幸いです。
もっと良い方法があるよ! とか、分かんないよ! とか、添削してやるぞ! とかあればよろしくお願いします。