3度目のアドベントカレンダーという、まさかの誕生日プレゼントをもらってしまいました・・・。
小さいころの夢はお母さんを冥王星につれていくことだった、本日誕生日の萩原です。
(bitshiftersの皆さん、昨日はありがとうございました。)
アドベントカレンダーよりもっと別のプレゼントください。
PHPでのAPI使い方の紹介
さて、最近AmazonAPIを使って商品検索をする機会がありましたので、その使い方を簡単に紹介したいと思います。
まずはじめにAmazonから自分のアクセスキーとシークレットキーを取得してきます。
後は、実際にコードを。
私はCakePHP使いなのでPHPを使って商品情報を取得します。
前々回先頭のCを小文字にしてしまったら弊社小山から苦情が来ました・・・すみません・・・
$access_key_id = 'アクセスキー';
$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'] = 'All';
$params['Keywords'] = $word; // ← 検索ワード
$params['ItemPage'] = $page;
// 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);
//XMLで情報を取得。
$xml = @simplexml_load_file($url);
注意する点
まず、一度に取得できる商品の件数は10件固定です。
一度に飛ばせるリクエストの数は2件までなのでまとめて20件は表示することが可能です。
私は今回5件ずつ取得したかったので、10件取得して前後5件ずつに分けることで対応しました。
ちょっと無駄にデータを取ってきてしまうのが気にはなりましたけどね。
次に、開発は基本皆さん仮想環境で開発を行っていると思います。
その際、時間がずれていることがよくあるかと思いますが、時間がずれすぎているとAmazonからアクセスを拒否されます。
多分10~15分くらいずれていると検索できません。
私は取りあえずの対応で、cronで5分ごとに時間を合わせることで対応しました。(正確に合わせる必要はなかったので)
後は、xmlを取得する際、エラー回避することを忘れないようにしましょう。
エラーが出てしまうと、XMLの取得に使用するURLがそのまま出てしまうのですが、上記を見てもらえたらわかるとおりURLにはそのままアクセスキーとシークレットキーが書いてあります。ですので、エラーが出たら即情報が漏れてしまいます。
今回は、デモでやっているのでとりあえず”@”をつけています。
まとめ
今回、こういったAPIを利用することは初めてだったので色々苦労しました。
よくあることとは思いますが、Amazonに条件を投げて帰ってくるパターンは変えられないので、そのなかで自分がほしい情報に編集するのが少々面倒でした。
また、XMLをいじることも初めてでしたし、javascriptでも苦労したことがあったのですが、これに関してはまた機会があれば。
毎度おなじみどうでもいい化学豆知識
炭素原子が三重結合までしかできないのは皆さん(多分)ご存知かと思いますが、タングステンやクロムなどは四重結合をすることがあります。
まぁ、だからなんだと言われても困るんですけど。
それでは、また。