RailsでAmazon Product Advertising APIを叩いて特定カテゴリの商品情報を取得したい
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をインストールする。
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とターミナルで打ち込めば、本の情報を取得できる。
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