2020年3月24日火曜日

PA-API5.0 を Ruby の vacuum というライブラリを使ってコールしてみた

概要

Product Advertising API 5.0 (PA-API5.0) を vacuum で試してみました
ちなみに amazon-ecs では 5.0 に対応しておらずコールすると HTTP Response: 503 Service Unavailable - AWS Access Key ID: AKIxxxxxxxxxxxxxxxxx. You are submitting requests too quickly. Please retry your requests at a slower rate. になってしまいます

環境

  • macOS 10.15.3
  • Ruby 2.6.2p47
  • vacuum 3.3.0

初期化する

まずは初期化します
初期化するには最低 3 つの認証情報が必要で「アクセスキー」「シークレットキー」「パートナーID」が必要になります
「パートナーID」はいろいろな値を設定できますが個人で使う分にはトラッキング ID を指定すれば OK です

require 'vacuum'

request = Vacuum.new(
  marketplace: 'jp',
  access_key: 'AKIxxxxxxxxxxxxxxxxxx',
  secret_key: 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx',
  partner_tag: 'store-99'
)

こんな感じで OK です
また marketplace は検索する国を選択できます
指定可能な国はこちらを参照してください

とりあえず検索してみる

初期化できたら検索してみましょう
search_items メソッドが簡単です

require 'vacuum'
require 'json'

request = Vacuum.new(
  marketplace: 'jp',
  access_key: 'AKIxxxxxxxxxxxxxxxxxx',
  secret_key: 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx',
  partner_tag: 'store-99'
)

response = request.search_items(title: '3Dプリンタ')
puts response.to_h.to_json

その名の通り title: を指定するとキーワードが含まれるタイトルの商品を取得します
結果はハッシュにすると扱いやすいです

単語で検索する

次に複数のキーワードで検索してみます
また API で取得する情報も指定したいと思います

require 'vacuum'
require 'json'

request = Vacuum.new(
  marketplace: 'jp',
  access_key: 'AKIxxxxxxxxxxxxxxxxxx',
  secret_key: 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx',
  partner_tag: 'store-99'
)

response = request.search_items(
  keywords: '3Dプリンタ',
  resources: %w[Images.Primary.Medium ItemInfo.Title]
)
puts response.to_h.to_json

複数のキーワードを指定する場合は keywords: を指定します
タイトル以外も検索対象になります
API でほしい情報を増やしたい場合は resources: を指定します
search_items メソッドで指定可能なリソースはこちらを参考にしてください

これで結果を取得すると画像 (Images) やタイトルの情報 (ItemInfo) が追加されています

{
  "SearchResult": {
    "Items": [
      {
        "ASIN": "B07KT611TM",
        "DetailPageURL": "https://www.amazon.co.jp/dp/B07KT611TM?tag=store-99&linkCode=osi&th=1&psc=1",
        "Images": {
          "Primary": {
            "Medium": {
              "Height": 160,
              "URL": "https://m.media-amazon.com/images/I/413w1hy-yIL._SL160_.jpg",
              "Width": 160
            }
          }
        },
        "ItemInfo": {
          "Title": {
            "DisplayValue": "3Dプリンタ 本体 完成品 小型 家庭用 3Dプリンター 組立て済み 軽量 コンパクト PLAフィラメント 造形サイズ
11×11×12.5cm 日本語マニュアル&日本語メニュー 初心者 (薄い青)",
            "Label": "Title",
            "Locale": "ja_JP"
          }
        }
      }
      ・・・

Items の長さは

どうやら一回の検索で上位 10 個まで取得できるようです

  • bundle exec ruby app.rb | jq . > log
  • cat log | jq '.SearchResult.Items|length'

=> 10

最大で 10 個のようで 1 から 10 までは変更可能ですが 10 以上は指定できないようです (ItemCount)

ソートしてみる

sort_by: を使います
指定可能なパラメータはこちらを参照してください

require 'vacuum'
require 'json'

request = Vacuum.new(
  marketplace: 'jp',
  access_key: 'AKIxxxxxxxxxxxxxxxxxx',
  secret_key: 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx',
  partner_tag: 'store-99'
)

response = request.search_items(
  keywords: '3Dプリンタ',
  resources: %w[Images.Primary.Medium ItemInfo.Title],
  sort_by: 'AvgCustomerReviews'
)
puts response.to_h.to_json

指定しない場合は Marketplace (jp) と SearchIndex (All) との組み合わせでいい感じに返してくれるようです
Featured などはランクが高い商品で並べ替えできるので使えそうです
というか何も指定しないと Featured と同じ挙動っぽいです

カテゴリを指定する

キーワード+カテゴリ検索はよく使うと思います
カテゴリを指定するには search_index: を使います
が指定する値を取得するには一旦 resources:SearchRefinements を指定して指定可能なカテゴリの一覧を取得する必要がありそうです

require 'vacuum'
require 'json'

request = Vacuum.new(
  marketplace: 'jp',
  access_key: 'AKIxxxxxxxxxxxxxxxxxx',
  secret_key: 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx',
  partner_tag: 'store-99'
)

response = request.search_items(
  keywords: '3Dプリンタ',
  resources: %w[Images.Primary.Medium ItemInfo.Title SearchRefinements],
)
puts response.to_h.to_json

すると以下のように検索対象だったカテゴリの一覧が取得できます

"SearchRefinements": {
  "SearchIndex": {
    "Bins": [
      {
        "DisplayName": "産業・研究開発用品",
        "Id": "Industrial"
      },
      {
        "DisplayName": "本",
        "Id": "Books"
      },
      {
        "DisplayName": "Kindleストア ",
        "Id": "KindleStore"
      },
      {
        "DisplayName": "パソコン・周辺機器",
        "Id": "Computers"
      },
      {
        "DisplayName": "ホーム&キッチン",
        "Id": "HomeAndKitchen"
      },
      {
        "DisplayName": "DIY・工具・ガーデン",
        "Id": "ToolsAndHomeImprovement"
      },
      {
        "DisplayName": "洋書",
        "Id": "ForeignBooks"
      },
      {
        "DisplayName": "家電&カメラ",
        "Id": "Electronics"
      },
      {
        "DisplayName": "文房具・オフィス用品",
        "Id": "OfficeProducts"
      },
      {
        "DisplayName": "おもちゃ",
        "Id": "Toys"
      },
      {
        "DisplayName": "ホビー",
        "Id": "Hobbies"
      },
      {
        "DisplayName": "Android アプリ",
        "Id": "MobileApps"
      },
      {
        "DisplayName": "その他すべて",
        "Id": "EverythingElse"
      },
      {
        "DisplayName": "ビューティー",
        "Id": "Beauty"
      },
      {
        "DisplayName": "服&ファッション小物",
        "Id": "Apparel"
      },
      {
        "DisplayName": "ドラッグストア",
        "Id": "HealthPersonalCare"
      },
      {
        "DisplayName": "車&バイク",
        "Id": "Automotive"
      },
      {
        "DisplayName": "大型家電",
        "Id": "Appliances"
      },
      {
        "DisplayName": "スポーツ&アウトドア",
        "Id": "SportsAndOutdoors"
      },
      {
        "DisplayName": "ベビー&マタニティ",
        "Id": "Baby"
      },
      {
        "DisplayName": "シューズ&バッグ",
        "Id": "Shoes"
      },
      {
        "DisplayName": "ジュエリー",
        "Id": "Jewelry"
      },
      {
        "DisplayName": "ペット用品",
        "Id": "PetSupplies"
      },
      {
        "DisplayName": "デジタルミュージック",
        "Id": "DigitalMusic"
      },
      {
        "DisplayName": "TVゲーム",
        "Id": "VideoGames"
      },
      {
        "DisplayName": "楽器",
        "Id": "MusicalInstruments"
      },
      {
        "DisplayName": "PCソフト",
        "Id": "Software"
      }
    ],
    "DisplayName": "カテゴリー",
    "Id": "SearchIndex"
  }
}

これで取得できた Id の部分を指定することで検索時にカテゴリを指定することができます

require 'vacuum'
require 'json'

request = Vacuum.new(
  marketplace: 'jp',
  access_key: 'AKIxxxxxxxxxxxxxxxxxx',
  secret_key: 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx',
  partner_tag: 'store-99'
)

response = request.search_items(
  keywords: '3Dプリンタ',
  resources: %w[Images.Primary.Medium ItemInfo.Title SearchRefinements],
  search_index: 'Industrial'
)
puts response.to_h.to_json

2 ページ目を取得する

1 - 10 件目がデフォルトで取得できますが 11 - 20 件目は item_page: を指定します

require 'vacuum'
require 'json'

request = Vacuum.new(
  marketplace: 'jp',
  access_key: 'AKIxxxxxxxxxxxxxxxxxx',
  secret_key: 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx',
  partner_tag: 'store-99'
)

response = request.search_items(
  keywords: '3Dプリンタ',
  resources: %w[Images.Primary.Medium ItemInfo.Title],
  item_page: 2
)
puts response.to_h.to_json

最後に

vacuum というライブラリを使って PA-API5.0 をコールしてみました
4.0 は完全に使えなくなり 5.0 になっているので 503 エラーが出る人は 5.0 に移行できているか確認しましょう
また 5.0 からいろいろと仕様が変更されており Amazon Product Advertising API は Amazon アフィリエイトで売上がある程度あるアカウントでないと使えなくなっているようです
細かい仕様はわかりませんが単純に登録してすぐは API が使えないようです

まぁ確かに売り上げがないアカウントに API を提供しても効果はなさそうなので間違っていない気はしますが、、
一応問い合わせすることができるのでコール時にエラーになる人は問い合わせてみるのも手かもしれません

参考サイト

0 件のコメント:

コメントを投稿