« PreviousNext »

PHPでRSSを取得&表示

18 2 月 2008

今回は、PHPでRSSを取得して、表示までしたいと思います。

さらに、前回(PHPで一覧ページ自動作成3)で作った「index.php」を利用して、

そのRSSのタイトルを一覧ページにて取得できるように改良したいと思います。

例によって、「 サンプルページ 」 を作っております。

まず、「 MagpieRSS: RSS for PHP 」こちらのページより、最新ヴァージョンの

「 magpierss-0.72.tar.gz 」をダウンロードします。     ※2008/2/17現在

それを解凍すると、中身はこんな感じになっていると思います。

LIST

その中で使うのは、

rss_cache.inc            ← ファイル ①
rss_fetch.inc            ← ファイル ②
rss_parse.inc            ← ファイル ③
rss_utils.inc            ← ファイル ④
extlib                   ← フォルダ ①
 Snoopy.class.inc        ← extlib の中身の ファイル ⑤

と、cache というフォルダです。     ← フォルダ ②

cache は新規作成です。

これを、下記で編集する 「 index2.php 」 と同じディレクトリにアップロードしてください。

で、RSSを表示するファイルを作成します。

名前は、何でもいいです。当サイトは、index2.php、index3.php、index4.php、という感じです。

※面倒であれば、RSS-INDEX こちらをどうぞ。
ちなみに、「 RSSナビ 」ここに行けば、RSSのリンクがいろいろありますよ。
<?php
$sname = $_SERVER['SERVER_NAME'];
$https = $_SERVER['HTTPS'];
$file = basename($_SERVER['SCRIPT_NAME']);
$dir = dirname($_SERVER['SCRIPT_NAME']);
if ($https != "on") {
  $protocol = "http://";
} else {
  $protocol = "https://";
}
/////////////////////////////////////////////////////////////////
//                                                             //
//  設定はここから                                             //
//                                                             //
/////////////////////////////////////////////////////////////////
//
// ↓RSSを配信しているところのRSSのURLを入力
$newsurl = 'http://www3.asahi.com/rss/national.rdf';
//
// ↓サーバーから見た自分のトップディレクトリ 例(/~hogehoge/)
// スラッシュで始まりスラッシュで終わる。
$topdir = "/";
$url = $protocol . $sname . $topdir;
//
// ディレクトリ用画像ファイルを指定
$img = "/img/folder.gif";
//
// CSSファイルがあれば指定する。
$css = "sub.css";
//
// 上のリストと、コピーライトのところに表示する名前
$back_site = "lunq.net";
//
// コピーライトの表記①
$copy[0] = "Copyright © 2008";
//
// 上のリストと、コピーライトのところに表示する名前のURL
$back_url = "http://www.lunq.net/";
//
// コピーライトの表記②
$copy[1] = "All Rights Reserved.";
//
// ↓表示したい件数
$kensuu = 20;
//
// これより下は、変更したければ変更する
$cssurl = $url . $css;
$dirimg = $url . $dirimg;
$fileimg = $url . $fileimg;
//
/////////////////////////////////////////////////////////////////
//                                                             //
//  設定はここまで                                             //
//                                                             //
/////////////////////////////////////////////////////////////////

if($dir == "/") {
  $dirname = " トップディレクトリ";
  $titleurl = $url;
} else {
  $urlorg = substr($dir, 1);
  $dirname = str_replace("/", "&nbsp;&gt;&nbsp;", $urlorg);
  $urlencode = urlencode($dir);
  $urlencode = str_replace("+", "%20",$urlencode);
  $urlencode = str_replace("%2F", "/",$urlencode);
  $urlencode = substr($urlencode, 1);
  $titleurl = $url . $urlencode . "/";
}

require_once 'rss_fetch.inc';
define('MAGPIE_OUTPUT_ENCODING', 'UTF-8');
$rss = fetch_rss($newsurl);
$title = $rss->channel['title'];
$title = mb_convert_encoding($title, "SJIS", "auto");
$count = count($rss->items);

print("<!DOCTYPE html PUBLIC ¥"-//W3C//DTD XHTML 1.0 Transitional//EN¥"");
print(" ¥"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd¥">");
?>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=Shift_JIS" />
<title><?php print($sname . &quot; &gt; &quot; . $title); ?></title>
<meta http-equiv="Content-Language" content="ja" />
<meta name="ROBOTS" content="noindex,nofollow" />
<meta name="Title" content="<?php print($sname . &quot;&nbsp;&gt;&nbsp;&quot; . $title); ?>" />
<link rel="stylesheet" href="<?php print($cssurl); ?>" type="text/css" media="screen" />
</head>

<body>
<div id="header">
 <h1><a id="top"></a><a href="<?php print($titleurl); ?>"><?php print($title); ?></a></h1>
 <h2><?php print($sname); ?></h2>
</div>

<div id="navigation">
<?php
print("<a href=¥"" . $back_url . "¥">" . $back_site . " - Home</a>");
print(&quot;&nbsp;&gt;&nbsp;" . $sname . "&nbsp;&gt;&nbsp;" . $dirname . "¥n");
?>
</div>

<div class="main">
<?php
print($dirname . "¥n&nbsp;&gt;&nbsp;" . "¥n合計 : " . $count . "&nbsp;件¥n<hr />¥n");
$value = urlencode($filename);
$value = str_replace("+", "%20",$value);
print("<h5><img src=¥"" . $img . "¥" alt=¥"" . $alt . "¥" /> ");
print("<a href=¥"$value¥">このフォルダの上に行く</a></h5>¥n");
print("  <ul>¥n");

$p = $_GET["p"];
if ($p != 1) { $p = $p * $kensuu; }
else { $p = 1; }

$rss->items = array_slice($rss->items, $p, $kensuu);

foreach ($rss->items as $item ) {
  $title = $item[title];
  $title = mb_convert_encoding($title, "SJIS", "auto");
  $url = $item[link];
  print("   <li><a href=¥"$url¥">$title</a></li>¥n");
}

print("  </ul>¥n<hr />");

$ans = $count % $kensuu; $ant = $count / $kensuu;
if($ans == 0) { $j = $ant - 1; }
else { $j = floor($ant); }

?>
<p>ページ切替 <?= $kensuu ?> 件単位<br /></p>
<p><a href="./<?= $file ?>?p=0">0</a>
<?php
for($i=0 ;$i<$j-1; $i++){
?>
&nbsp;&gt;&nbsp;<a href="./<?= $file ?>?p=<?= $i+1 ?>"><?= $i+1 ?></a>
<?php
}
if ( $j > 0 ) {
print(" > <a href=¥"./" . $file . "?p=" . $j . "¥">" . $j . "</a></p>");
}
?>
<hr />
</div>
<div class="footer">
<?php
print("<p> " .$copy[0] . " <a href=¥"" . $back_url . "¥">" . $back_site . "</a> ");
print($copy[1] . "</p>¥n");
?>
</div>
</body>
</html>
上記で作ったファイルと、その前に解凍したファイル ① ~ ⑤ と、 

フォルダ ① ② をアップロードすれば、表示されると思います。 

一応、件数指定でページ切り替え機能を実装しています。 

ちなみに、上記のファイルはそれだけで1つのページなのですが、

元々あるページに埋め込むこともできます。

その場合は、下記のようなファイルを作るか、
直接表示したい部分に貼り付けてください。

ファイルを作った場合、例えば名前を「 news.php 」 とした場合、

表示したいページの表示したい部分に <?php include('news.php'); ?> と記述すれば表示されると思います。

もちろん、ファイル ① ~ ⑤ と、フォルダ ① ② を忘れずにアップロードしてください。
<?php
//表示したい件数を指定
$kensuu = 10;
//これを表示するページの文字コードを指定
$encode = "SJIS";
//↓RSSを配信しているところのRSSのURLを入力
$newsurl = 'http://nikkeibp.jp/jp/flash/index.rdf';
//
require_once 'rss_fetch.inc';
define('MAGPIE_OUTPUT_ENCODING', 'UTF-8');
$rss = fetch_rss($newsurl);
$title = $rss->channel['title'];
$title = mb_convert_encoding($title, $encode, "auto");
print("<h1>$title</h1><br><br>\n");
$rss->items = array_slice($rss->items, 1, $kensuu);
foreach ($rss->items as $item ) {
  $title = $item[title];
  $title = mb_convert_encoding($title, $encode, "auto");
  $url = $item[link];
  print("<a href=\"$url\">$title</a><br>\n");
}
print("<br>\n");
?>
次に、そのファイルをいっぱい作った時のために、それを表示する一覧用のページを作ります。 

これは、あってもなくてもOKです。ただ単に一覧表示するだけなので。 

内容は、前回(PHPで一覧ページ自動作成3)で作った「index.php」を改良します。

今回の追加項目は、

 PHP の、title を読み込んで表示するようにしました。

なお、以下は編集の箇所しか記述しておりません。

コピーがウザかったら、こちらをどうぞ。
下記のリストに一緒にアップロードするファイル名を追加する
// 一覧で表示させたくないものを記述
// たくさんあれば、追加をしても大丈夫です。
$b[0] = $file;   // このファイルの変数名 表示したければ、"" にしてください。
$b[1] = $css;    // CSSの変数名 表示したければ、"" にしてください。
$b[2] = ".";     // このフォルダという意味 表示したければ、"" にしてください。
$b[3] = ".htaccess";
$b[4] = ".recycle";
$b[5] = "Thumbs.db";
$b[6] = "cache";            ← 追加
$b[7] = "extlib";           ← 追加
$b[8] = "rss_cache.inc";    ← 追加
$b[9] = "rss_fetch.inc";    ← 追加
$b[10] = "rss_parse.inc";   ← 追加
$b[11] = "rss_utils.inc";   ← 追加

218行目からの下記の行の下(226行目)にタイトルを抽出するために追加する。
    if ($pathext == ('html') || $pathext == ('htm')) {
      $fp = fopen($filename,"r");
      $ref_str = fread($fp, 1000);
      if (eregi("<title>(.*)</title>", $ref_str, $out)) {
        $title = strip_tags ($out[1]);
      } else {
        $title = $filename;
      }  ←  225行目
以下、226行目から13行分追加する。
-------------------- ここから --------------------
    } else if ($pathext == ('php')) {
      $fp = fopen($filename,"r");
      $ref_str = fread($fp, 1000);
      if (eregi("$newsurl = '(.*)';", $ref_str, $out)) {
        $title = strip_tags ($out[1]);
        require_once 'rss_fetch.inc';
        define('MAGPIE_OUTPUT_ENCODING', 'UTF-8');
        $rss = fetch_rss($title);
        $title = $rss->channel['title'];
        $title = mb_convert_encoding($title, "SJIS", "auto");
      } else {
      $title = $filename;
      }
-------------------- ここまで --------------------
    } else {
      $title = $filename;
    }
上記のように編集をしたら、それも一緒にアップロードします。

すると、他のインデックスページよりRSSのタイトルを取得して、

リンクのタイトルとして表示されていると思います。

これで完了です。

Posted in HTML | Trackback | del.icio.us | Top Of Page

No comments yet

Leave a Reply