2009-06-18 18:28:43
一昨日「Amazon.co.jp Product Advertising API チーム」というところから、メールが来て、「Product Advertising API への全てのリクエストに、認証のための電子署名を 2009年8月15日までに含めなければならない」ことを通知したのに、「弊社による調査では、お客様の AWSAccessKeyID から送信されているリクエストには、未だ電子署名が含まれていないことが判明しています」と警告されてしまった。ああ、そうだった。すっかり忘れていた。よく見たら、アメリカ、イギリス、ドイツ、フランスのAmazonから同じような警告が届いているではないか。面倒くさい。一体いくつのファイルを書き換えなければならないのか。気が遠くなるほどである。次から次へと訳もわからずPHPでスクリプトを書いては、cronで定期的に実行させたり、検索サイトを作ったりしてしまったのだ。
とりあえず、一つでも進めておこう。この情報はネット上にたくさんあるので参考にできるところは多い。いろいろ参考にさせてもらって(一カ所でないので引用できないけど)、ISBNから作品情報を得る部分は次のようなfunctionを作って今までのPHPスクリプトに埋め込み、Amazon.co.jpへの問い合わせの部分を置き換えることにした。
function amzuri($asin)
{
$params = array();
$params['Service'] = "AWSECommerceService";
$params['AWSAccessKeyId'] = "xxxxxxxxxxxxxxxxxx";
$params['Version'] = "2009-03-31";
$params['Operation'] = "ItemLookup";
$params['Timestamp'] = gmdate('Y-m-d\TH:i:s\Z');
$params['ItemId'] = $asin;
$params['ResponseGroup'] = "Small";
ksort($params);
$canonical_string = '';
foreach ($params as $k => $v) {
$canonical_string .= '&'.rawurlencode($k).'='.rawurlencode($v);
}
$canonical_string = substr($canonical_string, 1);
$baseurl = "http://ecs.amazonaws.jp/onca/xml";
$SecretKey = "xxxxxxxxxxxxxxxxxx/xxxxxxxx";
$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, $SecretKey, true));
$amzurl = $baseurl.'?'.$canonical_string.'&Signature='.rawurlencode($signature);
return $amzurl;
}
$getamz = amzuri($asin);
$res = simplexml_load_file($getamz);
foreach($res->Items->Item as $item){
$amazon = $item->DetailPageURL;
}
これで、試してみたら、いちおう答えが返ってきたからいいのだろうか。今は認証ができていなくてもエラーはでないのか。だとしたら、8月15日に一斉にエラーが出ると大変困ったことになる。
次にタイトルに含まれるキーワードで今月(以前)に出る本を検索し、その結果を新しい順に並べるというものである。
function amzuri($keyword,$pdate)
{
$params = array();
$params['Service'] = "AWSECommerceService";
$params['AWSAccessKeyId'] = "xxxxxxxxxxxxxxxxxxx";
$params['Version'] = "2009-03-31";
$params['Operation'] = "ItemSearch";
$params['Timestamp'] = gmdate('Y-m-d\TH:i:s\Z');
$params['ResponseGroup'] = "Medium,Offers";
$params['SearchIndex'] = "Books";
$params['Sort'] = "-publication_date";
$params['Power'] = "pubdate:before ".$pdate." and title:".$keyword;
ksort($params);
$canonical_string = '';
foreach ($params as $k => $v) {
$canonical_string .= '&'.rawurlencode($k).'='.rawurlencode($v);
}
$canonical_string = substr($canonical_string, 1);
$baseurl = "http://ecs.amazonaws.jp/onca/xml";
$SecretKey = "xxxxxxxxxxxxxxxxxxxx/xxxxxxxxx";
$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, $SecretKey, true));
$amzurl = $baseurl.'?'.$canonical_string.'&Signature='.rawurlencode($signature);
return $amzurl;
}
いいのかなあ。これを5カ国分やらなければならないのか。まあ、9割はAmazon.co.jpだと思うけど。