3 分で出来る Twitter BOT

BOT とは Twitter の自動ポストプログラムのことです。主にキャラクターや偉人の名言集を定期的につぶやくものが多いようです。私はピーター・ドラッカーの BOT をフォローしているのですが、心に響く名言がぽつりぽつり表れてとても面白いです。(^^)

ふと「この BOT のしくみは日々の英単語学習に生かせるのでは?」と思い、以前から作成していた英単語帳Twitter で定期的につぶやく BOT スクリプトruby で作成してみました。Ubuntu 9.04 + ruby 1.9 + twitter gem 0.6.15 の環境で動作確認しています。

■インストール(ruby, rubygems, twitter gem)

$ sudo apt-get install ruby1.9 rubygems1.9 
$ sudo ln -s /usr/bin/ruby1.9 /usr/bin/ruby
$ sudo gem install twitter
$ gem list -d twitter

*** LOCAL GEMS ***

twitter (0.6.15)
    Author: John Nunemaker
    Rubyforge: http://rubyforge.org/projects/twitter
    Homepage: http://github.com/jnunemaker/twitter
    Installed at: /var/lib/gems/1.9.0

    wrapper for the twitter api

スクリプト

$ cat kyagi_ew_bot.rb 
#!/usr/bin/ruby

$LOAD_PATH.push("/usr/lib/ruby/1.9.0/xmlrpc/")
require 'rubygems'
require 'twitter'

# 辞書ファイル
dict="/home/kyagi/prv/english/dict.org"

# ポストする間隔
period=600

# アカウント名とパスワード
username='Twitter アカウント'
password='Twitter アカウントのパスワード'

httpauth = Twitter::HTTPAuth.new(username, password)
client = Twitter::Base.new(httpauth)

File.open(dict) do |file|
  # org-mode の英単語帳のフォーマットに合わせてちょっとだけパースする
  while line = file.gets
    if (line =~ /\*/)
      header = line.split(/ /)
      message = header[1 .. -2]

      line = file.gets
      message.push(line)
      message.push(header[-1])

      client.update(message.join.to_s)
      sleep period
    end
  end
end
$ ruby kyagi_ew_bot.rb

■単語帳ファイル

$ head /home/kyagi/prv/english/dict.org 
* tied up                                                          :20090624:
  - She is so tied up with work that she can't go out for lunch.

* skyscraper                                                       :20090624:
  - There are numerous skyscrapers along the high way.

* pull together                                                    :20090621:
  - By pulling together, they were able to finish the work.

* regime                                                           :20090621:

■動作確認
kyagi_ew_botという新しい BOT用 のアカウントを作成してこの BOT プログラムから単語帳のエントリを 10 分間隔で流すようにしています。メインのアカウントからこのアカウントをフォローすれば完了です。これで自分で作成した英単語を Twitter を通して復習できるようになりました。とても便利で気に入っています。(^^)

上の例では私の英単語帳のフォーマットをパース/加工して出力していますが、普通に「名言ファイル」を「一行一言」で作成すればそのまま puts すれば OK です。IO.readlines で配列に格納したあと rand などでランダムに出力を生成してもいいと思います。

■その他
$LOAD_PATH を追加しているのは base64.rb にパスを通すためです。以下のエラーが出たからです。デフォルトで /usr/lib/ruby/1.9.0 配下にはリカーシブで通っているかなと思うと違うみたいです。

$ ruby kyagi_ew_bot.rb
/var/lib/gems/1.9.0/gems/oauth-0.3.6/lib/oauth/helper.rb:2:in `require': no such file to load -- base64 (LoadError)
(...snip...)
$ ruby -e '$LOAD_PATH.each do |x| puts x; end' | grep '/usr/lib/'
/usr/lib/ruby/vendor_ruby/1.9.0
/usr/lib/ruby/vendor_ruby/1.9.0/i486-linux
/usr/lib/ruby/vendor_ruby
/usr/lib/ruby/1.9.0
/usr/lib/ruby/1.9.0/i486-linux
/usr/lib/ruby/1.9/i386-linux