アマゾン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でアクセス!

グーグルさんしてみると、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