Amazon Product Advertising API v5.0 を Node.js で動かしてみた

「カエレバ」的な Amazon アソシエイトの広告コードを自分で作ってみたいと思い調べてみたところ、Amazon Product Advertising API v5.0 という API で作れるらしいことが分かった。早速やってみる。

目次

アクセスキー・シークレットキーを発行する

まずは API を利用するためのアクセスキーとシークレットキーのペアを発行する。Amazon アソシエイトの管理画面 → ツール → Product Advertising API と進み、「認証情報を追加する」ボタンを押下すると発行できる。

お試しで API を叩いてみたい場合は、公式の Scratchpad が使えるだろう。

Node.js SDK を用意する

Amazon PA API を利用するには、リクエストパラメータをあれこれ組み立てたりする必要があり、スクラッチで開発するのはとても手間がかかる。そこで、公式が用意している SDK を利用する。

Node.js SDK は Zip 形式でしか配布されていないのだが、有志が npm パッケージとして配布しているモノがいくつかある。以下は自分が実際に使えた npm パッケージだ。

いずれも、公式 SDK のソースコードを内部的に利用しており、やっていることは同じだ。

自分は今回、amazon-paapi パッケージを利用することにした。

Node.js スクリプトを書いてみる

練習用リポジトリを立ててみた。コード全量はコチラを参考にドウゾ。

次のように作業ディレクトリを用意し、スクリプトを書いていく。

$ npm init -y
$ npm install -S amazon-paapi
$ touch index.js
const amazonPaapi = require('amazon-paapi');

(async () => {
  try {
    const commonParameters = {
      AccessKey  : '【アクセスキー】',
      SecretKey  : '【シークレットキー】',
      PartnerTag : '【アソシエイト ID or トラッキング ID】',
      PartnerType: 'Associates',
      Marketplace: 'www.amazon.co.jp'
    };
    
    const data = await amazonPaapi.SearchItems(commonParameters, {
      Keywords   : '【任意のキーワード】',
      SearchIndex: 'All',
      ItemCount  : 10,
      Resources  : [
        'ItemInfo.Title',
        'Images.Primary.Medium',
        'Offers.Listings.Price'
      ]
    });
    
    if(!data.SearchResult || !data.SearchResult.Items) return console.warn('Error', data);
    
    data.SearchResult.Items.forEach(item => {
      console.log({
        asin         : item.ASIN,
        detailPageUrl: item.DetailPageURL,
        title        : item.ItemInfo.Title.DisplayValue,
        imageUrl     : item.Images.Primary.Medium.URL,
        imageWidth   : item.Images.Primary.Medium.Width,
        imageHeight  : item.Images.Primary.Medium.Height,
        price        : item.Offers.Listings[0].Price.DisplayAmount
      });
    });
  }
  catch(error) {
    console.error('Error', error);
    // error.status が 429 (TooManyRequests) の場合はリトライしたい
  }
})();

かなりシンプルだが、最低限のことはできている。

$ node index.js

で実行してみよう。

オブジェクトがやたらとネストされているので、Lodash の get() 関数のように安全にオブジェクトを掘り下げられるヘルパー関数を用意しておくとよいだろう。

素の SDK を利用している場合は、以下のホスト・リージョン情報を指定することで、日本の Amazon での検索ができる。

item.DetailPageURL がアソシエイトリンクになっているので、これらの情報を利用して HTML コードを組み立ててやれば、オリジナルの Amazon アソシエイトリンクが作れるだろう。

429 TooManyRequests エラーが発生する場合

API をコールすると 429 TooManyRequests エラーが発生する場合がある。コレはどうも、アソシエイトの売上に応じて API コールに制限がかかる仕組みらしい。それ以外にもどういうワケかこのエラーが発生する場合があり、何回かリトライしていると上手くデータが取れたりする。

なので、429 エラーが発生した場合は3回とか5回とか、適当に API コールをリトライしてみると良いだろう。

素の JS としては動かせない

Node.js SDK が使用しているのは crypto-js と superagent なので、ブラウザ上でも動かせそうな気がするのだが、hostuser-agent などの HTTP ヘッダを変更しようとしており、コレがブラウザ上では上手くいかないために API がコールできない。

フロントエンドオンリーで動いてくれれば嬉しかったのだが、どうもダメそうなので、PA API をコールする部分だけ、サーバレス環境で実行することにしよう。Functions として実装するなら、AWS Lambda、Netlify Functions、Vercel Serverless Functions あたりが無料で使える。PaaS で良ければ Heroku や Glitch を使えば、無料で Node.js サーバを公開できるので、いかようにも実装できるだろう。

とゆーワケで以上。