Amazon PAAPIのItemLookUpは複数ASINのリクエストが出来た
以前の記事「Amazon Product Advertising APIが簡単に使えるようになっていて驚いた」では久しぶりにAmazonのAPIを使って、特定のブラウズノードの商品一覧を取得しました。
しかし今度は別々のブラウズノードにある複数の商品のデータが欲しくなり、その商品数分のリクエストをItemLookUpでループして取得していたのですが…
ItemLookUpのItemIdには複数のASINが書けた
知っている人には当たり前の話ですが、ItemIdにASINをセットする際、
B01LW20AN8,B07J4HGKN4,B07GNC75CG
みたいにカンマ区切りにすることで複数のASINをまとめて指定できたんですねー。
考えてみれば Operation=ItemSearch とかではまとめて10個のデータを持ってきてくれるのですから、ItemLookUpで出来ても不思議ではなかった…。もちろんASINが書けるのは10個までという制限がありますが、それでも1つ1つリクエストするのに比べれば実に10倍です。
というわけで忘れないうちにメモメモ。
■PHPでAmazonの複数ASINを取得する例
<?php
$cfg['AWSAccessKeyId'] = "***********************";
$cfg['AWSSecretAccessKeyId'] = "***********************";
$cfg['AssociateTag'] = "**********-22";
$item_id = 'B01LW20AN8,B07J4HGKN4,B07GNC75CG';
$xml = getAmazon($item_id);
print_r($xml);
/**********************************************
* Amazon Product Advertising API
**********************************************/
function getAmazon($item_id) {
global $cfg;
$params = array(
'Service' => 'AWSECommerceService',
'Operation' => 'ItemLookup',
'AWSAccessKeyId' => $cfg['AWSAccessKeyId'],
'AssociateTag' => $cfg['AssociateTag'],
'ItemId' => $item_id,
'IdType' => 'ASIN',
'ResponseGroup' => 'ItemAttributes'
);
$endpoint = 'webservices.amazon.co.jp';
$uri = '/onca/xml';
// Set current timestamp if not set
if (!isset($params["Timestamp"])) {
$params["Timestamp"] = gmdate('Y-m-d\TH:i:s\Z');
}
// Sort the parameters by key
ksort($params);
$pairs = array();
foreach ($params as $key => $value) {
array_push($pairs, rawurlencode($key)."=".rawurlencode($value));
}
// Generate the canonical query
$canonical_query_string = join("&", $pairs);
// Generate the string to be signed
$string_to_sign = "GET\n".$endpoint."\n".$uri."\n".$canonical_query_string;
// Generate the signature required by the Product Advertising API
$signature = base64_encode(hash_hmac("sha256", $string_to_sign, $cfg['AWSSecretAccessKeyId'], true));
// Generate the signed URL
$request_url = 'https://'.$endpoint.$uri.'?'.$canonical_query_string.'&Signature='.rawurlencode($signature);
$response = @file_get_contents($request_url);
$parsed_xml = null;
if (isset($response)) {
$parsed_xml = simplexml_load_string($response);
}
return $parsed_xml;
}
?>
こんな感じで、無事10倍の速度でAmazonの商品データが取得できるようになりました。
めでたしめでたし。