nadoka から Twitter に投稿するボット

最近Twitterっていう「おたく何してるん?*1」って質問にひたすら答え続けるコミュニティサイトっぽいものが流行ってます。

IRCとか携帯とか、あちらこちらから投稿するプログラムができてきますが、僕が使ってる nadoka という IRC ボットでもそれを実現するためのプログラムを書きました。

つかいかた

以下のコードを twitterbot.nb として plugin フォルダに入れます。

# -*-ruby-*-
require 'net/http'
require 'kconv'

class TwitterBot < Nadoka::NDK_Bot
  def on_client_privmsg client, ch, message
    if (@ch == nil) or ((@ch != nil) and (@ch.upcase == ch.upcase))
      if @pattern =~ message
        status = message.sub(@pattern, '')
        if send_twitter(status)
          msg = Cmd.privmsg(@state.nick, 'sent to twitter:' + status)
        else
          msg = Cmd.privmsg(@state.nick, 'twitter send faild:' + status)
        end
        client.send_to_client client.add_prefix(msg, self.class.to_s)
      end
    end
  end

  def send_twitter status
    begin
      Net::HTTP.version_1_2
      req = Net::HTTP::Post.new('/statuses/update.json')
      req.basic_auth @user, @passwd
      req.body = 'status=' + URI.encode(status.toutf8)

      Net::HTTP.start('twitter.com',80) {|http|
        http.read_timeout = @timeout
        res = http.request(req)
        print res.body
      }
    rescue Exception => e
      return false
    end
    return true
  end

  def bot_state
    return "<#{self.class.to_s} user: #{@user}>"
  end

  def bot_initialize
    @ch      = @bot_config.fetch(:ch,      nil)
    @user    = @bot_config.fetch(:user,    nil)
    @passwd  = @bot_config.fetch(:passwd,  nil)
    @pattern = @bot_config.fetch(:pattern, /\s\.$/)
    @timeout = @bot_config.fetch(:timeout, 60)
  end
end

あとはこんな設定を追加すればOK。

    {
      :name   => :TwitterBot,
      :user   => 'hoge',
      :passwd => 'fuga',
      :ch     => '#伊勢的新常識', # このボットが反応するチャンネルを限定する場合に書きます
    },

設定が終わったら nadoka をリロード。末尾に半角スペース*2をつけた発言をすると twitter に送られます。

このプログラム書くに当たって最速インターフェース研究会 :: bluewindからtwitterを更新できるようにRubyでシンプルなクライアントを書いたを参考にさせていただきました。というかもろコピペ。

あ、ちなみに僕のTwitterこちらです

2007/05/15 update:nowa版に合せて修正加えました。

*1:高校時代、部活の先輩がよく言ってた

*2:設定「:pattern」に正規表現オブジェクトを指定すると条件を変更できます。デフォルト値は末尾に半角スペース (/\s$/) になっています