【Amazon・PA-API】商品データを取得し出力する例|PHP・WordPress

Amazonアソシエイトでは、Amazon内の商品データを扱えるPA-API(Product Advertising API)を提供しています。

今回は、そのAPIの中のPA-APIを使用し、WordPressでAmazonの簡単な商品データを取得し出力する例となります。

AmazonのPA-APIを使用するために必要な情報

まずは、AmazonのPA-APIを使用するために必要な以下の情報を用意します。

  • アクセスキーID
  • シークレットキー
  • アソシエイトタグ

上記、3つの情報を確認する方法については、以下のリンク先を参考にしてみてください。

【Amazon・PA-API】商品データを取得し出力する例

例では、WordPressでAmazonのPA-APIを使い、指定した商品のタイトルと画像(Amazon内へのリンク付き)を出力します。

以下、ソースコードの例となり商品データを出力したい箇所に記述します。

<?php
// エンドポイントのホスト、パスをそれぞれ変数に格納
$host = 'ecs.amazonaws.jp';
$path = '/onca/xml';

// リクエストURLのパラメータを配列で指定
$params = array(
	// XXXXXXXXの箇所にアクセスキーIDを指定。
    'AWSAccessKeyId' => 'XXXXXXXX',
	// XXXXXXXXの箇所にアソシエイトタグを指定
    'AssociateTag' => 'XXXXXXXX',
	// Product Advertising API のサービスを指定
    'Service' => 'AWSECommerceService',
	// 実行するProduct Advertising APIの種類を指定
    'Operation' => 'ItemLookup',
	// XXXXXXXXの箇所に商品IDを指定。複数の場合はをカンマで区切って指定(最大10)
    "ItemId" => 'XXXXXXXX',
	// 返されるデータのグループを指定。複数の場合はをカンマで区切って指定
    'ResponseGroup' => 'Small,Images',
	// タイムスタンプを指定
    'Timestamp' => gmdate('Y-m-d\TH:i:s\Z')
);

// 上記配列のキーを英数字でソート
ksort($params);

// パラメータの配列を結合
$parameter = '';
foreach ($params as $key => $value) {
    $parameter .= $key . '=' . rawurlencode($value) . '&';
}
// パラメータに不要な最後の文字列&を削除
$parameter = rtrim($parameter, '&');

// 署名を作成。XXXXXXXXの箇所には「シークレットキー」を指定
$secret_key = 'XXXXXXXX';
$signature = "GET\n" . $host . "\n" . $path . "\n" . $parameter;
$signature = hash_hmac('sha256', $signature, $secret_key, true);
$signature = rawurlencode(base64_encode($signature));

// リクエストURLを作成
$request_url = 'http://' . $host . $path . '?' . $parameter . '&Signature=' . $signature;

// XML形式の商品データをオブジェクトに変換
$xml = simplexml_load_file($request_url);

// 使用する商品データを取得して変数に格納
$item = $xml->Items->Item;
$page_url = $item->DetailPageURL;
$attributes = $item->ItemAttributes;
$image_url = $item->MediumImage->URL;
$title = $attributes->Title;
?>

<div>
	<p><?php echo esc_html($title); ?></p>
	<a href='<?php echo esc_url($page_url); ?>' target='_blank'>
		<img src='<?php echo esc_url($image_url); ?>' alt='<?php echo esc_attr($title); ?>'>
	</a>
</div>

取得したAPIのデータをキャッシュする場合

上記例の場合、アクセス時に毎回APIのデータを取得しますが、取得したデータをデータベースへキャッシュ(一時保存)することもできます。

詳しくは、以下のリンク先を参考にしてみてください。

ソースコードの説明

以下、例のソースコードのポイントとなる箇所の説明となります。

エンドポイントのホスト、パスをそれぞれ変数に格納

以下の箇所では、エンドポイントのホスト名とパスをそれぞれの変数に格納しています。

例のソースコード2行目の箇所

// エンドポイントのホスト、パスをそれぞれ変数に格納
$host = 'ecs.amazonaws.jp';
$path = '/onca/xml';

リクエストURLのパラメータを配列で指定

以下の箇所では、まず、リクエストURLのパラメータのキーと値をセットにして配列で格納しています。そして、格納した配列をksort関数で並べ替えています。

例のソースコード6行目からの箇所

// リクエストURLのパラメータを配列で指定
$params = array(
	// XXXXXXXXの箇所にアクセスキーIDを指定。
    'AWSAccessKeyId' => 'XXXXXXXX',
	// XXXXXXXXの箇所にアソシエイトタグを指定
    'AssociateTag' => 'XXXXXXXX',
	// Product Advertising API のサービスを指定
    'Service' => 'AWSECommerceService',
	// 実行するProduct Advertising APIの種類を指定
    'Operation' => 'ItemLookup',
	// XXXXXXXXの箇所に商品IDを指定。複数の場合はをカンマで区切って指定(最大10)
    "ItemId" => 'XXXXXXXX',
	// 返されるデータのグループを指定。複数の場合はをカンマで区切って指定
    'ResponseGroup' => 'Small,Images',
	// タイムスタンプを指定
    'Timestamp' => gmdate('Y-m-d\TH:i:s\Z')
);

// 上記配列のキーを英数字でソート
ksort($params);

パラメータの配列を並べ替える理由

AmazonのPA-APIのリクエストURLでは、リクエストの送信者を特定し検証するために、パラメータの最後に署名を追加します。

その署名を作成する過程で、リクエストURLに指定するパラメータによって、パラメータを並び替える必要があるため、パラメータを配列に格納して並べ替えています。

署名を作成する手順の詳細については以下のリンク先を参考にしてみてください。

REST リクエストのサンプル|Product Advertising API

パラメータOperationについて

パラメータOperationでは、Amazon PA-APIの種類を指定します。例で指定したItemLookupでは、指定したレスポンスグループに従い、指定した商品データを取得します。

パラメータOperationで指定できる値については、以下のリンク先を参考にしてみてください。

パラメータResponseGroupについて

パラメータResponseGroupでは、取得する商品データのグループを指定します。グループを複数指定する場合はカンマで区切ります。例で指定したSmallは簡易な商品データを、Imagesは商品の画像情報を取得します。

また、パラメータResponseGroupで指定できる値については以下のリンク先を参考にしてみてください。

レスポンスグループ|Product Advertising API

パラメータItemIdについて

パラメータItemIdでは、取得したい商品の商品IDを指定します。商品を複数指定する場合は商品IDをカンマで区切ります。

商品IDは、Amazonの商品ページの「登録情報」内にあるASINの番号となり、商品が紙の書籍の場合のみ、商品IDはISBN-10の番号となります。

パラメータの配列を結合

以下の箇所では、配列のキー名と値を'='で、個別のパラメータを'&'で結合し、リクエストURLで指定するパラメータを作成します。また、値はrawurlencode関数でエンコードします。

そして、作成したパラメータの最後には、不要な'&'が追加されるためrtrim関数で削除します。

例のソースコード27行目からの箇所

// パラメータの配列を結合
$parameter = '';
foreach ($params as $key => $value) {
    $parameter .= $key . '=' . rawurlencode($value) . '&';
}
// パラメータに不要な最後の文字列&を削除
$parameter = rtrim($parameter, '&');

署名を作成

以下の箇所では、AmazonのPA-APIの署名を作成する手順に従い、シークレットキーを利用し署名を作成します。

例のソースコード35行目からの箇所

// 署名を作成。XXXXXXXXの箇所には「シークレットキー」を指定
$secret_key = 'XXXXXXXX';
$signature = "GET\n" . $host . "\n" . $path . "\n" . $parameter;
$signature = hash_hmac('sha256', $signature, $secret_key, true);
$signature = rawurlencode(base64_encode($signature));

上記箇所では署名を作成するため、まず、hash_hmac関数を使用してハッシュ値を生成します。hash_hmac関数の第3引数に指定する値が「シークレットキー」となります。

ハッシュ値とhash_hmac関数については以下のリンク先を参考にしてみてください。

ハッシュ値|用語解説辞典|【公式】NTTPC

PHP: hash_hmac - Manual

次に生成されたハッシュ値を、base64_encode関数、rawurlencode関数を使用してエンコードします。

リクエストURLを作成

以下の箇所では、エンドポイント・パラメータ・署名を結合してリクエストURLを作成します。

例のソースコード41行目からの箇所

// リクエストURLを作成
$request_url = 'http://' . $host . $path . '?' . $parameter . '&Signature=' . $signature;

商品データを取得

以下の箇所では、取得した商品データがXMLのため、simplexml_load_file関数を使用し、PHPで扱えるオブジェクト型に変換します。

そして、オブジェクトから、商品の「タイトル」「中サイズの画像」「商品へのリンク」を取得しています。

例のソースコード44行目からの箇所

// XML形式の商品データをオブジェクトに変換
$xml = simplexml_load_file($request_url);

// 使用する商品データを取得して変数に格納
$item = $xml->Items->Item;
$page_url = $item->DetailPageURL;
$attributes = $item->ItemAttributes;
$image_url = $item->MediumImage->URL;
$title = $attributes->Title;

例で使用したSmall、Imagesのレスポンスグループで返されるデータについては、以下のリンク先を参考にしてみてください。

Small レスポンスグループ|Product Advertising API

Images レスポンスグループ|Product Advertising API

また、例ではXMLデータをsimplexml_load_file関数で扱いましたが、cURL関数を使い、外部データを取得する方法もあります。

cURL関数では、データ取得時にさまざまなオプションを設定することも可能です。詳しくは、以下のリンク先を参考にしてみてください。

商品データを出力

以下の箇所では、取得した商品の「タイトル」「中サイズの画像」「商品へのリンク」を、データに応じてエスケープを行いHTMLとして出力します。

例のソースコード55行目からの箇所

<div>
	<p><?php echo esc_html($title); ?></p>
	<a href='<?php echo esc_url($page_url); ?>' target='_blank'>
		<img src='<?php echo esc_url($image_url); ?>' alt='<?php echo esc_attr($title); ?>'>
	</a>
</div>

参考サイトなど

コメント投稿またはTwitterで返信

コメントは、以下の項目(*は必須項目)を入力し「コメントを送信」ボタンから送信お願いします。メールアドレスは公開されることはありません。
Twitterで返信する場合はこちらから。

また、コメントは承認制となります。