Help us understand the problem. What is going on with this article?

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

More than 1 year has passed since last update.

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 本を除外できない仕様みたいです。
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away