トップ > Appli > Amazonの画像URL取得とRewrite

Amazonの画像URL取得とRewrite

概要

Amazon の標準の商品リンクは「購入」ボタンとプライバシーリンクがちょいとじゃまなので、自分で作りたくなる。 そのときに必要になってくるのが商品画像なわけだが、これの取得が一筋縄ではいかない。

従来はASINを用いた URL で取得できたようだが、今は画像の URL の商品識別子が下記の "15ndv8ndf9a" のように ASIN から単純に求められなくなっている。

http://ecx.images-amazon.com/images/I/15ndv8ndf9a._SS160_.jpg

よって、方法としては Product Advertising API というリンク作成用のAPIを使うしかない。

手順としては

  1. Product Advertising API のアクセスキー情報を取得
  2. アクセスキーを使った画像取得用のスクリプトを書く
  3. URL Rewriteでスクリプトに飛ばす となる。

今回はスクリプトは PHP を用いた。また、サーバーが Apache であるので URL Rewrite は比較的簡単に利用できる。IIS などを使用している場合は別途調べていただきたい。

Product Advertising API のアクセスキー情報を取得

Amazon アソシエイトのトップページから "Product Advertising API" に飛ぶと "アカウント作成" ボタンがあるので、それをクリックし、アカウントを作成する。

なお、Amazon.co.jp のアカウントではなく、AWS (Amazon Web Services) のアカウントなので、もっていない場合は登録が必要である。登録は英語だが、サイトの概要説明なども適当に書いておけばいい。

登録が完了すると "アカウント設定"→"アクセスキー情報" からアクセスキーが確認できる。Access Key IDSecret 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 行目以下に追加したコードの説明を簡単にしておく。

  1. 53: 生成した URL で AWS にリクエストし、$strXml にレスポンスを得る。
  2. 54〜58: $strXml が空(失敗)なら URL を書き出して終了。
  3. 60〜64: 「http:// からはじまって _.jpg で終わる(オプションつきの)URL」を探し、オプション部分を自分の option に置換して $url に代入。
  4. 66〜: うまく URL が取得できればその URL に Location: ヘッダーで飛ばす。できなければレスポンスの XML の内容(エラー内容が記述されている)を吐き出す。

URL Rewriteでスクリプトに飛ばす

そのまま、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"/>

と記述することができる。

履歴

  • 2010/6/5 執筆
(2010/06/06 09:40:21)
15345
プロフィール

Kenz Yamada(山田研二)。1984年生。大阪。ちょっとずつ好きなプログラム作ってます。 好きなものはカメラと旅行。ガジェットや身の回り、ちょっとこだわります。 詳しくは Web mixi で。

Bookmark and Share