Harmonia!!

CAT長老さんのあれやらこれやら

アスキーアート リプレイ日記 日記 リンク サイトマップ

スポンサーサイト

tag:
上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

タグ、カテゴリ等


Product Advertising API にJavaScriptで対応する

tag:Ajax JavaScript xml プログラム web AWS ProductAdvertisingAPI 
Product Advertising API にJavaScriptで対応する  [を] アマゾンAPIを使うのに2009年8月15日から認証が必要になるらしいというニュースから一ヶ月。なんとかJavaScriptでのシグニチャ生成と、Ajaxの作成に成功したので、ソースをば。

必要なライブラリ

jssha256
 認証を作成する際に用いられているHMAC-SHA256への変換を、JavaScriptで可能にしてくれたライブラリです。これが無いと話になりません。

簡易ソースコード

簡易説明

 恐らくもっと綺麗に、そして簡潔なソースがそのうち出るだろうと信じつつ、ソースコードの説明をさせてもらいます。

 url_paraにはProduct Advertising APIで署名を作成する際に必要となる四行目……つまり、xml?以降のパラメータを代入してください。タイムスタンプとシグネチャは自動的に生成します。

 tmdataはタイムスタンプを作成しています。GMTを代入した後、半角スペースで一度配列に格納したあとで、Product Advertising APIで使用する形式の順序に並べなおしています。

 tmsとして作成されたタイムスタンプをurl_paraの末尾に追加した後、&で区切り、配列に格納します。ソートは結局アルファベット順で問題ないので、JavaScriptのsort()を使い、再び文字列を構築します。四行目が完成しました。

 GET\necs.amazonaws.jp\n/onca/xml\nは1行目から3行目のパラメータをまとめたもので、これに先ほど作成した四行目を追加し、sha_256にかけます。これでHMAC-SHA256による変換ができました。

 さて、ここからが苦労した点なのですが、HMAC-SHA256で作成されたものが2文字づつ、16進法で作成されている事になかなか気がつかず、出力された文字列をそのままBase64に変換したりしていました。当然、結果は異なり、ネコと趣味の日記の例題であれば、「i8h+iZhgAOyOT1EA9xF9brAa2nH29fdexDmWum0X74M=」にならなければならない所が、何度やっても「8bc87e89986000ec8e4f5100f7117d6eb01ada71f6f5f75ec43996ba6d17ef83」になり、無理やりリクエストを送信しても署名が違うと弾かれました。

 エンコード、デコードを色々と試すうち、ようやく、2文字ごとに区切られた16進数と言う事に気がつき、先ず二文字に区切るところから始めました。区切った二文字は2進法に変換します。Base64で変換表を用いる際、変換された2進法の桁数が8ケタ無いとずれが生じるため、足りない桁数を0で埋めます。

 256で作成される文字列は、そのまま2進法に直すと256ケタになります。これを6文字づつに区切り、変換表に照らし合わせていくわけですが、そのままですと4文字あまります。ですので、最後の二ケタに0を足し、258文字にします。改めて6桁ごとに区切り、表と照らし合わせながら、文字を一つ一つ出していきます。これで43文字、Base64に変換で来ました。Base64では四文字で1セットですので、このままでは1文字分足りません。よって、Base64のルールに従い、足りない文字数分=を追加します。

 +と/はURLにエンコードしなければなりませんが、JavaScriptが用意している関数では対応しきれないので、一つ一つ検索置換します。これでProduct Advertising APIで要求される署名の完成です。このスクリプトではurl_para_lengthと言う変数名でxml?以降を生成しているので、ご利用になる場合は、「url = 'http://ecs.amazonaws.jp/onca/xml?' + url_para_length」とすればシグネチャつきのURLを作成できます。

注意点

 あくまでもローカルでの作業でしか使えません。シークレットキーの公開は規約で禁止されています。自分もタグからAmazonアソシエイトが使用不可となりました。お任せリンクでいいじゃないと思うかもしれませんが、あれはブタのエサです。正直全く適切なものを表示してくれない。それよりも、タグ、カテゴリで商品名を指定しておけば、勝手にそのタグとカテゴリ名で検索させたほうがより適切なものを拾えるという発想でした。まず、これが使用不可能になります。Amazonが全体から検索してくれるライブリンクを作ってくれるのであればそれで解決する話ではあります。

 しかしながら、心のぶれた用語集で作成している静的な一覧の作成にはまだまだ有効ですので、同じような事をされている方で、自分と同じく躓いた方の為になればなと思い公開します。

躓いたポイント

 シークレットキーはURLエンコードする必要は無いようです。+とか/とかが入りますがそのまま入力してください。

 シグネチャはあっているのに何度も弾かれましたが、これはサーバーが不調だったためのようです。何も変更せず、食事を取ってから確認の為に動かしたら普通に署名が通りました。

 これからProduct Advertising APIに触れ、JavaScriptによるローカル専用のAjaxを学ばれる方は、かなりの勉強を必要とするかもしれませんが、xmlを弄れるようになるとwebの世界が変わるので、お時間あれば挑戦してみてください。

 最後になりましたが、makeSigを作成されたネコと趣味の日記さんに感謝します。makeSigのお陰で色々な検証が出来ました。有難うございました。

関連エントリー

スポンサーサイト

コメント

Re: タイトルなし

 コメント有難うございます。なるほど、ASINを一度に複数指定するという方法を知りませんでした。対応してみます。ご報告感謝です。

大変参考になりました。
自分でもがんばってはみたのですが、どうしてもBase64のあたりで躓いていました。有益な情報に感謝です!

試してみたところ、ASINを複数しているときなど、url_paraにカンマが入っているとエラーになるようです。カンマをURLエンコードしてみたら通りました。

Re: エラーになりました

 修正しました。ご報告感謝です。思いもよらないバグでした。設計の甘さを認識させられてしまいました。

 また、何かありましたらよろしくお願いします。

 コメントありがとうございます。ご指摘のとおり、こちらの設計ミスですね。ご報告ありがとうございます。水曜日辺りにソース見直させて貰います。

 感謝。

エラーになりました

なかなか勉強になります。ありがとうございます。
tms = tmdata.toGMTString();
の後、日が一桁だと「Timestamp is invalid. Reason: Must be in ISO8601 format.」になりませんか?
tms[1]が1桁だと前0埋めする必要があるかと思われます。

コメントの投稿

管理者にだけ表示を許可する

トラックバック

http://lastoneofthezodiac.blog38.fc2.com/tb.php/5613-902530fc

 | HOME | 

プロフィール

ちよろ

Author:ちよろ
大阪で活動するバンドマン。

メインはボーカル。

活動中のバンド
蒼天
 三国志テーマにやろうぜってバンド
音歪
 オーバードライブ。セッションで俺、ボーカル。
仔猫夜叉
 陰陽座。ギターデス。

バンド履歴
蒼天
HARMONIA
MARZie-DEKKER
HARMONIA

ヘルプなどで在籍したことのあるバンド
Mitanie Crue
邪影修羅神

カテゴリ

音楽活動 (206)
ライブ (118)
歌ってみた (85)
その他 (4471)
今日のやる夫スレ (12)
遊んだの (177)
読んだの (11)
見たの (3)
使ったの (3)
まとめらしきもの (401)
日記的なるもの (198)
楽天 (3665)
作ったの (1189)
描いたの (0)
アスキーアート (1176)
プログラムとか (11)
FLASH (2)
リンク集 (2)
サイトマップ (10)

最近の記事

最近のコメント

最近のトラックバック

月別アーカイブ

ブロとも申請フォーム

この人とブロともになる

感謝感激相互リンク様

お世話になってます

Ad

タグ、本文切り替えサーチ

 

RSSフィード

リンク

このブログをリンクに追加する

カウンター

ショートカット

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。