古い記事
ランダムジャンプ
新しい記事
「Amazon アソシエイト Web サービスの名称変更および署名認証についてのお知らせ」というメールが来ました。

追記: ほぼ同内容のものが Forumアソシ公式ブログにもありました。ただし Forum では15日ではなく16日となっています。)

さて、このたび、Amazon アソシエイト Web サービスの名称を、「Product Advertising API」と変更しましたことをお知らせいたします。この新名称は、開発者の皆様が Amazon サイトで販売されている商品の広告作成を行い、これによって Amazon より広告費を受け取るという、API の目的をより正しく表しています。
はいはい、了解しました。
「Product Advertising API」ですね。
PAAPI かな。パアピ!パアピ!

名称変更にともない、Product Advertising API にリクエストを送信いただく都度、認証のための電子署名を含めていただくことが必要になります。
なんだ、なんだ?
どうやら今までのような単純な使い方ができなくなるようです。
REST 的にアクセスする前に一仕事やらないといけないみたい。

以下、「開発者向けガイド」をざっと読んで理解した内容をまとめておきます。
私はまだ試していません。
勘違いで適当なこと書いてるかもしれません。
自己責任でよろしく。

準備


まず、今まで使っていた Access Key ID (例:022QF06E7MXBSH9DHM02) 以外に、Secret Access Key (例:kWcrlUX5JEDGM/LtmEENI/aVmYvHNif5zB+d9+ct) が必要になります。
(ref. Your AWS Identifies)

Secret Access Key は、 http://aws.amazon.com/ へ行って、
「Your Account」→「Access Identifiers」へ移動すると見ることができます。
(ref. Viewing Your AWS Identifiers)

アクセス


で、これを使って今までのように REST 的にアクセスする方法について。

(1) 今までのようにリクエストURLを作ります。Timestamp も付けます。
http://webservices.amazon.com/onca/xml?Service=AWSECommerceServic
e&AWSAccessKeyId=00000000000000000000&Operation=ItemLookup&ItemId
=0679722769&ResponseGroup=ItemAttributes%2COffers%2CImages%2CRevi
ews&Version=2009-01-06&Timestamp=2009-01-01T12%3A00%3A00Z

(2) 「?」以降を「&」で分割(split)し、アルファベット順にソートし、また「&」でくっつけます。
AWSAccessKeyId=00000000000000000000&ItemId=0679722769&Operation=I
temLookup&ResponseGroup=ItemAttributes%2COffers%2CImages%2CReview
s&Service=AWSECommerceService&Timestamp=2009-01-01T12%3A00%3A00Z&
Version=2009-01-06

(3) そして下記のような4行からなる文字列にします。
GET
webservices.amazon.com
/onca/xml
AWSAccessKeyId=00000000000000000000&ItemId=0679722769&Operation=I
temLookup&ResponseGroup=ItemAttributes%2COffers%2CImages%2CReview
s&Service=AWSECommerceService&Timestamp=2009-01-01T12%3A00%3A00Z&
Version=2009-01-06

(4) この文字列に
「RFC 2104-compliant HMAC with the SHA256 hash algorithm」
を適用します。キーは先ほどの Secret Access Key を使用。
キーとして 1234567890 を使うとこんな感じになるそう。
pwqYQRc3RepIrf7m+VMRy/jFXx/ZBSPsaSFFexIUoSI=
URL encode します。
pwqYQRc3RepIrf7m%2BVMRy%2FjFXx%2FZBSPsaSFFexIUoSI%3D

(5) これを Signature として、本来のリクエスト URL の末尾に付けます。
http://webservices.amazon.com/onca/xml?AWSAccessKeyId=00000000000
000000000&ItemId=0679722769&Operation=ItemLookup&ResponseGroup=It
emAttributes%2COffers%2CImages%2CReviews&Service=AWSECommerceServ
ice&Timestamp=2009-01-01T12%3A00%3A00Z&Version=2009-01-06&Signatu
re=pwqYQRc3RepIrf7m%2BVMRy%2FjFXx%2FZBSPsaSFFexIUoSI%3D

この URL でアクセスすれば今まで通りに使えるはず!
(ref. Authenticating REST Requests - Example REST Requests)

って、面倒そうだなあ、こりゃ。
日本の場合は、 http://webservices.amazon.com ではなく http://webservices.amazon.co.jp ですね、たぶん。
あと、「RFC 2104-compliant HMAC with the SHA256 hash algorithm」ってのはどうやれば一番楽なんだろう……。

切り替え期限は8月15日。
Amazon API を使って作った過去のサイト、ツール類に手を入れるのは一仕事だなあ。
この変更は、2009年5月11日より3ヶ月の間の移行期間の後、2009年8月15日には、Product Advertising API へ送信されるリクエストは全て認証されることとなり、認証されない場合、リクエストは処理されなくなります。

Perl でアクセス


Perl では Digest::SHA を使うと良さそう。
(サンキュー>id:yappo)

コード(行末の「\」は改行なしで続いていることを表す):
#!/usr/bin/perl
use strict;
use warnings;
use Digest::SHA qw(hmac_sha256_base64);
use URI::Escape;

my $data = q(GET
webservices.amazon.com
/onca/xml
AWSAccessKeyId=00000000000000000000&ItemId=0679722769&Operation=I\
temLookup&ResponseGroup=ItemAttributes%2COffers%2CImages%2CReview\
s&Service=AWSECommerceService&Timestamp=2009-01-01T12%3A00%3A00Z&\
Version=2009-01-06);

my $key = "1234567890";
my $signature = hmac_sha256_base64($data, $key);
$signature .= '=' while length($signature) % 4;
print "$signature\n";
print URI::Escape::uri_escape($signature), "\n";
実行結果:
Nace+U3Az4OhN7tISqgs1vdLBHBEijWcBeCqL5xN9xg=
Nace%2BU3Az4OhN7tISqgs1vdLBHBEijWcBeCqL5xN9xg%3D

ドキュメントによれば、正解は「pwqYQRc3RepIrf7m+VMRy/jFXx/ZBSPsaSFFexIUoSI=」だと思うんだけど、何かが違うなあ。
JAVA のサンプルコードを見ると、 HmacSHA256 というのを使ったあとで Base64 をかけてるだけみたいなんだけどなあ。何が違うんだろう。

追記090510: 実行結果に違うの貼っていたので直しました。
それでもサンプルとは違う。どうやらサンプルが間違っているようです。
see http://d.hatena.ne.jp/zorio/20090509/1241886502

追記090511: サンプルコードが直ってました。
あと、Perl では末尾に「=」を追加する処理がいるそうです。
前述のコードと実行結果を書き換えました。
URI/Amazon/APA.pm を参考にしました。
元のコードはウェブ魚拓をご覧ください。)

自分の ID でやってみたけど、認証 URL はアクセス失敗した。
って、サービス開始は5月11日からでした!ははは!
11日以降に改めて認証テストしてみます。

追記090511: 改めてやってみたらうまくいきました。
どうやら、失敗の原因は私が末尾「=」をつけてなかっただけみたいで、一昨日の段階からちゃんと動作していたみたいです。お騒がせしました。

関連リンク


随時追加。

- Amazon Product Advertising APIの認証の件 (zorioの日記)
http://d.hatena.ne.jp/zorio/20090509/1241886502
Ruby で試す。

- Amazon アソシエイト Web サービス改め Product Advertising API の電子署名について調べてみました (にーやんのブログ 2)
http://d.hatena.ne.jp/niiyan/20090509/1241884365
Python で試そうとする。

- perl - URI::Amazon::APA released! (404 Blog Not Found)
http://blog.livedoor.jp/dankogai/archives/51211577.html
専用 Perl モジュールのリリース

- Amazon Product Advertising API (Crayons)
http://ciel.fm/02110#k2110p1
文字数がmod 4で0になるまで=で埋めなくては (padding of Base64 Digests) いけないらしい。