{ 2010.12.16 }

PHPでのAmazonAPIの使い方

    はてなブックマーク - PHPでのAmazonAPIの使い方
    このエントリーをはてなブックマークに追加

    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でも苦労したことがあったのですが、これに関してはまた機会があれば。

    毎度おなじみどうでもいい化学豆知識

    炭素原子が三重結合までしかできないのは皆さん(多分)ご存知かと思いますが、タングステンやクロムなどは四重結合をすることがあります。
    まぁ、だからなんだと言われても困るんですけど。

    それでは、また。

    Comments are closed.