Railsで薬学ジャンルの本の情報を取得したかったので、その時の実装メモ。
RailsでAmazon Product Advertising APIを叩く
APIを叩く準備としては、大きく分けて『アクセスキーの取得』と『Railsの設定』の2つがある。
アクセスキーの取得
まずamazonアソシエイトに登録する。
次にEメールとパスワードを入力してログインする。
登録が終わると以下のような画面になるので、ヘッダーの『ツール』から『Product Advertising API』をクリックする。
『認証情報を追加』をクリック。
認証情報を追加すると
- APIアクセスキー
- シークレットキー
を取得できるのメモしておく。
次にトラッキングIDを取得する。
右上から『トラッキングIDの管理』をクリック。
そうすると、選択中のトラッキングIDが表示されているので、IDをメモしておく。
これでAPIを叩くために必要なキーの取得などは終わり。
Railsの設定
次はRails側の設定。
まずはvacuumというgemをインスールする。
# Gemfile gem 'vacuum', '~> 4.1'
bundle install vacuum
以上でAPIを叩く準備は整った。
Amazon Product Advertising APIで特定カテゴリの情報を取得する
特定のカテゴリの情報を取得するには、そのカテゴリのbrowseNodeIdを知る必要がある。
例えば、薬学の売れ筋本だと以下のURLに表示されている。
このbooksの後に続く500878という数字がbrowseNodeIdだ。
なので、取得したい商品のカテゴリーページに飛んで、各自でbrowseNodeIdを探す必要がある。
Amazon Product Advertising APIを叩く実装例
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
以下、簡単にコードの解説。
<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、ランキング、出版社の情報を抽出する。
イメージとしては↓みたいなレスポンスが返ってくる。
[{"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"=>"羊土社"} ]
<extract_authorメソッド>
商品データから著者の情報を抽出する
以上、おわり!