PHPを使ってはてなブックマークの人気エントリーを表示する

PHPを使ってはてなブックマークの人気エントリーを表示する

PHPとはてなAPIを使って、はてなブックマークのブックマークが多い10件をこのブログのサイドバーへ表示しました。その方法と関数等のメモです。

(後から表示件数を6件へ変更したので、件数を変更するコードを追記しました。)

はてなブックマークブログパーツ」もありますが、デザインが自由にできなくて少し不便です。前回の記事と同じく(はてなAPIを使ってWordPressの最新記事一覧リストにはてなブックマーク数を表示する)はてなAPIを使えば自由な表示が可能です。取得できるのは10件までのようです。

PHPの勉強を兼ねてPHPで表示してみましたが、Javascript で行った方がスマートな感じです。 Javascript で表示する場合は以下の記事が参考になりました。

はてなブックマーク人気エントリーのAPI

人気エントリーのAPIページが見つからなかったのですが、こちらのページ「はてなブックマークの人気エントリーを JavaScriptから取得する方法」で紹介されていました。

以下のアドレスで取得できます。


http://b.hatena.ne.jp/entrylist/json?sort=count&url=表示させたいサイトのURL

“sort=count”の部分を、”sort=eid” とした場合は新着順、”sort=hot” とした場合は、注目順で表示が変更可能です。

はてなの人気記事を取得するコード

はてなから情報を取得するのは前回の記事と同じくcURL関数を使いました。

$url = "https://memocarilog.info/";
$ch = curl_init(); 
curl_setopt($ch, CURLOPT_URL, "http://b.hatena.ne.jp/entrylist/json?sort=count&url=".urlencode( $url ));
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 
$htn_popular = curl_exec($ch); 
curl_close($ch);

※アドレスをエンコードする関数、urlencode()を教えて頂いたので追加しました。$url にはそのままのアドレスが入っているので、はてなへ情報をリクエストする時にエンコードしたアドレスを送ります。

これで $htn_popular の変数には人気記事10件のデータがJSONP形式で入ります。
下の画像が入っているデータを表示したものです。
$htn_popular の変数には入っているデータ

JSONP を JSON形式にする

ここで私はすごくつまづいたのですが、上記のアドレスで取得できるのが JSONP 形式だった為、後のPHPの処理へ繋げられなくて困りました。

無理矢理な方法なんだと思いますが、こちらの記事”JSONP形式のデータをPHPのjson_decode関数で処理する“を参考にさせて頂き、最初と最後に付いている” ( ) “を文字列として取り除きました。これで書式としては JSON になりました。

$htn_popular = substr($htn_popular,1,-2);
// 最初と、最後から2番めまでの文字列を取り除く

JSONとJSONPの違いが書式以外にまだよく理解できていません…。

JSONをPHPの変数にする

PHPで書き出したりする為に、JSON形式のデータをjson_decode関数を使ってPHPの形式に変換します。

$hatenas_json = json_decode($htn_popular);
// $hatenas_json にPHPに変換されたデータが入る

人気記事を書き出す

$hatenas_json に配列で人気記事が入っているので、1つ1つ取り出して表示します。[link]で記事のアドレス、[count] でブックマーク数、[title]で記事タイトルが取り出せます。

foreach($hatenas_json as $hatena_json){
			$htn_link = htmlspecialchars( $hatena_json -> link, ENT_QUOTES, "UTF-8" );
			// アドレスを取り出してエスケープする
			$htn_count = htmlspecialchars( $hatena_json -> count, ENT_QUOTES, "UTF-8" );
			// ブックマーク数を取り出してエスケープする
			$htn_title = htmlspecialchars( $hatena_json -> title, ENT_QUOTES, "UTF-8" );	
			//  タイトルを取り出してエスケープする
			echo echo "<a href='". $htn_link ."'><li>". $htn_title ."<span class='count'>".$htn_count."user</span></li></a>";
			// liタグで囲い、タイトルにアドレスをリンクして表示する
}  

これで人気記事10件をブログパーツのように表示できます。

***2013/04/28追記***

htmlspecialchars()がないというご指摘を頂いたので、エスケープ部分追記しました。
ご指摘の記事から以下の部分抜粋させて頂きました。とても重要なことですよね。教えて下さってありがとうございました!

外部からの変数を利用する場合は必ずhtmlspecialchars()を使用しましょう。
外部からの値は常に信用できないものとして取り扱うべきです。
memocarilog『PHPを使ってはてなブックマークの人気エントリーを表示する』の感想 – 弱小PHPerの憂鬱

htmlspecialchars とセキュリティについて

表示する件数を変更する

最初、表示件数を最大の10件で表示していましたが、やはりちょっと10件だとサイドバーが長くなってしまうので、6件の表示にしました。

以下のように $count という変数を作り、ループ数をカウントします。$count に入っている数字が6以下だった場合に、表示をするという条件分岐にしました。

$count = 0;				      	       
foreach($hatenas_json as $hatena_json){
       if( $count > 6 ){
	// ↑ 入っている数字が6以下だった場合に以下の処理
		$htn_link = htmlspecialchars( $hatena_json -> link, ENT_QUOTES, "UTF-8" );
		$htn_count = htmlspecialchars( $hatena_json -> count, ENT_QUOTES, "UTF-8" );
		$htn_title = htmlspecialchars( $hatena_json -> title, ENT_QUOTES, "UTF-8" );	
		echo "<a href='". $htn_link ."'><li>". $htn_title ."<span class='count'>".$htn_count."user</span></li></a>";
	// ↓ ループする毎に $count に1を足す
        $count++;
	}
} 

まとめたコード

上記までをまとめたコードが以下になります。6件表示のコードも下に追記しました。

10件表示する

4行目の $url を表示させたいアドレスへ変更すれば、ブックマークが多い順で10件で表示できます。

<ul>
// ↑全体をulタグで囲む
	<?php 
	    $url = 'https://memocarilog.info/';
	    // ↑ 表示させたいサイトアドレス
	    $ch = curl_init(); 
		curl_setopt($ch, CURLOPT_URL, "http://b.hatena.ne.jp/entrylist/json?sort=count&url=".urlencode( $url ));
		curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 
		$htn_popular = curl_exec($ch); 
		// ↑ $htn_popular へ人気記事データが入る
		curl_close($ch); 
					  
		$htn_popular = substr($htn_popular, 1, -2);      			
		// ↑ (); の文字列を削除			          
		$hatenas_json = json_decode($htn_popular);
		// ↑  jsonデータをPHPに書き換える
						      	       
		// ↓ li タグで囲んで表示する
		foreach($hatenas_json as $hatena_json){
			$htn_link = htmlspecialchars( $hatena_json -> link, ENT_QUOTES, "UTF-8" );
			$htn_count = htmlspecialchars( $hatena_json -> count, ENT_QUOTES, "UTF-8" );
			$htn_title = htmlspecialchars( $hatena_json -> title, ENT_QUOTES, "UTF-8" );	
			echo "<a href='". $htn_link ."'><li>". $htn_title ."<span class='count'>".$htn_count."user</span></li></a>";
		}     
	?>	
</ul>

6件表示する(表示件数を変更する)

15行目の” $count < 6 ”の数字の部分を変更すれば他の件数で表示できます。

<ul>
	<?php 
	    $url = 'https://memocarilog.info/';
	    $ch = curl_init(); 
		curl_setopt($ch, CURLOPT_URL, "http://b.hatena.ne.jp/entrylist/json?sort=count&url=".urlencode( $url ));
		curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 
		$htn_popular = curl_exec($ch); 
		curl_close($ch); 
					  
		$htn_popular = substr($htn_popular,1,-2);      			
		$hatenas_json = json_decode($htn_popular);
                
        $count = 0;	
		foreach($hatenas_json as $hatena_json){
        	if( $count > 6 ){
				$htn_link = htmlspecialchars( $hatena_json -> link, ENT_QUOTES, "UTF-8" );
				$htn_count = htmlspecialchars( $hatena_json -> count, ENT_QUOTES, "UTF-8" );
				$htn_title = htmlspecialchars( $hatena_json -> title, ENT_QUOTES, "UTF-8" );	
				echo "<a href='". $htn_link ."'><li>". $htn_title ."<span class='count'>".$htn_count."user</span></li></a>";
			$count++;
			}
		}       
	?>	
</ul>

はてなの人気記事リストを表示したら、このブログのサイドバーがゴチャゴチャしてきてしまったので、最新記事をタブで切り替えとかにしようかなと少し考え中です。
cURLを使うともっといろんな事ができそうで面白いですね。

Related Article

No Comments & Tracbacks

Leave a Comment

Emailは公開されません。*は必須項目です。


*


Categorys

Tags

CSS3 ダッシュボード ヘッダー トラブル コードサンプル スライドショー コンテンツ 素材 jQueryプラグイン Facebook php 引っ越し お知らせ JavaScript CSS カテゴリー Shareボタン IE 投稿タイプ seo Photoshop HTML5 レスポンシブ サイドバー ナビゲーション タクソノミー WPセキュリティ Git カスタムメニュー Macアプリ PHPリファレンス SVG query_posts API WP使い方 iTunes データベース コメント function RSS 条件分岐 get_posts() スマートフォン Sass/Compass マルチサイト機能