hatena-module 「人気エントリー」 HTML生成アプリ
自分のブログの「人気エントリー」(はてブが多い順のエントリーリスト)を生成するWebアプリツールを作ってみました.本当は,hatena-moduleにあればいいんだけどないみたいだし,PHPのお勉強も兼ねて.
このブログのメニューに表示している,右のような自分のブログ内のはてなブックマークリストを簡単に作りたいなというのが動機です.
アプリは下の画像のようなイメージです.
自分のブログのURLを入力してgenerateボタンを押すと,hatena-moduleのHTMLソースを生成します.このHTMLを,はてなダイアリーの管理画面 - デザイン - ページのフッタなどにコピペすれば,リストを追加できます(はてなユーザーならばですけど).hatena-moduleタイトルの指定,ブログタイトルの削除,件数指定などの機能も作ってみました.
完全自動ではないので,う〜んって感じではありますが...
PHPのコードはこんな感じ.例によっていい加減なコードです.文字コードやらエラー処理やら.XMLパーサーはたぶんもっと楽なのはあると思います.
<html> <head> <title>はてぶ hatena-module コード生成</title> </head> <body> <?php $RSSURL = "http://b.hatena.ne.jp/entrylist?mode=rss&url=http://d.hatena.ne.jp/ooolong/&sort=count&threshold=3"; $RSSURL_F = "http://b.hatena.ne.jp/entrylist?mode=rss&url="; $RSSURL_B = "&sort=count&threshold=3"; $BM_ENTRY = "http://b.hatena.ne.jp/entry/"; $BM_IMG = "http://b.hatena.ne.jp/entry/image/"; $input_url = $_POST["url"]; $input_cut = $_POST["R1"]; $input_num = $_POST["S1"]; $input_title = empty($_POST["title"]) ? "ブックマーク・エントリ" : $_POST["title"]; $input_title = mb_convert_encoding($input_title, "SJIS", "EUC-JP"); $HATENA_MODULE_F = "<div class=\"hatena-module\"> <div class=\"hatena-moduletitle\">{$input_title}</div> <div class=\"hatena-modulebody\"> <ul class=\"hatena-bmlist\">"; $HATENA_MODULE_B = "</ul> </div> </div>"; // エラー処理は全般に適当 if (empty($input_url)) { // die("Empty"); } $RSSURL = $RSSURL_F.$input_url.$RSSURL_B; // URLのファイルオープン $buff = ""; $fp = fopen($RSSURL,"r") or die("OPENエラー $RSSURL"); while ( !feof($fp) ) { $buff .= fgets($fp,4096); } fclose($fp); // XMLパースし連想配列$valuesに保存 $parser = xml_parser_create(); xml_parser_set_option($parser,XML_OPTION_SKIP_WHITE,1); xml_parse_into_struct($parser,$buff,$values,$idx); xml_parser_free($parser); // 連想配列の要素毎に処理 $i = 0; $in_item = 0; $result = "{$HATENA_MODULE_F} "; foreach ($values as $value) { $tag = $value["tag"]; $type = $value["type"]; $value = $value["value"]; $tag = strtolower($tag); if ($tag == "item" && $type == "open") { $in_item = 1; } else if ($tag == "item" && $type == "close") { $result .= "<li><a href=\"{$link}\">$title</a><a href=\"{$BM_ENTRY}{$link}\"> <img src=\"{$BM_IMG}{$link}\" border=\"0\"></a></li> "; /* echo <<<EOM <a href="$link">$title</a> <a href="$BM_ENTRY$link"><img src ="$BM_IMG$link" border="0"></a><br> $description<hr> EOM; */ $in_item = 0; if ( ++$i >= $input_num) { break; } } if ($in_item) { switch ($tag) { case "title": // 文字コードは全般に適当 $value = mb_convert_encoding($value, "EUC-JP", "UTF-8"); $value = $input_cut ? str_replace("脱・下流エンジニア (仮) - ", "", $value) : $value; // 決め打ち $value = mb_convert_encoding($value, "SJIS", "EUC-JP"); $title = $value; break; case "link": $link = $value; break; case "description": $value = mb_convert_encoding($value, "SJIS", "UTF-8"); $description = $value; break; } } } $result .= "{$HATENA_MODULE_B}"; ?> <form method="POST" action="<?php echo $_SERVER["PHP_SELF"]?>"> <table border="0"> <tr><td>URL: <input type="text" name="url" size="80" maxlength="80" value="http://d.hatena.ne.jp/ooolong/"/></td></tr> <tr><td>hatena-moduletitle: <input type="text" name="title" size="40" maxlength="40" value=""/></td></tr> <tr><td>BlogTitle Cut? : <input type="radio" name="R1" value="1" checked>Yes <input type="radio" name="R1" value="0">No</td></tr> <tr><td>Select Num <select name="S1"> <option value="10">10</option> <option value="20" selected>20</option> <option value="30">30</option></select></td></tr> <tr><td><input type="submit" name="sub1" value="generate HTML"/></td><td> <tr><td> <textarea name="ta1" rows="20" cols="100"> <?php echo $result ?> </textarea> </td></tr> </table> </form> <?php print $result ?> </body> </html>