RubyでAmazonPA API5.0を利用する


AmazonのPAAPIが5.0になったことで、以前利用していたamazon-ecsが利用出来なくなった為、PA API5.0に対応するpaapiを利用し検索は出来たのですが、ASINからのデータ取得がエラーで動かなかった為、最終的にvacuumを利用することにしました。

ライブラリ名PA APIサポートVersionコメント
amazon-ecs4.xまで?現行Amazonでは利用できない模様。
paapi5.0商品名検索は出来るが、ASINからの検索が出来なかった。
vacuum5.0paapiのコメントで、「If this gem doesn’t meet your needs, try the Vacumm gem.」と記載あり。ASINからの検索もできた。

Ruby On Railsの場合には、Gemfileに以下を追記して、bundle install実行。rubyのみで利用する場合には、gem install vacuumを実行。

# railsの場合(Gemfileのあるディレクトリにて)
echo "gem 'vacuum'" >> ./Gemfile
bundle install

# Rubyのみの場合
gem install vacuum

PA API5.0を用いたvacuumによる検索方法

以下のように検索します。resourcesに設定している値は、Resources Partnerに記載のあるものを書きます。とりあえず、一般的な用途の場合、以下サンプルコード指定値で十分かと思います。

KEY = "AAAAAAAAAAAAAAAAAAAAAAAA" # 書き換えてください。
SECRET = "secret-secret-secret-secret-secret-secret" # 書き換えてください。
TAG = "****jp-22" # 書き換えてください。

# PA APIのリクエストを作成して帰す
def _request
    request = Vacuum.new(marketplace: 'JP',
                               access_key: KEY,
                               secret_key: SECRET,
                               partner_tag: TAG)
     
    # 必要に応じて有効化   
    #logger = Logger.new(STDOUT)
    #request.use(logging: {logger: logger})
    return request
end

# キーワード検索する
def search(keyword)
    request = _request
    response = request.search_items(
        keywords: keyword,
        resources: %w[Images.Primary.Large ItemInfo.Title ItemInfo.ProductInfo
                   Offers.Listings.Price ItemInfo.Features]
    )
    h = response.to_h
    return h["SearchResult"]["Items"]
 end

# ASINから、対象商品の値段を確認する。asinsはArrayで指定。
def price(asins)
    request = _request
    response = request.get_items(
        item_ids: asins,
        resources: %w[Offers.Listings.Price]
        )
    h = response.to_h
    return h["ItemsResult"]["Items"]
end

# 検索
k = search("WXR-6000AX12S")
p k

# ASINから値段の取得
k = price(['B08SQ9NFN3','B089GKYGBL'])
p k

上記検索結果

{"ASIN"=>"B08SQ9NFN3",
 "DetailPageURL"=>"https://www.amazon.co.jp/dp/B08SQ9NFN3?tag=****jp-22&linkCode=osi&th=1&psc=1",
 "Images"=>{"Primary"=>{"Large"=>{"Height"=>500, "URL"=>"https://m.media-amazon.com/images/I/41tPHtH+U1L._SL500_.jpg", "Width"=>500}}},
 "ItemInfo"=>
  {"Features"=>
    {"DisplayValues"=>
      ["【バッファロー Wi-Fi 6ルーター フラッグシップモデル】5GHz 8ストリーム+2.4GHz 4ストリームの計12ストリームで多台数接続時も高速かつ安定した通信を実現。また、2.2GHzクアッドコアCPUが高いパフォーマンスを引き出します。",
       "【バッファロー史上最速※のWi-Fi 6ルーター】新技術が反映されたことにより、従来規格よりももっと高速なWi-Fi機器の設計が可能になりました。速度は最大4803Mbps(理論値)で、従来の最上位機種WXR-2533DHP2(11ac世代)の最大1733Mbps(理論値)の約2.7倍も高速です。※2021年2月現在、バッファローのWi-Fiルーターの理論上の転送速度を比較。","割愛します"],
     "Label"=>"Features",
     "Locale"=>"ja_JP"},
   "ProductInfo"=>
    {"ItemDimensions"=>
      {"Height"=>{"DisplayValue"=>7.6771653465, "Label"=>"Height", "Locale"=>"ja_JP", "Unit"=>"インチ"},
       "Length"=>{"DisplayValue"=>2.9527559025, "Label"=>"Length", "Locale"=>"ja_JP", "Unit"=>"インチ"},
       "Weight"=>{"DisplayValue"=>3.4833037396, "Label"=>"Weight", "Locale"=>"ja_JP", "Unit"=>"ポンド"},
       "Width"=>{"DisplayValue"=>11.81102361, "Label"=>"Width", "Locale"=>"ja_JP", "Unit"=>"インチ"}},
     "ReleaseDate"=>{"DisplayValue"=>"2021-03-01T00:00:01Z", "Label"=>"ReleaseDate", "Locale"=>"en_US"},
   "Title"=>
    {"DisplayValue"=>
      "バッファロー WiFi ルーター無線LAN 最新規格 Wi-Fi6 11ax / 11ac AX6000 4803+1147Mbps 日本メーカー 【iPhone12/11/iPhone SE(第二世代)メーカー動作確認済み】WXR-6000AX12S/N",
     "Label"=>"Title",
     "Locale"=>"ja_JP"}},
 "Offers"=>
  {"Listings"=>
    [{"Id"=>"xxxxxxxxxxxxxxxxx",
      "Price"=>{"Amount"=>38280.0, "Currency"=>"JPY", "DisplayAmount"=>"¥38,280"},
      "ViolatesMAP"=>false}],
}}

個別の値書き出し

戻り値kに対して単純に中身を確認する方法。ループで回すなり、お好きな方法で取得して下さい。

## 検索結果から、表示したい箇所を見る。
# ASIN
k[0]["ASIN"]

# URL
k[0]["DetailPageURL"]

# Title
k[0]["ItemInfo"]["Title"]["DisplayValue"]

# LargeImageURL
k[0]["Images"]["Primary"]["Large"]["URL"]

# 説明文
k[0]["ItemInfo"]["Features"]["DisplayValues"].join("")

# ReleaseDate
k[0]["ItemInfo"]["ProductInfo"]["ReleaseDate"]["DisplayValue"]

# 価格
k[0]["Offers"]["Listings"][0]["Price"]["Amount"]

最後に

私の場合、Railsを使っての開発だったため、上記を適当なクラスに入れて、rails consoleして、戻り値を確認しながらコードを作りました。

タグ . ブックマークする パーマリンク.

コメントを残す

メールアドレスが公開されることはありません。

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください