そんなわけで、作りました。
- /lang/perl/URI-Amazon-APA/trunk - CodeRepos::Share - Trac
- dankogai's p5-uri-amazon-apa at master - GitHub
- @CPAN (coming soon)
名称変更にともない、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なども、省略されていれば自動生成してくれます。
自分の ID でやってみたけど、認証 URL はアクセス失敗した。
もう一度試してみて下さい。注意点としては、Digest::SHA::hmac_sha256_base64()の出力はそのままでは使えなくて、=でpadしなければならないということがあります。
Enjoy!
Dan the Perl Monger
追記:うーん、車輪の再発明。
use utf8;
use feature qw(say);
use URI::Amazon::APA;
my $u = URI::Amazon::APA->new('http://ecs.amazonaws.jp/onca/xml');
$u->query_form( Title => '日本語' );
say $u->query;
$u->sign(key => $key, secret => $secret);
say $u->query =~ m/(Title=.+)/ ? $1 : '';
$ perl test.pl
Title=%E6%97%A5%E6%9C%AC%E8%AA%9E
Title=%C3%A6%C2%97%C2%A5%C3%A6%C2%9C%C2%AC%C3%A8%C2%AA%C2%9E
decode_utf8 の is_utf8 のチェックが邪魔しちゃってるのでしょうか?
- my %q = map { $_ => decode_utf8( uri_unescape( $eq{$_} ) ) } keys %eq;
+ my %q = map { $_ => Encode::decode('utf8', uri_unescape( $eq{$_} ) ) } keys %eq;