2009年05月10日 20:15 [Edit]
perl - URI::Amazon::APA released!
そんなわけで、作りました。
- /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
追記:うーん、車輪の再発明。
Posted by dankogai at 20:15│Comments(6)│TrackBack(7)
この記事へのトラックバックURL
この記事へのトラックバック
Amazonが、アソシエイト・プログラムを通じてAmazonの商品を広告しているWebサイトに支払っている額は、年間で数十億円にものぼります。
アマゾンのAPIは今まで、Amazon Web サービス(AWS)によって提供され...
AWSからProduct Advertising APIへ【[Z]ZAPAブロ〜グ2.0】at 2009年05月10日 23:22
さくらです??こんばんわ☆彡
今日は5月11日…そう!
AWS ユーザー界を騒がせてるパアピ!パアピ!がサービスインする日なの!!
(パアピ!パアピ!は Product Advertising API の愛称よ。詳し...
Amazon Product Advertising API で認証付きリクエストの動作を確認してみますた【ゆっくり…して…イってネ!】at 2009年05月11日 02:24
dankogaiさんが、PerlのProduct Advertising APIライブラリを作ってた。便乗して、Java。
Amazonの新しいProduct Advertising APIのRestのリクエストの作り方は前回のエントリで説明しました。このRestクライアントは、Amazonのドキュメントに載っています。しかし、その例は...
Product Advertising APIの日本用Restクライアント(Java)【The net is vast】at 2009年05月14日 01:51
Amazon Web Services
2009年8月15日からAmazon Web Servicesを利用するときはアクセスキーだけではなく電子署名も埋め込む必要があるというメールが来ていた。
まあ、アクセスキーが分かれば誰でもリクエスト出来るというのは
いかがなものかなとは思っていたところだったの...
Rubyで電子署名 Amazon アソシエイト Web サービス【黒川仁 文具堂ブログ三昧】at 2009年06月28日 19:32
MovabletypeをベースにしてAmazonアソシエイトリンクジェネレーター AmaPOPを構築中です。なんとか使えるような形になってきましたのでお知らせです。Movabletypeであれば、こうしたアプリのようなものを手軽にアタッチできる(プラグイン)ことがわかりました。いまさらなが...
MovabletypeベースでAmazonアソシエイトリンクジェネレーターアプリを構築【WEBデザイン BLOG】at 2009年10月15日 04:04
WebAPIでAmazonの商品情報を取れるProduct Advertisin...
[メモ] Perl で Amazon アソシエイト WEBサービス (現 Product Advertising API)の署名認証をどうにかする【デジタル家電とパソコン奮闘】at 2011年04月12日 22:59
アマゾンWebサービスの勉強を始めようと、早速本(※)も買ってきてコードを書いてみるのだが、サーバーからエラーが返ってくる。 <?xml version="1.0"?> <ItemSearchErrorResponse xmlns="http://ecs.amazonaws.com/doc/2010-09-01/"> <Error> <Code>MissingParameter</Code
Perlにおける署名計算のためのサンプルコード【S's 2nd】at 2011年06月09日 17:28
この記事へのコメント
日本語で検索するとエラーになったので、以下のようにすると正常に動くようになりました。
3a4
> use utf8;
22c23,27
< my %q = map { $_ => uri_unescape( $eq{$_} ) } keys %eq;
---
> my %q = map {
> my $value = uri_unescape( $eq{$_} );
> utf8::decode( $value );
> $_ => $value;
> } keys %eq;
27c32
< my $sq = join '&', map { $_ . '=' . uri_escape( $q{$_} ) } sort keys %q;
---
> my $sq = join '&', map { $_ . '=' . uri_escape_utf8( $q{$_} ) } sort keys %q;
3a4
> use utf8;
22c23,27
< my %q = map { $_ => uri_unescape( $eq{$_} ) } keys %eq;
---
> my %q = map {
> my $value = uri_unescape( $eq{$_} );
> utf8::decode( $value );
> $_ => $value;
> } keys %eq;
27c32
< my $sq = join '&', map { $_ . '=' . uri_escape( $q{$_} ) } sort keys %q;
---
> my $sq = join '&', map { $_ . '=' . uri_escape_utf8( $q{$_} ) } sort keys %q;
Posted by keroyonn at 2009年05月15日 09:34
keroyonnさん、
報告ありがとうございます。patchどおりではないのですが、修正の上$VERSION++しておきました。
Dan the Author Thereof
報告ありがとうございます。patchどおりではないのですが、修正の上$VERSION++しておきました。
Dan the Author Thereof
Posted by 弾 at 2009年05月23日 04:34
「反貧困」湯浅誠 岩波新書を読みましょう。話はそっからです。
Posted by 「反貧困」湯浅誠 岩波新書を読みましょう。話はそっからです。 at 2009年05月26日 03:52
使わせていただこうとしたのですが、どうもシングルクォートを含むキーワードでSigunatureが合わないようです。
uri_escape_utf8ではシングルクォートをスルーしてるみたいですが、%27にエンコードされた方がいいみたいですね。
uri_escape_utf8ではシングルクォートをスルーしてるみたいですが、%27にエンコードされた方がいいみたいですね。
Posted by kisara at 2009年06月02日 21:56
私の環境だけかもしれませんが、sub sign でエラーが出るので下記のようにしたら無事通るようになりました。
use URI::Escape;
use URI::Escape qw(uri_escape_utf8);
やっと走ったと思ったら、今度は日本語で検索したらエラーになります。
v 0.2を使用しているのですが、考えられる対策があればご教示いただけると幸いです。
use URI::Escape;
use URI::Escape qw(uri_escape_utf8);
やっと走ったと思ったら、今度は日本語で検索したらエラーになります。
v 0.2を使用しているのですが、考えられる対策があればご教示いただけると幸いです。
Posted by あびる at 2009年06月05日 16:06
こんにちは、
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;
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;
Posted by u at 2009年07月23日 19:12