WebAPIでAmazonの商品情報を取れるProduct Advertising APIを使うとき、
マニュアル通りの上記のURL(※分かりやすいよう改行した)にアクセスすると
これは2009年8月からAPIの仕様変更により、APIのリクエストに電子署名を付加しな
ければならなくなった。これがなかなか厄介だったのでメモしておく。
Perlの場合は便利なモジュールが存在し、
・404 blog not found さんのとこの URI::Amazon::APA (CPAN)
・また上のモジュールで使われている Digest::SHA::PurePerl (CPAN)
の2つをCPANからダウンロードしてくる。
私が使っているロリポップのようなレンタルサーバーの場合、
CPANを使ったモジュールのインストールはもちろん出来ないので、
自分でCPAN用のディレクトリを作っちゃえばいい。(ってことを最近知った
長くなりそうなので続きに書く。
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.pmとAPA.pmという
2つのモジュール本体が入っている。こいつらを直接読み込めば言い訳だが、
ちょっと仕掛けが必要。
いまexample.cgiというperlスクリプトでAmazonのAPIをモジュール越しに使う場合、
という一文を加えればいいのだが、もちろん<mycpan>の事なんか知らないので、
モジュールが見つからないというエラーが出る。
なので、
というようにライブラリ(mycpan)を使う宣言をする。
パスはexample.cgiから見た相対パス、もしくは絶対パスを使用する。
これでURI::Amazon::APAは使えるようになるが、APA.pm内で使われている
SHA.pmがロリポップのレンタルサーバーにはないので(SHA1はあるけども...)
とエラーを吐く。じゃあ、同じようにモジュールをmycpanに入れれば良い。
そのためにDigestのSHAもダウンロードしてきた。
APA.pmはもちろんmycpanの場所を知らないので、
以上で、祈願のURI::Amazon::APAがレンタルサーバーで使えるようになる。
もし、まだAPA.pmを動かすためのライブラリが足りなかったら、
同じようにmycpanにモジュール(pmファイル)を追加していけばよい。
詳しくは404 Blog Not FoundとかAmazon Product〜を参考に。
ちなみに以下でXML(のURL)が取得できるので、、駄文ですが。
非常に便利!あとはXML処理関連のXML::Simple等を使って、XMLから
必要な情報を取り出せばいい。
<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.pmとAPA.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---------上記のようにAPA.pmを改編する。PurePerlを指定しないといけないので、
use lib qw(/cgi-bin/mycpan);
#use Digest::SHA qw(hmac_sha256_base64);
use Digest::SHA::PurePerl qw(hmac_sha256_base64);
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から
必要な情報を取り出せばいい。
コメントする