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の場合は有志が公開しているモジュールが存在し、
・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.pmとAPA.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から必要な情報を取り出せばいい。