Perlにおける署名計算のためのサンプルコード

| トラックバック(0)
アマゾンWebサービスの勉強を始めようと、早速本(※)も買ってきてコードを書いて
みるのだが、サーバーからエラーが返ってくる。

<?xml version="1.0"?>
<ItemSearchErrorResponse xmlns="http://ecs.amazonaws.com/doc/2010-09-01/">
<Error>
    <Code>MissingParameter</Code>
    <Message>The request must contain the parameter Signature.</Message>
</Error>
<RequestID>a71f4723-94fc-4979-a84d-77f9594f6e6a</RequestID>
</ItemSearchErrorResponse>
署名パラメーターが必要とか書いてあるけど、何の事だか分からんー。

とりあえず、ググってみたら、2009年8月15日までに署名認証が必要となったそうだ。
そんな仕様変更、知らん。。

   Announcement: Product Advertising API Planned Outage
   https://forums.aws.amazon.com/ann.jspa?annID=476

じゃぁ、どうやって署名を埋め込みゃいいのかって調べてみると、日本語の情報ソースが
あったもののはっきり言って何を言ってるか分からない。

   RESTリクエストにおけるHMAC-SHA署名
   https://affiliate.amazon.co.jp/gp/associates/help/t126/a6?ie=UTF8&pf_rd_t=501&ref_=amb_link_84046296_1&pf_rd_m=AN1VRQENFRJN5&pf_rd_p=&pf_rd_s=center-1&pf_rd_r=&pf_rd_i=assoc_help_t126_a7

このSinged Request Helperに、エラーが出たURLを書き込んでみると何となく、どの部分を
使って署名を作ればいいか分かってきた。

   Singed Request Helper
   http://associates-amazon.s3.amazonaws.com/signed-requests/helper/index.html

もちろんモジュールがあるんだよね、、と期待しつつ公式サイトには載っていないPerlのサンプル
ソースを探してみるとやっと見つかりました!!
(ちなみに、公式サイトにはJavaのサンプルソースのみ)

ただ、それもエンドポイントが古いせいなのか、自分流に改造してみてやっと妥当なレスポンスが
返ってくるようになりました。

以下、ご参考にしてみてください。

 【前提】:hmac_sha256_base64 用のソースコードをダウンロードして、
Digestディレクトリを実行プログラムと同じディレクトリに保存しておくこと。

use LWP::UserAgent;
use XML::Simple;
use POSIX qw(strftime);
use lib qw(.); 
use Digest::SHA::PurePerl qw(hmac_sha256_base64);
use URI::Escape;
use strict;
use warnings;

# アカウント固有の値
my $access_key_id        = "********************";
my $secret_access_key    = "********************";
my $associate_tag        = "ss-22";

# パラメータを作成
my %pkv;
$pkv{'Service'}         = 'AWSECommerceService';
$pkv{'AWSAccessKeyId'}  = $access_key_id;
$pkv{'AssociateTag'}    = $associate_tag;
$pkv{'Operation'}       = 'ItemSearch';
$pkv{'Keywords'}        = 'Shirt';
$pkv{'SearchIndex'}     = 'Apparel';
$pkv{'Version'}         = '2010-09-01';
$pkv{"Timestamp"}       = strftime("%Y-%m-%dT%H:%M:%SZ", gmtime);

############
# 署名生成 #
############
# 呼び出し文字列を結合
my $pstr = join('&', map {"$_=".uri_escape($pkv{$_})} (sort keys %pkv));
# 署名作成のための文字列を生成
my $data = "GET\necs.amazonaws.jp\n/onca/xml\n$pstr";
# base64エンコードのHMAC-SHA256署名を生成
my $signature = hmac_sha256_base64($data, $secret_access_key);
# RFC2104準拠のHMAC-SHA256ハッシュアルゴリズムの計算を行う
$signature .= '=' while length($signature) % 4;
# 署名をURIエンコードする
$signature = URI::Escape::uri_escape($signature);

my $url = qq(http://ecs.amazonaws.jp/onca/xml?)
.qq($pstr&Signature=$signature);

print "【引渡URL】:\n", $url, "\n";

# 既存の呼び出しコードに渡す
my $request = HTTP::Request->new("GET", $url );
my $ua = LWP::UserAgent->new;
my $response = $ua->request($request);

print "【結果XML】:\n", $response->content;

さて、これで基本的なところはできたので、あとはXMLの再勉強かな。

(※)以下の本を購入しました。
かなり丁寧に書いてくれてますが、出版年が古いのが玉にきず。
それでも、アマゾンWebサービスに関して、アフィリエイト系のサービスの説明を
してくれているのはこの本くらいしかないんじゃないかな。



<<<追記>>>:
小飼弾さんがモジュールを作ってくれていましたね。。
なんで見つけられなかったんだろう。

   perl - URI::Amazon::APA released!
   http://blog.livedoor.jp/dankogai/archives/51211577.html

まぁ、勉強です。

トラックバック(0)

トラックバックURL: http://shigephilo.heteml.jp/mt/mt-tb.cgi/787

ご案内

ブログパーツ