<< 指定文字列に挟まれた文字列を返す | main | 自然文検索に対応したOkSearchAPI >>

2007.04.04 Wednesday

RSSリーダーを作る

RSSリーダーを作る、といっても、高機能なものを作るわけでなければ、
比較的簡単に、かつ、自分に必要な機能を備えるRSSリーダーが出来ます。
WX320Kを購入してから、OperaサーバーサービスのRSS機能を使用していたのですが、登録したフィードが消失したり、途中までしか読み込まなかったり、一部のフィードの登録が出来なかったり、背景色が黒で現在のUIにあっていない、本文の文字サイズが微妙に小さくて拡大率がアバウトな関係もあって読みにくい、などなど、様々な問題点があったので、このOperaサーバーサービスのRSS機能の代用が目的です。

自分で作れば、背景色や文字サイズだけでなく、表示内容も自分の好きなように出来ます。

--

■必要なもの
自分がよく見ているRSSフィードは、ほとんどが画像を配信してくれるフィード、AtomやRSS2.0だったりします。
PearのXML_Parserを使ってもいいのですが、MagpieRSS: RSS for PHPというパッケージを使うと、Pearよりも簡単にAtomやRSS2.0が扱えるので、今回はMagpieRSSを使って実装します。
インストールは簡単で、拡張子がincのファイルをインクルードパスの通った場所に、extlibをディレクトリごと、同じ場所に転送するだけです。

■サブルーチン サブルーチンでは、フィードのURLと何日前まで表示するかを引数として受け取り、 ・フィードタイトル ・投稿日 ・コンテンツ を表示する、だけで十分でしょう。 ソースは以下のとおり。 UTF-8のところは、自分の環境に合わせて変更する必要があります。
function サブルーチン関数名($url,$before_day=3) {
  require_once 'rss_fetch.inc';
  define('MAGPIE_OUTPUT_ENCODING', 'UTF-8');
  $before_day_limit = 24*60*60*$before_day;
  $rss = fetch_rss($url);
  $title = $rss->channel['title'];
  echo "<h2>$title</h2>\n";
  print "<ul>";
  foreach ($rss->items as $item ) {
    // 時刻
    if ($item['dc']['date'] != '') {
      $dt = strtotime($item['dc']['date']);
    } else if($item['pubdate'] != '') {
      $dt = strtotime($item['pubdate']);
    } else if($item['modified'] != '') {
      $dt = strtotime($item['modified']);
    } else if($item['updated'] != '') {
      $dt = strtotime($item['updated']);
    } else {
      $dt = time();
    }
    if( ( time() - $before_day_limit ) < $dt ) {
      // タイトルとリンク
      $title = $item['title'];
      $title = mb_convert_encoding($title, "UTF-8", "auto");
      $url   = $item['link'];
      print "<li><a href=\"$url\">" . $title . "</a>" . "<br>";
      print "投稿日:" . date("Y-m-d", $dt) . "<br>";
      // 本文
      if(!empty($item['atom_content']))    print($item['atom_content']."<br>");
      else if(!empty($item['content:encoded']))  print($item['content:encoded']."<br>");
      else if(!empty($item['content']['encoded']))  print($item['content']['encoded']."<br>");
      else if(!empty($item['content']))    print($item['content']."<br>");
      else if(!empty($item['description']))  print($item['description']."<br>");
      print("<br>");
    }
  }
  print "</ul><hr>";
}
日付とコンテンツに関しては、フィードによって、どういったアイテムを持っているのか分からないので、自分なりに優先順位をつけています。 おそらくは、これだけ網羅しておけば、ほとんどのフィードが読めるんじゃないかな。

■呼び方
サブルーチンが出来たら、メインルーチンから
サブルーチン関数名(RSSフィードのURL[,日付]);
とするだけです。
日付は省略可能で、省略時は3日前までのフィードを表示します。
サブルーチン関数名(RSSフィードのURL,1);
とすれば、24時間前までのフィードを表示できます。

自分がよく見るページのフィードを公開しても意味がないので、リンクは貼りませんが、
WX320Kで実際に作成したページにアクセスしてみると、なかなかいい感じ。
ページアクセス時に、若干待たされるものの、ページが表示されてしまえば、後は通信も必要ないので、快適にRSSフィードを読むことが出来るようになりました。

本当は、OperaサーバーサービスのRSS機能に問題がなければ、こんなことしなくてもいいんですけどね。

--

テクノラティお気に入りに追加する

Comments

コメント入力は停止しています

海外からと思われるコメントスパムが横行しているため、全記事のコメント入力を停止しています。メッセージのある方は、ホームページの一番下に連絡欄がありますので、そちらからお願いします。

Trackback URL

トラックバックする場合は、
トラックバック元の記事にこのエントリへのリンクを記載してください
このエントリのタイトル「RSSリーダーを作る」
このエントリのリンク「http://kommy.s254.xrea.com/blog/log/eid29.html」