*いしのなかにいる*

oops ! I am in rock !

【AmazonAPI】Rubyを使ってAmazonの在庫状況を取得する方法(Amazon Product Advertising API)

こんにちは!

ちょいと思い立ってAmazon Product Advertising APIの勉強を始めました。 後で読み返せるように、アプリを動かすまでの手順をまとめておきます。

前準備:Product Advertising API に登録する

Amazonアソシエイトの登録が必要

その後Product Advertising API の登録

コーディング始めるまで

情報が英語ばかりでさっぱりなのでググる シークレットアクセスキーの取得方法

環境構築

適当なフォルダにbundlerをインストール

$ gem install bundler
ERROR:  While executing gem ... (Errno::EACCES)
    Permission denied @ rb_sysopen - /Users/xxxx/.rbenv/versions/2.3.0/lib/ruby/gems/2.3.0/gems/bundler-1.11.2/.gitignore
    
$ sudo gem install bundler
Password:
Successfully installed bundler-1.11.2
1 gem installed

もちろん権限が必要です。

Gemfileを作成

$ vim Gemfile

「i」キーを押して以下の内容を記述

source 'http://rubygems.org'
gem 'amazon-ecs'

「esc」キーを押してから 「:wq」 を入力して enter

amazon/ecs をインストールする

$ bundle install --path vendor/bundle


Fetching gem metadata from http://rubygems.org/..........


Fetching version metadata from http://rubygems.org/..


Resolving dependencies...
Installing mini_portile2 2.0.0
Installing ruby-hmac 0.4.0
Using bundler 1.11.2
Installing nokogiri 1.6.7.2 with native extensions
Installing amazon-ecs 2.4.0
Bundle complete! 1 Gemfile dependency, 5 gems now installed.
Bundled gems are installed into ./vendor/bundle.

商品検索のサンプルコード

require 'rubygems'
require 'amazon/ecs'
require 'active_support/core_ext'  # 検索結果のハッシュを整形する
require 'pp'

# 初期設定
Amazon::Ecs.configure do |options|
  options[:AWS_access_key_id] = 'AWS_ACCESS_KEY'             # 必須(AWS_ACCESS_KEY)
  options[:AWS_secret_key]    = 'AWS_SECRET_ACCESS_KEY'      # 必須(AWS_SECRET_ACCESS_KEY)
  options[:associate_tag]     = '****-22'                    # 必須(トラッキングID)
  options[:search_index]      = 'Books'                      # 商品種別
  options[:response_group]    = 'ItemAttributes'
  options[:country]           = 'jp'                         # 国
end

# 検索
xml = Amazon::Ecs.item_search('Rubyによるクローラー開発技法').doc.to_s    # 検索する文言を指定して検索 
# 検索結果のハッシュを整形
result = Hash.from_xml(xml).with_indifferent_access[:ItemSearchResponse]

検索実行

$ bundle exec ruby sample.rb
~~~省略~~~
 "Items"=>
  {"Request"=>
    {"IsValid"=>"True",
     "ItemSearchRequest"=>
      {"Keywords"=>"Rubyによるクローラー開発技法",
       "ResponseGroup"=>"ItemAttributes",
       "SearchIndex"=>"Books"}},
   "TotalResults"=>"3",
   "TotalPages"=>"1",
   "MoreSearchResultsUrl"=>
    "http://www.amazon.co.jp/gp/redirect.html?linkCode=xm2&SubscriptionId=AKIAIU5MOE4UE466LMXA&location=http%3A%2F%2Fwww.amazon.co.jp%2Fgp%2Fsearch%3Fkeywords%3DRuby%25E3%2581%25AB%25E3%2582%2588%25E3%2582%258B%25E3%2582%25AF%25E3%2583%25AD%25E3%2583%25BC%25E3%2583%25A9%25E3%2583%25BC%25E9%2596%258B%25E7%2599%25BA%25E6%258A%2580%25E6%25B3%2595%26url%3Dsearch-alias%253Dbooks-single-index&tag=re-minder-22&creative=5143&camp=2025",
   "Item"=>
    [{"ASIN"=>"4797380357",
      "DetailPageURL"=>
       "http://www.amazon.co.jp/Ruby%E3%81%AB%E3%82%88%E3%82%8B%E3%82%AF%E3%83%AD%E3%83%BC%E3%83%A9%E3%83%BC%E9%96%8B%E7%99%BA%E6%8A%80%E6%B3%95-%E5%B7%A1%E5%9B%9E%E3%83%BB%E8%A7%A3%E6%9E%90%E6%A9%9F%E8%83%BD%E3%81%AE%E5%AE%9F%E8%A3%85%E3%81%A821%E3%81%AE%E9%81%8B%E7%94%A8%E4%BE%8B-%E4%BD%90%E3%80%85%E6%9C%A8-%E6%8B%93%E9%83%8E/dp/4797380357%3FSubscriptionId%3DAKIAIU5MOE4UE466LMXA%26tag%3Dre-minder-22%26linkCode%3Dxm2%26camp%3D2025%26creative%3D165953%26creativeASIN%3D4797380357",
      "ItemLinks"=>
       {"ItemLink"=>
         [{"Description"=>"Add To Wishlist",
           "URL"=>
            "http://www.amazon.co.jp/gp/registry/wishlist/add-item.html%3Fasin.0%3D4797380357%26SubscriptionId%3DAKIAIU5MOE4UE466LMXA%26tag%3Dre-minder-22%26linkCode%3Dxm2%26camp%3D2025%26creative%3D5143%26creativeASIN%3D4797380357"},
          {"Description"=>"Tell A Friend",
           "URL"=>
            "http://www.amazon.co.jp/gp/pdp/taf/4797380357%3FSubscriptionId%3DAKIAIU5MOE4UE466LMXA%26tag%3Dre-minder-22%26linkCode%3Dxm2%26camp%3D2025%26creative%3D5143%26creativeASIN%3D4797380357"},
          {"Description"=>"All Customer Reviews",
           "URL"=>
            "http://www.amazon.co.jp/review/product/4797380357%3FSubscriptionId%3DAKIAIU5MOE4UE466LMXA%26tag%3Dre-minder-22%26linkCode%3Dxm2%26camp%3D2025%26creative%3D5143%26creativeASIN%3D4797380357"},
          {"Description"=>"All Offers",
           "URL"=>
            "http://www.amazon.co.jp/gp/offer-listing/4797380357%3FSubscriptionId%3DAKIAIU5MOE4UE466LMXA%26tag%3Dre-minder-22%26linkCode%3Dxm2%26camp%3D2025%26creative%3D5143%26creativeASIN%3D4797380357"}]},
      "ItemAttributes"=>
       {"Author"=>["佐々木 拓郎", "るびきち"],
        "Binding"=>"単行本",
        "EAN"=>"9784797380354",
        "EANList"=>{"EANListElement"=>"9784797380354"},
        "IsAdultProduct"=>"0",
        "ISBN"=>"4797380357",
        "Label"=>"SBクリエイティブ",
        "Languages"=>
         {"Language"=>
           [{"Name"=>"日本語", "Type"=>"Published"},
            {"Name"=>"日本語", "Type"=>"Unknown"}]},
        "ListPrice"=>
         {"Amount"=>"3218",
          "CurrencyCode"=>"JPY",
          "FormattedPrice"=>"¥ 3,218"},
        "Manufacturer"=>"SBクリエイティブ",
        "NumberOfPages"=>"448",
        "PackageDimensions"=>
         {"Height"=>"110", "Length"=>"827", "Weight"=>"137", "Width"=>"583"},
        "ProductGroup"=>"Book",
        "ProductTypeName"=>"ABIS_BOOK",
        "PublicationDate"=>"2014-08-22",
        "Publisher"=>"SBクリエイティブ",
        "Studio"=>"SBクリエイティブ",
        "Title"=>"Rubyによるクローラー開発技法 巡回・解析機能の実装と21の運用例"}},
~~~省略~~~

こんな感じで取得できます。 あとはお好みの情報だけ抽出して、DBに登録するなりしましょう。

検索結果を1件ずつ取得

一回のAPI実行で10件取得できるで、ループして各商品情報を取得しましょう。

result[:Items][:Item].each do |item|
  #  pp "商品名称   : #{item[:ItemAttributes][:Title]}"
  #  pp "価格       : #{item[:ItemAttributes][:ListPrice][:Amount]}"
  #  pp "商品URL    : #{item[:DetailPageURL]}"
  #  pp "画像URL    : #{item[:MediumImage][:URL] if item[:MediumImage].present?}"
  #  pp "Platform   : #{item[:ItemAttributes][:Platform]}"
  #  pp "メーカー   : #{item[:ItemAttributes][:Label]}"
  #  pp "販売者     : #{item[:ItemAttributes][:Publisher]}"
  #  pp "商品種別   : #{item[:ItemAttributes][:Binding]}"
  #  pp "発売日     : #{item[:ItemAttributes][:ReleaseDate]}"
end

検索結果が多い(10件を超える)場合は

件数が多い場合は複数回APIを実行する必要があります。
(100件まで検索結果を取得可能なので最大10回)

そんな場合はAPI呼び出しの外側にループを組みましょう。

[*1..10].each do |page|
  xml = Amazon::Ecs.item_search(platform, search_index: 'Books', item_page: page).doc.to_s
  # 何か処理
end

最後に

今の所こんな感じに使用しています。

Amazonの在庫情報をもとに商品を紹介するなど、Amazonアソシエイトの使い方が広がりそうですよね。 今後もAmazonAPIの色々な機能を試してみようと思います。