ツンデレ本管理プロジェクト 書籍情報取得API に関しての話

書籍の情報って… 入力するのめんどくさいやんw
タイトルとか入れても…
amazonから引っ張ってくれば良くねぇ?
正直ASINで管理する方が楽なのね。
アソシエーションあるしw

そこから始まる、APIを開発しました。

図にするとこんな感じです、PAPIサービスというのが今回の開発ターゲットです。
ユーザはツンデレ本管理のシステムを利用しますが、直接は触りませんプログラムが内部的に呼び出すAPIです。

最初はツンデレプロジェクトに内包していた機能ですが独立させました。
認証キーの管理がまとめたいですし、他のシステムへの流用が可能にしました

PAPIにて提供している機能

  • ASINから書籍タイトル、表紙画像URLを取得します
  • バーコードからASINと書籍タイトル、表紙画像URLを取得します
  • キーワードから書籍の一覧の取得します(Max:100件)

認証周りの環境設定があるのでソースはローカルの GItLabにて管理しています。
その他の部分を抜粋版をGitHubに上げました

https://github.com/wataru775/papiv4-api-service

ご参考にしてください

ツンデレ本管理プロジェクト管理画面での利用シーン

管理画面から呼び出すAPIサービスは以下を実装しています。

  • getItems : ASINの情報から書籍情報を引っ張ります
  • searchItems : 検索キーワードの書籍を検索します。複数の場合は選択画面を表示します

新規書籍登録画面にてこのAPIを利用する機能をつけております(右の雲です)

激烈シンプルですが、こんな感じにしております

キーワード検索機能(searchItems)

検索の右のテキストを入れて、[雲]を押すとAPIのsearchItems機能を呼び出します。

入力内容はキーワードかバーコードかを入れます。
※ スキャナ使うと超便利

結果が一件の場合はその値のASINとTITLE、カバー写真を表示します。

複数ある場合は… ださださダイアログが表示されますのでそちらから選択します

選択すると、値が埋め込まれます。

これで便利になります。

検索機能は新規追加のみなので編集の場合はASINから取るだけです。

ASINによる書籍情報取得機能(getItems)

ASINはamazonの管理キーなので一意になるでしょう!

タイトルをカスタマイズした後にリセットするには便利です。

開発ポイント

10件しか取れない!?

はじめに少しだけ悩みましたが、データ件数が10件しか取れません…

公式文章によると「ItemCount : Type: Integer (Between 1 to 10)」となっております。
最大10アイテムですので注意です

https://webservices.amazon.com/paapi5/documentation/search-items.html

どうするか?

ページがありますので、それで対応しましょう!

「ItemPage : Type: Integer (Between 1 to 10)」… 10ページまでです。限界です

だとどうするか?10件 x 10ページ取れるなら取っちゃおう!

https://github.com/wataru775/papiv4-api-service/blob/6bf3f8fffea47db10b4d843dbf3831562ff426e1/app/Services/PAPIv4/AWSApiService.php#L92

悪いことですが、これで処理しました(ゴルゴ13は200巻以上だから取れないけれどもw)

接続が失敗する… Exception Occured

いろいろやっていますと、fopenで落ちます…

https://github.com/wataru775/papiv4-api-service/blob/6bf3f8fffea47db10b4d843dbf3831562ff426e1/app/Services/PAPIv4/AWSApiService.php#L225

とりあえずの対応で1秒待ちの再アクセスしていますが…

リクエストをキャッシュする

同じリクエストを繰り返すと怒られそうなので、キャッシュを追加しました。
といっても超シンプルにsqliteにキーワードとパージ番号をキーに結果のjsonテキストを入れているだけです。

キャッシュチェック : https://github.com/wataru775/papiv4-api-service/blob/6bf3f8fffea47db10b4d843dbf3831562ff426e1/app/Services/PAPIv4/AWSApiService.php#L94

キャッシュ格納 : https://github.com/wataru775/papiv4-api-service/blob/6bf3f8fffea47db10b4d843dbf3831562ff426e1/app/Services/PAPIv4/AWSApiService.php#L131

テーブル定義 : https://github.com/wataru775/papiv4-api-service/blob/main/database/migrations/2021_10_04_222838_create_table_aws_cache.php

公式文章と認証キー

公式文章とサンプル

実際にはAmazonのPAAPI5を実装しているだけです
この辺りを参照していただけますとサンプルデータなども出てきます。

https://webservices.amazon.com/paapi5/documentation/

APIの話ではなく具体的なソースが欲しい人にはScratchpadにソースはあります。
を参考にすればOKです
ターゲットTag(ショップID?)と認証キーを設定すればソースと動作を確認できます

https://webservices.amazon.co.jp/paapi5/scratchpad/index.html

簡単でしょ

私はこの辺りの感じでまとめております

https://github.com/wataru775/papiv4-api-service/blob/main/app/Services/PAPIv4/AWSApiService.php

https://github.com/wataru775/papiv4-api-service/blob/main/app/Services/PAPIv4/AwsV4.php

認証キー

認証キーの管理まわりはちょっと複雑でした。

アソシエイトにて使っているキーなので、AWSとか漁り出すとまるっきり出ません

https://affiliate.amazon.co.jp/assoc_credentials/home

シークレットキーIDは作成時にしか表示されませんので要注意です。
さらに、認証キーは2つしか登録できませんので管理は大切です