Amazonのアフィリエイトで利用している[アソシエイトツールバー]で商品へのリンクを作成する画面で[画像]や[テキストと画像]が表示されなくなってしまう(予定)なので、自前でリンクを作成すべく、Amazon APIを勉強してます。
アソシエイトツールバー
Amazonが提供している商品ページからアフィリエイト用のリンクを作成する[アソシエイトツールバー]があります。
このツールバーを利用すると、アフィリエイト情報を追加したテキストのURLや写真付きのリンクが自動的に作成してくれます。
しかし11月30日から[テキスト]リンクしか作成できなくなる予定です。
本当は11月10日から非表示になったのですが、各所から鬼電があったのか、その後に少し猶予期間が設けられました。
Amazonアソシエイツのホームページでも[お知らせ]に次のような記載があります。
【2023/11/14: (訂正) アソシエイト・ツールバーの画像リンク作成機能の提供終了について】 2023年11月10日をもって、アソシエイト・ツールバーの画像リンク作成機能の提供を終了する旨をお知らせしましたが、提供終了の日付を2023年11月30日に変更させていただきます。お客様に混乱を招いてしまいましたことをお詫びいたします。また、機能廃止によってご利用のお客様にご不便をおかけしますが、ご理解のほどよろしくお願いいたします。
Amazonアソシエイトのお知らせから
Amazon APIで自作してみる
アフィリエイト用のリンク生成をするサービスはありますが、他力本願だと結局「サービス終了」のリスクと付き合うことになるのは変わりません。
なので、Amazon PA APIでリンクの自作してみようと少し勉強してみました。
利用条件が厳しいAPI
Amazon Product Advartising APIは無料で利用ができますが、利用するための条件があります。
中でも重要なのが、これ
売上実績の発生がない場合は、PA-APIの利用開始はできません。
Amazon アソシエイト ヘルプより
また、発送済み商品売上が過去30日以内に発生していない場合、PA-APIをご利用いただけなくなる恐れがございます。
1日で利用できるAPIの回数などの制限もありますが、Amazonアフィリエイトで継続的に売上実績を上げる必要があります。
なので、過去30日以内に1円でもアソシエイトリンクを使った売上が無いとAPIのテストもできないという状況になります。
これからAmazonのアフィリエイトを始める場合はAPIの利用は厳しい。
詳しくは[Amazon アソシエイト ヘルプ|その他のお知らせ]をご覧ください。
認証キーの取得
他サービスのAPI同様に Amazon APIも利用するためのキーを取得する必要があります。
具体的には、次の手順で行います。
1. アフィリエイト用のアカウントでログインした状態で[ツール|Product Advertising API]メニューを選択します。
2.[Amazon Product Advertising API(商品情報API)]画面をスクロールして[認証キーの管理]を探します。
3.[認証情報を追加する]をクリックします。
4.[認証情報のダウンロード]画面で表示された[アクセスキー]と[シークレットキー]をコピーします。([認証情報をダウンロードする]をクリックしてテキストファイルでダウンロードできます)
商品検索APIの利用
まずは、開発者ガイドのサンプルを使ってキーワードを指定してAmazonの商品検索するPHPを利用する手順です。
1. アフィリエイト用のアカウントでログインした状態で[ツール|Product Advertising API]メニューを選択します。
2. 表示された[Amazon Product Advertising API(商品情報API)]画面をスクロールして[参考資料]を探します。
2.[参考資料]内の[開発者ガイド]をクリックします。
3.[Welcome to Product Advertising API]画面の左側メニューで[Sending & Request]を探します。
4.[Sending & Request|Without SDK]メニューをクリックします
5. 切り替わった右側の画面で[PHP]までスクロールします。
6. 表示された2つのサンプルコードを、[searchItem.php]と[awsv4.php]として保存します。
[searchItem.php]
<?php
/**
* Copyright 2019 Amazon.com, Inc. or its affiliates. All Rights Reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License").
* You may not use this file except in compliance with the License.
* A copy of the License is located at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* or in the "license" file accompanying this file. This file is distributed
* on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
* express or implied. See the License for the specific language governing
* permissions and limitations under the License.
*/
$searchItemRequest = new SearchItemsRequest ();
$searchItemRequest->PartnerType = "Associates";
// Put your Partner tag (Store/Tracking id) in place of Partner tag
$searchItemRequest->PartnerTag = <PARTNER_TAG>;
$searchItemRequest->Keywords = "Harry";
$searchItemRequest->SearchIndex = "All";
$searchItemRequest->Resources = ["Images.Primary.Small","ItemInfo.Title","Offers.Listings.Price"];
$host = "webservices.amazon.com";
$path = "/paapi5/searchitems";
$payload = json_encode ($searchItemRequest);
//Put your Access Key in place of <ACCESS_KEY> and Secret Key in place of <SECRET_KEY> in double quotes
$awsv4 = new AwsV4 (<ACCESS_KEY>, <SECRET_KEY>);
$awsv4->setRegionName("us-east-1");
$awsv4->setServiceName("ProductAdvertisingAPI");
$awsv4->setPath ($path);
$awsv4->setPayload ($payload);
$awsv4->setRequestMethod ("POST");
$awsv4->addHeader ('content-encoding', 'amz-1.0');
$awsv4->addHeader ('content-type', 'application/json; charset=utf-8');
$awsv4->addHeader ('host', $host);
$awsv4->addHeader ('x-amz-target', 'com.amazon.paapi5.v1.ProductAdvertisingAPIv1.SearchItems');
$headers = $awsv4->getHeaders ();
$headerString = "";
foreach ( $headers as $key => $value ) {
$headerString .= $key . ': ' . $value . "\r\n";
}
$params = array (
'http' => array (
'header' => $headerString,
'method' => 'POST',
'content' => $payload
)
);
$stream = stream_context_create ( $params );
$fp = @fopen ( 'https://'.$host.$path, 'rb', false, $stream );
if (! $fp) {
throw new Exception ( "Exception Occured" );
}
$response = @stream_get_contents ( $fp );
if ($response === false) {
throw new Exception ( "Exception Occured" );
}
echo $response;
class SearchItemsRequest {
public $PartnerType;
public $PartnerTag;
public $Keywords;
public $SearchIndex;
public $Resources;
}
?>
[awsv4.php]
<?php
/**
* Copyright 2019 Amazon.com, Inc. or its affiliates. All Rights Reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License").
* You may not use this file except in compliance with the License.
* A copy of the License is located at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* or in the "license" file accompanying this file. This file is distributed
* on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
* express or implied. See the License for the specific language governing
* permissions and limitations under the License.
*/
class AwsV4 {
private $accessKeyID = null;
private $secretAccessKey = null;
private $path = null;
private $regionName = null;
private $serviceName = null;
private $httpMethodName = null;
private $queryParametes = array ();
private $awsHeaders = array ();
private $payload = "";
private $HMACAlgorithm = "AWS4-HMAC-SHA256";
private $aws4Request = "aws4_request";
private $strSignedHeader = null;
private $xAmzDate = null;
private $currentDate = null;
public function __construct($accessKeyID, $secretAccessKey) {
$this->accessKeyID = $accessKeyID;
$this->secretAccessKey = $secretAccessKey;
$this->xAmzDate = $this->getTimeStamp ();
$this->currentDate = $this->getDate ();
}
function setPath($path) {
$this->path = $path;
}
function setServiceName($serviceName) {
$this->serviceName = $serviceName;
}
function setRegionName($regionName) {
$this->regionName = $regionName;
}
function setPayload($payload) {
$this->payload = $payload;
}
function setRequestMethod($method) {
$this->httpMethodName = $method;
}
function addHeader($headerName, $headerValue) {
$this->awsHeaders [$headerName] = $headerValue;
}
private function prepareCanonicalRequest() {
$canonicalURL = "";
$canonicalURL .= $this->httpMethodName . "\n";
$canonicalURL .= $this->path . "\n" . "\n";
$signedHeaders = '';
foreach ( $this->awsHeaders as $key => $value ) {
$signedHeaders .= $key . ";";
$canonicalURL .= $key . ":" . $value . "\n";
}
$canonicalURL .= "\n";
$this->strSignedHeader = substr ( $signedHeaders, 0, - 1 );
$canonicalURL .= $this->strSignedHeader . "\n";
$canonicalURL .= $this->generateHex ( $this->payload );
return $canonicalURL;
}
private function prepareStringToSign($canonicalURL) {
$stringToSign = '';
$stringToSign .= $this->HMACAlgorithm . "\n";
$stringToSign .= $this->xAmzDate . "\n";
$stringToSign .= $this->currentDate . "/" . $this->regionName . "/" . $this->serviceName . "/" . $this->aws4Request . "\n";
$stringToSign .= $this->generateHex ( $canonicalURL );
return $stringToSign;
}
private function calculateSignature($stringToSign) {
$signatureKey = $this->getSignatureKey ( $this->secretAccessKey, $this->currentDate, $this->regionName, $this->serviceName );
$signature = hash_hmac ( "sha256", $stringToSign, $signatureKey, true );
$strHexSignature = strtolower ( bin2hex ( $signature ) );
return $strHexSignature;
}
public function getHeaders() {
$this->awsHeaders ['x-amz-date'] = $this->xAmzDate;
ksort ( $this->awsHeaders );
$canonicalURL = $this->prepareCanonicalRequest ();
$stringToSign = $this->prepareStringToSign ( $canonicalURL );
$signature = $this->calculateSignature ( $stringToSign );
if ($signature) {
$this->awsHeaders ['Authorization'] = $this->buildAuthorizationString ( $signature );
return $this->awsHeaders;
}
}
private function buildAuthorizationString($strSignature) {
return $this->HMACAlgorithm . " " . "Credential=" . $this->accessKeyID . "/" . $this->getDate () . "/" . $this->regionName . "/" . $this->serviceName . "/" . $this->aws4Request . "," . "SignedHeaders=" . $this->strSignedHeader . "," . "Signature=" . $strSignature;
}
private function generateHex($data) {
return strtolower ( bin2hex ( hash ( "sha256", $data, true ) ) );
}
private function getSignatureKey($key, $date, $regionName, $serviceName) {
$kSecret = "AWS4" . $key;
$kDate = hash_hmac ( "sha256", $date, $kSecret, true );
$kRegion = hash_hmac ( "sha256", $regionName, $kDate, true );
$kService = hash_hmac ( "sha256", $serviceName, $kRegion, true );
$kSigning = hash_hmac ( "sha256", $this->aws4Request, $kService, true );
return $kSigning;
}
private function getTimeStamp() {
return gmdate ( "Ymd\THis\Z" );
}
private function getDate() {
return gmdate ( "Ymd" );
}
}
?>
7.[searchItem.php]の先頭部分を次の様に編集します。
<?php
require 'awsv4.php';
/**
* Copyright 2019 Amazon.com, Inc. or its affiliates. All Rights Reserved.
*
8.[searchItem.php]の中段部分を次の様に編集します。
$searchItemRequest = new SearchItemsRequest ();
$searchItemRequest->PartnerType = "Associates";
// Put your Partner tag (Store/Tracking id) in place of Partner tag
$searchItemRequest->PartnerTag = <PARTNER_TAG>; //[Amazonアソシエイトで利用しているID(assosicate-22など)]
$searchItemRequest->Keywords = "Harry";
$searchItemRequest->SearchIndex = "All";
$searchItemRequest->Resources = ["Images.Primary.Small","ItemInfo.Title","Offers.Listings.Price"];
$host = "webservices.amazon.com";
$path = "/paapi5/searchitems";
$payload = json_encode ($searchItemRequest);
//Put your Access Key in place of <ACCESS_KEY> and Secret Key in place of <SECRET_KEY> in double quotes
$awsv4 = new AwsV4 (<ACCESS_KEY>, <SECRET_KEY>); 先に取得した[アクセスキー]と[シークレットキー]
$awsv4->setRegionName("us-west-2"); //日本は us-west-2
9. PHPが動作する環境に、2つのファイルを保存してブラウザーで[searchItem.php]を表示します。
10. 画面に検索された結果が表示されます。
{"SearchResult":{"Items":[{"ASIN":"B06Y4XJCQ5","DetailPageURL":"https://www.amazon.co.jp/dp/B06Y4XJCQ5?tag=assosicate-22&linkCode=osi&th=1&psc=1","Images":{"Primary":{"Small":{"Height":75,"URL":"https://m.media-amazon.com/images/I/51DRXlDBvLL._SL75_.jpg","Width":75}}},"ItemInfo":{"Title":{"DisplayValue":"Harry's Men's Razor Blade Refills 8ct ハリー メンズカミソリブレード、替刃8個 [並行輸入品]","Label":"Title","Locale":"ja_JP"}},"Offers":{"Listings":[{"Id":"Fwhuv9jyqPsqaKvRbDxbviNZj%2Bxdcgkwva0o41BfX7Kfi7WIuhg47l83wDOCihoLwrdmwWXpeuj1tLYLRoWFNFHK9viGEnxSaL%2FcTh0W36F5W43Moi%2B%2BHopA7SEcWERSnCqQI1uwrT8Dvn%2FUUA%2FntGRfOc3XL96DO76ezRNaPaE0o1W1Kdb7yA%3D%3D","Price":{"Amount":4659.0,"Currency":"JPY","DisplayAmount":"¥4,659"},"ViolatesMAP":false}]}}, ...
とりあえず、公式ページのサンプルを少し編集することでAPIの利用ができました。
キーワード検索では、Amazonのアフィリエイトリンクはできないので次回はASIN番号を指定して商品情報を取得していきます。
まとめ
今回は、Amazon アソシエイトプログラムの[Amazon Product Advertising API]を利用するための基本的な手順について書きました。
Amazonアソシエイツのツールバーで画像付きの商品ページへのリンクが作成できなくなるので、継続的に利用するには外部ツールを利用するか、自前で用意するしかありません。
ツールバーでの生成が終了するまでに、少し猶予期間ができたのでAPIを使ってリンクを作成する方法を探していきます。
[Amazon Product Advertising API]を使いたい人の参考になれば幸いです。
スポンサーリンク
最後までご覧いただき、ありがとうございます。