LoginSignup
8
7

More than 5 years have passed since last update.

Amazon Product Advertising API を使った書籍検索 API をサクッと作る

Posted at

Amazon Product Advertising API を使って、本の ISBN コードを GET すると、
書籍情報を返してくれる API を JavaScript で作り Now(v2)にデプロイしました。

Amazon Product Advertising API の準備

Amazon Product Advertising API は登録しないと使えないので、登録を行って、

を取得しておきます。

JavsScript のコード

Amazon Product Advertising API を使うためのライブラリで、
今回はnode-apacを使いました。
あとは、express で簡易的な API サーバを立てて、ISBN コードが GET されたら、
それを元に API に投げて、書籍情報を返却するようにしています。
以下がコードになります。

const express = require('express');
const bodyParser = require('body-parser');

const app = express();

const { check, validationResult } = require('express-validator/check');
const { matchedData } = require('express-validator/filter');
const { OperationHelper } = require('apac');

const opHelper = new OperationHelper({
  awsId: process.env.AWSID, //アクセスキー
  awsSecret: process.env.AWSSECRET, //シークレットキー
  assocId: process.env.ASSOCID, //アソシエイトタグ
  locale: 'JP'
});

app.use(bodyParser.urlencoded({ extended: true }));

app.get('/', [check('isbn').exists()], async (req, res) => {
  const errors = validationResult(req);
  if (!errors.isEmpty())
    return res.status(422).json({ errors: errors.mapped() });

  const valid = matchedData(req);
  const isbnCode = valid.isbn;

  opHelper
    .execute('ItemLookup', {
      SearchIndex: 'Books',
      IdType: 'ISBN',
      ItemId: isbnCode,
      ResponseGroup: 'ItemAttributes,Images'
    })
    .then(response => {
      let responseItem = null;

      if (!response.result.ItemLookupResponse.Items.Item['0']) {
        responseItem = response.result.ItemLookupResponse.Items.Item;
      } else {
        responseItem = response.result.ItemLookupResponse.Items.Item['0'];
      }

      const bookData = {
        title: responseItem.ItemAttributes.Title,
        author: responseItem.ItemAttributes.Author,
        publisher: responseItem.ItemAttributes.Publisher,
        releaseDate: responseItem.ItemAttributes.ReleaseDate,
        imageURL: responseItem.LargeImage.URL
      };

      res.json({
        bookData
      });
    })
    .catch(err => {
      res.status(422).json({ errors: '存在しません。' });
    });
});

app.listen(3000, () => console.log('Example app listening on port 3000!'));

module.exports.app = app;

Now にデプロイ

Now をインストールしていない人は、npm i -g nowでインストールを行って、登録をしてください。

Now の準備

Now にデプロイする前に準備をします。

now.json

まずは、now.jsonを作成します。
version2で、namealiasは個別の名前を設定してください。
aliasはなくてもいいのですが、Now の場合デプロイ毎に URL が変わってしまうので、
API として使う場合は設定しておいたほうがいいと思われます。

envは環境変数として設定しているアクセスキーなどを Now で使うための設定になります。
後述するnow secretsの設定で連携させます。

{
  "version": 2,
  "name": "APIの名前",
  "alias": "APIの固定URL",
  "env": {
    "AWSID": "@awsid",
    "AWSSECRET": "@awssecret",
    "ASSOCID": "@associd"
  },
  "builds": [{ "src": "index.js", "use": "@now/node-server" }]
}

.nowignore ファイルの作成

Now のコードは全て見えちゃうので、(URL に/_srcをつけると見える)
Now にあげたくないファイルを.nowignoreファイルに記述します
ここでは、direnvを使ってるので、.envrcファイルを対象にしています。

.envrc

now secrets の実行

環境変数を Now で使えるようにするために以下のコマンドを実行します。
設定したsecretsnow.jsonと連携するように記述します。

now secrets add awsid 'アクセスキー'
now secrets add awssecret 'シークレットコード'
now secrets add associd 'アソシエイトタグ'

設定できたか確認する場合は、以下のコマンドを実行することで確認できます。

$ now secret ls

> 3 secrets found under takutakuma [582ms]

  name       created
  awsid      3d ago
  awssecret  3d ago
  associd    3d ago

Now にデプロイ

ここまで準備できたら、 Now にデプロイしましょう。
以下のコマンドを実行すると Now にデプロイができているので、
API として動くか確認してください。

now
now alias

その他

  • 書籍の情報検索 API は色々あるのですが、どれも一長一短でなかなか選定が難しかったです。
  • ISBN での検索だと Amazon API は Kindle 本を除外できない仕様みたいです。
8
7
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8
7