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>