PHPを使ってAmazon Product Advertising APIから商品情報取得

AmazonAPIを使って商品へのリンクを作成したい。
下のような、画像をクリックするとAmazonのページへ飛ぶやつだ。

AmazonAPIの基本は、リクエストとしてURLを送信し、レスポンスにXMLが返ってくるもの。
そのXMLデータから画像やリンクを作成することで、おなじみのアフィリエイトリンクができる。

その画像リンクを作成したいのだが、一気にやるのは難しい。
順序立ててやっていこう。

今回はAmazonAPIを利用して、商品情報のXMLを取得する。

ちなみにアソシエイトID、アクセスキー、シークレットキーが必要なので準備しておく。

1. Amazon Product Advertising APIを使ってみる

リクエストとして、以下のURLを送る。

ちなみに、以下のURLをアクセスキーだけ変更しても商品情報は取得できないので注意。
タイムスタンプやシグネチャを動的に生成しないといけない。

自分は以下のURLをPHPで作成した(後述)。

http://ecs.amazonaws.jp/onca/xml?
AWSAccessKeyId=[自分のアクセスキー]
&ItemId=4839947597
&Operation=ItemLookup
&ResponseGroup=ItemAttributes
&Service=AWSECommerceService
&Timestamp=2014-11-15T03%3A20%3A32Z
&Version=2011-08-01
&Signature=QUWf%2FGxZaFKjowDsufO%2FoKKQzN%2BDcreGALe%2FPYhezuA%3D

今回は、ItemLookupというIDから商品情報を取得するタイプのオペレーションを使用している。
オペレーションには、キーワードから商品検索するタイプなどもある。

URLの構成・作り方についてはこちらを参照。
また、各々のパラメータの意味についてはこちらを参照。

そして、レスポンスとして以下の様なXMLが返ってくる。
アクセスキーのところはピンクで塗りつぶしてある。

APIレスポンス

全体はキャプションできなかったけど、下の方にズラズラと本のデータが並んでる。
これで、Amazonから商品情報が取得できたことになる。

2. PHPでAPIを使用する際のサンプル

以下が今回作成したプログラムになる。

今回のデータを実行すると、上記のXMLツリーが表示されるように作ってある。
ただ、本来ならオブジェクトとしてパースして使うのが一般的。そこは注意。

<?php ItemLookup('4800710642'); function ItemLookup ($id) { $params = array(); // 必須 $access_key_id = '自分のアクセスキー'; $secret_access_key = '自分のシークレットキー'; $params['AssociateTag'] = '自分のアソシエイトタグ'; $baseurl = 'http://ecs.amazonaws.jp/onca/xml'; // パラメータ $params['Service'] = 'AWSECommerceService'; $params['AWSAccessKeyId'] = $access_key_id; $params['Version'] = '2011-08-01'; $params['Operation'] = 'ItemLookup'; $params['ItemId'] = $id; $params['ResponseGroup'] = 'ItemAttributes'; $params['Timestamp'] = gmdate('Y-m-d\TH:i:s\Z'); ksort($params); // 送信用URL・シグネチャ作成 $canonical_string = ''; foreach ($params as $k => $v) {
        $canonical_string .= '&' . urlencode_rfc3986($k) . '=' . urlencode_rfc3986($v);
    }
    $canonical_string = substr($canonical_string, 1);
    $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 = $baseurl . '?' . $canonical_string . '&Signature=' . urlencode_rfc3986($signature);

    // xml取得
    $xml = request($url);
    // xml出力
    header('Content-type: text/xml; charset=UTF-8');
    echo $xml;
}

function urlencode_rfc3986($str)
{
    return str_replace('%7E', '~', rawurlencode($str));
}

function request($url){
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_1);
    $response = curl_exec($ch);
    curl_close($ch);

    return $response;
    //return simplexml_load_string($response); //オブジェクトとして返す場合
}

ネットに落ちてるソースを継ぎ接ぎしたものなので、間違ってたらごめんね。

このプログラムでややこしいのは、シグネチャの部分。
シグネチャは署名のことで、送信者から送られた正しいリクエストであるかを判断する。

しかし、APIの使用例を載せるのって難しい・・・

みんな、自分のアクセスキーを晒したがらないだろうし。
タイムスタンプやシグネチャーも固定値ではないし。

参考

Amazon Web サービス入門(Product Advertising API)

PHPでAmazon Product Advertising APIを利用する

PHPからAmazon Web ServiceのREST APIを利用するサンプル

コメント

  1. […] PHPを使ってAmazon Product Advertising APIから商品情報取得 […]

タイトルとURLをコピーしました