ホーム >> 左脳Script >> Movable Type >> Amazon API 認証について

Amazon API 認証について


アマゾンのリンクをなんとかスッキリさせたい。」

アマゾンアソシエイトのページで作れるリンクは縦長で、どうカスタマイズしても Amazonロゴ が入る。広告としては本来在るべき姿なのだろうが、イロイロなページやブログを見ると、本やCDジャケット部分の「画像のみ」のリンクを貼り付けているものが見られる。

自分のページでも、せめてアマゾン商品へのリンクをカスタマイズできれば、ブログのデザインも しやすくなるのではと、調査を開始。


注:この記事は試行錯誤した結果の健忘目的となっています。長い上にオチが無いです。

リンクの実際

具体的にリンクがどうなっているのか、イロイロな?ページの「画像のみのリンク」を簡単に見てみた。

  • 例1
    
    <a href="http://www.amazon.co.jp/exec/obidos/ASIN/4797348569/*****-22" target="_blank">
    <img src="http://images-jp.amazon.com/images/P/4797348569.09._SY100_SCLZZZZZZZ_.jpg"
     class="thumb" />
    </a>
    

  • 例2
    
    <a href="http://www.amazon.co.jp/dp/4797348569/"
     title="Movable Typeデザインカスタマイズブック MT4.2対応 クリエイターのためのValue Design (大型本)">
    <img src="http://ec2.images-amazon.com/images/I/51Nisnpe7tL._SX160_.jpg"
     alt="Movable Typeデザインカスタマイズブック MT4.2対応 クリエイターのためのValue Design (大型本)" width="160" />
    </a>
    

ひとまず、ASIN という番号が判れば、画像と商品リンクを作成出来ることが判る。例2 の画像URL「51Nisnpe7tL」は意味不明。ハッシュのような感じもある。

検索の結果、例2のような URL は、asin 番号からアマゾンのAPIを使って問い合わせしないと取得できないようだ。

ASIN入りアマゾン商品画像URLリダイレクトCGIの雛形で、雛形が公開されている。以下引用。

#!/usr/bin/perl
use strict;
use warnings;
use CGI;
use LWP::Simple;

my $q = new CGI;
my $asin = $q->param('a');
my $size = $q->param('s') || "s";

my $aurl = "http://webservices.amazon.co.jp/onca/xml?".
  "Service=AWSECommerceService&".
   "AWSAccessKeyId=[キー]&".
   "Operation=ItemLookup&ItemId=$asin&ResponseGroup=Images";
my $res = get($aurl);

my $url = "";
if ($size eq "s") {
    ($url) = $res =~ /<SmallImage><URL>(.+?)</;
} elsif ($size eq "m") {
    ($url) = $res =~ /<MediumImage><URL>(.+?)</;
} elsif ($size eq "l") {
    ($url) = $res =~ /<LargeImage><URL>(.+?)</;
}

$url = "http://...1x1.jpg(1x1画像のURL)" unless $url;

print qq(Location: $url¥n¥n);


アマゾンAPI

この アマゾンAPI がどういうものかろくに調べずに(ぉぃ)、画像取得に関する事に絞って検索したが、ハッキリ明言している記事を検索しまくったが、該当するものはなかった。

この アマゾンAPI を使わずに画像だけを得る方法は無いのか?!

どうも画像そのものは静的な物と言う扱いなので、大丈夫。かもしれない。 しかし、それは出来上がったリンクの話

さらに、ASIN から簡単に作れる画像URL は古い商品向けで、新しい商品のURL は ASINコード から普通に推測できるような文字列ではない。(アマゾンアソシエイトユーザーから見た)使い勝手から考えると、どうしても API から画像のURL を取得する方が融通が利き長く使えそうに見える。
やはり、ここは今後の技術投資と言う意味も兼ねて、アマゾンAPI を調べて置くのが良いだろう。

Product Advertising API

問題の アマゾンAPI は「Product Advertising API」というらしい。
また、2009年8月15日から API リクエスト に認証が必要になるらしい。

検索中に見つけたこんな記事があった。
アカウント取らせて API トラフィックの管理をしやすくすると言う事なのだろうか。
理由としては至極妥当。アフェリエイトで稼ぐ!なんて流行があってから、アフィブログの量産が あって、きっと想定を超えるトラフィックになっているのだろう。

さて、認証が必要になると言う事は、ユーザー特定情報となるパスワードのようなものが必要になると言う事。まずは、これを取得しなければならない。この作業は無料であるが、Amazonクラウドなんたらカンタラでサーバを借りようとすると料金が発生するらしい。クラウド云々は、今回とは全く関係ないので問題なし。


アカウント取得

英語ページから、APIアクセス用 のアカウントを作らなければならないようだ。また、普通のアマゾンアソシエイトアカウントとは別管理らしい。英語圏での登録(2009年7月時点)なので、住所が英語表記、電話も国際番号から、と面倒。中でも、自分のサイトの簡単な説明を、英語で書かなければならないのが日本人としては面倒である(笑)。

サイトの説明がネックだ。どこかのページで日本語で登録したとか言う記事を読んだが、公式ページには英語でやれとある。ここは真面目に、翻訳サイトに頼るしかない。

My site is a site about the program technology of ActionScript and the JavaScript.
「ASとJSのプログラムサイトです。」と。コレでいいだろう。英語辞書が行方を不明しているので仕方がない。ないものはない。


注意:既に Amazon.co.jp のアカウントをお持ちの場合でも、Amazon.com のアカウントをお持ちでない場合は、新規作成が必要となりますのでご注意ください。

おぃイ?日本とアメリカで別なのかぃ!全部英語かと思ったら、規約は日本語。

登録完了。ここからアカウント情報の確認。ここで、目的のAPIアクセス認証に必要な「キー」を確認できる。

アクセスキーと、秘密鍵を入手。証明書はひとまず置いておく。


アクセス実験

実際、この作業をしていたのが7月半ばで、認証システムへの移行期間だったので認証なしのコードで実験してみた。

試しに、Asinが4873113296の画像URLの情報を取得をしてみる。URL 直で。***** は先ほど取得したキー。

http://webservices.amazon.co.jp/onca/xml?Service=AWSECommerceService&AWSAccessKeyId=*****&Operation=ItemLookup&ItemId=4873113296&ResponseGroup=Images
XMLのテキストが返ってきた。画像のURLらしき文字列も含まれている。直で表示させてみたところ、正しく画像URLを取得出来ているようだ。

注意:現在は移行期間が終わっているのでこのようなテストは出来ない。ハズ。


とりあえずコーディング

冒頭の CGI雛形を参考に Windows上の Perl 環境で 試行錯誤した結果、以下のコードが出来た。一部「WIndowsだから」という環境依存(strftimeのフォーマット%T)の問題があったが、それ以外は問題はなく、正しく取得は出来ているようだ。

my  $secret_key =   '**************************';

sub getParam
{
    my  $uri    =   URI->new(@_);
    #   split parameters
    my  %eq =   map{    split /=/, $_   }   split /&/, $uri->query();
    my  %q  =   map{    $_ => decode_utf8(uri_unescape($eq{$_}))    }   keys    %eq;
    #   add timestamp parameter
#   $q{Timestamp}   ||= strftime( "%Y-%m-%dT%TZ", gmtime() );    # 2009-01-01T12:00:00Z
    $q{Timestamp}   ||= strftime( "%Y-%m-%dT%H:%M:%SZ", gmtime() );  # 2009-01-01T12:00:00Z for Windows
    $q{Version} ||= '2009-01-06';
    #   sort paramaters
    my  $sq =   join '&',map{   $_ . '=' . uri_escape_utf8($q{$_})  }   sort keys %q;
    #   make request
    my  $tosign =   join "\n", 'GET', $uri->host, $uri->path, $sq;
    #
    my  $signature  =   hmac_sha256_base64( $tosign, $secret_key );
    $signature  .=  '=' while length($signature) % 4;   # padding required
    #
    $q{Signature}   =   $signature;
    $uri->query_form(   \%q );
    #
    return  $uri->as_string();
}
getParam にURL文字列を渡すと、シグネチャがついた URL が返る。これでアクセスする。
その際、グローバルの $secret_key に暗証鍵を設定して置く事。

コードの主要部分のアルゴリズム殆どを URI/Amazon/APA.pm を参考にさせて頂いた。

Windows上のPerlからテストした試験コード

#!/usr/bin/perl
use strict;
use warnings;
use CGI;
use LWP::Simple;

use strict;
use POSIX qw(strftime);
use URI::Escape;
use Encode qw/decode_utf8/;
use base 'URI::http';
use Digest::SHA qw(hmac_sha256_base64);

my $q = new CGI;
my $asin = $q->param('a');

my  $secret_key =   '***********************************';

sub getParam
{
    my  $uri    =   URI->new(@_);
    #   split parameters
    my  %eq =   map{    split /=/, $_   }   split /&/, $uri->query();
    my  %q  =   map{    $_ => decode_utf8(uri_unescape($eq{$_}))    }   keys    %eq;
    #   add timestamp parameter
#   $q{Timestamp}   ||= strftime( "%Y-%m-%dT%TZ", gmtime() );    # 2009-01-01T12:00:00Z
    $q{Timestamp}   ||= strftime( "%Y-%m-%dT%H:%M:%SZ", gmtime() );  # 2009-01-01T12:00:00Z for Windows
    $q{Version} ||= '2009-01-06';
    #   sort paramaters
    my  $sq =   join '&',map{   $_ . '=' . uri_escape_utf8($q{$_})  }   sort keys %q;
    #   make request
    my  $tosign =   join "\n", 'GET', $uri->host, $uri->path, $sq;
    #
    my  $signature  =   hmac_sha256_base64( $tosign, $secret_key );
    $signature  .=  '=' while length($signature) % 4;   # padding required
    #
    $q{Signature}   =   $signature;
    $uri->query_form(   \%q );
    #
    return  $uri->as_string();
}

my $aurl = "http://webservices.amazon.co.jp/onca/xml?".
    "Service=AWSECommerceService&".
    "AWSAccessKeyId=************************&".
    "Operation=ItemLookup&".
    "ItemId=$asin&".
    "ResponseGroup=Images&";
$aurl   =   getParam($aurl);

my $res = get($aurl);
my  $url='';
if( defined($res)   )
{
#   ($url)  =   $res =~ /<LargeImage><URL>(.+?)</;
#   $url = "http://...1x1.jpg(1x1画像のURL)" unless $url;
    print $res."\n";
}
else
{
    print   "Get ERROR!\n";
}
ワザと間違えた公開IDや暗証鍵でアクセスしたところ、ちゃんとエラーになった。
認証機能は問題ないようだ。


結局

アマゾンAPI の認証部分(前述コードの getParam )が上手く動いたので、ここから Movable Type のプラグインへ持っていってみた。
Windows からの移植?時に、モジュールの扱いで難儀したが、ひとまず当初の目的を達成できたので良しとする。

ASIN番号から画像を表示できるタグを作成した。認証移行期間が終了した現在(2009年9月1日)でも正しく動作し、URLを取得できている。

今後アマゾンAPI でナニかしたいと思ったとき、(主に自分が)すぐに応用できる。かもしれない。


アマゾン画像URL展開プラグイン




トラックバック(0)

トラックバックURL: http://n-yagi.0r2.net/sanoupulurun/mt-tb.cgi/221

コメントする

ホーム >> 左脳Script >> Movable Type >> Amazon API 認証について

アーカイブ

このブログ記事について

このページは、n-yagiが2009年9月 1日 12:49に書いたブログ記事です。

ひとつ前のブログ記事は「Amazon画像URL展開プラグイン」です。

次のブログ記事は「MovieClip 継承クラスのコーディング @ActionScript 2.0」です。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。

Creative Commons License
このブログはクリエイティブ・コモンズでライセンスされています。