ここで紹介するやり方を実現するには以下の条件が整っている必要があります。
1. Amazon アソシエイトの登録済みである。
2. Amazon Product Advertising APIに登録済みで、アクセスIDとシークレットアクセスキーを取得済みである。
3. APIを使用するサーバに、PECL hashというモジュールがインストールされている。
使い方の詳細は、「最速で Amazon Web Services の Product Advertising API を使って商品検索をしてみよう」が参考になります。
上記サイトのapi()という関数をコピーして用意しておきます。
これをreuireして呼び出せばOKです。
自分用の簡単な検索フォームの例を以下に示します。
検索フォームのスクリプト
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
template_dir = "./templates"; $smarty_obj->compile_dir = "./templates_c"; if(isset($_POST['keyword'])){ require_once("./api.php") $opt_array = Array( 'locale' => 'http://ecs.amazonaws.jp/onca/xml', 'Service' => 'AWSECommerceService', 'Operation' => 'ItemSearch', 'AWSAccessKeyId' => 'xxxxxxxxxxxxxxxxxx', 'SearchIndex' => 'Books', 'ResponseGroup' => 'Large', 'Keywords' => $_POST['keyword'], 'Version' => '2009-01-06', 'AssociateTag' => 'takaemon210f-22', 'secret_key' => 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx' ); $data = api($opt_array); $smarty_obj->assign("results", $data); } $smarty_obj->display("form.tpl"); |
「xxxxxxxxxxxxxxxxx」のところには各自で取得したキーを入れてください。
今回はテンプレートにSmartyを使っているので、テンプレートファイルも以下に記載します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
<title>Amazon 商品検索</title> {if $results} <hr> {foreach from=$results->Items->Item item=item} <img>MediumImage->URL}"> <ul> <li>{$item->ItemAttributes->Title}</li> <li>{$item->ItemAttributes->PublicationDate}</li> </ul> <hr> {/foreach} {/if} |
呼び出すapi関数を記述したファイル(api.php)は以下になります。
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 |
$value) { if($key != 'secret_key' && $key != 'locale') { if(isset($params)) { $params .= sprintf('&%s=%s', $key, $value); } else { $params = sprintf('%s=%s', $key, $value); } } } // ベースとなるURL(locale)とURL用のパラメータ文字列をくっつけてURLとします。 $url = $array['locale'] . '?' . $params; // できたURLをparse_urlを使用して$urlを分解します。 $url_array = parse_url($url); // parse_strを使用してパラメータ文字列部分を$param_array配列に格納します。 parse_str($url_array['query'], $param_array); // $param_arrayの'Timestamp'要素に、現在の日時情報を入力する $param_array['Timestamp'] = gmdate('Y-m-d\TH:i:s\Z'); // $param_arrayをソートします。 ksort($param_array); // GET文字列を作成します。 $str = sprintf("GET\n%s\n%s\n", $url_array['host'], $url_array['path']); // パラメータが入った$param_array配列を再度URL用の文字列を作成します。 $str_param = ''; while(list($key, $value) = each($param_array)) $str_param .= sprintf('%s=%s&', strtr($key, '_', '.'), rawurlencode($value)); // パラメータ文字列の最後の無駄な"&"を削除しつつ、$strの後ろにくっつけます。 $str .= substr($str_param, 0, strlen($str_param) - 1); // 完成したGETリクエスト文字列($str)に対し、シークレットキーを使ってハッシュ化し、Signatureを作成します。 $signature = base64_encode(hash_hmac('sha256', $str, $array['secret_key'], true)); // 作成したSignatureを使用して、最終的にリクエストに使用するURLを作成します。 $url_sig = sprintf('%s://%s?%sSignature=%s', $url_array['scheme'], $url_array['host'] . $url_array['path'], $str_param, rawurlencode($signature)); // 最終的なURL($url_sig)に対し、file_get_contents()でサーバから情報を取ってきます。 $xml = file_get_contents($url_sig); // 取得したxmlをsimplexml_load_string()を使用して配列化します。 if($xml) { return simplexml_load_string($xml); } else { return false; } } |
たとえば”ディズニー”で検索した結果は以下のようになります。