アマゾンAPIの認証方式に対応する
|
Product Advertising API ?? |
Amazonからのメールによると、Web サービスの名称が変わり、認証が必要になるらしい、、、
名称変更にともない、Product Advertising API にリクエストを送信いただく都度、
認証のための電子署名を含めていただくことが必要になります。
この変更は、2009年5月11日より3ヶ月の間の移行期間の後、2009年8月15日には、
Product Advertising API へ送信されるリクエストは全て認証されることとなり、
認証されない場合、リクエストは処理されなくなります。
8月だから、まだいっか・・・。
、と、思ったらいくつか情報発見。
アマゾンAPIを使うのに2009年8月15日から認証が必要になるらしい
http://chalow.net/2009-05-09-1.html
ここを参考にして、
Secret Access Key は、 http://aws.amazon.com/ へ行って、
「Your Account」→「Access Identifiers」へ移動すると見ることができます。
ログインして上の場所へ行くと、認証キーをGETできます。
Your Access Key ID:
1D4P12WWD7KPTPH77H82
Your Secret Access Key:
Cwl0Z7Ur1lzuAO9DE0Hz28Nuw7lRdfeMxr5IrXnY
グーグルさんしてみると、PHP用のソースがフォーラム(英語)にあるようです。
ちょっと探すと、ありました。
http://developer.amazonwebservices.com/connect/thread.jspa?threadID=31679
ソースのURLは、こっちのようです。
http://mierendo.com/software/aws_signed_query/
では、動かしてみましょう。
Fatal error: Call to undefined function: hash_hmac() in...
「hash_hmac関数が定義されてない」と怒られました、、、「hash_hmac」関数を調べてみます。
http://php.s3.to/man/function.hash-hmac.html
http://php.s3.to/man/hash.setup.html
ハッシュ拡張モジュールは外部のライブラリを必要とせず、PHP 5.1.2 では
デフォルトで有効となります。~略~ それ以前のバージョンの PHP にハッシュ拡張
モジュールを組み込むには、≫ PECL モジュール をインストールします。
いまだにPHP4を使っている化石サイトなので、当然入っていませんでした・・・。
PECLでインストールしましょうか。
[php@localhost]#pecl install hash
hash.soがインストールされたようなので、php.iniのextensionの項目にhash.soを追加します。
;extension=yyyy.dll
;extension=xxxx.dll
extension=hash.so
httpdをリスタート。
動きません。。。
hash.soの入ってるディレクトリを見ると、1人だけパーミッションが変なようです。
[php@localhost]#chmod 755 hash.so
これで動くようになり、、ませんでした
Fatal error: Call to undefined function: simplexml_load_string() in...
また怒られました。。。でも、これはXMLをパースする関数なので削除しちゃいます。
そして、手を加えた関数がこちら。
<?php
function aws_request($params){
// Your Access Key ID
$public_key = "1D4sくぁwせPH77H82";
// Your Secret Access Key
$private_key = "Cwl0Z7Ur1lz0000w7lRdfeMxr5IrXnY";
$host="webservices.amazon.co.jp";
$method = "GET";
$uri = "/onca/xml";
$params["Service"] = "AWSECommerceService";
$params["AWSAccessKeyId"] = $public_key;
$params["Timestamp"] = gmdate("Y-m-d\TH:i:s\Z");
$params["Version"] = "2009-01-06";
ksort($params);
$query = array();
foreach ($params as $param=>$value){
$param = str_replace("%7E", "~", rawurlencode($param));
$value = str_replace("%7E", "~", rawurlencode($value));
$query[] = $param."=".$value;
}
$query = implode("&", $query);
$string_to_sign = $method."\n".$host."\n".$uri."\n".$query;
$signature = base64_encode(hash_hmac("sha256", $string_to_sign, $private_key, True));
$signature = str_replace("%7E", "~", rawurlencode($signature));
$request = "http://".$host.$uri."?".$query."&Signature=".$signature;
return file_get_contents($request);
}
// sample
$xml = aws_request(array("Operation"=>"ItemSearch",
"SearchIndex"=>"HealthPersonalCare",
"BrowseNode"=>"171312011",
"ResponseGroup"=>"Images,ItemAttributes,OfferFull"));
echo $xml;
?>
実行サンプル ソース
キーワード検索の例:
// 日本語キーワードは関数側でurlエンコードしている, ページはItemPage
$xml = aws_request(array("Operation" => "ItemSearch",
"SearchIndex" => "Books",
"Keywords" => "PHP",
"ItemPage" => 1,
"ResponseGroup"=>"Images,ItemAttributes,OfferSummary,Reviews"));
// PHP4でXML解析をする方法
require_once("XML/Unserializer.php");
$Unserializer =& new XML_Unserializer();
$Unserializer->setOption('parseAttributes', TRUE);
$status = $Unserializer->unserialize($xml);
$val = $Unserializer->getUnserializedData();
print_r($val);
ASIN検索の例:
$xml = aws_request(array("Operation" => "ItemLookup",
"ItemId" => "B000NODF50",
"ResponseGroup"=>"Large"));
ちなみに、以前のURLは
http://webservices.amazon.co.jp/onca/xml?
Service=AWSECommerceService
&AssociateTag=letsphp-22
&SubscriptionId=1KSCR3JZ6P65QT1AN702
&Operation=ItemSearch
&SearchIndex=HealthPersonalCare
&BrowseNode=171312011
&ItemPage=1
&ResponseGroup=Images,ItemAttributes,OfferFull
XMLで見る
表示サンプル
アフリサイト「アマゾンサーチ」の書き換えはこれからです。面倒くさそう。。。
LastModified