JavaScript勉強会

JavaScriptの学習日記

Amazon APIのリクエストURLを組み立てる方法

Amazonの商品データを取得する方法をメモ。

 

jsstudy.hatenablog.com

 

今回は、AmazonProduct Advertising APIでデータを取得するために、リクエストURLを組み立てる方法です。

 

 

f:id:jsstudy:20180813231706p:plain

 

 

APIのアクセスキーと秘密キーを取得

まず最初にAmazonに登録して、API利用に必要な「アクセスキー」と「秘密キー」を用意します。

 

(参考)AWSアクセスキー識別子

https://affiliate.amazon.co.jp/help/topic/t126/a4/ref=amb_link_hUkkizpuNYCtYB28C08Nlg_8

Product Advertising APIのアカウントを作成すると、AWSでは以下のようなアカウント識別子情報を設定します。

アクセスキーID(半角英数字で構成された20文字の文字列)
例:022QF06E7MXBSH9DHM02

秘密キー40文字のシーケンス)
例:kWcrlUX5JEDGM/LtmEENI/aVmYvHNif5zB+d9+ct

これらが、お客様のAWSアクセスキー識別子となります。

 

リクエストの署名

Amazon APIの利用方法は、検索するといろいろ説明が出てきます。

 

ajaxtower.s26.xrea.com

 

(参考)サンプルリクエストに署名を行うためのステップ

https://affiliate.amazon.co.jp/help/topic/t126/a13/ref=amb_link_3LE3oueLNruPiAGKrfDxRQ_2

 

Amazon APIのリクエストURLを作るメソッド

ここでは、CodeIgniter(PHPMVCフレームワーク)で、Amazon APIを利用するライブラリークラスを作成してみます。

 

<?php
defined('BASEPATH') OR exit('No direct script access allowed');

class Amazon {
    // @property
    private $access_key_id = '022QF06E7MXBSH9DHM02';
    private $secret_access_key = 'kWcrlUX5JEDGM/LtmEENI/aVmYvHNif5zB+d9+ct';
    private $associate_tag = 'amazonsample-22';
    private $api_version = '2011-08-01';

    // Request URL
    function encodeURL($params = NULL) {
        $params['Service'] = 'AWSECommerceService';
        $params['AWSAccessKeyId'] = $this->access_key_id;
        $params['AssociateTag'] = $this->associate_tag;
        $params['Version'] = $this->api_version;
        $params['Timestamp'] = gmdate('Y-m-d\TH:i:s\Z');
        ksort($params);

        // canonical string
        $canonical_string = '';
        foreach ($params as $k => $v) {
            $canonical_string .= '&'.$this->urlencode_rfc3986($k).'='.$this->urlencode_rfc3986($v);
        }
        $canonical_string = substr($canonical_string, 1);

        // URL
        $baseurl = 'http://ecs.amazonaws.jp/onca/xml';
        $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, $this->secret_access_key, true));
        $url = $baseurl.'?'.$canonical_string.'&Signature='.$this->urlencode_rfc3986($signature);

        return $url; //←このURLにアクセスすればAPIリクエストできる
    }

    // RFC3986形式でURLエンコードする
    function urlencode_rfc3986($str) {
        return str_replace('%7E', '~', rawurlencode($str));
    }
}

 

  • AmazonクラスのencodeURLメソッドを使います。
  • 引数$paramsで必要な情報を渡します。
  • APIにアクセスするためのURLが返ってくるので、そのURLでAmazonにデータ取得のリクエストを行います。
  • リクエストの結果=レスポンスデータは、AmazonからXMLデータの形で渡されます。
  • XMLデータをパースして、利用したい情報を取り出します。

 

リクエストURL作成メソッドの利用例

ASIN(Amazonの商品コード)で商品データを取得する場合の使用例です。

CodeIgniterのモデルでAmazonクラスのencodeURLメソッドを呼び出しています。

(説明の簡便化のため、前後の記述は省略)

 

<?php
$params['Operation'] = 'ItemLookup'; $params['ItemId'] = '4295003859'; // ASIN $params['ResponseGroup'] = 'Large'; $url = $this->amazon->encodeURL($params); $xml = file_get_contents($url);

 

  • Operation、ItemId、ResponseGroup等のデータを指定して、配列$paramsに入れます。
  • $paramsを引数として、encodeURLメソッドに渡せば、ASINで検索するためのリクエストURLが作成されます。
  • PHPのfile_get_contents関数でURLにアクセスすると、XMLのレスポンスデータがAmazonのProduct Advertising APIから返されます。

 

様々なタイプのリクエスト

APIの利用方法に応じて、引数$paramsに入れる付加情報を変えればOKです。

上記の例では、「ItemLookup」という操作を行なっています。

他にも、いろいろな操作ができます。

 

(参考)その他の署名認証リクエストの例

https://affiliate.amazon.co.jp/help/topic/t126/a14/ref=amb_link_YH9CZRtyNvui235NwsYxuA_3

リクエストサンプルリスト

・ItemSearch

・CartCreate

・ListSearch

・ListLookup

・BrowseNodeLookup

・SimilarityLookup

 

それぞれのリクエストで、どのような引数を渡せば良いのでしょうか?

使い方を確認するために、「Product Advertising API Scratchpad」というツールが用意されていました。

 

qiita.com

 

よく使うのは、

  • ASINやISBNを指定した商品検索
  • 商品カテゴリーの検索
  • カテゴリー毎の商品検索

などでしょうか?

 

リクエストの回数制限

APIのリクエストは、Amazonのサーバーに負荷をかけないため、基本的に1秒あたり1回までとなってます。

API経由によるAmazon商品の売上金額に応じて、APIの利用回数が増加/減少される仕組みになってます。(1秒あたり1回~10回に増減される)

 

(参考)Product Advertising API (PA-API) の利用ガイドライン

https://affiliate.amazon.co.jp/help/topic/t32/ref=amb_link_zYXX0aRKMACI_Qkj9rR6Nw_1

リクエスト数の上限は、以下の計算式によって定められ、最大1秒間あたり10リクエストまで認められます。この売上実績は、PA-APIで取得したURL経由のものでなくてはなりません。

◆[リクエスト数の上限] = 1 + [ (過去30日間の配送済み商品売上実績/460,000円)の小数点以下を四捨五入した数 ]

 

これで、Amazon APIを使う準備ができました。

 

 

スラスラわかるPHP

スラスラわかるPHP