ヤフオクの入札状況をTwitterで実況するBOTを作ってみる(1)


 ある平日の朝、始業時間前に出社してトイレに行っていた私にメッセで

(09時43分01秒) ○○○@帰東京: ちょっと聞きたいんだが
(09時43分46秒) ○○○@帰東京: ヤフオクの入札履歴をブログで表示するようなのって自作って難しい?

と送ってきたヤツがいた。そう、ヤツだ…… 自分をヤフオクに出したというチャレンジャー、大住有だった。

 まず簡単な要件だけまとめた。

  • 稼働するのはオークション終了までの最大7日間 + 自動延長分。
  • 入札状況をトラッキングするのは指定のオークションID1件のみ。
  • tweetするアカウントは固定。
  • cronで1分に1回起動。

使い捨てBOTなので、いかに実装が楽かを主眼にRubyで実装することにした。OAuth経由でtweetするには、OAuthが必要になる。これはgemとかemergeすればokだろう。

 まず、TwitterにBOTを登録する必要がある。http://twitter.com/apps/ から必要事項を記入して登録する。ここで登録した名前が各tweetで表示されるアプリケーション名になる。登録が完了したら、Consumer keyとConsumer secretが発行される。これはOAuthに必要となる。

 次に、Access tokenとAccess secretを取得する。これはtweetするアカウントごとに必要になるが、今回は1アカウントにのみtweetするので取得してしまう。irbから

irb(main):001:0> require 'rubygems'
=> false
irb(main):002:0> require 'oauth'
=> true
irb(main):003:0> consumer = OAuth::Consumer.new('[Consumer key]', '[Consumer secret]', :site => 'http://twitter.com')
=> #<OAuth::Consumer:0x7f8d6992da58 〜>
irb(main):004:0> request_token = consumer.get_request_token
=> #<OAuth::RequestToken:0x7f8d6991d130 〜>
irb(main):005:0> puts request_token.authorize_url
http://twitter.com/oauth/authorize?oauth_token=〜
=> nil

 以上で、認証画面へのURLが表示される。なお、GentooのRubyだと環境変数にRUBYOPT=-rauto_gemがセットされているのでrequire 'rubygems'は不要だが、環境変数がセットされていないcron経由の実行だと必要になって割と嵌ってしまうので気をつけた方がいい。

 BOTでtweetするアカウントにログインした後でURLを開くと、認証画面が表示される。

twitter_oauth_grant.png

ここで「許可する」を押下すると、数字が表示される。これがoauth_verifierになる。

twitter_oauth_granted.png

 この数字を使って、Access tokenとAccess secretを取得する。

irb(main):006:0> access_token = request_token.get_access_token(:oauth_verifier => '4747424')
=> #<OAuth::AccessToken:0x7f8d69903eb0 〜>
irb(main):007:0> p access_token.token
"dummy-l4JYWCiTiA2skjDt1hxdQYkCujMrA1swkCqyq26T0"
=> nil
irb(main):008:0> p access_token.secret "dummy1syyyz7akmjiNyn2sdIABXAuGwYd1U4aaisO19qkU" => nil

 Access tokenとAccess secretは再取得できないので、どこかしら第三者に漏れないところにメモしておく必要がある。

 以上で、OAuth経由でtweetする準備ができた。irb経由で正しくtweetできるか確認してみる。既にAccess tokenインスタンスがいるが、実際のbotでの仕様に備え、敢えてインスタンスを再生成してtweetしてみる。

irb(main):009:0> token = OAuth::AccessToken.new(consumer, '[Access token]', '[Access key]')
=> #<OAuth::AccessToken:0x7f45c9916340 〜>
irb(main):010:0> token.post('/statuses/update.json', :status => 'hogehoge')
=> #<Net::HTTPOK 200 OK readbody=true>

 200 OKが返ってくればtweetできているはず。

 次回以降に、ヤフオクAPIから入札履歴を取得して実際にtweetする部分を紹介したい。