Amazonアソシエイトのレポートページに出ていた↑この表示。僕はずっとそのままにしていました。

しかしこの表示通りであれば、本記事を更新している2020年3月8日の翌日あたりから、以前作成したカエレバ風リンク作成ポチポチが使えなくなってしまう。

これではあかんなと思ったので、急遽PA-API5.0に対応したバージョンを作成することにしました。

ポチポチファイブ

名付けて、ポチポチファイブです。響きがゴーゴーファイブに似ていて、少し好きです。

<?php
//pochipochi5(ポチポチファイブ)はカエレバと同じものを自前で用意したものである
//Ri○kerは100%GPLじゃないからちょっと、ショートコードを実装するためにfunction.phpをいじるのもちょっとなという方におすすめだ

// WordPress用の関数をここでも使いたいから読み込む
require_once( dirname( __FILE__ ) . '/wp-load.php' );
// 利用するSDKのクラスをインポート
use Amazon\ProductAdvertisingAPI\v1\com\amazon\paapi5\v1\api\DefaultApi;
use Amazon\ProductAdvertisingAPI\v1\ApiException;
use Amazon\ProductAdvertisingAPI\v1\Configuration;
use Amazon\ProductAdvertisingAPI\v1\com\amazon\paapi5\v1\GetItemsRequest;
use Amazon\ProductAdvertisingAPI\v1\com\amazon\paapi5\v1\GetItemsResource;
use Amazon\ProductAdvertisingAPI\v1\com\amazon\paapi5\v1\PartnerType;
use Amazon\ProductAdvertisingAPI\v1\com\amazon\paapi5\v1\ProductAdvertisingAPIClientException;

// ブックマークレットからGETするASINコードとキーワードを変数に格納する
$getasin = $_GET["asin"];
$getkw = $_GET["kw"];

//楽天アフィリエイトID
  $rakuten_affiliate_id = 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX';
  //Yahoo!バリューコマースSID
  $sid = 'XXXXXXX';
  //Yahoo!バリューコマースPID
  $pid = 'XXXXXXXXX';

//Amazonキーワード検索用にアソシエイトタグを入れておく
  $ptag = 'XXXXXXXXXX';

// 各種アフィリエイトのキーワード検索用URLをそれぞれの変数に入れる
$amazon_url = 'https://www.amazon.co.jp/gp/search?keywords='.$getkw.'&tag='.$params['AssociateTag'];
$rakuten_url = 'https://hb.afl.rakuten.co.jp/hgc/'.$rakuten_affiliate_id.'/?pc=https%3A%2F%2Fsearch.rakuten.co.jp%2Fsearch%2Fmall%2F'.$getkw.'%2F-%2Ff.1-p.1-s.1-sf.0-st.A-v.2%3Fx%3D0%26scid%3Daf_ich_link_urltxt%26m%3Dhttp%3A%2F%2Fm.rakuten.co.jp%2F';
$yahoo_url = 'https://ck.jp.ap.valuecommerce.com/servlet/referral?sid='.$sid.'&pid='.$pid.'&vc_url=http%3A%2F%2Fsearch.shopping.yahoo.co.jp%2Fsearch%3Fp%3D'.$getkw;

// SDKを利用するためautoload.phpを読み込み
require_once(dirname( __FILE__ ) . 'autoload.php'); 

// 基本のリクエストパラメータを設定するConfigurationのインスタンスを作成
$config = new Configuration();
$config->setAccessKey('XXXXXXXXXX'); // アクセスキーIDを指定
$config->setSecretKey('XXXXXXXXXXXXXXXXXXX'); // シークレットキーを指定
$config->setHost('webservices.amazon.co.jp');  // Hostを指定
$config->setRegion('us-west-2'); // Regionを指定

// PA-APIのリクエストを行うDefaultApiのインスタンスを作成
$apiInstance = new DefaultApi(
	new \GuzzleHttp\Client(), 
	$config
);

// GetItemsオペレーションを利用するため、GetItemsRequestのインスタンスを作成
$getItemsRequest = new GetItemsRequest();
$getItemsRequest->setPartnerTag($ptag); // アソシエイトタグを指定
$getItemsRequest->setPartnerType(PartnerType::ASSOCIATES); // PartnerTypeを指定
$itemIds = array(
	$getasin
);
$getItemsRequest->setItemIds($itemIds); // 取得する商品のASIN番号を指定
$resources = array(
	GetItemsResource::ITEM_INFOTITLE,
	GetItemsResource::OFFERSLISTINGSPRICE,
	GetItemsResource::IMAGESPRIMARYMEDIUM
);
$getItemsRequest->setResources($resources); // 取得したいレスポンスデータによってリソースを指定

// GetItemsRequestのインスタンスに指定したリクエストパラメータが無効の場合にエラーを出力
$invalidPropertyList = $getItemsRequest->listInvalidProperties();
$length = count($invalidPropertyList);
if ($length > 0) {
	echo "Error forming the request", PHP_EOL;
	foreach ($invalidPropertyList as $invalidProperty) {
		echo $invalidProperty, PHP_EOL;
	}
	return;
}

// ASIN番号をもとに、取得したレスポンスデータをマッピングする関数
function parseResponse($items){
    $mappedResponse = array();
    foreach ($items as $item) {
        $mappedResponse[$item->getASIN()] = $item;
	}
    return $mappedResponse;
}

try {
	// GetItemsオペレーションのPA-APIのリクエストを送信してレスポンスデータを取得
	$getItemsResponse = $apiInstance->getItems($getItemsRequest);

	if ($getItemsResponse->getItemsResult()->getItems() != null) {
		// ASIN番号をもとに、取得したレスポンスデータをマッピング
		$responseList = parseResponse($getItemsResponse->getItemsResult()->getItems());

		// 商品ごとにデータを出力
		foreach ($itemIds as $itemId) {
			$item = $responseList[$itemId];
			if ($item != null) {
				// 商品データを取得
				$title = $item->getItemInfo()->getTitle()->getDisplayValue();
				$page_url = $item->getDetailPageURL();
				$image_url = $item->getImages()->getPrimary()->getMedium()->getURL();
				$price = $item->getOffers()->getListings()[0]->getPrice()->getDisplayAmount();
			} else {
				echo "<p>商品が見つかりません</p>";
			}
		}
	}

	if ($getItemsResponse->getErrors() != null) {
		// 取得したレスポンスデータが無効の場合、エラーを出力
		echo PHP_EOL, 'Printing Errors:', PHP_EOL, 'Printing first error object from list of errors', PHP_EOL;
		echo 'Error code: ', $getItemsResponse->getErrors()[0]->getCode(), PHP_EOL;
		echo 'Error message: ', $getItemsResponse->getErrors()[0]->getMessage(), PHP_EOL;
	}
} catch (ApiException $exception) {
	// PA-APIのリクエストがエラーの場合、エラーを出力
	echo "Error calling PA-API 5.0!", PHP_EOL;
	echo "HTTP Status Code: ", $exception->getCode(), PHP_EOL;
	echo "Error Message: ", $exception->getMessage(), PHP_EOL;
	if ($exception->getResponseObject() instanceof ProductAdvertisingAPIClientException) {
		$errors = $exception->getResponseObject()->getErrors();
		foreach ($errors as $error) {
			echo "Error Type: ", $error->getCode(), PHP_EOL;
			echo "Error Message: ", $error->getMessage(), PHP_EOL;
		}
	} else {
		echo "Error response body: ", $exception->getResponseBody(), PHP_EOL;
	}
} catch (Exception $exception) {
	// その他のエラーを出力
	echo "Error Message: ", $exception->getMessage(), PHP_EOL;
}

// 各種アフィリエイトのキーワード検索用URLをそれぞれの変数に入れる
$amazon_url = 'https://www.amazon.co.jp/gp/search?keywords='.$getkw.'&tag='.$ptag;
$rakuten_url = 'https://hb.afl.rakuten.co.jp/hgc/'.$rakuten_affiliate_id.'/?pc=https%3A%2F%2Fsearch.rakuten.co.jp%2Fsearch%2Fmall%2F'.$getkw.'%2F-%2Ff.1-p.1-s.1-sf.0-st.A-v.2%3Fx%3D0%26scid%3Daf_ich_link_urltxt%26m%3Dhttp%3A%2F%2Fm.rakuten.co.jp%2F';
$yahoo_url = 'https://ck.jp.ap.valuecommerce.com/servlet/referral?sid='.$sid.'&pid='.$pid.'&vc_url=http%3A%2F%2Fsearch.shopping.yahoo.co.jp%2Fsearch%3Fp%3D'.$getkw;

?>
<html>
<head>
    <title>ポチポチファイブ</title>
</head>
<body>
<h1>ポチポチファイブ</h1>
じゅん.さおとめらいふがカエレバと同じようにリンクを作るためだけに作ったページをPA-PAI5.0に対応させたもの
<h2>使い方</h2>
まずは、このブックマークレットをブラウザに保存する。<br>
<a href="javascript:(function(){var nakami;$nakami=location.pathname.replace(/.*\/(ASIN|dp|product|aw\/d)\/([0-9A-Z]+)\/.*/,'$2');window.open('http://jun3010.me/pochipochi5.php?asin='+$nakami+'&kw='+window.getSelection().toString())})();">ポチポチ5ブックマークレット</a><br>
あとは、Amazonの商品ページで、楽天とYahoo!のキーワードにするキーワードを選択した状態でブックマークレットを実行するだけ。<br>

<div class="cstmreba">
<div class="kaerebalink-box">
<div class="kaerebalink-image"><a href="<?php echo esc_url($page_url); ?>" target="_blank" ><img src="<?php echo esc_url($image_url); ?>" style="border: none;" /></a></div>
<div class="kaerebalink-info">
<div class="kaerebalink-name"><a href="<?php echo esc_url($page_url); ?>" target="_blank" ><?php echo esc_html($title); ?></a></p>
<div class="kaerebalink-powered-date">posted with <a href="http://jun3010.me/pochipochi5.php" rel="nofollow" target="_blank">ポチポチファイブ</a></div>
</div>
<div class="kaerebalink-link1">
<div class="shoplinkamazon"><a href="<?php echo esc_html($amazon_url); ?>" target="_blank" >Amazon</a></div>
<div class="shoplinkrakuten"><a href="<?php echo esc_html($rakuten_url); ?>" target="_blank" >楽天市場</a></div>
<div class="shoplinkyahoo"><a href="<?php echo esc_html($yahoo_url); ?>" target="_blank" >Yahooショッピング<img src="//ad.jp.ap.valuecommerce.com/servlet/gifbanner?sid=XXXXXXXX&pid=XXXXXXXX" height="1" width="1" border="0"></a></div>
</div>
</div>
<div class="booklink-footer"></div>
</div>
</div>
<textarea onclick="this.select()">
<div class="cstmreba">
<div class="kaerebalink-box">
<div class="kaerebalink-image"><a href="<?php echo esc_url($page_url); ?>" target="_blank" ><img src="<?php echo esc_url($image_url); ?>" style="border: none;" /></a></div>
<div class="kaerebalink-info">
<div class="kaerebalink-name"><a href="<?php echo esc_url($page_url); ?>" target="_blank" ><?php echo esc_html($title); ?></a></p>
<div class="kaerebalink-powered-date">posted with <a href="http://jun3010.me/" rel="nofollow" target="_blank">ポチポチファイブ</a></div>
</div>
<div class="kaerebalink-link1">
<div class="shoplinkamazon"><a href="<?php echo esc_html($amazon_url); ?>" target="_blank" >Amazon</a></div>
<div class="shoplinkrakuten"><a href="<?php echo esc_html($rakuten_url); ?>" target="_blank" >楽天市場</a></div>
<div class="shoplinkyahoo"><a href="<?php echo esc_html($yahoo_url); ?>;vcptn=kaereba" target="_blank" >Yahooショッピング<img src="//ad.jp.ap.valuecommerce.com/servlet/gifbanner?sid=XXXXXXXX&pid=XXXXXXXX" height="1" width="1" border="0"></a></div>
</div>
</div>
<div class="booklink-footer"></div>
</div>
</div></textarea>
</body>
</html>

このphpファイルをWordPressのドキュメントルートに保存して、実行するようにしました。

ちなみにこのphpを実行する為には、PA-API5.0のSDKが必要です。こちらのリンクより「paapi5-php-sdk-and-samples」をダウンロードして、WordPress内のどこかで圧縮ファイルを展開しておいてください。

https://webservices.amazon.com/paapi5/documentation/quick-start/using-sdk.html

初期設定

15行目あたり

まず始めに、15行目あたりで楽天アフィリエイトIDやYahoo!ショッピング用のバリューコマースSIDとPIDを入れます。その下の部分にAmazonアソシエイトタグ(○○○-22みたいなやつ)を入れます。

35行目あたり

その後の36行目で、ダウンロードして展開しておいたSDK内にあるautoload.phpへのパスを記述します。

SDKまるごとWordPress内に置こう

venderディレクトリだけをドキュメントルート内に配置してもcomposer.jsonが足りなくて動作しませんでした。paapi5-php-sdkディレクトリごとWordPress内のどこかに展開してください。

157行目付近

ソースコードの一番下の方に、実際に書き出されるHTMLタグが用意してあります。ここにもYahoo!ショッピングのPIDとSIDを入れて下さい。(あれ、これ本当は変数名でもいけるんかな。まぁいいや。)

使い方

基本は以前作成したポチポチと同じです。

上記phpファイルにブラウザからアクセスするとページが表示されるので、そのページ内のブックマークレットを保存しておきます。このブックマークレットの内容もソースコード内にあるので、必要に応じて書き換えてください。

ブックマークレットを保存したら、Amazonの商品ページにアクセスして、商品名や型番などの文字列を範囲選択して、ブックマークレットを実行します。

使い回しの画像ですみません

すると、その商品名とURL内のASINコードを元にリンクが作成されます。楽天市場とYahoo!ショッピングへのリンクは、範囲選択した文字列で商品を検索するためのものです。画像や商品へのリンクが正しく表示できているかをまずはここで確認します。

もしこのphpを実行しも400などのエラーを吐いて画像等が表示されない場合は、URLからASINコードが拾えてない状態です。そういう場合は、一度Amazonアソシエイトツールバー等でテキストリンクを作成し、そこにアクセスした後にブックマークレットを実行してみてください。大抵それで上手くいくはずです。

正しく出力された時の、この部分にある小さいテキストボックスが実際に吐き出したHTMLタグです。このボックス内をクリックすると、中身が全て範囲選択されるようにしたので、そのままコピーしちゃってください。あとは、コピーしたタグをこれまで通り記事内に貼り付けるだけです。

感想

毎回同じ事を言ってるかもしれませんが、自分が書いたりカスタマイズしたコードが動くと本当に達成感がありますね。作っていて楽しかったです。

そして今回も、このphpを作成するにあたって、というか殆ど全てをこちらのページのものを使わせていただきました。毎回勉強になります。ありがとうございました。

こちらのページで紹介されていたコードに、前回作成したポチポチに使った内容を足していった感じです。まだPA-API5.0への移行がお済みでない方は、当記事や参考リンクを見て作業してみてください。

動作テストがてら、作成したリンクを貼っておきます。今回のコーディングは全てHHKBで行いました。まじで最高。