
そんなわけで、作りました。
- /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;