2011/01/20

ニンテンドー3DSの予約状況をTweetするBot:@Amazon3DSを作った

本日、ニンテンドー3DSの予約が始まりましたね!我が家では先日DSi LLを購入したばかりなので、3DSの購入予定は無いのですが、お祭り騒ぎには乗じたい!ということで、Amazon.co.jpでのニンテンドー3DSの予約状況をTweetするBotを作りました。

@Amazon3DS

Amazon Web ServicesのProduct Advertising APIを使いたいが為に作ったようなものなので、将来的には潰しちゃうかもだけど。


まず、Amazon Web Servicesを使う為には、アカウントを作成する必要があります。http://aws.amazon.com/jp/から新規にアカウント開設を行い、「アクセス証明書」ページから「アクセスキーID」と「シークレットアクセスキー」を取得します。

さて、RubyからAWSにアクセスする為には便利なgemパッケージがあります。amazon-ecsです。まずはこいつをインストール。
$ sudo gem install amzon-ecs

本体のソースは以下。amazon-ecsでニンテンドー3DSのASIN(本体2色なので2つ)から商品情報を取得、現在のステータス(availability)を抽出し、RubytterでTwitterにTweetしています。ステータスがnilの場合は「予約不可」とし、それ以外の場合はそのままTweetしますので、「近日発売 予約可」のようになるはずです(他の商品ではそうなったんだけど、3DSは未だ予約可になってないので...)
#!/usr/bin/ruby -Ku

require 'rubygems'
require 'oauth'
require 'rubytter'
require 'amazon/ecs'

# Amazon::Ecs.debug = true

Amazon::Ecs.options = {
  :aWS_access_key_id => ACCESS_KEY,
  :aWS_secret_key    => SECRET_KEY,
  :associate_tag     => "**********-22",
  :country           => :jp
}

res1 = Amazon::Ecs.item_lookup("B00457VVS4", {:response_group => 'Large'})
res2 = Amazon::Ecs.item_lookup("B00457VVRU", {:response_group => 'Large'})

title1,title2,status1,status2 = String.new

res1.items.each do |item|
  title1 = item.get('title')
  avail1 = item.get('availability')
  if avail1 == nil then
    status1 = "予約不可"
  else
    status1 = avail1
  end
end

res2.items.each do |item|
  title2 = item.get('title')
  avail2 = item.get('availability')
  if avail2 == nil then
    status2 = "予約不可"
  else
    status2 = avail2
  end
end

ntime = Time.now.strftime("%Y-%m-%d %H:%M:%S")
mess = "[#{ntime}] #{title1}が【#{status1}】、#{title2}が【#{status2}】だよ!"

# Twitter Post
consumer = OAuth::Consumer.new(
  CONSUMER_KEY,
  CONSUMER_SECRET,
  :site => 'http://twitter.com'
)

token = OAuth::AccessToken.new(
  consumer,
  ACCESS_TOKEN,
  ACCESS_SECRET
)

client = OAuthRubytter.new(token)
client.update(mess)

exit
amzon-ecsは他にも色々使い道がありそうなので、また何かネタを考えたいと思います。