2009年05月10日 20:15 [Edit]

perl - URI::Amazon::APA released!

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

追記:

うーん、車輪の再発明。


この記事へのトラックバックURL

この記事へのトラックバック
アマゾン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
WebAPIでAmazonの商品情報を取れるProduct Advertisin...
[メモ] Perl で Amazon アソシエイト WEBサービス (現 Product Advertising API)の署名認証をどうにかする【デジタル家電とパソコン奮闘】at 2011年04月12日 22:59
MovabletypeをベースにしてAmazonアソシエイトリンクジェネレーター AmaPOPを構築中です。なんとか使えるような形になってきましたのでお知らせです。Movabletypeであれば、こうしたアプリのようなものを手軽にアタッチできる(プラグイン)ことがわかりました。いまさらなが...
MovabletypeベースでAmazonアソシエイトリンクジェネレーターアプリを構築【WEBデザイン BLOG】at 2009年10月15日 04:04
Amazon Web Services 2009年8月15日からAmazon Web Servicesを利用するときはアクセスキーだけではなく電子署名も埋め込む必要があるというメールが来ていた。 まあ、アクセスキーが分かれば誰でもリクエスト出来るというのは いかがなものかなとは思っていたところだったの...
Rubyで電子署名 Amazon アソシエイト Web サービス【黒川仁 文具堂ブログ三昧】at 2009年06月28日 19:32
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
さくらです??こんばんわ☆彡 今日は5月11日…そう! AWS ユーザー界を騒がせてるパアピ!パアピ!がサービスインする日なの!! (パアピ!パアピ!は Product Advertising API の愛称よ。詳し...
Amazon Product Advertising API で認証付きリクエストの動作を確認してみますた【ゆっくり…して…イってネ!】at 2009年05月11日 02:24
Amazonが、アソシエイト・プログラムを通じてAmazonの商品を広告しているWebサイトに支払っている額は、年間で数十億円にものぼります。 アマゾンのAPIは今まで、Amazon Web サービス(AWS)によって提供され...
AWSからProduct Advertising APIへ【[Z]ZAPAブロ〜グ2.0】at 2009年05月10日 23:22
この記事へのコメント
こんにちは、


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
私の環境だけかもしれませんが、sub sign でエラーが出るので下記のようにしたら無事通るようになりました。

use URI::Escape;
use URI::Escape qw(uri_escape_utf8);

やっと走ったと思ったら、今度は日本語で検索したらエラーになります。

v 0.2を使用しているのですが、考えられる対策があればご教示いただけると幸いです。
Posted by あびる at 2009年06月05日 16:06
使わせていただこうとしたのですが、どうもシングルクォートを含むキーワードでSigunatureが合わないようです。

uri_escape_utf8ではシングルクォートをスルーしてるみたいですが、%27にエンコードされた方がいいみたいですね。
Posted by kisara at 2009年06月02日 21:56
「反貧困」湯浅誠 岩波新書を読みましょう。話はそっからです。
Posted by 「反貧困」湯浅誠 岩波新書を読みましょう。話はそっからです。 at 2009年05月26日 03:52
keroyonnさん、
報告ありがとうございます。patchどおりではないのですが、修正の上$VERSION++しておきました。
Dan the Author Thereof
Posted by at 2009年05月23日 04:34
日本語で検索するとエラーになったので、以下のようにすると正常に動くようになりました。

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