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形式で入ります。
下の画像が入っているデータを表示したものです。
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 とセキュリティについて
5分でできるPHPセキュリティ対策 – ぼくはまちちゃん!(Hatena)
PHPのhtmlspecialcharsにはENT_QUOTESを付ける:phpspot開発日誌
表示する件数を変更する
最初、表示件数を最大の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を使うともっといろんな事ができそうで面白いですね。
No Comments & Tracbacks