amazon-ecsでAmazon Product Advertising APIを使ってみました

背景

漫画本を扱うアプリを作りたいな、と考えていて、そのための調査として、AmazonAPIはどんなことが出来るのかな、と調べてみました。

Rubyで使うためのgemを調べたらamazon-ecsというのが見つかったので、とりあえずそれを使いました。

触ったのは主に、商品検索関連です。

事前準備

AmazonAPIが使えるようにユーザ登録しておく必要があります。

このページから行いました。

リファレンス

書き方・使い方

接続するためのキーなどを登録

Amazon::Ecs.configure do |options|
  options[:AWS_access_key_id] = '[your access key]'
  options[:AWS_secret_key] = '[you secret key]'
  options[:associate_tag] = '[your associate tag]'
end

商品を検索する

item_searchというメソッドを使います。 APIリファレンス

検索対象は、何も設定しないとデフォルトはBookになるようです。

res = Amazon::Ecs.item_search(
  '', # Keyword検索の内容を入力します
  :title => '僕だけがいない街', # titleだけで調べたい場合にはこちらを
  :sort => 'titlerank', # 取得された結果(レスポンス)の中でのソート順になるので、注意が必要です
  :tag_sort => 'Name', # 取得される結果をソートします
  :browse_node => '2250738051', # 検索対象をより細かく設定したい場合に使います。この値はKindleストアです
  :country => 'jp'
)

注意事項としては、一度のitem_searchメソッドでレスポンスとして受け取れるのは、最大10個までなので、全ての結果を取得するには、:item_pageのパラメータを使って、複数回問い合わせる必要があるようです。

取得されたデータから値を抽出する

上記のような処理を行うとAmazon::Ecs.Responseクラスが結果として返されます。この中身はXMLになっているようですが、準備されているメソッドで欲しい情報を取得できます。

流れとしては、Amazon::Ecs.ResponseクラスからAmazon::Ecs.Elementクラスを取得して、Amazon::Ecs.Elementクラスのメソッドでタイトルなどの値が抽出できます

res.total_pages # 検索結果が全部で何ページ分あるのか確認できます
res.items.each do |item| # itemsメソッドで、Elementの配列が取得できます
  puts item.get('ASIN')  #Amazonの商品コードを取得
  puts item.get('ItemAttributes/Title') # タイトルを取得
  p item.get_hash # Elementの内容をHashに変えて処理できるようになります
end

商品IDから商品を検索する

item_search以外にもitem_lookupというメソッドがあります。 APIリファレンス

こちらは、商品IDから該当する商品情報を取得するのに便利です

使い方としては、第一引数にASIN(Amazon Standard Identification Number)を渡してあげれば良くて、Responseから先はitem_seachとほぼ同じ流れになります

asins = ['B00UGU4LF4','B010N2825O'] # ASINはカンマ区切りの文字列で最大10個まで渡せます
Amazon::Ecs.item_lookup(asins.join(','),:country => 'jp').items.each do |item|
  puts item.get('ItemAttributes')
end

その他

item_searchitem_lookup:countryというオプションを使っていますが、このオプションはAPIリファレンスには無いものです。

amazon-ecsとして、リクエストを投げるURLを決めるのに使うようなのですが、APIリファレンスに無いために、私はよく書き忘れてしまいます。。。

対策として、最初のconfigureoptions[:country] = 'jp'と書いてしまえば、毎回書く必要は無くなります。(何もしないとデフォルトはusになっているようです)