さて、このたび、Amazon アソシエイト Web サービスの名称を、「Product Advertising API」と変更しましたことをお知らせいたします。この新名称は、開発者の皆様が Amazon サイトで販売されている商品の広告作成を行い、これによって Amazon より広告費を受け取るという、API の目的をより正しく表しています。はいはい、了解しました。
名称変更にともない、Product Advertising API にリクエストを送信いただく都度、認証のための電子署名を含めていただくことが必要になります。なんだ、なんだ?
http://webservices.amazon.com/onca/xml?Service=AWSECommerceServic e&AWSAccessKeyId=00000000000000000000&Operation=ItemLookup&ItemId =0679722769&ResponseGroup=ItemAttributes%2COffers%2CImages%2CRevi ews&Version=2009-01-06&Timestamp=2009-01-01T12%3A00%3A00Z
AWSAccessKeyId=00000000000000000000&ItemId=0679722769&Operation=I temLookup&ResponseGroup=ItemAttributes%2COffers%2CImages%2CReview s&Service=AWSECommerceService&Timestamp=2009-01-01T12%3A00%3A00Z& Version=2009-01-06
GET webservices.amazon.com /onca/xml AWSAccessKeyId=00000000000000000000&ItemId=0679722769&Operation=I temLookup&ResponseGroup=ItemAttributes%2COffers%2CImages%2CReview s&Service=AWSECommerceService&Timestamp=2009-01-01T12%3A00%3A00Z& Version=2009-01-06
URL encode します。pwqYQRc3RepIrf7m+VMRy/jFXx/ZBSPsaSFFexIUoSI=
pwqYQRc3RepIrf7m%2BVMRy%2FjFXx%2FZBSPsaSFFexIUoSI%3D
http://webservices.amazon.com/onca/xml?AWSAccessKeyId=00000000000 000000000&ItemId=0679722769&Operation=ItemLookup&ResponseGroup=It emAttributes%2COffers%2CImages%2CReviews&Service=AWSECommerceServ ice&Timestamp=2009-01-01T12%3A00%3A00Z&Version=2009-01-06&Signatu re=pwqYQRc3RepIrf7m%2BVMRy%2FjFXx%2FZBSPsaSFFexIUoSI%3D
この変更は、2009年5月11日より3ヶ月の間の移行期間の後、2009年8月15日には、Product Advertising API へ送信されるリクエストは全て認証されることとなり、認証されない場合、リクエストは処理されなくなります。
実行結果:#!/usr/bin/perl use strict; use warnings; use Digest::SHA qw(hmac_sha256_base64); use URI::Escape; my $data = q(GET webservices.amazon.com /onca/xml AWSAccessKeyId=00000000000000000000&ItemId=0679722769&Operation=I\ temLookup&ResponseGroup=ItemAttributes%2COffers%2CImages%2CReview\ s&Service=AWSECommerceService&Timestamp=2009-01-01T12%3A00%3A00Z&\ Version=2009-01-06); my $key = "1234567890"; my $signature = hmac_sha256_base64($data, $key); $signature .= '=' while length($signature) % 4; print "$signature\n"; print URI::Escape::uri_escape($signature), "\n";
Nace+U3Az4OhN7tISqgs1vdLBHBEijWcBeCqL5xN9xg=
Nace%2BU3Az4OhN7tISqgs1vdLBHBEijWcBeCqL5xN9xg%3D
文字数がmod 4で0になるまで=で埋めなくては (padding of Base64 Digests) いけないらしい。