Amazon Web Service

Amazon Web Service(AWS)を使うと、Amazonで検索した商品データを自分のサイトに載せる事ができます。商品データはXML形式で返されますので、これをPHPで解析してHTMLに成型します。

商品検索方法

http://xml-jp.amznxslt.com/onca/xml3?local=jp
このアドレスに検索用のパラメータを連結させて問い合わせします。

オプションパラメータ
f= XSLTを適用する場合はそのURL
f=xmlとするとそのままXMLを取得できます。
locale= 国コード 日本はjp
type= lite 簡易版
heavy 完全版
t= アソシエイトID
dev-t= Subscription Id (デベロッパトークン)
page= 結果が複数ページに渡る場合のページ数
mode= 検索する商品のジャンル
和書 books-jp
洋書 books-us
音楽 music-jp
音楽クラシック classical-jp
DVD dvd-jp
ビデオ vhs-jp
エレクトロニクス electronics-jp
ソフトウェア software-jp
ゲーム videogames-jp
ASINSearch= 商品固有のASIN(Amazon Standard Item Number)コード、もしくは書籍に付いているISBNコードを指定。 カンマ(,)で区切って複数指定可能
KeywordSearch= 検索単語

これ以外にも詳細な検索が行えるパラメータがいくつかあります。

XMLを解析する

アマゾンから返ってきたXMLは、PHP標準のDOM関数を使って自力で解析しても良いのですが、構造が複雑になると少々大変です。そこで、PEARのXML_Serializerパッケージに含まれているXML_Unserializerクラスを使います。これを使えば、XMLテキストを瞬時に連想配列にしてくれますので、後で好きな様にHTMLに加工できます。

(注) PEARがない場合、まずPEARを導入して下さい。
http://pear.php.net/package/XML_Serializer

PHP

  1. // XML_Unserializerクラスの読み込み
  2. require 'XML/Unserializer.php';
  3. class AWS_QueryString {
  4.   var $_params;
  5.   function AWS_QueryString($token, $assoc, $type = 'heavy', $format = 'xml',
  6. $locale = 'jp') {
  7.     $this->_params = array();
  8.     // 基本データだけ入れておく
  9.     $this->add('dev-t', $token);
  10.     $this->add('t', $assoc);
  11.     $this->add('locale', $locale);
  12.     $this->add('f', $format);
  13.     $this->add('type', $type);
  14.   }
  15.   function add($name, $value) {
  16.     $this->_params[$name] = $value;
  17.   }
  18.   function get($key) {
  19.     if(array_key_exists($key, $this->_params)) {
  20.       return $this->_params[$key];
  21.     }
  22.     return NULL;
  23.   }
  24.   function toString() {
  25.     if(count($this->_params) > 0) {
  26.       $tmp = array();
  27.       $str = '';
  28.       foreach($this->_params as $key => $value) {
  29.         if($value) $tmp[] = "$key=$value";
  30.       }
  31.     }
  32.     $str = implode('&', $tmp);
  33.     $str = "http://xml-jp.amznxslt.com/onca/xml3?$str";
  34.     return $str;
  35.   }
  36. }
  37. class AWS_ProductData {
  38.   var $_products;
  39.   function AWS_ProductData($xmlsrc, $encoding = 'SJIS') {
  40.     $lines = file($xmlsrc);
  41.     $line = implode('', $lines);
  42.     $line = mb_convert_encoding($line, $encoding, 'UTF-8');
  43.     
  44.     $unserializer =& new XML_Unserializer();
  45.     // 解析に属性も含める
  46.     $unserializer->setOption('parseAttributes', TRUE);
  47.     $success = $unserializer->unserialize($line);
  48.     if(is_object($success)) die( $success->getMessage() );
  49.     $this->_products = $unserializer->getUnserializedData();
  50.   }
  51.   function getProducts() {
  52.     return $this->_products;
  53.   }
  54. }
  55. // アマゾン・リクエストID(デベロッパトークン)
  56. define('AWS_TOKEN''xxxxxxxx');
  57. // アマゾン・アソシエイトID
  58. define('AWS_ASSOC''xxxxx-22');
  59. $qs =& new AWS_QueryString(AWS_TOKEN, AWS_ASSOC);
  60. $qs->add('mode''music-jp');
  61. $qs->add('KeywordSearch''宇多田ヒカル');
  62. $url = $qs->toString();
  63. $obj =& new AWS_ProductData($url);
  64. $products = $obj->getProducts();
  65. print '<pre>';
  66. print_r($products);
  67. print '</pre>';

実行結果

商品リンク

http://www.amazon.co.jp/exec/obidos/ASIN/xxxxxxxxxx/xxxxx-22/
http://www.amazon.co.jp/exec/obidos/ASIN/xxxxxxxxxx/xxxxx-22/ref=nosim/

通常、商品が売れた場合の紹介料は3%ですが、下のようにref=nosimを付けたアドレスにリンクしておくと、そのページで購入された場合に限り5%になりますので、一応付けておきましょう。

参考資料

コメントは受け付けていません。