cpan

そんなわけで、作りました。

Amazon アソシエイト・プログラム(アフィリエイト) 公式ブログ: Amazon アソシエイト Web サービスの名称変更および署名認証についてのお知らせ
名称変更にともない、Product Advertising API にリクエストを送信いただく都度、認証のための電子署名を含めていただくことが必要になります。この変更は、2009年5月11日より3ヶ月の間の移行期 間の後、2009年8月15日には、Product Advertising API へ送信されるリクエストは全て認証されることとなり、認証されない場合、リクエストは処理されなくなります。Product Advertising API へのリクエストに署名認証を含めるための簡単な方法については、こちらの開発者向けガイドをご覧ください。

使い方は、すこぶる簡単です。以下、実地テストに使ったScriptを、keyとsecretのみ伏せて。

#!/usr/local/bin/perl
use strict;
use warnings;
use URI::Amazon::APA;
use LWP::UserAgent;
use XML::Simple;
use YAML::Syck;

my $u = URI::Amazon::APA->new('http://webservices.amazon.com/onca/xml');
$u->query_form(
    Service     => 'AWSECommerceService',
    Operation   => 'ItemSearch',
    Title       => shift || 'Perl',
    SearchIndex => 'Books',
);
$u->sign(
    key    => $key,
    secret => $secret,
);

my $ua = LWP::UserAgent->new;
my $r  = $ua->get($u);
print $r->status_line, "\n", YAML::Syck::Dump( XMLin( $r->content ) );

要はURIオブジェクトにsignメソッドだけ追加してやるというモジュールです。Timestampなども、省略されていれば自動生成してくれます。

[を] アマゾンAPIを使うのに2009年8月15日から認証が必要になるらしい
自分の ID でやってみたけど、認証 URL はアクセス失敗した。

もう一度試してみて下さい。注意点としては、Digest::SHA::hmac_sha256_base64()の出力はそのままでは使えなくて、=でpadしなければならないということがあります。

Enjoy!

Dan the Perl Monger

追記:

うーん、車輪の再発明。