「Amazon アソシエイト Web サービスの名称変更および署名認証についてのお知らせ」というメールが来ました。
(追記: ほぼ同内容のものが Forum とアソシ公式ブログにもありました。ただし Forum では15日ではなく16日となっています。)
「Product Advertising API」ですね。
PAAPI かな。パアピ!パアピ!
どうやら今までのような単純な使い方ができなくなるようです。
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 も付けます。
(2) 「?」以降を「&」で分割(split)し、アルファベット順にソートし、また「&」でくっつけます。
(3) そして下記のような4行からなる文字列にします。
(4) この文字列に
「RFC 2104-compliant HMAC with the SHA256 hash algorithm」
を適用します。キーは先ほどの Secret Access Key を使用。
キーとして 1234567890 を使うとこんな感じになるそう。
(5) これを Signature として、本来のリクエスト URL の末尾に付けます。
この 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 を使って作った過去のサイト、ツール類に手を入れるのは一仕事だなあ。
Perl では Digest::SHA を使うと良さそう。
(サンキュー>id:yappo)
コード(行末の「\」は改行なしで続いていることを表す):
ドキュメントによれば、正解は「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
(追記: ほぼ同内容のものが 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 を使うとこんな感じになるそう。
URL encode します。pwqYQRc3RepIrf7m+VMRy/jFXx/ZBSPsaSFFexIUoSI=
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) いけないらしい。