くらげになりたい。

くらげのようにふわふわ生きたい日曜プログラマなブログ。趣味の備忘録です。

PAAPI v5に移行してみた: Node.js版

積読ハウマッチAmazonのPAAPIを使っているけど、
v4が2020年3月9日に利用できなくなるため、移行してみたときの備忘録。

f:id:wannabe-jellyfish:20200307171304p:plain

以前は、node-apacを使ってたけど、対応はなさそう

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をダウンロードして展開するとこんな感じになってる。

f:id:wannabe-jellyfish:20200307171126p:plain

src配下がAPIなので、自分のソースに配置。

f:id:wannabe-jellyfish:20200307170607p:plain

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

とにかく、以下を読みまくった。。

以上!!