PHPで作るRSSビューア

(1/1)
RSS がブームである。標準機能としてRSSをサポートするブログも増えてきた。「ぱふぅ家のホームページ」でも、3つのRSSを配信している。

目次

サンプル・プログラムの実行例

PHPで作るRSSビューア

サンプル・プログラム

圧縮ファイルの内容
viewRSS.phpサンプル・プログラム本体。

pear/XML_RSS

世の中にはPHP用の RSSパーサというものが無償配布されている。これを使えば、簡単にRSSを表示するプログラムを作ることができる。
このサンプル・プログラムは当初、MagpieRSS というオープン・ソースのRSSパーサを用いていたが、PHP8対応するためにはソースのあちらこちらを修正しなければならないことが分かり、pear/XML_RSS に乗り換えることにした。

PEAR パッケージのインストールについては、「PEARのインストール」などを参考にしてほしい。ここでは、pear/XML_RSS がインストールされたという前提で話を進める。

まず、PHP8対応にするため、若干の修正が必要だ。
"RSS.php" および "Parser.php" について、"startHandler($xp, $elem, &$attribs)" を検索する。この第3引数を値渡し "$attribs" に変更する。
startHandler($xp, $elem, &$attribs)
  ↓
startHandler($xp, $elem, $attribs)
これは、PHP8で値渡しになったための修正だ。

サンプル・プログラムの流れ

今回は、入力と結果を1つの画面で表示し、プログラムも1本で済ませることを目標にする。

画面は、大きく2つのブロックに分かれる。RSSのURLを入力するためのINPUT部と、RSSを解釈した結果を表示するBODY部である。プログラムの流れとしては、URLが入力されたらBODY部を表示するようにする。

そこで、最初はINPUT部のみ表示しておき、[取得]ボタンが押されたら、URLの値をGET渡しする。もしGET渡しされた値があったら、BODY部を表示するようにする。
PHPで作るRSSビューア

解説:初期化処理

0014: // 初期化処理 ================================================================
0015: define('INTERNAL_ENCODING', 'UTF-8');
0016: mb_internal_encoding(INTERNAL_ENCODING);
0017: mb_regex_encoding(INTERNAL_ENCODING);
0018: define('MYSELF', basename($_SERVER['SCRIPT_NAME']));
0019: define('REFERENCE', 'https://www.pahoo.org/e-soul/webtech/php02/php02-02-01.shtm');
0020: 
0021: //プログラム・タイトル
0022: define('TITLE', 'RSSビューア');
0023: 
0024: //リファラチェック+リリースフラグの設定
0025: if (isset($_SERVER['HTTP_HOST']) && ($_SERVER['HTTP_HOST'] == 'localhost')) {
0026:     define('FLAG_RELEASE', FALSE);
0027:     define('REFER_ON', '');
0028:     ini_set('display_errors', 1);
0029:     ini_set('error_reporting', E_ALL);
0030: else {
0031:     //リリース・フラグ(公開時にはTRUEにすること)
0032:     define('FLAG_RELEASE', TRUE);
0033:     //リファラ・チェック(直リン防止用;空文字ならチェックしない)
0034:     define('REFER_ON', 'www.pahoo.org');
0035: }
0036: 
0037: //表示幅(ピクセル)
0038: define('WIDTH', 600);
0039: 
0040: //RSS URL(初期表示用)
0041: define('DEFURL', 'https://www.pahoo.org/rss/pahoo.rdf');
0042: 
0043: //pear/XML_RSS  https://pear.php.net/package/XML_RSS
0044: require_once('XML/RSS.php');

関数  mb_internal_encoding  により、内部処理は UTF-8 を指定する。

定義済み変数 $_SERVER['SCRIPT_NAME'] には、このPHPスクリプト自身の実行パスとファイル名が格納されている。のちほど使うことになるので、関数  basename  によりスクリプト・ファイル名のみ取り出し、定数 MYSELF に格納しておく。

関数  require_once  を使って pear/XML_RSS を読み込む。
PEAR パッケージは include_path にあるという前提である。

解説:引数取得

0114: /**
0115:  * 指定したパラメータを取り出す
0116:  * @param   string $key  パラメータ名(省略不可)
0117:  * @param   bool   $auto TRUE=自動コード変換あり/FALSE=なし(省略時:TRUE)
0118:  * @param   mixed  $def  初期値(省略時:空文字)
0119:  * @return  stringパラメータ/NULL=パラメータ無し
0120: */
0121: function getParam($key$auto=TRUE$def='') {
0122:     if (isset($_GET[$key]))         $param = $_GET[$key];
0123:     else if (isset($_POST[$key]))   $param = $_POST[$key];
0124:     else                            $param = $def;
0125:     if ($auto)  $param = mb_convert_encoding($paramINTERNAL_ENCODING, 'auto');
0126:     return $param;
0127: }

0103: /**
0104:  * 指定したボタンが押されてきたかどうか
0105:  * @param   string $btn  ボタン名
0106:  * @return  bool TRUE=押された/FALSE=押されていない
0107: */
0108: function isButton($btn) {
0109:     if (isset($_GET[$btn]))     return TRUE;
0110:     if (isset($_POST[$btn]))    return TRUE;
0111:     return FALSE;
0112: }

0205: $rssonly = isButton('rssonly');
0206: $uri = getParam('uri', FALSEDEFURL);

ユーザー関数 getParam は、定義済み配列変数 $_GET および $_POST を参照し、uri が GET渡しされていたら、これを取り込んでおく。
後述するように、formタグからgetメソッドでスクリプト自身(MYSELF)を呼び出すようにしてあり、ここで $uri をGET渡しする。

ユーザー関数 isButton を使い、オプション rssonly の有無をユーザー変数 $rssonly に格納しておく。

解説:ヒアドキュメント

0175: $body =<<< EOT
0176: <body>
0177: <h2>{$title} {$version}</h2>
0178: <form name="myform" method="get" action="{$myself}" enctype="multipart/form-data">
0179: RSS URL
0180: <input type="text" name="uri" id="uri" size="50" value="{$url}" />
0181: <input type="submit" id="exec"  name="exec"  value="取得" /> 
0182: <input type="submit" id="reset" name="reset" value="リセット" />
0183: </form>
0184: 
0185: {$table}
0186: 
0187: <div style="border-style:solid; border-width:1px; margin:20px 0px 0px 0px; padding:5px; width:{$width}px; font-size:small; overflow-wrap:break-word; word-break:break-all;">
0188: <h3>使い方</h3>
0189: <ol>
0190: <li>[<span style="font-weight:bold;">RSS URL</span>]に表示したいRSSのURLを入力してください。</li>
0191: <li>[<span style="font-weight:bold;">取得</span>] ボタンを押してください。</li>
0192: <li>RSSの一覧が表示されます。</li>
0193: </ol>
0194: ※参考サイト:<a href="{$refere}">{$refere}</a>
0195: </div>
0196: </body>
0197: 
0198: EOT;

HTMLタグが多い部分については、いちいち関数  echo  や  print  を使って出力するのは面倒である。そこで、PHPに用意されている「ヒアドキュメント」という仕組みを利用する。

たとえば、このサンプル・プログラムでは、"<<< EOT" の次の行から "EOT;" の直前行まで、そのままの形でユーザー変数 $body$table に格納される。
また、ヒアドキュメントの中には、PHP変数や式を埋め込むことができる。ここでは、配列変数 $item$uri などの値を埋め込んでいる。

同様に、HMTLのヘッダ部をユーザー変数 $HtmlHeader に、フッタ部をユーザー変数 $HtmlFooter に格納しておく。

解説:メイン・プログラム

メイン・プログラムの流れは簡単である。
$uri に値が入っていたら pear/XML_RSS のパーサー parse を呼び出す。
NULLが返っていたら、ユーザー変数 $errmsg にエラー・メッセージを格納する。

パーサーによって得られるRSSの内容は以下の通り。

0202: // メイン・プログラム ===================================================
0203: $rss = NULL;
0204: $errmsg = '';
0205: $rssonly = isButton('rssonly');
0206: $uri = getParam('uri', FALSEDEFURL);
0207: 
0208: //リセット
0209: if (isButton('reset')) {
0210:     $uri = '';
0211: 
0212: //RSS解釈と出力コンテンツ作成
0213: else if ($uri != '') {
0214:     $rss = new XML_RSS($uri);        // pear/XML_RSS
0215:     $rss->parse();
0216:     if ($rss == NULL)   $errmsg = 'RSSの解釈に失敗';
0217: }
0218: 
0219: $HtmlBody = makeCommonBody($rssonly$uri$rss$errmsg);
0220: 
0221: // 表示処理
0222: if ($rssonly) {
0223:     echo $HtmlBody;
0224: else {
0225:     echo $HtmlHeader;
0226:     echo $HtmlBody;
0227:     echo $HtmlFooter;
0228: }
0229: 
0230: /*

<channel>
$rss->channel["title"]タイトル。普通は親サイトのタイトル。
$rss->channel["link"]|URL。普通は親サイトのURL。
$rss->channel["desctiption"]channelに関する説明記述。
<item>
$item["title"]itemのタイトル。
$item["link"]itemのURL。
$item["desctiption"]itemの簡単な記述/概要。
$item["dc"]["date"]itemのタイムスタンプ(W3C形式)。

解説:表示処理

表示処理はいたって簡単である。ユーザー変数 $rssonly によって場合分けしているだけだ。
この時点で表示に必要な情報は次のユーザー変数に格納されている。
$HtmlHeaderHTMLヘッダ
$HtmlBodyBODY部
$HtmlFooterHTMLフッタ
これを順次、関数  echo  でクライアント画面に出力してやればよい。

0225:     echo $HtmlHeader;
0226:     echo $HtmlBody;
0227:     echo $HtmlFooter;

サンプル・プログラムの応用

URLをGET渡ししたことによって、もう1つメリットが生じる。他のページから本プログラムを呼び出すときに、"viewRSS.php?uri=[RSS URL]"と指定してやれば、RSSの内容を表示できるのだ。

このとき、INPUT部が表示される必要はないと思うので、rssonly オプションを追加した。
たとえば "viewRSS.php?rssonly&uri=[RSS URL]"と指定してやれば、スタイルシートは未定義で、INPUT部を表示しないRSSビューアとして機能する。

ぱふぅ家のホームページでは、最速セキュリティニュースで、サンプル・プログラムと同様のスクリプトを使っている。
Apache HTTPサーバSSI の1つである "#include virtual" を利用し、RSSビューア・スクリプトをコンテンツの中に埋め込んでいる。

参考サイト

(この項おわり)
header