個別記事

外部の RSS を PHP で取得

この記事が属するカテゴリー
web&blog

ありがたくも、拙記事なんぞをはてなブックマーク 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

2005-05-18T22:34:45+09:00 | コメント (3) | トラックバック (3) |はてなブックマーク

関連性が高いエントリー 5 件

トラックバック

このエントリーのトラックバックURL:
http://WWW.lucky-bag.com/cgi/mt/mt-tb.cgi/233

このリストは、次のエントリーを参照しています: 外部の RSS を PHP で取得:

MT hxxks さんからのトラックバック
Re: 外部の RSS を PHP で取得
php_flag short_open_tag Off の方法でも間違いではありませんが、 .htaccess を使わない方法もあります。 [続きを読む]
2005年05月19日 00:17
Trivial Tracks さんからのトラックバック
PHP版多機能RSSリーダ 正式リリース
機能概要 サイト、ブログ上であらゆる他サイトRSSを読み込んで表示できる ネットワークのタイムアウト時間変更 文字コードの詳細設定 BlogPeopleの... [続きを読む]
2005年12月15日 04:10
Craranの日記 さんからのトラックバック
サイトURLからRSSのURLを取得する。PHPでヘッダーを見て…
<? $url = $_GET[’url’]; $html = file_get_contents($... [続きを読む]
2005年12月20日 19:06

コメント

(o) さんからのコメント [TypeKey Profile Page]

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

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

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

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

error_reporting(E_ERROR);

2005年05月19日 00:58
(o) さんからのコメント [TypeKey Profile Page]

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

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

2005年05月19日 01:19
e-luck さんからのコメント [TypeKey Profile Page]

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

2005年05月19日 11:51

コメントしてください

コメント内ではタグは一切使えません。コメント内にてタグを表記したい場合は、お手数ですが、文字実体参照を利用して < を &lt; 、> を &gt; とそれぞれ置き換えてください。




保存しますか?


(V) (P)