Home > RubyでTwitter bot を書く

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に接続できなかったので、今回は別の方法をとりました。

ライブラリ

コード

# 簡単な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)

使い方

  1. いまつくったbotアカウントをfollowします。

    follow bot_account

  2. botアカウントに対してダイレクトメッセージを投げます。

    d bot_account hello bot !

まとめ

簡単なTwitter botづくりのレシピをまとめました。

つくってみると、いろんなバッドノウハウ (送信するメッセージはchat typeじゃないとおかしくなる場合がある、 定期的に何かメッセージを投げないと、応答しなくなる) にぶちあたるので、自分で何かbotをつくてみようかと考えている方の参考になれば幸いです。

もっと良い方法があるよ! とか、分かんないよ! とか、添削してやるぞ! とかあればよろしくお願いします。

Comments:0

Comment Form
Remember personal info

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回の北海道開発オフ部に参加してきました。オフの状況は別途レポートするとして、作っぅ

Home > RubyでTwitter bot を書く

Feeds

Return to page top