できるだけシンプルにAmazon Product Advertising API v5.0をPHPで実装する方法。 | 在宅ネットでコツコツお金を稼ぐ

以前、Amazon Webサービス(AWS)の時にはそのAWSを利用していました。 こちらのAPIは、Amazonの商品情報を返してくれるもので、 ホームページに自動で広告を表示したりとすごく便利でした。

ただ、バージョンアップをしたり、 名称もAmazon Product Advertising APIになったりして、 プログラム的にだんだん難しくなっていきました。 管理人が新たなプログラムを実装するのが大変になって、 結局APIを使わないことになってしまいました・・・。

ただ、最近管理人のサイトでAmazonの商品を自動で紹介したくなって、 再びこのAPIを使うことにしました。 現在は、Amazon Product Advertising APIのバージョンがv5というものになっていて、 プログラムの仕様も大きく変わったようです。

管理人はPHPが一番馴染みがあるので、 今回は、PHPを使ってAmazon Product Advertising API v5を実装したいという計画です。

まずはSDKを利用

Amazon Product Advertising API v5はSDKが用意されていて、 そのSDKを使うと一からプログラムを書かなくても大丈夫とのことでした。 SDKを利用する際に、今回、参考にしたサイトは以下のサイトです。

4.0から大きく変わった「PA-API v5.0(Amazon API)」の使い方!

上記のサイトの通りに進んでいきます。

まずは、v5用の新しいアクセスキーとシークレットキーを取得。

それから、SDKをダウンロードします。 Using SDK

「paapi5-php-sdk-example」フォルダの中を探すと、

SampleGetItemsApi.phpというファイルがあるので、 こちらを書き換えれば良いみたいです。 管理人は「SampleSearchItemsApi.php」を使いたいので、 こちらを書き換えます。

書き換えるのは上記サイトの通り、アクセスキー、シークレットキー、アソシエイトタグの3つ。

あとは、 ホストとリージョンも変更します。

$config->setHost('webservices.amazon.co.jp');

$config->setRegion('us-west-2');

これでできるはず、です。

ただ、エラーで値が返ってきてくれません。 いろいろな原因が考えられて、原因がわかるまで時間がかかりました。 一番怪しいと思ったのが、 「成果の出ていないアソシエイトタグでは、利用できない」ということでした。

成果を出して再挑戦

最近、Amazonアソシエイトの方もサボリ気味だったので、 なんとか成果を出そうとがんばって、ようやく成果が出ました。 そして、次の月の1日に先程のスクリプトを実行してみると、無事に値が返ってきました。 管理人の場合は、この「成果が出ていない」というのが値の返ってこない原因だったようです。

SDKを使わずシンプルに実装したい

先程のサイトのおかげで、Amazon Product Advertising API v5の値が返ってくるところまでは できました。 ただ、こちらはSDKを利用しないといけないと思いました。 管理人はなるべくシンプルな環境で実装したい、という希望があります。

Amazon Product Advertising API v5の サイトを見ていると、

Integrating without SDK

ということで、SDKなしでも実装できるソースコードが出ていました。

下の方にPHP用のものがあったので、こちらを使用します。

SDKを使わないソースコード

そして、先程のサイトで教えていただいたところを書き換えます。

具体的には $searchItemRequest->PartnerTag = <PARTNER_TAG>;

$searchItemRequest->PartnerTag = "ご自身のアソシエイトタグ";

に変えます。

$host = "webservices.amazon.com";

$host = "webservices.amazon.co.jp";

に変えます。

次に、

$awsv4->setRegionName("us-east-1");

$awsv4->setRegionName("us-west-2");

変えます。

最後に、 $awsv4 = new AwsV4 (<ACCESS_KEY>, <SECRET_KEY>);

$awsv4 = new AwsV4 ("ご自身のアクセスキー", "ご自身のシークレットキー");

に変えます。アクセスキーとシークレットキーはダブルクオーテーション(")で囲むようです。 これで良いはずですが、 phpを実行すると、

Fatal error: Uncaught Error: Class 'AwsV4' not found in

というエラーメッセージが。 ここでまたハマってしまいました。 管理人はClassとかが苦手で、困ったのですが、 どうもClassの定義が書かれていないのが原因のようです。 だいぶハマりましたが、 よく見ると、先程の公式サイトに別枠でclass AwsV4というものがありました。 以下のサイトの一番下にあります。

SDKを使わないソースコード

こちらを追加すると、無事に値が返ってきました。

何回かハマりましたが、 これでなんとかAmazon Product Advertising API v5が使えるようになりました。

リクエストする時は

管理人はアイテムサーチで使うので、 先程のWithout SDKのPHPファイルを書き換えるのは以下の部分となります。 まずは、キーワードを変える時は、

$searchItemRequest->Keywords = "Harry";

となっている部分です。 こちらを例えば、

$searchItemRequest->Keywords = "タブレットPC";

などと書き換えます。 これで値が返ってきます。

返ってくる値で、リソースというものも指定できます。 この指定できるリソースは先程の公式サイトに書いてあります。

使用できるリソース

デフォルトは、以下のようになっています。

$searchItemRequest->Resources = ["Images.Primary.Small","ItemInfo.Title","Offers.Listings.Price"];

こちらに例えば、

$searchItemRequest->Resources = ["Images.Primary.Small","Images.Primary.Medium","ItemInfo.Title","Offers.Listings.Price"];

という風に追加すると、Mediumサイズの画像のデータも返してくれます。

また、例えば、 ソートしたい場合は、

$searchItemRequest->SearchIndex = "All";

の行の下に、

$searchItemRequest->SortBy = "NewestArrivals";

という行を追加すると、ソートができました。 こちらの先程の公式サイトに出ていますが、ソートの種類もいくつかありますね。

使用できるソートの種類

そして、 先程のphpスクリプトの

$responseに値が入っているので、こちらを処理すれば良いことになります。

値の取得方法

Amazon Product Advertising API v5ではjsonという型式で値が返ってくるようです。 こちらも苦手でハマってしまいました。

例えば、 $obj = json_decode($response, true);

でできるはずですが、どうもうまくいきません。 最初の一行目がひっかかっているようでした。 ちょっと格好悪いやり方かも知れませんが、 管理人がうまくいった方法は、

$response=stristr($response, '{"SearchResult"');

などとして、SearchResult以下のデータのみにして、それから、

$obj = json_decode($response, true);

とやってみるとうまくいきました。

値を指定する時は、例えば、ASINでしたら、

$asin=$obj["SearchResult"]["Items"][0]["ASIN"];

商品のURLは

$detail_url=$obj["SearchResult"]["Items"][0]["DetailPageURL"])

画像の方はちょっと入り組んでいて、

$medium_image=$obj["SearchResult"]["Items"][0]["Images"]["Primary"]["Medium"]["URL"]

などとやると取得できました。

値の取得の方はちょっと自信がありませんが、 一応、これで値が取得できているようです。

今回のまとめ

今回は、 Amazon Product Advertising API v5をPHPでできるだけシンプルに実装したい、 ということでチャレンジしてみました。 一応はうまくいっているようで、 管理人の別サイトで動かしています。 何度もハマってしまって、大変でしたが、 なんとかできました。

(2020/07/06)

トップページ

その他のコラム

コンテンツ

トップページ