Amazon の標準の商品リンクは「購入」ボタンとプライバシーリンクがちょいとじゃまなので、自分で作りたくなる。 そのときに必要になってくるのが商品画像なわけだが、これの取得が一筋縄ではいかない。
従来はASINを用いた URL で取得できたようだが、今は画像の URL の商品識別子が下記の "15ndv8ndf9a" のように ASIN から単純に求められなくなっている。
http://ecx.images-amazon.com/images/I/15ndv8ndf9a._SS160_.jpg
よって、方法としては Product Advertising API というリンク作成用のAPIを使うしかない。
手順としては
今回はスクリプトは PHP を用いた。また、サーバーが Apache であるので URL Rewrite は比較的簡単に利用できる。IIS などを使用している場合は別途調べていただきたい。
Amazon アソシエイトのトップページから "Product Advertising API" に飛ぶと "アカウント作成" ボタンがあるので、それをクリックし、アカウントを作成する。
なお、Amazon.co.jp のアカウントではなく、AWS (Amazon Web Services) のアカウントなので、もっていない場合は登録が必要である。登録は英語だが、サイトの概要説明なども適当に書いておけばいい。
登録が完了すると "アカウント設定"→"アクセスキー情報" からアクセスキーが確認できる。Access Key ID と Secret Access Key が必要なので、メモっておく。
これは Amazon Product Advertising API への対応(PHP版) - もやし日記 などが参考になる。 4行目から50行目あたりまではほぼそのまま使わせていただいている。
5行目6行目の <Access Key ID> と <Secret Access Key> をそれぞれ書き換えればよい。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75
$asin = isset($_GET["asin"]) ? $_GET["asin"] : "B003H7MVD2";
$option = isset($_GET["op"]) ? $_GET["op"] : "_SS160_";
// Access Key ID と Secret Access Key は必須です
$access_key_id = '<Access Key ID>';
$secret_access_key = '<Secret Access Key>';
$xmlns = 'http://webservices.amazon.com/AWSECommerceService/2009-03-31';
// RFC3986 形式で URL エンコードする関数
function urlencode_rfc3986($str)
{
return str_replace('%7E', '~', rawurlencode($str));
}
// 基本的なリクエストを作成します
// - この部分は今まで通り
$baseurl = 'http://ecs.amazonaws.jp/onca/xml';
$params = array();
$params['Service'] = 'AWSECommerceService';
$params['AWSAccessKeyId'] = $access_key_id;
$params['Version'] = '2009-03-31';
$params['Operation'] = 'ItemLookup';
$params['ResponseGroup'] = 'Images';
$params['ItemId'] = $asin;
// Timestamp パラメータを追加します
// - 時間の表記は ISO8601 形式、タイムゾーンは UTC(GMT)
$params['Timestamp'] = gmdate('Y-m-d\TH:i:s\Z');
// パラメータの順序を昇順に並び替えます
ksort($params);
// canonical string を作成します
$canonical_string = '';
foreach ($params as $k => $v) {
$canonical_string .= '&'.urlencode_rfc3986($k).'='.urlencode_rfc3986($v);
}
$canonical_string = substr($canonical_string, 1);
// 署名を作成します
// - 規定の文字列フォーマットを作成
// - HMAC-SHA256 を計算
// - BASE64 エンコード
$parsed_url = parse_url($baseurl);
$string_to_sign = "GET\n{$parsed_url['host']}\n{$parsed_url['path']}\n{$canonical_string}";
$signature = base64_encode(hash_hmac('sha256', $string_to_sign, $secret_access_key, true));
// URL を作成します
// - リクエストの末尾に署名を追加
$request_url = $baseurl.'?'.$canonical_string.'&Signature='.urlencode_rfc3986($signature);
// リクエストして XML を取得
$strXml = file_get_contents($request_url);
if (!$strXml)
{
echo 'Failed. Request URL = '.$request_url;
exit;
}
// URL を見つける
if (preg_match("|s?https?://[-_.!~*'()a-zA-Z0-9;/?:@&=+$,%#]+_.jpg|", $strXml, $matches))
{
//オプションを書き換える
$url = preg_replace("|_[a-z0-9]+_|i", $option, $matches[0]);
}
if (strlen($url) > 0)
{
// URL が取得できていればリダイレクト
header("Location: ".$url);
}
else
{
// 失敗した場合は XML をそのまま書き出す(デバッグ用)
echo $strXml;
}
以後、このソースを /cgi/amazon_image.php に保存したものとする。
1〜2 行目はスクリプトに渡すパラメータである。
asin | 商品のASIN |
---|---|
op | 画像オプション |
画像オプションは Amazonの商品画像をカスタマイズしてみる(その1) - サラリーマン白書 などを参考にする。_(アンダースコア)ではさまれた文字列である。
サイズ変更系のオプションは下記の通り。
形式 (xxx は500以下の数字) | 機能 | 例 |
_SLxxx_ | 自動リサイズ (幅か高さをxxxに合わせる。その他の辺は相対的に決定される) | _SL160_ |
_SXxxx_ | 幅指定リサイズ (幅をxxxに合わせる。高さは相対的に決定される) | _SX100_ |
_SYxxx_ | 高さ指定リサイズ (高さをxxxに合わせる。幅は相対的に決定される) | _SY200_ |
_SSxxx or AAxxx_ | 正方形リサイズ (幅、高さともにxxxに合わせる。足りない辺方向には余白が追加される) | _SS160_ |
そのため、たとえば ASIN=B000000000 の商品を正方形 150px で取り出したい場合は
/cgi/amazon_image.php?asin=B000000000&op=_SS150_
とすればよい。
念のため、52 行目以下に追加したコードの説明を簡単にしておく。
そのまま、img タグに
<img src="/cgi/amazon_image.php?asin=B000000000&op=_SS150_"/>
としても別段問題はないのだが、ちょっとかっこよく(?) .jpg で表示できるようにしてみる。
Apache の URL Rewrite を利用して .htaccess に下記のように追記する。
# Amazon 画像取得スクリプト用 URL Rewrite RewriteEngine On RewriteCond %{REQUEST_FILENAME} !-f # with option RewriteRule ^amazon_image/([A-Z0-9]+)(_[_a-zA-Z0-9]+_)\.jpg$ /cgi/amazon_image.php?asin=$1&op=$2 [L] # without option RewriteRule ^amazon_image/([A-Z0-9]+)\.jpg$ /cgi/amazon_image.php?asin=$1 [L]
オプションつきとオプションありの場合の RewriteRule を書いてある。これは
amazon_image/B000000000_SS150_.jpg amazon_image/B000000000.jpg
というような URL がリクエストされたとき、それぞれ
/cgi/amazon_image.php?asin=B000000000&op=_SS150_ /cgi/amazon_image.php?asin=B000000000
と書き換えるものである。
これにより img タグには
<img src="amazon_image/B000000000_SS150_.jpg"/>
と記述することができる。
Kenz Yamada(山田研二)。1984年生。大阪。ちょっとずつ好きなプログラム作ってます。
好きなものはカメラと旅行。ガジェットや身の回り、ちょっとこだわります。
詳しくは Web mixi で。