サイドバーに最近読んだ本(ブクログに追加した本)のアソシエイトリンクを追加

昨年の11月より、ブクログの無料ユーザーは、アマゾンのアソシエイトIDを設定できなくなりました(参考:ブクログ、無料ユーザーは「AmazonアソシエイトID設定」が利用不能に(2013年11月6日15:00より) | Synthetic LOG)。
とはいっても、自分にはほとんど関係ない話で、アマゾンの紹介料レポートをみても、ブクログ経由でクリックされたものはなさそうです。

ところで、今までサイドバーにて使っていたブクログのブログパーツ(ミニ本棚)。最近読んだ本(というより、最近登録した本)を一覧で表示してくれるのはいいのだけれども、リンク先がブクログのURL。当たり前だろと言われそうですが、個人的にはアマゾンに直接とんでくれるほうがうれしい。
というわけで、自分でやってみることにしました。

利用したデータはブクログで配信されているRSS(http://booklog.jp/users/amano225/feed)。ブクログでは非公式APIとしてjsonも配信しているようですし(参考:ブクログのAPI(非公式)を使って本の情報をjQueryで取得してみた :: backyard.weblog)、そちらのほうが多分簡単に実装できるとは思うのですが、今回はRSSのほうを利用することに。
また、今回のやり方では『PHP Code Widget』というプラグインを使っています。PHP Codeのウィジェットをサイドバーにいれて、下記のように入力。

<?php
function booklogFunc(){
	$RSSpath = "http://booklog.jp/users/amano225/feed/";
	$associateID = "am-yu-22"; // アマゾンのアソシエイトID
	$booklogID = "amano225"; // ブクログID

	$opts = array(
		'http'=>array(
			'method'=>'GET',
			'header'=>"User-Agent:am-yu.net"
		)
	);
	$context = stream_context_create( $opts ); // HTTPリクエスト作成
	$http = file_get_contents($RSSpath, FALSE, $context); // RSSデータ取得
	$XML = new SimpleXMLElement ( $http );
	$pattern = '/http:\/\/[\w\/:%#\$&\?\(\)~\.=\+\-]+/';
	
	echo "<div>";
	
	$i = 0;
	foreach ( $XML->item as $item ) {
		$link = $item->link; // ブクログのURL
		$isAmazon = preg_match('/booklog.jp\/users\/'.$booklogID.'\/archives\/1\//', $link);
		$description = $item->description;
		$isReview = preg_match('/<p>/', $description);
		if( $isAmazon && $isReview ){
			++$i;

			preg_match($pattern, $description, $matches, PREG_OFFSET_CAPTURE);
			
			$src = $matches[0][0];
			$title = $item->title;
			$amazonURL = str_replace("booklog.jp/users/$booklogID/archives/1/", "www.amazon.co.jp/o/ASIN/", $link) . "/$associateID/";
			echo "<p style=\"font-size:13px;\"><a href=\"$amazonURL\" target=\"_blank\"><img src=\"$src\" style=\"border:1px solid #888;\"><br>$title</a>(<a href=\"$link\" target=\"_blank\">ブクログレビュー</a>)</p>";
			
			if($i >= 5){
				break;
			}
		}
	}
	echo "</div>";
};
booklogFunc();
?>

今回困ったことに、simplexml_load_fileを使って直接RSSのXMLをパースできなませんでした。ブクログのRSSでの表示は、HTTPリクエストヘッダにユーザーエージェントが必要なようです(7~12行目で設定)。ユーザーエージェントは空文字でもいいようなのですが、とりあえず”am-yu.net”と設定しておきました。HTTPリクエストヘッダをつけてsimplexml_load_fileで取得する方法はあるのだろうか。調べてみても分かりませんでした。

23行目ではアマゾンへリンクできる本かどうか、25行目ではレビューがあるかどうかを見て、26行目で両方そうであればリンクを作成するようにしています。これは、自分がhontoの電子書籍を購入してブクログに登録することがあるため。やろうと思えばhontoのアフィリエイトリンクも作れるとは思うのですが、hontoのアフィリエイトIDを持ってないのでやってません。レビューがあるかないかは別に見る必要はないかもしれませんが、あまり触れてほしくない本はレビューをしてないのでレビューしてるかどうかで表示するか判断することに。
また、掲載する本は最大5冊にしています。

amazonへのURLについては下記のページを参考にしました。
AmazonのURL短縮|最新版
“ref=nosim/”はつけたほうがいいのかな? とずっと思ってたけど、今は別に関係ないようです。

関数にしてるのは、PHP Codeの動きがよく分かっていないため、変数名の衝突する可能性もあるのではないかと思ってそうしました。PHPはあまり詳しくないのでこうしましたが、もっと良い方法があるかもしれません。

ところで、最後に一つだけ言っておくと、自分のブクログのレビューは、たまに日記や雑記みたいなことを書いてしまっています。

コメント

タイトルとURLをコピーしました