外部の RSS を PHP で取得

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)と同じディレクトリに下記をアップ。

さらに 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

この記事についての情報

似た内容の記事

この記事に対するトラックバック

トラックバックURL: http://www.lucky-bag.com/mt/mt-tb.cgi/158

MT hxxks - Re: 外部の RSS を PHP で取得 (2005年5月19日 00:17)

php_flag short_open_tag Off の方法でも間違いではありませんが、 .htaccess を使わない方法もあります。 続きを読む

Trivial Tracks - PHP版多機能RSSリーダ 正式リリース (2005年12月15日 04:10)

機能概要 サイト、ブログ上であらゆる他サイトRSSを読み込んで表示できる ネットワークのタイムアウト時間変更 文字コードの詳細設定 BlogPeopleの... 続きを読む

Craranの日記 - サイトURLからRSSのURLを取得する。PHPでヘッダーを見て… (2005年12月20日 19:06)

<? $url = $_GET[’url’]; $html = file_get_contents($... 続きを読む

Comments

(o) said:

文字化け周りですけど、0.7系だとrequire_once 'rss_fetch.inc';の後に以下のように追加しておくだけでmb_convert_encoding相当のことを内部的にやってくれるようになっています。

define('MAGPIE_OUTPUT_ENCODING', 'UTF-8');

ファイルを変更したり、置き換えたりする必要はないので簡単ですね。

あとですね、そのままだとRSSが取得できなかったときに、ページにエラーメッセージが表示されてしまいます。以下のように書いておくと、エラー表示を抑制できます。

error_reporting(E_ERROR);

(o) said:

以下のエントリーにMSN SearchのRSS出力をMagpieRSSを使って表示する例を示しています。
http://as-is.net/blog/archives/000958.html

上記の例でも考慮していますが、$item[description]などをhtmlspecialcharsでエスケープしたほうがXSS対策的にはよいです。

e-luck said:

(o) さん、どうもです。
文字化け、あっさり解決しました:-)
素晴らしいっす。

js said:

どーしても、EUC-JP で表示したいのですが
define('MAGPIE_OUTPUT_ENCODING', 'EUC-JP'); と書いたのですが
化け文字になってしまいます。
何か良い方法はありませんか?