Service_Amazonによる商品検索
Service_Amazonには、Product Advertising APIを利用した商品検索結果をキャッシュに保存しておく機能があります。その際にはCacheライブラリを使用しています。Cacheライブラリ内のCacheクラスではキャッシュする形式を「コンテナ」といい、String型の変数で指定します。さらにその際のオプションを「コンテナオプション」として配列で指定します。コンテナの種類にはPEAR/DB、file、PEAR/MDBなどがあります。詳しくはPEARの解説ページで確認できます。
Service/Amazon.php内でCacheライブラリを使用している部分はsetCacheメソッドで以下のコードになります。
function setCache($container = 'file', $container_options = array())
{
if(!class_exists('Cache')){
@include_once 'Cache.php';
}
@$cache = new Cache($container, $container_options);
Amazon_ServiceではCacheライブラリの「file」形式でキャッシュ内容をファイルに出力することが分かります。Cacheライブラリの「Cache_Container_file」では、「$container_options」として指定できる配列の要素に次のようなものがあります。
| 配列のキー | 概要 |
| cache_dir | キャッシュさせるファイルの出力先ディレクトリ |
| fileLocking | キャッシュさせるファイルをロックするかどうか |
| filename_prefix | ファイル名の指定 |
詳しくはPEARのCache_Container_fileクラスの解説ページで確認できます。サンプルではAmazon_ServiceのsetCacheメソッドを利用する際に「cache_dir」でキャッシュ先ディレクトリのみ指定します。
その他のService_Amazonの主なメソッドは次の表のとおりです。
| 関数名 | 概要 |
| setLocale(ロケール) | Amazon Web Serviceを利用する国を指定します。現在は「US, UK, DE, JP, FR, CA」の指定が可能です |
| setCacheExpire(秒) | キャッシュする時間を秒で指定します |
| ItemSearch(検索対象, オプション) | BooksやDVD等の検索対象を指定してAPIを呼び出してAmazon内で商品検索を行います |
| TagLookup(タグ, オプション) | タグで商品検索を行います |
| SimilarityLookup(商品ID,オプション) | 指定した商品と類似の商品を検索します |
本サンプルで利用するItemSearchメソッドのオプションは、以下のパラメータをキーとして配列で指定します。指定できるパラメータは非常に多いため、代表的なもののみ記載します。詳しくはAmazonのAPIドキュメントページを参照ください。
| パラメータ名 | 概要 |
| Keywords | 検索するキーワードを指定する |
| Title | 商品のタイトルを指定する |
| Artist | アーティスト名を指定する |
| Author | 作者名を指定する |
| Actor | 俳優名を指定する |
| ResponseGroup | 返されるデータの種類を指定する |
Amazon Web Service登録時に発行された「ACCESS KEY ID」と「SECRET ACCESS KEY」、アフィリエイト機能を利用する場合はAmazonアソシエイト登録時に発行されるアソシエイトIDをconfig.phpに記述します。
$ACCECSS_KEY_ID = 'ACCESS KEY ID'; $SECRET_ACCESS_KEY = 'SECRET ACCESS KEY'; $ASSOC_ID = 'アソシエイトID';
Amazonでの商品検索実行部分はUtil.class.php内のgetDvdInfoメソッドに実装します。女優名を受け取ってドラマのDVDを検索します。ItemSearchメソッド実行の際にオプションで「Actor」を女優名とすると映画の検索結果が出てくるので、「Keywords」に「女優名+ドラマ」として検索します。
Product Advertising APIより返却される商品検索のXMLのフォーマットは以下のようになります。
<?xml version="1.0" encoding="UTF-8"?>
<ItemSearchResponse xmlns="http://webservices.amazon.com/AWSECommerceService/2009-11-30>
<OperationRequest>
<Items>
<Request>
<IsValid>True</IsValid>
<ItemSearchRequest>
<Keywords>「検索に使用したキーワード」</Keywords>
</ItemSearchRequest>
</Request>
<TotalResults>「検索結果総件数」</TotalResults>
<TotalPages>「総ページ数」</TotalPages
<Item>
<ASIN>「ASINナンバー」</ASIN>
<DetailPageURL>「Amazon内の商品詳細画面へのURL」</DetailPageURL>
<SmallImage>
<URL>「小画像のURL」</URL>
<Height>「高さ」</Height>
<Width>「幅」</Width>
</SmallImage>
<MediumImage>
: * SmallImageと同じフォーマット
:
</MediumImage>
<LargeImage>
: * SmallImageと同じフォーマット
:
</LargeImage>
<ItemAttributes>
<Author>「著者名」</Author>
:
:
<ProductGroup>「Books, DVDなど商品の種別」</ProductGroup>
<Title>「商品名」</Title>
</ItemAttributes>
</Item>
:
:
</Items>
</ItemSearchResponse>
Service_AmazonではItemSearchメソッドで受け取った結果は、XMLのタグ名がそのままキーとなった配列となっているので、各要素へのアクセスは配列データを扱う場合と同じ処理で可能です。キーワードを指定してItemSearchメソッドで商品検索を行い、結果を解析するコードは以下のようになります。
function getDvdInfo($word){
ini_set('error_reporting', 6143);
require_once 'Services/Amazon.php';
// Service_Amazonをコール
$amazon = new Services_Amazon(
$this->_ACCECSS_KEY_ID, // アクセスキー
$this->_SECRET_ACCESS_KEY, // シークレットアクセスキー
$this->_ASSOC_ID // アソシエイトID
);
// 日本を指定
$result = $amazon->setLocale('JP');
// キャッシュ設定 ファイル、ディレクトリを指定
$result = $amazon->setCache(
'file', array( 'cache_dir' => 'cache/')
);
// 検索結果を24時間キャッシュ
$amazon->setCacheExpire( 24 * 60 * 60 );
// 検索対象
$search_key = "DVD";
// 検索オプションを指定
$options = array();
$options['Keywords'] = $word;
$options['ResponseGroup'] = 'Medium';
// 検索の実行
$result = $amazon->ItemSearch($search_key, $options);
// 返却するための配列
$_return = array();
// 画像がある検索結果を1件取得して返却する
foreach ($result['Item'] as $item) {
if( array_key_exists('MediumImage',$item) ){
// 商品名
$_return['dvdTitle'] = $item['ItemAttributes']['Title'];
// 中サイズ商品画像URL
$_return['dvdImage'] = $item['MediumImage']['URL'];
// 商品詳細URL
$_return['dvdUrl'] = $item['DetailPageURL'];
break;
}
}
return $_return;
}
先のXMLフォーマットより商品検索の結果で返却される「Item」要素内の商品名、中サイズ画像のURL、商品詳細URLを1商品分取得して返却します。中サイズの商品画像がないものもあるため、商品が格納されている配列に 'MediumImage' の要素があるか判定して商品情報を取得しています。
PHP 5.3ではService_Amazonをそのまま呼び出すと「Deprecated: Assigning the return value of new by reference is deprecated・・・」というエラーが出ます。
このエラーはServices_Amazonが以下のようにオブジェクトを生成するときに「&」をつけてnewしていることに対する警告メッセージです。
$http = &new HTTP_Request($url);
この警告はPHPの動作には影響がないと思われますので、Service_Amazonを呼び出す前に「ini_set('error_reporting', 6143);」を記述してエラーメッセージを出力しないようにしています。
