AmazonAPIで商品を自動検索する方法(PHP)
目次
概要
Amazonが公開している価格や商品の検索・購入をプログラムから行う為のAPI
各種パラメータ(下記、1~11)をAmazonのWebサーバーにリクエストするとXML形式でレスポンスが返ってくる。
XMLを解析、データを加工する事で独自のWebサービスの作成が可能。
なお、AmazonAPIを利用するには、
①アソシエイトID = Amazonアフィリエイト用アカウントの作成(無料)により付与される。
②AWSアクセスキー = Amazonアフィリエイト用アカウントの作成(無料)により作成可能(無料)。
③AWSシークレットキー = Amazonアフィリエイト用アカウントの作成(無料)により作成可能(無料)。
が必要。
※AmazonWebServiceについては「AWS① 主なサービス」を参照
(1)リクエスト先URI
$baseurl = "http://ecs.amazonaws.jp/onca/xml";
※日本の商品を検索する場合。他国は別。
(2)Amazon各種アカウント設定
// ①アソシエイトタグ
define("Associate_tag", "*****");
// ②アクセスキー
define("Access_Key_ID", "*****");
// ③シークレットキー
define("Secret_Access_Key", "*****");
(3)パラメータ付加
// リクエストのパラメータ作成
$params = array();
$params["Service"] = "AWSECommerceService"
$params["AWSAccessKeyId"] = Access_Key_ID;
$params["Version"] = "2013-08-01"
$params["Operation"] = "ItemSearch"
$params["SearchIndex"] = "All";
※All/Books/DVD/Electronics 等を指定
$params["Keywords"] = "Windowsプログラム";
※商品検索ワードを指定
$params["AssociateTag"] = Associate_tag;
$params["ResponseGroup"] = "ItemAttributes,Offers,Medium"
※画像無し:Small/画像有り:Medium/レビューや関連商品等も:Large を指定
↑ リクエスト先URIにパラメータを付加
$base_request = "";
foreach ($params as $k => $v) {
$base_request .= "&" . $k . "=" . $v;
}
$base_request = $baseurl . "?" . substr($base_request, 1);
$v) {
$base_request .= “&” . $k . “=” . $v;
}
$base_request = $baseurl . “?” . substr($base_request, 1);
?>
↓
Service=AWSECommerceService&
AWSAccessKeyId=*****&
Version=2013-08-01&
Operation=ItemSearch&
SearchIndex=Books&
Keywords=Windows&
AssociateTag=*****&
ResponseGroup=ItemAttributes,Offers,Medium
(4)タイムスタンプを付加
$params["Timestamp"] = gmdate("Y-m-d\TH:i:s\Z");
$base_request .= "&Timestamp=" . $params['Timestamp'];
↓
Service=AWSECommerceService&
AWSAccessKeyId=*****&
Version=2013-08-01&
Operation=ItemSearch&
SearchIndex=Books&
Keywords=Windows&
AssociateTag=*****&
ResponseGroup=ItemAttributes,Offers,Medium&
Timestamp=2015-04-27T21:30:35Z
(5)「RFC 3986」形式でエンコーディング
$base_request = "";
foreach ($params as $k => $v) {
$base_request .= '&' . $k . '=' . rawurlencode($v);
$params[$k] = rawurlencode($v);
}
$base_request = $baseurl . "?" . substr($base_request, 1);
$v) {
$base_request .= ‘&’ . $k . ‘=’ . rawurlencode($v);
$params[$k] = rawurlencode($v);
}
$base_request = $baseurl . “?” . substr($base_request, 1);
?>
↓
Service=AWSECommerceService&
AWSAccessKeyId=%2A%2A%2A%2A%2A&
Version=2013-08-01&
Operation=ItemSearch&SearchIndex=Books&
Keywords=Windows&
AssociateTag=%2A%2A%2A%2A%2A&
ResponseGroup=ItemAttributes%2COffers%2CMedium&
Timestamp=2015-04-27T21%3A32%3A50Z
(6)「&」削除&改行
$base_request = preg_replace("/.*\?/", "", $base_request);
$base_request = str_replace("&", "\n", $base_request);
↓
Service=AWSECommerceService
AWSAccessKeyId=%2A%2A%2A%2A%2A
Version=2013-08-01
Operation=ItemSearch
SearchIndex=Books
Keywords=Windows
AssociateTag=%2A%2A%2A%2A%2A
ResponseGroup=ItemAttributes%2COffers%2CMedium
Timestamp=2015-04-27T21%3A35%3A07Z
(7)パラメーター名で昇順ソート
ksort($params);
$base_request = “”;
foreach ($params as $k => $v) {
$base_request .= "&" . $k . "=" . $v;
}
$base_request = substr($base_request, 1);
$base_request = str_replace("&", "\n", $base_request);
$v) {
$base_request .= “&” . $k . “=” . $v;
}
$base_request = substr($base_request, 1);
$base_request = str_replace(“&”, “\n”, $base_request);
?>
↓
AWSAccessKeyId=%2A%2A%2A%2A%2A
AssociateTag=%2A%2A%2A%2A%2A
Keywords=Windows
Operation=ItemSearch
ResponseGroup=ItemAttributes%2COffers%2CMedium
SearchIndex=Books
Service=AWSECommerceService
Timestamp=2015-04-27T21%3A35%3A07Z
Version=2013-08-01
(8)「&」でつなぐ
$base_request = str_replace("\n", "&", $base_request);
↓
AWSAccessKeyId=%2A%2A%2A%2A%2A&
AssociateTag=%2A%2A%2A%2A%2A&
Keywords=Windows&
Operation=ItemSearch&
ResponseGroup=ItemAttributes%2COffers%2CMedium&
SearchIndex=Books&
Service=AWSECommerceService&
Timestamp=2015-04-27T21%3A40%3A30Z&
Version=2013-08-01
(9)3行を頭に追加
$parsed_url = parse_url($baseurl);
$base_request =
"GET" . "\n"
. $parsed_url['host'] . "\n"
. $parsed_url['path'] . "\n"
. $base_request;
↓
GET
webservices.amazon.com
/onca/xml
AWSAccessKeyId=%2A%2A%2A%2A%2A&
AssociateTag=%2A%2A%2A%2A%2A&
Keywords=Windows&
Operation=ItemSearch&
ResponseGroup=ItemAttributes%2COffers%2CMedium&
SearchIndex=Books&
Service=AWSECommerceService&
Timestamp=2015-04-27T21%3A40%3A30Z&
Version=2013-08-01
(10)署名を作成
$signature = base64_encode(hash_hmac('sha256', $base_request, Secret_Access_Key, true));
$signature = rawurlencode($signature);
↓
5cqsDfQNvWujrBWtFjy8RYm4rXi%2B6OcmygkLILe1D8A%3D
(11)署名を付加
$base_request = "";
foreach ($params as $k => $v) {
$base_request .= "&" . $k . "=" . $v;
}
$base_request = $baseurl . "?" . substr($base_request, 1) . "&Signature=" . $signature;
$v) {
$base_request .= “&” . $k . “=” . $v;
}
$base_request = $baseurl . “?” . substr($base_request, 1) . “&Signature=” . $signature;
?>
↓
AWSAccessKeyId=%2A%2A%2A%2A%2A&
AssociateTag=%2A%2A%2A%2A%2A&
Keywords=Windows&
Operation=ItemSearch&
ResponseGroup=ItemAttributes%2COffers%2CMedium&
SearchIndex=Books&
Service=AWSECommerceService&
Timestamp=2015-04-27T21%3A40%3A30Z&
Version=2013-08-01&
Signature=5cqsDfQNvWujrBWtFjy8RYm4rXi%2B6OcmygkLILe1D8A%3D
(12)XMLから商品データを抜き出して表示
XMLから商品データを抜き出し
$amazon_xml=simplexml_load_string(@file_get_contents($base_request));
抜き出したデータを全件Loop
foreach((object)$amazon_xml->Items->Item as $item_a=>$item){
//商品名
$title=$item->ItemAttributes->Title;
//商品のURL
$detail=$item->DetailPageURL;
//画像のURL
$image=$item->MediumImage->URL;
// ↑ をリンクにしてhtml表示
print '<div style="clear:both;">
<a href="'.$detail.'" target="_blank">
<img src="'.$image.'" align="left"/>
'.$title.'
</a>
</div>';
unset($item);
Items->Item as $item_a=>$item){ //ここに注目
$title=$item->ItemAttributes->Title; //商品名
$detail=$item->DetailPageURL; //商品のURL
$image=$item->MediumImage->URL; //画像のURL
print ‘
‘;
print ‘
‘;
unset($item);
}
?>