読者です 読者をやめる 読者になる 読者になる

アパくんのホテル

プログラミング関連のメモ

amazon-ecsでAmazonProductAdvertisingAPIをゴニョゴニョした

amazon-ecsってなに

 前の記事でnokogiriをインストールしたときにamazon-ecsの話をしました。

刃物の秋だしNokogiriをインストールしてみる - アパくんのホテル

で今回はそのamazon-ecsのお話です。詳細はこちらで。

GitHub - jugend/amazon-ecs: Ruby Amazon Product Advertising API

AmazonProduct Advertising APIRubyから簡単に扱えるようにしてくれるGemですー。

書くこと

 今回は書籍名で検索して、結果をコマンドラインに表示させてみようと思います。

  1. APIを呼び出す
  2. 検索する
  3. いろいろなレスポンス
  4. エラーでムムム顔

こんな感じでいきまーす。

APIを呼び出す

 まずはamazon-ecsを読み込みまーす。

require 'amazon/ecs'

そしたらAPIの設定を書いていきます。"Your〜"のところは自分のものに書き換えてくださいね。

Amazon::Ecs.options = {
          :associate_tag => 'YourAssociateTag',
          :AWS_access_key_id => 'YourAccessKey',
          :AWS_secret_key => 'YourSercretKey'
}

ちなみにamazon-ecsじゃなくてProductAdvertisingの話なんですが、IAMっていう子アカウントみたいなやつのkeyは使えないので、ルートアカウントのものを使ってくださいね。ヘッダーにある自分のアカウント名のプルダウンメニューからSecurity Credentialsを踏めば、その先でルートアカウントのkeyが確認できると思います。
 全体像はこんな感じ。

require 'amazon/ecs'

Amazon::Ecs.options = {
          :associate_tag => 'YourAssociateTag',
          :AWS_access_key_id => 'YourAccessKey',
          :AWS_secret_key => 'YourSercretKey'
}

 これで準備は完了〜。

検索する

 お次は検索してくところですね。まずはタイトルで検索して、

  1. タイトル
  2. 著者
  3. 出版社
  4. 商品ページのurl

を返してくれる感じにしようと思います。「よくわかる分子生物学の基本としくみ」で検索したいので、データを持ってくる手はずを整えて…

res = Amazon::Ecs.item_search('よくわかる分子生物学の基本としくみ', :response_group => "ItemAttributes", :country => 'jp')

putsで表示させます。

res.items.each do |item|
    puts item.get('ItemAttributes/Title')
    puts "著者:#{item.get('ItemAttributes/Author')}"
    puts "出版社:#{item.get('ItemAttributes/Publisher')}"
    puts "商品ページ:http://www.amazon.co.jp/dp/#{item.get('ASIN')}?tag=#YourAssociateTag"
end

商品ページのurlは、ASIN(商品の識別数字列?)をもらってきて無理やり作ってます。'YourAssociateTag'には自分のに書き換えてくださいね。全体像はこんな感じ。

require 'amazon/ecs'

Amazon::Ecs.options = {
          :associate_tag => 'YourAssociateTag',
          :AWS_access_key_id => 'YourAccessKey',
          :AWS_secret_key => 'YourSercretKey'
}

res.items.each do |item|
    puts item.get('ItemAttributes/Title')
    puts "著者:#{item.get('ItemAttributes/Author')}"
    puts "出版社:#{item.get('ItemAttributes/Publisher')}"
    puts "商品ページ:http://www.amazon.co.jp/dp/#{item.get('ASIN')}?tag=#YourAssociateTag"
end

例えばこんな感じに結果が得られると思います。

$ bundle exec ruby blog_code.rb 
図解入門 よくわかる分子生物学の基本としくみ (メディカルサイエンスシリーズ)
著者:井出 利憲
出版社:秀和システム
商品ページ:http://www.amazon.co.jp/dp/4798018309?tag=#YourAssociateTag

わーいできたヽ(´▽`)ノ

いろいろなレスポンス

 今回扱ったProductAdvertisingAPI、他にもいろんな商品情報を取得できます。例えば

  1. 中古最安価格
  2. 中古出品数
  3. 新品価格
  4. 新品出品数

とかとか。でこのとき重要になるのがAmazon::Ecs.item_search('よくわかる分子生物学', :response_group => "ItemAttributes", :country => 'jp')response_groupのとこ。各レスポンスごとに親要素とかが違うので、ここを正しく指定してあげないと欲しいデータが返ってきません。例えばこんな感じに書いてあげるといいですね。

res = Amazon::Ecs.item_search('よくわかる分子生物学の基本としくみ', :response_group => "ItemAttributes, OfferSummary", :country => 'jp')

res.items.each do |item|
    puts item.get('ItemAttributes/Title')
    puts "中古最安価格:#{item.get('OfferSummary/LowestUsedPrice/Amount')}"
    puts "中古出品数:#{item.get('OfferSummary/TotalUsed')}"
    puts "新品価格:#{item.get('ItemAttributes/ListPrice/Amount')}"
    puts "新品出品数:#{item.get('OfferSummary/TotalNew')}"
end

ちなみにレスポンスの要素とかはProduct Advertising APIのドキュメントを参考にしてください。僕は読んでもあんまりわからんかったんですけど…

エラーでムムム

 最後はエラーの話。とってもムムムなんですが、このAPI叩いてるとときどき以下のようなエラーをいただきます。

$ bundle exec ruby blog_code.rb 
/vagrant/ruby_projects/amazon_product_advertising_test/vender/bundle/ruby/2.1.0/gems/amazon-ecs-2.2.5/lib/amazon/ecs.rb:130:in `send_request': HTTP Response: 503 Service Unavailable (Amazon::RequestError)
  from /vagrant/ruby_projects/amazon_product_advertising_test/vender/bundle/ruby/2.1.0/gems/amazon-ecs-2.2.5/lib/amazon/ecs.rb:99:in `item_search'
   from blog_code.rb:9:in `<main>'

えと、こういうエラーが出た時は再度実行していただければ上手く動くと思います。HTTPのステータスコード503が返ってきてることからもわかるように、サーバ側のエラーみたいですね。ProductAdvertisingAPIサーバがいけないので僕は知りません。(…時間があったら調べてみようと思います!)

 今回はここまで!今はsinatraamazon-ecsイジイジして本を検索するwebアプリ作ってみたりしています。Amazon公式より情報少ないから、目当ての本のコスト調べたい時とかはちょっと捗りますよ。