Amazon Product Advertising API 5.0（PA-API v5）をexpressでREST API化する

# 概要
Amazon Product Advertising API 5.0 というAmazonが提供している商品情報検索APIがあります。
SDKが公式から提供されているのですが、サンプルコードのままだとコード内でASINやキーワードを指定するためAPIを単発でしかコールできないため、expressでREST APIとして動作するようにしました。
Dockerによる実行も可能です。Dockerfileは下記リポジトリにあります。

ソースコード：https://github.com/sakatech-jp/paapi5-express-sample

【参考】
・[Product Advertising API 5.0 Documentation](https://webservices.amazon.com/paapi5/documentation/)
・[Product Advertising API 5.0 SDK for NodeJS ](https://github.com/wusoma/paapi5-nodejs-sdk)

# 前提条件
- Amazonアソシエイト・プログラムに承認されたアカウントを所持している
- 認証キーを発行している
- Node.jsが実行できる

# 使用方法
## 実行環境

```bash
$ sw_vers
ProductName:    Mac OS X
ProductVersion: 10.15.6
BuildVersion:   19G2021

$ node -v
v14.1.0

$ docker -v
Docker version 19.03.12, build 48a66213fe
```

## セットアップ
クローンまたはフォークして依存パッケージをインストールします。

```bash
$ git clone https://github.com/sakatech-jp/paapi5-express-sample.git
$ cd paapi5-express-sample
$ npm install
```

config.js内に認証キーとアソシエイトタグを設定します。

```javascript
module.exports = {
  ACCESS_KEY: '<YOUR ACCESS KEY>', // アクセスキーをセット
  SECRET_KEY: '<YOUR SECRET KEY>', // シークレットキーをセット
  API_HOST: 'webservices.amazon.co.jp',
  REGION: 'us-west-2',
  PARTNER_TAG: '<YOUR PARTNER TAG>', // アソシエイトタグをセット
  PARTNER_TYPE: 'Associates'
}
```

app.jsを実行することでAPIを立ち上げることができます。

```bash
$ node app.js
Listening to PORT: 3000
```

## エンドポイント

以下の4つのエンドポイントがあります。
####  /searchItems
検索条件から商品データを取得することができます。
#### /getItems
指定したASINを持つ商品の情報を取得することができます。
#### /getVariations
指定したASINを持つ商品のバリエーション（サイズや色など）を取得することができます。
#### /getBrowseNodes
指定した商品カテゴリの情報を取得することができます。

## リクエストとレスポンスのサンプル

各エンドポイントへのリクエストのサンプルとそれに対するレスポンスです。

#### /searchItems
「Node.js」でキーワード検索をしてみます。

```bash
$ curl -X GET localhost:3000/searchItems \
-d '{
    "Keywords": "Node.js",
    "Resources": ["Images.Primary.Medium", "ItemInfo.Title", "Offers.Listings.Price"],
    "ItemCount": 1
   }'
```

「Node.js超入門[第3版]」という書籍の情報が返ってきます。

```json
{
    "SearchResult": {
        "TotalResultCount": 146,
        "SearchURL": "https://www.amazon.co.jp/s?k=Node.js&rh=p_n_availability%3A-1&tag=***&linkCode=osi",
        "Items": [
            {
                "ASIN": "B08HRMTXHB",
                "DetailPageURL": "https://www.amazon.co.jp/dp/B08HRMTXHB?tag=***&linkCode=osi&th=1&psc=1",
                "Images": {
                    "Primary": {
                        "Medium": {
                            "URL": "https://m.media-amazon.com/images/I/51SoAyWCBdL._SL160_.jpg",
                            "Height": 160,
                            "Width": 124
                        }
                    }
                },
                "ItemInfo": {
                    "Title": {
                        "DisplayValue": "Node.js超入門[第3版]",
                        "Label": "Title",
                        "Locale": "ja_JP"
                    }
                },
                "Offers": {
                    "Listings": [
                        {
                            "Id": "rnBB%2BZKboyhEDyET8hzwlpvGBT%2FHZ%2BfRAoEtE4FR6i7%2Bv%2B5YeQ1ap7PjpdIUPxEugDBSHdeZavd6BbESDvgw6Q6zLIAPCpYKOoboMSZgkd6bu1zutQ5byVmg55svmhuJlopqxFxF3WQs4aCICTPDPUWEokDz1%2Fj%2FJgC3VYcQoodSEWsCS1Zu0A%3D%3D",
                            "Price": {
                                "Amount": 3168,
                                "Currency": "JPY",
                                "DisplayAmount": "￥3,168"
                            },
                            "ViolatesMAP": false
                        }
                    ]
                }
            }
        ]
    }
}

```

#### /getItems
「B08HRMTXHB」というASINを持つ商品の情報を取得してみます。

```bash
$ curl -X GET localhost:3000/getItems \
-d '{
    "ItemIds": ["B08HRMTXHB"],
    "Resources": ["Images.Primary.Medium", "ItemInfo.Title", "Offers.Listings.Price"]
   }'
```

Node.js超入門[第3版]」という書籍の情報が返ってきます。

```json
{
    "ItemsResult": {
        "Items": [
            {
                "ASIN": "B08HRMTXHB",
                "DetailPageURL": "https://www.amazon.co.jp/dp/B08HRMTXHB?tag=***&linkCode=ogi&th=1&psc=1",
                "Images": {
                    "Primary": {
                        "Medium": {
                            "URL": "https://m.media-amazon.com/images/I/51SoAyWCBdL._SL160_.jpg",
                            "Height": 160,
                            "Width": 124
                        }
                    }
                },
                "ItemInfo": {
                    "Title": {
                        "DisplayValue": "Node.js超入門[第3版]",
                        "Label": "Title",
                        "Locale": "ja_JP"
                    }
                },
                "Offers": {
                    "Listings": [
                        {
                            "Id": "2QzP8U6GS%2BOE3G8ybPwm1FbqJ8V%2Fh6jc24%2Bmw%2FeCFpItFscuzkMg8wE5rhC%2BVJ4bttattXONPnhLtfj%2BI2UQiM3rvFpB7SIcX3YozDc9Gb1UjeyINE%2Btn0Vl%2BdI8hjNwvDExYbcO5QCSnqCcxs%2BwuKUam5dl5tXoc6syYJ3Blv0xxDt6RyoiaA%3D%3D",
                            "Price": {
                                "Amount": 3168,
                                "Currency": "JPY",
                                "DisplayAmount": "￥3,168"
                            },
                            "ViolatesMAP": false
                        }
                    ]
                }
            }
        ]
    }
}
```

#### /getVariations

いろはすのペットボトルのASINである「B0026IAWMU」で情報を取得してみます。

```bash
$ curl -X GET localhost:3000/getVariations \
-d '{
    "ASIN" : "B0026IAWMU"
   }'
```
24本と48本の2種類が返ってきます。

```bash
{
    "VariationsResult": {
        "Items": [
            {
                "ASIN": "B0026IAWMU",
                "DetailPageURL": "https://www.amazon.co.jp/dp/B0026IAWMU?tag=***&linkCode=ogv&th=1&psc=1",
                "ItemInfo": {
                    "Title": {
                        "DisplayValue": "コカ・コーラ い・ろ・は・す 天然水 555mlPET×24本",
                        "Label": "Title",
                        "Locale": "ja_JP"
                    }
                },
                "VariationAttributes": [
                    {
                        "Name": "size_name",
                        "Value": "1) 555ml×24本"
                    }
                ]
            },
            {
                "ASIN": "B007B9T4UK",
                "DetailPageURL": "https://www.amazon.co.jp/dp/B007B9T4UK?tag=***&linkCode=ogv&th=1&psc=1",
                "ItemInfo": {
                    "Title": {
                        "DisplayValue": "I LOHAS(い・ろ・は・す) いろはす 555ml×24本×2ケース",
                        "Label": "Title",
                        "Locale": "ja_JP"
                    }
                },
                "VariationAttributes": [
                    {
                        "Name": "size_name",
                        "Value": "555mlx48本"
                    }
                ]
            }
        ],
        "VariationSummary": {
            "PageCount": 1,
            "VariationCount": 2
        }
    }
}
```

#### /getBrowseNodes
商品カテゴリID「2275256051」の情報を取得してみます。

```bash
$ curl -X GET localhost:3000/getBrowseNodes \
-d '{
    "BrowseNodeIds": ["2275256051"]
   }'
```

「Kindle本」というカテゴリ情報が返ってきます。

```json
{
    "BrowseNodesResult": {
        "BrowseNodes": [
            {
                "ContextFreeName": "Kindle本",
                "DisplayName": "Kindle本",
                "Id": "2275256051",
                "IsRoot": false
            }
        ]
    }
}
```

## 指定できるパラメータについて
上記のサンプルで指定しているもの以外にもパラメータは多く定義されています。
詳しくは公式ドキュメントをご覧ください。
#### searchItems
https://webservices.amazon.com/paapi5/documentation/search-items.html
#### getItems
https://webservices.amazon.com/paapi5/documentation/get-items.html
#### getVariations
https://webservices.amazon.com/paapi5/documentation/get-variations.html
#### getBrowseNodes
https://webservices.amazon.com/paapi5/documentation/getbrowsenodes.html