Ajax
Amazon Product Advertising API はじめの一歩
Amazonの商品を検索して、販売するというアプリを作ろうとしています。
最初は
「APIのリファレンス読んでちゃちゃっとできるだろう!」
と思っていたら、意外と難しかったので、つまづいた点などをメモしておきます。
そもそも、RESTとか、証明書とか、リクエストを送って結果を受信する方法もわからないよ!という人向けです。
読むべきドキュメント
最初につまづいたポイントは、
「とにかくAmazonのドキュメントがわかりにくい!どこにおいてあるのかさえわかりにくい!!」
ということです。
たとえば、下記がProgramming Guideの目次となっていますが、コンセプトみたいな話も多く、いらない情報が多いのです。
http://docs.aws.amazon.com/AWSECommerceService/2011-08-01/DG/ProgrammingGuide.html
何がいらないかと言うと、下記のようなEコマースとはなんぞや?というドキュメントもあります。
http://docs.aws.amazon.com/AWSECommerceService/2011-08-01/DG/WhatisECommerce.html
要約すると、
「Eコマースとはアマゾンみたいなサイトのことだよん。
Eコマースについて知りたければ、アマゾンで買い物してよねっ。」
とか書いてあります。どういう商魂のたくましさでしょうか。
ってか、こんなのをProgramming Guideに入れるな!と大声で言いたいです。
とにかく、それぐらいAmazonが提供しているドキュメントが混乱しているということがわかって頂けたでしょうか?
また、Amazon Product Advertising API Best Practices というページもあります。2007年に書かれたもののようです。
しかし、役には立ちそうなので、一読しておいた方がいいでしょう。
http://aws.amazon.com/articles/Product-Advertising-API/1057
サンプルコードの一覧が下記にあります。腕に覚えありの人は、こういうの見たほうが早いでしょうか?
http://aws.amazon.com/code/Product-Advertising-API?browse=1
Amazonに商品検索のパラメーターを送って、結果を受信する
Amazonに商品検索のパラメーターを送って、結果を受信するには、Amazon Product Advertising APIでは、リクエストをRESTで送信し、結果を受信する、ということになります。
そもそも「RESTで送信」とは??なんぞや?
と言いますと、RESTとはとか言い出すと、WikiPediaを見てください、ということになりますが、簡単に言うと、ここで必要なのはHTTPでリクエストを送信することです。
下記のようなURLをブラウザで実行することも、HTTPで送信している、ということになります。
http://webservices.amazon.com/onca/xml?Service=AWSECommerceService&Operation=ItemSearch&
AWSAccessKeyId=[Access Key D]&AssociateTag=[ID]&SearchIndex=Apparel&
Keywords=Shirt&Timestamp=[YYYY-MM-DDThh:mm:ssZ]&Signature=[Request Signature]
RESTでリクエストをする方法についての、Amazonのオフィシャルなドキュメントはこちら
http://docs.aws.amazon.com/AWSECommerceService/2011-08-01/DG/AnatomyOfaRESTRequest.html
そのために、AmazonのAmazon Product Advertising APIのアクセスキーというものが必要になります。
AmazonのAmazon Product Advertising APIのアクセスキーを取得する
下記のページの、
https://affiliate.amazon.co.jp/gp/advertising/api/detail/your-account.html
こちらのリンクから、以下の処理が可能です:
の「こちらのリンク」をクリックしてください。
日本国内で、アフィリエイトのリンクを張りつけるだけのアカウントを持っている場合があると思いますが、これは別にIDを登録しないといけません。
情報を入力していくと、アカウントができます。
そのあと、アカウントを作り、再度上記の画面からサインインしますと、Amazon Web Serviceの管理画面に行けます。
いきなり、アラートが出て、今後はこの管理画面は使えなくなり、今後は、Your Security Credentialsという管理画面に映るそうです。
未来のために、Your Security Credentialsの説明を書いておきます。
下記のような画面ですが、確かにAccess Key IDとは書いてありますが、Secret Access Keyがありません。
え??( ゚Д゚)
と思いますよね。
赤マルで囲んだボタンをクリックします。
すると、新しいAccess Key IDとSecret Access Keyをダウンロードできます。
つまりは…このSecret Access Keyは一度ダウンロードしたら、同じものは二度とダウンロードできないのです!!!
もしSecret Access Keyがなくなってしまったら、新しいものを発行するしかないのです。
恐ろしすぎます…。Secret Access Keyは大事大事に保存しましょうね!!
ちなみに、現在利用できる日本語の管理画面では、画面上でSecret Access Keyを表示させることができます。
ふぅー
やっとアクセスキーとシークレットアクセスキーが取得できましたね。
そして再度RESTでリクエストを送ってみる
もう一度、RESTでリクエストをする方法についての、Amazonのオフィシャルなドキュメントはこちら
http://docs.aws.amazon.com/AWSECommerceService/2011-08-01/DG/AnatomyOfaRESTRequest.html
わかりにくいので解説ですが、そもそもリクエストを投げるパラメーターを含んだリクエストを、一旦解剖してからシークレットキーでハッシュ化し、最後にパラメーターとして付与することになります。
なんでこんな面倒なことするんですかね…
アマゾンの価格だけ調べて、利用しようとする人たちを一生懸命排除するためでしょうか。
つまり、下記のようなリクエストをHTTPで投げたいとして
http://ecs.amazonaws.co.uk/onca/xml?Service=AWSECommerceService&A
WSAccessKeyId=AKIAIOSFODNN7EXAMPLE&Operation=ItemSearch&Actor=Joh
nny%20Depp&ResponseGroup=ItemAttributes,Offers,Images,Reviews,Var
iations&Version=2009-01-01&SearchIndex=DVD&Sort=salesrank&Associa
teTag=mytag-20
上記をまず、下記の状態にします。
GET
ecs.amazonaws.co.uk
/onca/xml
AWSAccessKeyId=AKIAIOSFODNN7EXAMPLE&Actor=Johnny%20Depp&Associate
Tag=mytag-20&Operation=ItemSearch&ResponseGroup=ItemAttributes%2C
Offers%2CImages%2CReviews%2CVariations&SearchIndex=DVD&Service=AW
SECommerceService&Sort=salesrank&Timestamp=2009-01-01T12%3A00%3A0
0Z&Version=2009-01-01
それを、HMACの SHA256で暗号化します。
PHPであれば、
hash_hmac('sha256', $string_to_sign, $secret_access_key, true)
などとやります。別にこれは、自分のサーバーで行えばよいです。
で、暗号化された文字列が、下記のようにできますが、
TuM6E5L9u%2FuNqOX09ET03BXVmHLVFfJIna5cxXuHxiU%3D
これを
Signature=TuM6E5L9u%2FuNqOX09ET03BXVmHLVFfJIna5cxXuHxiU%3D
として、先ほどのHTTPリクエストに混ぜてやります。
全体のHTTPリクエストは、下記のようになります。
http://ecs.amazonaws.co.uk/onca/xml?AWSAccessKeyId=AKIAIOSFODNN7EXAMPLE
&Actor=Johnny%20Depp&AssociateTag=mytag-20&Operation=ItemSe
arch&ResponseGroup=ItemAttributes%2COffers%2CImages%2CReviews%2CV
ariations&SearchIndex=DVD&Service=AWSECommerceService&Signature=T
uM6E5L9u%2FuNqOX09ET03BXVmHLVFfJIna5cxXuHxiU%3D&Sort=salesrank&Ti
mestamp=2009-01-01T12%3A00%3A00Z&Version=2009-01-01
と、長々と書きましたが、なかなか書くのは面倒ですね…
少し間違うと、すぐ下記のようなメッセージが帰ってきてしまいます。
The request signature we calculated does not match the signature you provided.
下記にて、上記の流れのサンプルコードを公開されている方がいらっしゃいました。
ありがとうございます!!
https://gist.github.com/DQNEO/6231929
これで、AmazonからXMLが帰ってくれば、成功です★
後日段
後日、file_get_contents()ではなく、ソケット通信 fsockopen()でやろうとしましたが、Request Not Supported と返されてしまいました。(^_^;
残念。