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


 前回に引き続いて、ヤフオクの入札履歴を取得してTwitterにtweetするbot作成の続き。今回はヤフオクから入札履歴を取得する部分について触れる。

 前提として、Yahoo!アカウントにログインしていない状態では完全な文字列を取得できない最終入札者情報については、本体で表示されるのと同等に一部マスクされた状態(abc******など)で取得するものとする。

 ヤフオクAPIについては、デベロッパーネットワークに詳細な資料がある。今回は入札履歴のみ取得すればいいのだが、まずアプリケーションIDを取得する必要がある。こちらから登録すれば取得できるが、今回は各Yahoo!アカウント固有の何か(入札履歴etc.)にアクセスする必要はないので、OAuthは不要となる。

 アプリケーションIDがー発行されたら、まず

http://auctions.yahooapis.jp/AuctionWebService/V1/BidHistory?appid=[アプリケーションID]&auctionID=#[オークションID]

でアクセスしてみて、XMLが正しく返ってくるかを確認する。

 さて、取得したXMLをどうやってパースするかだが、今回はNokogiriでパースすることにした。一時期はHpricotがよく使われていたが、Nokogiriのほうがパフォーマンスが高いこと、そして何よりもメンテナが失踪していないことが重要だと思う。

 取得されたHTMLは、<result>要素の中に<(bidder|price|date)>要素として入札者、入札価格、入札時刻が保存されている。Nokogiriの使い方は基本的にHpricotと同じなので、

require 'nokogiri'
parser = Nokogiri(http_get)
bidder = nil
price  = nil
date   = nil
(parser/:Result).each do |xml|
bidder = (xml/:Bidder).text
price  = (xml/:Price).text.to_i
date   = Time.parse((xml/:Date).text)
break if (xml/:IsHighestBidder).text == 'true'
end

のようなコードで最高入札者が取得できる。

 ここで気を付けないといけないのは、ヤフオクには自動再入札が存在すること、出品者によって入札が削除される可能性があること。自動再入札の場合は、入札者・入札時刻は変わらずに入札価格だけが変化し、入札者が削除された場合は、価格が下がった上で入札者、入札時刻が変わる。なので、この3つを保存しておいて、現在の情報と過去の情報を比較し、

  1. 新しく入札があったか
  2. 自動再入札が発生したか
  3. 入札者が削除されたか

を判定する必要がある。

 次回以降で、tweetする部分を説明したい。