[メモ] Perl で Amazon アソシエイト WEBサービス (現 Product Advertising API)の署名認証をどうにかする

| コメント(0) | トラックバック(0)
WebAPIでAmazonの商品情報を取れるProduct Advertising APIを使うとき、

http://ecs.amazonaws.jp/onca/xml?
Service=AWSECommerceService
&AWSAccessKeyId=[AccessKeyId]
&Operation=ItemSearch
&SearchIndex=ALL
&Keywords=Antecp193

マニュアル通りの上記のURL(※分かりやすいよう改行した)にアクセスすると
<Message>The request must contain the parameter Signature.</Message>
というエラーのXMLが返ってくる。

これは2009年8月からAPIの仕様変更により、APIのリクエストに電子署名を付加しな
ければならなくなった。これがなかなか厄介だったのでメモしておく。

Perlの場合は便利なモジュールが存在し、
・404 blog not found さんのとこの URI::Amazon::APA (CPAN)
・また上のモジュールで使われている Digest::SHA::PurePerl (CPAN)
の2つをCPANからダウンロードしてくる。

私が使っているロリポップのようなレンタルサーバーの場合、
CPANを使ったモジュールのインストールはもちろん出来ないので、
自分でCPAN用のディレクトリを作っちゃえばいい。(ってことを最近知った
長くなりそうなので続きに書く。
例えばCGIの動作が許可されている<cgi-bin>というディレクトリがホームにあるとして、
<cgi-bin>
       |--<mycpan>

というように、<cgi-bin>以下に<mycpan>というディレクトリを作る。
此処ではmycpanとつけたが、ディレクトリ名は適当でよい。

CPANから上の2つのモジュールをダウンロードしてtar.gzを展開、
展開されたディレクトリの中に<lib>があり、各々の<lib>ディレクトリの中に
<Digest> (Digest-SHA-PurePerl-5.50) と
<URL> (URI-Amazon-APA-0.03) というディレクトリがあるので、
その<Digest>と<URI>ディレクりを<mycpan>以下にアップロードする。

<cgi-bin>
      |--<mycpan>
                |----<Digest>
                |           |----<SHA>
                |                       |-- PurePerl.pm
                |----<URI>
                            |----<Amazon>
                                        |-- APA.pm  

それぞれのディレクトリの中にはPurePerl.pmAPA.pmという
2つのモジュール本体が入っている。こいつらを直接読み込めば言い訳だが、
ちょっと仕掛けが必要。


いまexample.cgiというperlスクリプトでAmazonのAPIをモジュール越しに使う場合、
use URI::Amazon::APA;

という一文を加えればいいのだが、もちろん<mycpan>の事なんか知らないので、
モジュールが見つからないというエラーが出る。
なので、
use lib qw(/cgi-bin/mycpan);
use URI::Amazon::APA;

というようにライブラリ(mycpan)を使う宣言をする。
パスはexample.cgiから見た相対パス、もしくは絶対パスを使用する。

これでURI::Amazon::APAは使えるようになるが、APA.pm内で使われている
SHA.pmがロリポップのレンタルサーバーにはないので(SHA1はあるけども...)
Can't locate Digest/SHA.pm in @INC

とエラーを吐く。じゃあ、同じようにモジュールをmycpanに入れれば良い。
そのためにDigestのSHAもダウンロードしてきた。


APA.pmはもちろんmycpanの場所を知らないので、
-----APA.pm---------
use lib qw(/cgi-bin/mycpan);
#use Digest::SHA qw(hmac_sha256_base64);
use Digest::SHA::PurePerl qw(hmac_sha256_base64);
上記のようにAPA.pmを改編する。PurePerlを指定しないといけないので、
use Digest::SHA qw(hmac_sha256_base64);
はコメントアウトして、新たな一文を追加させる。


以上で、祈願のURI::Amazon::APAがレンタルサーバーで使えるようになる。
もし、まだAPA.pmを動かすためのライブラリが足りなかったら、
同じようにmycpanにモジュール(pmファイル)を追加していけばよい。


詳しくは404 Blog Not FoundとかAmazon Product〜を参考に。
ちなみに以下でXML(のURL)が取得できるので、、駄文ですが。
my $key = '●●API Key●●';
my $secret = '●●Secret Kye●●';
my $amazon_api = URI::Amazon::APA->new('http://ecs.amazonaws.jp/onca/xml');
my $amazon_track = '●●track名●●';
$amazon_api->query_form(
    Service     => 'AWSECommerceService',
    Operation   => 'ItemSearch',
    Keywords       => '●●商品検索キーワード●●',
    SearchIndex => 'All',
    ResponseGroup => 'Medium',
    AssociateTag => $amazon_track,
);
$amazon_api->sign(
    key    => $key,
    secret => $secret,
);
とすれば、$amazon_api の変数にはXMLを取得するためのURLが代入される。
非常に便利!あとはXML処理関連のXML::Simple等を使って、XMLから
必要な情報を取り出せばいい。

トラックバック(0)

トラックバックURL: http://mimimopu.com/mt/mt-tb.cgi/64

コメントする