RubyでTwitter bot を書く
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に接続できなかったので、今回は別の方法をとりました。
ライブラリ
- XMPP4R
- gem install xmppr4r
コード
# 簡単な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をつくてみようかと考えている方の参考になれば幸いです。
もっと良い方法があるよ! とか、分かんないよ! とか、添削してやるぞ! とかあればよろしくお願いします。
- Newer: 無理なく続けられる 年収10倍アップ勉強法
- Older: Real UNIX MAGAZINE Day
Comments:0
Trackbacks:3
- Trackback URL for this entry
- http://blog.deadbeaf.org/2007/11/14/twitter-bot-by-ruby/trackback/
- Listed below are links to weblogs that reference
- RubyでTwitter bot を書く from mootoh.log
- pingback from ç¡ç ä¸è¶³ ver2 - memo 07-11-15 (Thu) 14:32
-
[...] RubyでTwitter bot を書く 丁度試してみようと思っていたら参考になるモノ発見。 [...]
- pingback from bookmark_2007-11-19 07-11-19 (Mon) 22:33
-
[...] hogeLog ≫ RubyでTwitter bot を書く [...]
- trackback from コマネタ帳 08-01-27 (Sun) 22:03
-
[プログラミング]北海道開発オフでTwitter botを作ったよ…
第1åã®åæµ·ééçºãªãé¨ã«åå ãã¦ãã¾ããããªãã®ç¶æ³ã¯å¥éã¬ãã¼ãããã¨ãã¦ãä½ã£ã…

