【PA-API 5.0】Amazon Product Advertising APIをNode.jsで動かす方法

どーも、ぐるたか@guru_takaです。

Amazon Product Advertising APIを使って新しいプロダクトの個人開発を始めました。新バージョン「PA-API 5.0」に対応しています。

色々と引っかかった箇所もあったので、備忘録としてまとめます。

MEMO
Amazon アソシエイトに登録済みを前提として、進めていきます。

主な手順

STEP.1
認証キーの発行
STEP.2
ScratchpadでPA-API 5.0のテスト確認
STEP.3
公式が提供しているPA-API 5.0のSDKでサンプルを動かす

STEP.1:認証キーの発行

まずは認証キーを発行して、アクセスキーIDとシークレットキーをコピーしましょう。

STEP.2:ScratchpadでPA-API 5.0のテスト確認

次にScratchpadで発行した、アクセスキーIDとシークレットキーが使えるかどうか、確認します。
Amazon Product Advertising API Scratchpad

以下のように入力して、「Run Request」をクリック。

こんな表示がされていればOKです!

注意
マーケットプレイスを日本に設定しないと、エラーが出るので注意です!

STEP.3:公式が提供しているPA-API 5.0のSDKでサンプルを動かす

後は公式が用意しているSDKとサンプルを使って動かします。
Using SDK

zipファイルを解答した後、必要なパッケージをインストールします。

~/paapi5-nodejs-sdk-example
$ npm i crypto-js superagent

その後、sampleSearchItemsApi.jsを編集します。

sampleSearchItemsApi.js

/**
 * Copyright 2019 Amazon.com, Inc. or its affiliates. All Rights Reserved.
 *
 * Licensed under the Apache License, Version 2.0 (the "License").
 * You may not use this file except in compliance with the License.
 * A copy of the License is located at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * or in the "license" file accompanying this file. This file is distributed
 * on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
 * express or implied. See the License for the specific language governing
 * permissions and limitations under the License.
 */

// Run `npm install` locally before executing following code with `node sampleSearchItemsApi.js`

/**
 * This sample code snippet is for ProductAdvertisingAPI 5.0's SearchItems API
 * For more details, refer:
 * https://webservices.amazon.com/paapi5/documentation/search-items.html
 */

var ProductAdvertisingAPIv1 = require('./src/index')

var defaultClient = ProductAdvertisingAPIv1.ApiClient.instance

// Specify your credentials here. These are used to create and sign the request.
defaultClient.accessKey = 'アクセスキー'
defaultClient.secretKey = 'シークレットキー'

/**
 * PAAPI Host and Region to which you want to send request.
 * For more details refer: https://webservices.amazon.com/paapi5/documentation/common-request-parameters.html#host-and-region
 */

// 日本のマーケットプレイスに設定
defaultClient.host = 'webservices.amazon.co.jp'
defaultClient.region = 'us-west-2'

var api = new ProductAdvertisingAPIv1.DefaultApi()

// Request Initialization

var searchItemsRequest = new ProductAdvertisingAPIv1.SearchItemsRequest()

/** Enter your partner tag (store/tracking id) and partner type */
searchItemsRequest['PartnerTag'] = '自分のアソシエイトID'
searchItemsRequest['PartnerType'] = 'Associates'

/** Specify Keywords */
searchItemsRequest['Keywords'] = 'Harry Potter'

/**
 * Specify the category in which search request is to be made
 * For more details, refer: https://webservices.amazon.com/paapi5/documentation/use-cases/organization-of-items-on-amazon/search-index.html
 */
searchItemsRequest['SearchIndex'] = 'Books'

/** Specify item count to be returned in search result */
searchItemsRequest['ItemCount'] = 2

/**
 * Choose resources you want from SearchItemsResource enum
 * For more details, refer: https://webservices.amazon.com/paapi5/documentation/search-items.html#resources-parameter
 */
searchItemsRequest['Resources'] = [
  'Images.Primary.Medium',
  'ItemInfo.Title',
  'Offers.Listings.Price'
]

function onSuccess(data) {
  console.log('API called successfully.')
  var searchItemsResponse = ProductAdvertisingAPIv1.SearchItemsResponse.constructFromObject(
    data
  )
  console.log(
    'Complete Response: \n' + JSON.stringify(searchItemsResponse, null, 1)
  )
  if (searchItemsResponse['SearchResult'] !== undefined) {
    console.log('Printing First Item Information in SearchResult:')
    var item_0 = searchItemsResponse['SearchResult']['Items'][0]
    if (item_0 !== undefined) {
      if (item_0['ASIN'] !== undefined) {
        console.log('ASIN: ' + item_0['ASIN'])
      }
      if (item_0['DetailPageURL'] !== undefined) {
        console.log('DetailPageURL: ' + item_0['DetailPageURL'])
      }
      if (
        item_0['ItemInfo'] !== undefined &&
        item_0['ItemInfo']['Title'] !== undefined &&
        item_0['ItemInfo']['Title']['DisplayValue'] !== undefined
      ) {
        console.log('Title: ' + item_0['ItemInfo']['Title']['DisplayValue'])
      }
      if (
        item_0['Offers'] !== undefined &&
        item_0['Offers']['Listings'] !== undefined &&
        item_0['Offers']['Listings'][0]['Price'] !== undefined &&
        item_0['Offers']['Listings'][0]['Price']['DisplayAmount'] !== undefined
      ) {
        console.log(
          'Buying Price: ' +
            item_0['Offers']['Listings'][0]['Price']['DisplayAmount']
        )
      }
    }
  }
  if (searchItemsResponse['Errors'] !== undefined) {
    console.log('Errors:')
    console.log(
      'Complete Error Response: ' +
        JSON.stringify(searchItemsResponse['Errors'], null, 1)
    )
    console.log('Printing 1st Error:')
    var error_0 = searchItemsResponse['Errors'][0]
    console.log('Error Code: ' + error_0['Code'])
    console.log('Error Message: ' + error_0['Message'])
  }
}

function onError(error) {
  console.log('Error calling PA-API 5.0!')
  console.log('Printing Full Error Object:\n' + JSON.stringify(error, null, 1))
  console.log('Status Code: ' + error['status'])
  if (
    error['response'] !== undefined &&
    error['response']['text'] !== undefined
  ) {
    console.log(
      'Error Object: ' + JSON.stringify(error['response']['text'], null, 1)
    )
  }
}

api.searchItems(searchItemsRequest).then(
  function(data) {
    onSuccess(data)
  },
  function(error) {
    onError(error)
  }
)

後はPGを起動して、JOSNデータが返ってきたらOK!

〜/sampleSearchItemsApi.js
$ node sampleSearchItemsApi.js

参考リンク

参考 PAAPI v5に移行してみた: Node.js版 - くらげになりたい。

コメントを残す