WEBサービス・API/Amazon/Product Advertising API

1月 1, 2003 · Posted in Amazon, WEBサービス・API · Comment 

概要

Amazonの商品情報を、WEBサービスを経由して取得することができるAPI。

公式サイト

-http://affiliate.amazon.co.jp/gp/advertising/api/detail/main.html
-署名認証について
http://affiliate.amazon.co.jp/gp/associates/help/t126
-Product Advertising APIドキュメント
http://docs.amazonwebservices.com/AWSECommerceService/latest/DG/

署名認証の導入

2009年8月15日より、WEBサービスにリクエストを送信する際に、署名認証情報を付加して送信しないと、商品情報が取得できないように仕様が変更になった。

8/14までの状態でリクエストを送信してみる。

http://webservices.amazon.co.jp/onca/xml?
Service=AWSECommerceService&SubscriptionId=XXXXXXXXXXXXXXXXXXXX&
Operation=ItemSearch&SearchIndex=DVD&ResponseGroup=Medium&
ItemPage=1&Keywords=StarWars

結果

<?xml version="1.0"?>
<ItemSearchErrorResponse xmlns="http://ecs.amazonaws.com/doc/2005-10-05/">
<Error>
<Code>MissingParameter</Code>
<Message>The request must contain the parameter Signature.</Message>
</Error>
<RequestID> XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX </RequestID>
</ItemSearchErrorResponse>
署名パラメータがない。

署名の付け方
Product Advertising API アカウントを作成する
http://affiliate-program.amazon.com/gp/flex/advertising/api/sign-in-jp.html

ログイン→Manage Your Account→アクセスキー情報にアクセスして、アクセスキーIDと秘密キーを取得する。

パラメータの組み立て

$awsUrl = "http://ecs.amazonaws.jp/onca/xml";

$params = array();
$params{"Service"} = "AWSECommerceService";
$params{"AWSAccessKeyId"} = "アクセスキーID";
$params{"Operation"} = "ItemSearch";
// 当ページの下のほう参照
$params{"SearchIndex"} = "Books";
$params{"Keywords"} = "Java";
$params{"Version"} = "2009-07-01";
$params{"Timestamp"} = gmdate("Y-m-d\TH:i:s\Z"); // タイムスタンプ

// キーソート。重要!
ksort($params);

// urlパラメータ形式の作成
$paramString = "";
foreach ($params as $key=>$value) {
$paramString .= "&".urlencode($key)."=".urlencode($value);
}
$paramString = substr($paramString, 1);

続いて、署名を作成してURLにくっつける

$parseUrl = parse_url($awsUrl);
$baseString = "GET\n{$parseUrl['host']}\n{$parseUrl['path']}\n{$paramString}";
$signature = base64_encode(hash_hmac("sha256", $baseString, "秘密キー", true));

$url = $awsUrl . "?" .$paramString . "&Signature=" . urlencode($signature);

作成したURLにアクセス

$xml = simplexml_load_file($url);
foreach($xml->Items->Item as $node){
print_r($node);
}

SearchIndex

-Apparel
-Automotive
-Books
-DVD
-Electronics
-GourmetFood
-Kitchen
-Music
-PCHardware
-PetSupplies
-Software
-SoftwareVideoGames
-SportingGoods
-Tools
-Toys
-VHS
-VideoGames