積読ハウマッチでAmazonのPAAPIを使っているけど、
v4が2020年3月9日に利用できなくなるため、移行してみたときの備忘録。
Amazon側の移行手順
公式の移行手順を参考に進める感じ。
ステップ1: 新しい認証情報を取得する
認証情報の形式が古いと払い出しが必要らしい
いままで使っていたアクセスキーとシークレットキーでOKだったのでスキップ
ステップ2: PA-API 5.0を試してみる
以前と同様、Scratchpadが用意されている。
アクセスキーがOKだったかも、ここで確認した。
・Product Advertising API 5.0 Scratchpad
ステップ3: 必要な知識を得る
公式ドキュメントにも書いてあるとおり、レスポンスがXMLからJSONになったらしい。
変更点は、ここにまとまっている。
主には、セキュリティ強化、レスポンス速度の改善、新しいAPIの追加など。
また、レスポンスに関してv4からv5へのマッピングも用意されてる。
・PA-API 4.0 to 5.0 Mapping · Product Advertising API 5.0
ステップ4: PA-API 5.0を導入する
従来どおり、Web APIを直接叩けるけど、SDKも提供されている。
言語は、Java / Node.js / PHP / Pythonの4つ。サンプルもある。
・Using SDK · Product Advertising API 5.0
ただ、残念なことに、Node.jsのSDKは、zipで公開されている...
ソース側の移行手順
SDKを配置
zipをダウンロードして展開するとこんな感じになってる。
src配下がAPIなので、自分のソースに配置。
dependencyがあるので、それもコピペして、npm i
する
"dependencies": { "superagent": "3.5.2", "crypto-js": "^3.1.9-1" },
APIの呼び出し
解答したzipにサンプルがあるので、それを見ながら実装していく。
使っているのは検索なので、sampleSearchItemsApi.js
を参照。
以下は、サンプルの抜粋
// ** API Clientの準備 var ProductAdvertisingAPIv1 = require('./src/index'); var defaultClient = ProductAdvertisingAPIv1.ApiClient.instance; // アクセスキーなどを設定。ホストとかリージョンは、以下を参照 // https://webservices.amazon.com/paapi5/documentation/common-request-parameters.html#host-and-region defaultClient.accessKey = '<YOUR ACCESS KEY>'; defaultClient.secretKey = '<YOUR SECRET KEY>'; defaultClient.host = 'webservices.amazon.co.jp'; defaultClient.region = 'us-west-2'; // ** リクエストの生成 var searchItemsRequest = new ProductAdvertisingAPIv1.SearchItemsRequest(); // アソシエイトタグを設定 searchItemsRequest['PartnerTag'] = '<YOUR PARTNER TAG>'; searchItemsRequest['PartnerType'] = 'Associates'; // 検索リクエストを設定。SearchIndexは以下を参照 // https://webservices.amazon.com/paapi5/documentation/use-cases/organization-of-items-on-amazon/search-index.html searchItemsRequest['Keywords'] = 'Harry Potter'; searchItemsRequest['SearchIndex'] = 'Books'; searchItemsRequest['ItemCount'] = 2; // 取得するレスポンスの指定 // https://webservices.amazon.com/paapi5/documentation/search-items.html#resources-parameter searchItemsRequest['Resources'] = ['Images.Primary.Medium', 'ItemInfo.Title', 'Offers.Listings.Price']; // ** コールバックの設定 var callback = function (error, data, response) { if (error) { // エラーの場合 console.log('Status Code: ' + error['status']); } else { // レスポンスを取得 var searchItemsResponse = ProductAdvertisingAPIv1.SearchItemsResponse.constructFromObject(data); if (searchItemsResponse['SearchResult'] !== undefined) { // 1件目の結果を取得 var item_0 = searchItemsResponse['SearchResult']['Items'][0]; if (item_0 !== undefined && item_0['ASIN'] !== undefined) { console.log('ASIN: ' + item_0['ASIN']); } } // エラーが返ってきた場合 if (searchItemsResponse['Errors'] !== undefined) { var error_0 = searchItemsResponse['Errors'][0]; console.log('Error Code: ' + error_0['Code']); console.log('Error Message: ' + error_0['Message']); } } }; // ** APIの実行 var api = new ProductAdvertisingAPIv1.DefaultApi(); try { api.searchItems(searchItemsRequest, callback); } catch (ex) { console.log('Exception: ' + ex); }
対応が必要だった点
基本的にパラメタがわかったため、一致してるものを探していけばOK。
変更自体はそこまでだけど、できることが変わっているので注意...
リクエスト関連
- MerchantIdがMerchantになっていた。設定値は変わらず
- SortがSortyByになり、設定値も変更
- PowerSearchが廃止に...つまり、除外や期間指定ができない
レスポンス関連
- 全体的に変更。XMLからJSONになっており、構成も変わっている
- 発売日がUTCになり、時刻まで記載
- エラーメッセージも全体的に変わっているので対応が必要
- バリエーションが除外され、GetVariations APIが新設(リクエスト数が増...)
- ただ、電子書籍の価格が取得できるようになった
よく参照したURL
とにかく、以下を読みまくった。。
- Operations関連: リクエストパラメタとか。指定できるレスポンスもここ
- SearchItems ... 検索
- GetItems ... ASINから商品情報取得
- GetVariations ... ASINからバリエーション情報取得
- Resource関連: レスポンスの内容
- 共通のリクエストパラメタ関連
- 日本のMarketplaceとかの情報
- 共通のリクエストパラメタ ... HostやRegionもここ
- 共通のレスポンス関連
- マイグレーション関連
以上!!