RailsでAmazon Product Advertising APIを叩いて特定カテゴリの商品情報を取得したい

2024/07/27に公開

Ruby on Railsで薬学ジャンルの本の情報を取得したかったので、その時の実装メモ。

RailsでAmazon Product Advertising APIを叩く下準備をする

Amazon Product Advertising APIを叩く準備としては、大きく分けて『アクセスキーの取得』と『Railsの設定』の2つがある。

まずamazonアソシエイトに登録する。

次にEメールとパスワードを入力してログインする。

登録が終わると以下のような画面になるので、ヘッダーの『ツール』から『Product Advertising API』をクリックする。

『認証情報を追加』をクリック。

認証情報を追加すると

  • APIアクセスキー
  • シークレットキー
    を取得できるのメモしておく。

次にトラッキングIDを取得する。
右上から『トラッキングIDの管理』をクリック。

そうすると、選択中のトラッキングIDが表示されているので、IDをメモしておく。

これでAPIを叩くために必要なキーの取得などは終わり。

RailsでAPIを叩く実装をする

次はRails側の設定。
まずはvacuumというgemをインストールする。

Gemfile
gem 'vacuum', '~> 4.1'
bundle install vacuum

特定のカテゴリの情報を取得するには、そのカテゴリのbrowseNodeIdを知る必要がある。
例えば、薬学の売れ筋本は以下のURLで表示されており、browseNodeIdは500878となる。
https://www.amazon.co.jp/gp/bestsellers/books/500878

なので、取得したい商品のカテゴリーページに飛んで、各自でbrowseNodeIdを見つける必要がある。

browseNodeIdを取得したら、以下のようにRubyで実装すればAPIを叩ける。
具体的にはAmazonTransfer.fetch_booksとターミナルで打ち込めば、本の情報を取得できる。

amazon_transafer.rb
class AmazonTransfer
  class << self 
   REGION = 'JP'.freeze
   BROWSE_NODE_ID = '500878' 
   RESOURCES = ['BrowseNodeInfo.WebsiteSalesRank', 'ItemInfo.ByLineInfo', 'Images.Primary.Medium', 'ItemInfo.Title', 'Offers.Listings.Price'].freeze 
 
    def client
      Vacuum.new(
        marketplace: REGION,
        access_key: ENV.fetch('AWS_ACCESS_KEY_ID', nil),
        secret_key: ENV.fetch('AWS_SECRET_ACCESS_KEY', nil),
        partner_tag: ENV.fetch('PARTNER_TAG', nil)
      )
    end

    def fetch_books
      res = client.search_items(browse_node_id: BROWSE_NODE_ID, resources: RESOURCES)
      extract_book_data(res.to_h['SearchResult']['Items'])
    end

    private

    def extract_book_data(books)
      books.map do |book|
        {
          'Title' => book.dig('ItemInfo', 'Title', 'DisplayValue'),
          'Price' => book.dig('Offers', 'Listings', 0, 'Price', 'Amount'),
          'DetailPageURL' => book['DetailPageURL'],
          'Author' => extract_author(book),
          'ImageUrl' => book.dig('Images', 'Primary', 'Medium', 'URL'),
          'SalesRank' => book.dig('BrowseNodeInfo', 'WebsiteSalesRank', 'SalesRank'),
          'Publisher' => book.dig('ItemInfo', 'ByLineInfo', 'Manufacturer', 'DisplayValue')
        }
      end
    end

    def extract_author(book)
      book.dig('ItemInfo', 'ByLineInfo', 'Contributors')
          .select { |c| c['RoleType'] == 'author' }
          .map { |a| a['Name'] }
    end
  end
end

実行すると、↓みたいなレスポンスが返ってくる。

[{"Title"=>"ユーキャンの登録販売者 速習テキスト&重要過去問題集 第3版【オールカラー&過去問200題収録】 (ユーキャンの資格試験シリーズ)",
  "Price"=>2310.0,
  "DetailPageURL"=>
   "https://www.amazon.co.jp/dp/4426614252?tag=tmykkt-22&linkCode=osi&th=1&psc=1",
  "Author"=>["ユーキャン 登録販売者試験研究会"],
  "ImageUrl"=>"https://m.media-amazon.com/images/I/61Cd14-WzmL._SL160_.jpg",
  "SalesRank"=>2827,
  "Publisher"=>"U-CAN"},
 {"Title"=>"治療薬ハンドブック2023 薬剤選択と処方のポイント",
  "Price"=>4840.0,
  "DetailPageURL"=>
   "https://www.amazon.co.jp/dp/4840754519?tag=tmykkt-22&linkCode=osi&th=1&psc=1",
  "Author"=>[],
  "ImageUrl"=>"https://m.media-amazon.com/images/I/41C-H97EOnL._SL160_.jpg",
  "SalesRank"=>4394,
  "Publisher"=>"じほう"},
 {"Title"=>"しくじり症例から学ぶ精神科の薬〜病棟で自信がもてる適切な薬の使い方を精神科エキスパートが教えます",
  "Price"=>3740.0,
  "DetailPageURL"=>
   "https://www.amazon.co.jp/dp/4758124043?tag=tmykkt-22&linkCode=osi&th=1&psc=1",
  "Author"=>["井上 真一郎"],
  "ImageUrl"=>"https://m.media-amazon.com/images/I/51Sbt+4OpkL._SL160_.jpg",
  "SalesRank"=>2949,
  "Publisher"=>"羊土社"}
]

以下、簡単にコードの解説。

<REGION と BROWSE_NODE_ID>
Amazon APIにリクエストを送る際に使用されるパラメータ。
REGIONは日本を指定するなら”JP”でOK。
BROWSE_NODE_IDは先ほども説明した通り、取得したい情報のカテゴリのこと。

<RESOURCES>
取得する商品情報を表すパラメータの配列。

今回は商品のWebサイト上でのランキング、著者などのベーシックな商品情報、商品のイメージ画像、タイトル、価格などの情報を取得する。

Amazon Product Advertising APIのリファレンスに詳細は書いてあるので、詳しくはそちらを参照してください。

<clientメソッド>
Vacuumというライブラリを使用して、AmazonのAPIクライアントを作成。
アクセスキー、シークレットキー、パートナータグは環境変数から取得する。

<fetch_booksメソッド>
clientを使って商品データを取得し、extract_book_dataメソッドで取得したデータを加工する。

<extract_book_dataメソッド>
取得した商品データから必要な情報を抽出してハッシュとして返す。
ここでは、タイトル、価格、詳細ページURL、著者、画像URL、ランキング、出版社の情報を抽出する。

以上、終わり。

Discussion