sifue's blog

プログラマな二児の父の日常

Oauth認証できるRuby製TwitterBotプログラムの設置方法

  • 機能について

ここで紹介するtwitterボットプログラムは、Oauthを使って認証し、XMLでつぶやき・返信コンテンツを編集できるrubyのプログラムです。Unix系のcronやWindows系のタスクで動かすことを想定しています。


ちなみに具体的な実装の説明は
http://d.hatena.ne.jp/sifue/20100125/1264394021
こちら。こっちにソースを載せてます。


機能は以下の通り

  • post.xmlからつぶやく
  • フォローしている人をフォローし返す
  • 新たにフォローしてくれた人に、welcome.xmlからウェルカムポストを実行する
  • 自分への返信にキーワードがあるか解析してreply_for_me.xmlから返信する
  • 自分がフォローしている人のポストにキーワードがあるか解析してreply.xmlから返信する
  • xmlからはランダムまたはポスト回数の少ない最後のポストのどちらかを選べる
  • Oauthのアプリケーション登録からfrom◯◯のアプリケーション名を編集できる
  • 返信元が参照できる形でポストする
  • #user_name#をユーザー名、#date#を今日の◯月◯日、#time#を今の◯時◯分に置換する
  • ポストの日時とポスト回数がxml内に記録される
  • XMLのキーワードは上から優先して返信され、一度返信されたポストには返信しない
  • 自分宛のメッセージの返信のキーワードを''(空文字)にすると必ず返す

となっています。


その他にも

  • フォロー外された人を外し返す
  • 自分への返信をお気に入りに登録する

という機能もありますが、ボットへのフォロー、人のボット間会話をできるだけ早く流すなどの観点からコメントアウトしてあります。復活させたい人は#でしてあるコメントアウトをはずして使ってください。


ダウンロードは、

https://github.com/sifue/twitter_oauth_bot

からどうぞ。


一応動いているサンプルは、

aisha_bot
http://twitter.com/aisha_bot

です。ダウンロードしたものには、このサンプルのコンテンツが丸々同梱してあります。


ダウンロード後、思い思いの場所に解凍して使ってください。

  • 環境準備

比較的簡単に自宅サーバーの立てれるUbuntu8.04で実行する場合を例に書きますが、Windowsでも、Macでも問題なく動きます。ちなみにLinuxでやる場合は、Ubuntuおすすめです。Redhat系のFedoraCentOSはちょっとプロ向けでいろいろ設定大変です。ちなみに開発はMacOSX10.6.2とNetBeans6.8でやっています。

  • サーバーとは

あとサーバーって何?って方に説明ですが、サーバーとは24時間起動していてサービスを提供するコンピューターのことです。
サーバーレンタルしたり、自宅で24時間パソコン動かしたりしてれば立てられます。レンタルならレンタル費。自宅なら電気代や騒音、熱に悩まされます。
そのサーバーがあるという前提で進めていきます。

rubyは1.8.6と1.8.7で検証済ですのでどちらでも可です。
1.9系は試してみないと分かりません。Ubuntu8.04では、

$ sudo apt-get install ruby rdoc irb ruby1.8-dev rubygems libopenssl-ruby
$ sudo gem update --system
$ sudo apt-get remove rubygems
$ sudo ln -s /usr/bin/gem1.8 /usr/bin/gem
$ sudo gem install twitter


この流れでインストールすれば大丈夫です。以下のURLを参考にしましたが、他のOSでもいろいろググってみれば必ず準備できます。
http://neconnect.net/item/631


問題なくインストールできたようでしたら、設定手順に進みましょう。

  • 設定手順
  • 1. twitterのアカウントの取得

まずボットのためのtwitterアカウントを取得します。
ボットのためのメールアドレスを用意します。


そのメールアドレスを使って、twitterのアカウントは、
http://twitter.com/
から作成できます。


  • 2. アプリケーションの登録

アプリケーションの登録はログインの後、
http://twitter.com/oauth_clients
にアクセスすることで作成することができます。


ここでは、アイコン、アプリケーション名、説明、サイトが設定できます。


なお、ここで設定したアプリケーション名がポストの「Webから」と「API」からという部分に反映されます。好きな名前を設定しましょう。


その他の設定では、
Application Type:は、Clientを
Default Access type:は、Read & Writeを
Use Twitter for login:は、Yes, use Twitter for loginを
  それぞれ設定してください。


保存後、Consumer keyとConsumer secretを控えておいてください。
これを設定ファイルconf.ymlに入力することとなります。


  • 3. conf.ymlの編集

次に設定のためのconf.ymlの編集を行います。
このファイルはYAML形式なので、タブのインデントや順番、
スペースの間隔を崩さないように編集してください。

bot:
  ・login: twitterのユーザー名
  ・password: パスワード
  ・post_random: true(ランダムで内容選択)かfalse(回数少ない順)で投稿
  ・interval: 返信の間隔を秒で設定(1分は60、1時間は3600)
  ・oauth:
    ・consumer_key: アプリケーションの登録で取得したConsumer key
    ・consumer_secret: アプリケーションの登録で取得したConsumer secret

以上を設定します。

  • 4. アプリケーションの認証

プログラムのあるフォルダに移動して

$ ruby main_auth_request.rb

を実行します。


   すると、

以下のURLにアクセスしてアプリケーションを許可し、暗証番号を入力してください
http://twitter.com/oauth/authorize?oauth_token=XXXX
>


と、入力を求められますので、URLにアクセスの後、アプリケーションを許可し、表示された暗証番号を入力して、Enterキーを押してください。
すると自動的に、conf.ymlに許可された時に得られた、tokenとsecretが保存されます。


これで動かすことができますので、

$ ruby main_post.rb


で実際に動かしてみましょう。ちゃんとポストされましたか?
上手くいかない場合は、戻って一つ一つ設定しなおしてみましょう。


エラーログなんかをググってみても良いかもしれません。
うまくいったら自動実行のためのcronの設定です。

  • 5. 自動実行のためのcronの設定


プログラムは、post.xmlから通常のつぶやきを行うmain_post.rbとwelcome.xml、reply.xml、reply_for_me.xmlから、返信を行うmain_reply.rbの2種類があります。それらを自動実行するようにcronを設定します。

$ crontab -e


を実行した後、例えば常に◯時4分に実行させたいならmain_post.rbを以下のように設定

4 0-23/1 * * * ruby /home/username/ruby/aisha_bot/main_post.rb > /home/username/ruby/aisha_bot/main_post.log 2>&1


のように。逆に毎分main_reply.rbを実行させたいなら以下のように設定し

*/1 * * * * ruby /home/username/ruby/aisha_bot/main_reply.rb > /home/username/ruby/aisha_bot/main_reply.log 2>&1


conf.ymlのintervalの値も60としておきます。こうすることで、今後しっかり自動実行されるようになります。


なお、ここでは前回実行した分のログを残すように出力していますが、デバッグのために使うものなので普通に実行して問題ないようでしたらはずしてもよいかもしれません。


あと、Windowsでは、batファイルかvbsファイルでも作ってタスクで思うように実行させてみてください。


以上で自動設定は終了です。Botの設置お疲れ様でした。

  • コンテンツの編集について

プログラムと同じ階層にあるxmlファイルを編集することで投稿のバリエーションを増やすことができます。形式は、ダウンロードしたサンプルを参考にしてください。ちなみにこのサンプルプログラムでは、自分宛の解析を優先で、かつXMLの上のキーワードから優先に引っかかったものを返していきます。同じコメントには一度しか返信しないので、優先順位とかいろいろいじって良い方法を模索してみてください。空文字''をキーワードに設定すると必ず返信するので、自分宛の末尾などに設定すると良いかもしれません。


一応、XMLが崩れていないかなどを、FirefoxOperaIEなどのブラウザにドラックアンドドロップして調べてみてください。もし崩れていたら、おかしい場所を教えてくれます。便利。Safariは対応してません、残念。


ちなみに自分はシンタックスハイライトを使うためにWindowsでは秀丸Macでは、CotEditorのHTMLのカラーリングを使ってます。誤ってUTF-8以外の文字コードで保存してしまわないように注意が必要です。


あと有名な話ですが、twitterは1時間に150リクエストしかできませんので、返信などもしまくれないという事をご了承ください。うまくキャッシュを使ってますが、1分ごとに返信するようにすると、1時間の返信限界は87返信です。
では面白いBot作り、みなさまもチャレンジしてみてくださいね。