2008年12月26日に当サイトのテンプレートおよびデザイン、サーバの変更作業時に当記事にて紹介しているHot entryというページは削除してしまいました。当該ページは404 Not Foundとなっていることをご了承ください。
ありがたくも、拙記事なんぞをはてなブックマークや dei.icio.us などの ソーシャルブックマークでブックマークして頂いてもらっちゃったりしているわけで、なんとも恐縮に感じていたり、いなかったり。んでもって、どうせなら興味を持って頂いた記事を紹介するかっつうことで、そんなに Hot なわけじゃないのに Hot entry なるページを作っちまいました。ウヘ:-P
とりあえず今回は、はてなブックマークにブックマークされている当サイトのエントリー一覧の RSS を取り込んでみますた。外部の RSS を取り込むって場合、CGI や JavaScript を使ってゴニョったり、JavaScript を生成してくれるサービスなんかがあったりするんだけど、今回は MagpieRSS を使って PHP で取得してみた。参考にさせて頂いたのは、下記のサイト。
RSS を読み込むために用意するもの
MagpieRSS から magpierss-0.71.1.tar.gz をダウンロードして展開し、RSS を表示させたいファイル(当サイトの場合 hotentry.html)と同じディレクトリに下記をアップ。
- rss_cache.inc
- rss_fetch.inc
- rss_parse.inc
- rss_utils.inc
- extlib
さらに cache というディレクトリを同じ階層に作成。このままだと、2 バイトの文字が化けてしまったんだけど、magpierss-0.6 (旧バージョン)をダウンロードし、rss_parse.inc のみを上書きしたら大丈夫だった。コメントにて (o) さんより教えて頂き、ファイルを入れ替えなくてもdefine('MAGPIE_OUTPUT_ENCODING', 'UTF-8');
を require_once 'rss_fetch.inc';
の後に追加することで解決。
コードを挿入
RSS を表示させたいファイル(当サイトの場合 hotentry.html)に以下のコードを挿入して完了。参考サイトでは、タイトルのみを ul
で表示だったんで、dl
を使って概要(description)も表示するようにした。
<?php
error_reporting(E_ERROR);
require_once 'rss_fetch.inc';
define('MAGPIE_OUTPUT_ENCODING', 'UTF-8');
$url = 'http://b.hatena.ne.jp/entrylist?mode=rss&url=http%3A%2F%2Fwww.lucky-bag.com';
$rss = fetch_rss($url);
$title = $rss->channel['title'];
echo "<h3>$title</h3>\n";
echo "<dl>\n";
foreach ($rss->items as $item ) {
$title = htmlspecialchars($item['title']);
$description = htmlspecialchars($item['description']);
$url = htmlspecialchars($item['link']);
echo "<dt><a href=\"$url\">$title</a></dt>\n";
echo "<dd>$description</dd>\n";
}
echo "</dl>\n";
?>
強調部分は取得したい RSS の URL を指定している。mb_convert_encoding
define('MAGPIE_OUTPUT_ENCODING', 'UTF-8');
内の UTF-8 となっている部分は、RSS を表示させたいファイル(当サイトの場合 hotentry.html)の文字コードに合わせている。
(o) さんよりコメントにて教えて頂き、コードを手直ししました。
おまけ
Hot entry だけ拡張子が .php なのはアレだったんで、.htaccess に下記を追加し、.html でも PHP ファイルとして認識させるようにした。
AddType application/x-httpd-php .html
それと、xml 宣言部分の <?
が php の省略タグだと認識されてエラーになっちゃうんで、同じく .htaccess に下記を追加して省略タグを無効にした。
php_flag short_open_tag Off
Comments
文字化け周りですけど、0.7系だとrequire_once 'rss_fetch.inc';の後に以下のように追加しておくだけでmb_convert_encoding相当のことを内部的にやってくれるようになっています。
define('MAGPIE_OUTPUT_ENCODING', 'UTF-8');
ファイルを変更したり、置き換えたりする必要はないので簡単ですね。
あとですね、そのままだとRSSが取得できなかったときに、ページにエラーメッセージが表示されてしまいます。以下のように書いておくと、エラー表示を抑制できます。
error_reporting(E_ERROR);
以下のエントリーにMSN SearchのRSS出力をMagpieRSSを使って表示する例を示しています。
http://as-is.net/blog/archives/000958.html
上記の例でも考慮していますが、$item[description]などをhtmlspecialcharsでエスケープしたほうがXSS対策的にはよいです。
(o) さん、どうもです。
文字化け、あっさり解決しました:-)
素晴らしいっす。
どーしても、EUC-JP で表示したいのですが
define('MAGPIE_OUTPUT_ENCODING', 'EUC-JP'); と書いたのですが
化け文字になってしまいます。
何か良い方法はありませんか?