2009-05-10
Amazon Product Advertising API への対応(PHP版)
Amazon のアフィリエイト用 API の名前がまた変わりました(今回で3回目?)。名前が変わるだけならそれほどの問題ではないのですが、過去の API を利用している全サイトに影響があるので注意が必要です。
重要な変更内容:
- 2009年8月15日以降、全てのリクエストに対して Secret Access Key を使った署名認証が必要になる
- そのため、これまでの Amazon Associates Web Service 4.0(旧 Amazon ECS 4.0)リクエストは全て無効になる
Secret Access Key の取得
今までの Amazon Associates Web Service 4.0 は Access Key ID のみで利用できたのですが、新しいバージョンでは Secret Access Key も必要になります。
Access Key ID と Secret Access Key の確認方法:
- http://aws.amazon.com/ にアクセス
- 右上から Your Account -> Access Identifiers に移動
署名認証リクエストの作成方法(PHP5)
標準的な PHP5 環境で署名認証リクエストを生成するコードは以下のようになります。
<?php // Access Key ID と Secret Access Key は必須です $access_key_id = 'ここに Access Key ID を入力'; $secret_access_key = 'ここに Secret Access Key を入力'; // 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'] = 'ItemSearch'; // ← ItemSearch オペレーションの例 $params['SearchIndex'] = 'Books'; $params['Keywords'] = 'もやし'; // ← 文字コードは UTF-8 // 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 を作成します // - リクエストの末尾に署名を追加 $url = $baseurl.'?'.$canonical_string.'&Signature='.urlencode_rfc3986($signature); echo $url; // ← この URL にアクセスすれば、API リクエストができます
PEAR::Services_Amazon を使う場合
自前でコードを書くのが面倒で、PEAR を使える環境であれば、Services_Amazon が使えます。
さきほど Product Advertising API に対応したバージョン 0.8.0 を公開しました。
次のコマンドで最新版の Services_Amazon をインストールできます。
# pear install -a Services_Amazon-beta
過去のバージョンをインストール済みのときは、次のコマンドで最新版に更新できます。
# pear upgrade Services_Amazon-beta
更新した場合は、古いコードを修正してください。
<?php // 以下は 2009年8月15日 以降利用できなくなります $amazon = new Services_AmazonECS4(ACCESS_KEY_ID); $amazon->ItemSearch(...); ↓ // Product Advertising API に対応した Services_Amazon クラスを利用します $amazon = new Services_Amazon(ACCESS_KEY_ID, SECRET_ACCESS_KEY); $amazon->ItemSearch(...); // ← 今まで通りのインタフェースが使えます // アソシエイトタグは第3引数に指定します $amazon = new Services_Amazon(ACCESS_KEY_ID, SECRET_ACCESS_KEY, 'amazon-22');
PHP4 環境での注意
Services_Amazon は、sha256 アルゴリズムのハッシュを生成するために、hash ライブラリまたは mhash ライブラリに依存します。一般的な PHP5 環境では hash ライブラリの hash_hmac 関数が利用できますが、PHP4 では利用できません。hash ライブラリを pecl コマンドでインストールしてください。
# pecl install hash
レンタルサーバなど、hash/mhash をインストールできない環境では Services_Amazon を利用できません。sha256 を生成する PHP4 コードのライブラリがあれば、Services_Amazon::_hash メソッドをオーバーライドして、独自に対応するコードが書けるかもしれません。
雑感
ウェブ API はこういうのがあるから怖い。
- AWSからProduct Advertising APIへ
- 積み重ねた日々 - Amazon アソシエイト Web サービスの名称が「Prod...
- くるえるはてなくしょん - Amazon Product Advertising API (PAAPI...
- PHP,MySQL,Flexな日々+イラストとか - 今日気になったページ
- Amazon が Product Advertising API に変わっても「Amazon Quick Af...
- Amazon Product Advertising API 電子署名とXSLTのまとめ
- Amazon アソシエイト Web サービスの名称変更および署名認証につい...
- 積み重ねた日々 - Amazon Product Advertising APIに対応した
- てきとう - CakePHP amazonAPI使うよー
- [PEAR]Amazon Web Servicesを使ってISBN-13からASINを取得するPHPプ...
- Amazon Product Advertising APIだそうで
- Product Advertising APIに電子署名を追加
- Amazon Product Advertising APIへ対応する(PEAR)
- 新大阪で働く社長のはてなダイアリー - *新しいAmazonAPI用PHPソー...
- 「PAAPI」対応
- Amazon Product Advertising API:おぉ、対応忘れていた。AmazonのAP...
- WEBと読書記録 - Amazon Product Advertising API
- 自由自在にシステムを構築する者への道 - Amazon APIの作り直し
- Amazon Product Advertising API(Amazon Web サービス)の署名認証...
- アマゾンのProduct Advertising APIに対応させる
- to-Rの日記 - 今日のclipper
- [php]Services_Amazonで商品情報を取得
- Amazon Product Advertising API 電子署名とXSLTのまとめ
- [Mi]みたいなもの - AmazonProduct Advertising APIをPHPから使う
- macaroni3の日記 - AmazonのAPIのデータ取得法
- [php]Amazon Product Advertising APIへの問い合わせ
- iPhoneケースランキング
- tarepanyoの実験的独身生活(仮住まい編) - WEBサービスで、マッシ...
- phaのPHPとか自習室 - amazon api

