[メモ] Perl で Amazon Product Advertising API の署名認証をどうにかする

WebAPIでAmazonの商品情報を取れるProduct Advertising APIを使うとき、マニュアル通りの下記のURL(※分かりやすいよう改行した)にアクセスする。

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

そうすると、次のエラー内容のXMLが返ってくる。

<Message>The request must contain the parameter Signature.</Message>

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

Perl で Amazon Product Advertising API を扱う場合の便利なモジュール

Perlの場合は有志が公開しているモジュールが存在し、
・404 blog not found さんの URI::Amazon::APA (CPAN)
・上記のモジュールで使われている Digest::SHA::PurePerl (CPAN)
の2つを利用すればよい。

私が使っているロリポップのようなレンタルサーバーの場合、CPANを使ったモジュールのインストールはもちろん出来ないので、自分でCPAN用のディレクトリを作っちゃえばいい。

自己CPAN(my CPAN)の作り方

例えばCGIの動作が許可されている<cgi-bin>というディレクトリがホームにあるとして、

<cgi-bin>
    |–<mycpan>

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

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

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

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

いまexample.cgiというperlスクリプトでAmazonのAPIをモジュール越しに使う場合、example.cgiの冒頭にモジュール読み出しのために

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から必要な情報を取り出せばいい。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です