single.php

Amazon API で画像とテキストのアフィリエイトリンクを自作

アソシエイトツールが更新されて画像付きのウィジェットが動作しなくなってしまったので、Amazon Product Advartising APIを使って画像とテキストでアフィリエイトするリンクを自作してみた際の備忘録的な投稿です。

画像とテキストのウィジェット廃止

2023年の年末に、アソシエイトツールの[画像]と[画像とテキスト]を使った商品リンクの作成が廃止された際に、過去のリンクもアクセスできなくなったようです。

過去のリンクは使えると勝手に考えていましたが、甘かったです。

Amazonリンクを生成してくれるサービスもありますが、他力本願だと結局終了になるリスクを負うことになるので、APIを利用して画像とテキストのウィジェットを自作してみます。

Amazon Product Advartising APIの使い方に関する詳細は別記事をご覧ください。

必要最低限の情報を収集

今回は商品のASINコードから、アフィリエイトリンクを作成するための以下の情報をAPIから収集してリンクを作成することにします。

・タイトル(Amazonの商品紹介ページのタイトル)
・商品の最小サイズの画像
・アフィリエイト用リンク

この3点があれば、必要最低限のリンクができます。

APIには1日で利用できる回数などの制限があるので、動的ではなくアソシエイトツールのように、HTMLコードを出力するページのような形で作成します。

動作環境の作成

開発者ガイドで公開されているサンプルを修正してASINコードからAmazonの商品情報を取得するPHPの環境を作っていきます。

1. 公開されている表示された2つのサンプルコードを、[getItem.php]と[awsv4.php]として保存します。

2. 保存した[getItem.php]の先頭部分を次の様に編集します。

<?php
  require 'awsv4.php';
/**
 * Copyright 2019 Amazon.com, Inc. or its affiliates. All Rights Reserved.
 *

3. 続けて中段部分を次の様に編集します。

 * 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.
 */

$getItemRequest = new GetItemsRequest ();
$getItemRequest->PartnerType = "Associates";
// Put your Partner tag (Store/Tracking id) in place of Partner tag
$getItemRequest->PartnerTag = <PARTNER_TAG>;[Amazonアソシエイトで利用しているID(assosicate-22など)]
$getItemRequest->ItemIds = ["商品のASINコード(B09KMGQG5Yなど)]"];
$getItemRequest->ItemIdType = "ASIN";
$getItemRequest->Resources = ["Images.Primary.Small","ItemInfo.Title","ItemInfo.Features","Offers.Summaries.HighestPrice","ParentASIN"];
$host = "webservices.amazon.com";
$path = "/paapi5/getitems";
$payload = json_encode ($getItemRequest);
//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");
$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.GetItems');
$headers = $awsv4->getHeaders ();

4. アイテム検索するためのクラスをファイルの末尾に追加します。

class GetItemsRequest {
    public $PartnerType;
    public $PartnerTag;
    public $ItemIds;
    public $ItemIdType;
    public $Resources;
}

5. PHPが動作する環境(WordPressサイトなど)、2つのファイルを保存してブラウザーで[getItem.php]を表示します。

6. 正常に終了すれば、画面に検索された結果が表示されます。

{"ItemsResult":{"Items":[{"ASIN":"B09KMGQG5Y","DetailPageURL":"https://www.amazon.co.jp/dp/B09KMGQG5Y?tag=maggothand-22&linkCode=ogi&th=1&psc=1","Images":{"Primary":{"Small":{"Height":75,"URL":"https://m.media-amazon.com/images/I/41mvqe1FS3L._SL75_.jpg","Width":62}}},"ItemInfo":{"Features":{"DisplayValues":["B09KMGQG5Y"],"Label":"Features","Locale":"ja_JP"},"Title":{"DisplayValue":"Western Digital 8TB WD ブルー PC ハードドライブ HDD - 5640 RPM SATA 6 Gb/s 128 MB キャッシュ 3.5インチ - WD80EAZZ","Label":"Title","Locale":"ja_JP"}},"Offers":{"Summaries":[{"Condition":{"Value":"New"},"HighestPrice":{"Amount":36629.0,"Currency":"JPY","DisplayAmount":"¥36,629"}}]}}]}}

HTML出力用ページの作成

動作した[getItem.php]をベースにアフィリエイト用のHTMLを出力するように修正します。

<html>
  <head>
    <title></title>
    <meta http-equiv="content-type" charset="UTF-8">
    <link rel="stylesheet" href="__amazon-affi-style.css" type="text/css">
  </head>
<body>
  <form action="" method="post">
    <input type="text" name="_url" value="B0B5N1C8FB"/>
    <input type="submit" value="GetItems" />
  </form>
<?php

$asin = $_POST["_url"];

if($asin != "")
{
  //Amazon API キー読み込み
  define('ACCESS_KEY', '[APIのアクセスキー]');
  define('SECRET_KEY', '[APIのシークレットキー]');
  define('ASSOCIATE_TAG', '[Amazonアソシエイトで利用しているID]');

  require 'awsv4.php';

  $getItemRequest = new GetItemsRequest ();

  $getItemRequest->PartnerType = "Associates";
  $getItemRequest->PartnerTag = ASSOCIATE_TAG;
  $getItemRequest->ItemIds = array($asin);
  $getItemRequest->ItemIdType = "ASIN";
  $getItemRequest->Resources = ["Images.Primary.Small","ItemInfo.Title","ItemInfo.Features","Offers.Summaries.HighestPrice","ParentASIN"];
  $host = "webservices.amazon.co.jp";
  $path = "/paapi5/getitems";
  $payload = json_encode ($getItemRequest);
  $awsv4 = new AwsV4 (ACCESS_KEY, SECRET_KEY);
  $awsv4->setRegionName("us-west-2");
  $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.GetItems');
  $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" );
  }

  $arr = json_decode($response, TRUE);

  $output = "";

  if ($arr === NULL) {
    echo "Error";
  }else{

    $PageUrl = $arr['ItemsResult']["Items"][0]["DetailPageURL"];
    $ImageUrl = $arr['ItemsResult']["Items"][0]["Images"]["Primary"]["Small"]["URL"];
    $Title = $arr['ItemsResult']["Items"][0]["ItemInfo"]["Title"]["DisplayValue"];
    
    $output = '<div class="ama-affi">';
    $output .= '<div class="ama-affi-image"><a href="' . $PageUrl . '" target="_blank"><img src="' . $ImageUrl . '"></a></div>';
    $output .= '<div class="ama-affi-text"><a href="' . $PageUrl . '" target="_blank">' . $Title . '</a></div>';
    $output .= '<a href="' . $PageUrl . '" target="_blank"><div class="ama-affi-button">Amazonで購入</div></a>';
    $output .= '</div>';
  }

  echo $output;

  echo '<p>';
  echo '<textarea style="width:100%;" rows="10">';
  echo $output;
  echo '</textarea>';
  echo '</p';

}

class GetItemsRequest {
  public $PartnerType;
  public $PartnerTag;
  public $ItemIds;
  public $ItemIdType;
  public $Resources;
}

?>

</body>
</html>

ページを表示すると、こんな感じでテキストボックスとボタンが表示されます。

ASINコードを変更して[GetItems]ボタンをクリックするとアフィリエイト用のリンクとHTMLが出力されます。

最後に、スタイルシートで出力されるタグの装飾をすれば完成です。

実際にブログで動作しなくなったウィジェットをHTMLで更新すると、こんな感じで仕上げることができました。

今回は必要最低限の情報をAPIから取得しましたが、他の情報も取得したい場合にはGetItemsのパラメータを変更します。

詳しい内容については別記事をご覧ください。

まとめ

今回は、Amazon アソシエイトプログラムの[Amazon Product Advertising API]を利用して、ASINコードからアフィリエイト用のリンクを作成する方法について書きました。

Amazonアソシエイツのツールバーで画像付きの商品ページへのリンクが作成できなくなった際に、過去のウィジェットも動作しなくなってしまったのでアフィリエイトを行う場合にはテキストにするか、他のリンク作成サービスなどを利用する必要があります。

他サービスは、終了のリスクを考える必要いがあるので、今回はAmazon APIで自作することにしました。

[Amazon Product Advertising API]でアフィリエイト用のリンクを作成したい人の参考になれば幸いです。

スポンサーリンク

最後までご覧いただき、ありがとうございます。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です