JavaScriptベースで一通りつついてみたので、実装方法の備忘録。秘密鍵扱うので、クライアントサイドJavaScriptはNGですな。基本的にはプログラミングガイド読めば分かるものです。コーディングはお仕事しますよ? 的な。
必要なもの
- アクセスキーID:
- Amazonアソシエイト・セントラル →ツール →Product Advertising API で取得可能
- 秘密キー:
- Amazonアソシエイト・セントラル →ツール →Product Advertising API で取得可能(認証情報生成時のみ表示されるようなので注意)
- アソシエイトID:
- Amazonアソシエイト・セントラルの右肩に出てるアレです
実装上のポイント
一先ず、ASINで指定した特定商品の情報取得を試しました。
- エンドポイントは固定。シグネチャ生成時にhostとpathに分割することになります。
- クエリは文字コード順でソートすることになるので、& で連結せずに扱ったほうが良さ気でした。ソートはArray.sort()のアルゴリズムで問題ない筈。
- 各所の値は
encodeURIComponent()
でエンコード。 - TimestampはISO形式の日付+時間ですが、ミリ秒以下があるとエラーになりますので
(new Date()).toISOString()
は使用できません。 - シグネチャはbase64 エンコードの HMAC_SHA256です。Node.jsの場合
crypto.createHmac()
が使用可能です。
うっかりハマる点として、各所に出てくるサンプルでのエンドポイントがアメリカ版ですが、日本のAmazonでアカウント登録している場合は日本のエンドポイントを使う必要があります。
処理の流れ
- タイムスタンプを生成します。UTC~メソッド群を使用して、ミリ秒を含まないISO形式の日付を生成。getUTCMonth()が0~11を返すことと、1桁の値は右側に0が必要になることに注意
-
クエリを項目ごとに分割・格納したArrayを組み立てます →query
- AWSAccessKeyId
- アクセスキーID
- AssociateTag
- アソシエイトID
- Operation
- ItemLookup (今回は商品情報取得なので)
- ItemId
- ASIN
- Timestamp
- タイムスタンプ
- エンドポイントURLをバラします。Node.jsの場合
url.parse()
でパースして、hostとpathを使用します。 - クエリをソートし、&で連結しておきます。 →sorted_query
- 'GET', エンドポイントのhost, エンドポイントのpath, sorted_queryを\nで連結し、
crypto.createHmac()
で処理した後digest('base64')
でBASE64形式で取り出し、更にencodeURIComponent()
でエンコードします。 →signature - エンドポイント + ? + sorted_query(queryでもいい筈) + & + signature にアクセスします。後はレスポンスを適宜調理。
リクエスト制限は「1秒に1回」とされているのですが、試行しているときにコード修正で明らかに数秒以上経過してても制限にかかってエラーになったので、もう少し余裕持ったほうが良さそう。
ところでPAAPIってやっぱり「パァイ」って読めばいいんですかね。