読者です 読者をやめる 読者になる 読者になる

kur.jp

バイオリンと自転車をこよなく愛するkurのチラシの裏。たまには技術的なことを書いたりするかも知れません。

Amazon APIで商品を検索する

Amazonで扱われている特定の商品の値段を期的にチェックして、値段が変わったら教えてくれるプログラムが欲しいなーと思ったのでコソコソ作ってます。

まず、下記のようなコードでAmazon APIで商品を検索することが出来ます。

[php] include_once('Services_Amazon/Amazon.php');

function SearchAmazonItem($category, $keyword){ $amazon = new Services_Amazon(ACCESS_KEY_ID,SECRET_ACCESS_KEY,AFFERIATE_ID); $amazon->setVersion(API_VERSION); $amazon->setBaseUrl('http://ecs.amazonaws.jp/onca/xml'); $options = array( 'Keywords' => $keyword, ); return $amazon->ItemSearch($category, $options); } [/php] API_VERSIONに間して私の環境では2011-02-16だったけど、たぶんこれは人によって違うんだろうと思う。ちなみに、当然のことながら、Services_Amazonのライブラリを使用しなくてもAmazon APIを利用することが出来る。具体的なコードはこんな感じになる。なお、Services_Amazonを使った際の注意点として、検索結果が1件の場合、データの構造がちょっと変わるので対処できるようにしておく必要がある。これに関してServices_Amazonの出力がそうなっているのか、それともAmazonが返すXMLがそもそもそういう構造になっているのかはまだ未確認。

[php] function SearchAmazonItem($keyword){ $params['Service'] = 'AWSECommerceService'; $params['AWSAccessKeyId'] = ACCERSS_KEY_ID; $params['Version'] = API_VERSION; $params['Operation'] = 'ItemSearch'; $params['Keywords'] = $keyword; $params['Timestamp'] = gmdate('Y-m-d\TH:i:s\Z'); ksort($params);

$canonical_string = '';
foreach ($params as $k => $v) {
    $canonical_string .= '&' . $this->urlencode_rfc3986($k).'=' . $this->urlencode_rfc3986($v);
}
$canonical_string = substr($canonical_string, 1);

$parsed_url = parse_url($baseurl);
$string_to_sign = "GET\n{$parsed_url['host']}\n{$parsed_url['path']}\n{$canonical_string}";
$signature = base64_encode(hash_hmac('sha256', $string_to_sign, $SECRET_ACCESS_KEY, true));

$url = $baseurl.'?'.$canonical_string.'&Signature='.$this->urlencode_rfc3986($signature);
return file($url);

} [/php]