2008年02月19日13:06
RSSリーダーの多くは、各サイトごとにRSS情報がまとめられるものが多いのですが、むしろ、登録したサイトのRSS情報を全てごちゃ混ぜにして、時系列順で一覧にしてみたいのです。はてなRSSリーダーはそういう仕様になっているので、センスがいいなあと思います。
今回は、そういう私の個人的なニーズにあったRSSリーダーを自作してみましょう。
(例:ごった煮RSSリーダー)
その前にまず、今回扱うRSSについて説明させていただきます。
RSS1.0とRSS2.0というのがあるのですが、はっきり言って、細かい事は私にも分りません。
ぶっちゃけ違いがあろうとなかろうとどうでもいいんですが、ただ、日付の表記が違うのだけは今回すごく痛いのです。
<日付の表記の差>
RSS1.0 ・・・ <dc:date>2008-02-19T01:38:04+09:00</dc:date>
RSS2.0 ・・・ <pubDate>Tue, 19 Feb 2008 01:38:04 +0900</pubDate>
(他、RSS1.0とRSS2.0の違いについて。)
RSS2.0の方が良いかもしれません… − [Z]ZAPAブロ〜グ2.0
これははっきり言って、RSS2.0の方が扱いづらい。
こちとら初心者で、日付の変換の方法もよくわかりませんので、今回潔くRSS2.0には対応いたしません。
また、あんまり多くのフィードを読み込むとどれくらい負荷がかかるかも分りませんので、フィードは5個くらいにしておきます。
RSS1.0のフィードを手動で5つくらい登録して時系列順に並び替えるRSSリーダーをつくります。
我ながら制約が多いRSSリーダーだな、オイ。
ま、いいか。
ポイントを列挙します。
1.1つめのRSSフィードを読み込んで配列にする。
2.配列から情報を抜き出し、「日付+リンク+サイト名」という形の文字列にする。
3.作った文字列を配列に入れ込む。
4.これをRSSフィードの数だけ繰り返す。
5.日付+リンク+サイト名という文字列を日付降順でソートする。
6.日付をトリミングして、ソートされた順にひとつの文字列にする。
7.文字列をキャッシュ。
結構長くなりそうですね。
とりあえず、1、2、3を今回ご説明させて頂き、4、5、6を次回、7を最終回にしましょうか。
それでは始めます。
1.1つめのRSSフィードを読み込んで配列にする。
前回のものをそのまま流用。
XML/Unserializer.phpを使用してますので、詳しいやり方は前回の記事をご参照下さい。
require_once("XML/Unserializer.php");
$xml_data = file_get_contents("rss.xml");
$options = array(
XML_UNSERIALIZER_OPTION_ATTRIBUTES_PARSE => 'parseAttributes'
);
$unserializer = new XML_Unserializer($options);
$unserializer->unserialize($xml_data);
$result = $unserializer->getUnserializedData();
深く考えずに、コピペとファイルのコピーで丸暗記。
2.配列から情報を抜き出し、「日付+リンク+サイト名」という形の文字列にする。
$result['channel']['title'] ・・・ サイト名
$result['item'][$i]['dc:date'] ・・・ 記事の日付
$result['item'][$i]['title'] ・・・ 記事のタイトル
$result['item'][$i]['link'] ・・・ 記事のアドレス
記事の日付 <a herf='記事のアドレス'>記事のタイトル</a> (サイト名)
という形にしたいのですが、変数以外の文字列はダブルクォーテーションでくくって、.(ドット)で連結します。
$result['item'][$i]['dc:date']." <a href='".$result['item'][$i]['link']."' target='_blank'>".$result['item'][$i]['title']."</a> (".$result['channel']['title'].")<br />"
は、スペースを入れるための特殊文字です。
target='_blank' は、リンクを別窓で開くためのもので、ダブルクォーテーションの中にある場合、シングルクォーテーションにします。
<br />は改行です。
長い命令文ですが、やっている事は単純です。
文字列はダブルクォーテーションでくくって、.(ドット)で連結、ただそれだけです。
これをRSSフィードの記事の数だけ繰り返さないといけません。
for($i=0; $i< count($result[item]); $i++){
$entry = $result['item'][$i]['dc:date']." <a href='".$result['item'][$i]['link']."' target='_blank'>".$result['item'][$i]['title']."</a> (".$result['channel']['title'].")<br />";
}
3.作った文字列を配列に入れ込む。
配列って、中身を順番に並び替えたりできるんです。
これを利用するために、作った文字列を新たな配列に入れ込んでおきます。
ここで、ちょっとした配列の小技をご紹介します。
$array[] = $hensu;
こういう風に書くと、配列$arrayの一番最後に、$hensuの中身を付け加えてくれます。
今回$datという配列に、文字列の変数$entryの中身を次々と加えていきます。
そして、あとでこれを日付順に並べ替えます。
for($i=0; $i< count($result[item]); $i++){
$entry = $result['item'][$i]['dc:date']." <a href='".$result['item'][$i]['link']."' target='_blank'>".$result['item'][$i]['title']."</a> (".$result['channel']['title'].")<br />";
$dat[] = $entry;
}
最終的にここまでのプログラムは下記のようになります。
当サイトのRSSで試してみます。
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "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=utf-8" />
<title>RSSリーダーのテスト</title>
</head>
<body>
<?php
require_once("XML/Unserializer.php");
$xml_data = file_get_contents("http://afiliate.livedoor.biz/index.rdf");
$options = array(
XML_UNSERIALIZER_OPTION_ATTRIBUTES_PARSE => 'parseAttributes'
);
$unserializer = new XML_Unserializer($options);
$unserializer->unserialize($xml_data);
$result = $unserializer->getUnserializedData();
for($i=0; $i< count($result[item]); $i++){
$entry = $result['item'][$i]['dc:date']." <a href='".$result['item'][$i]['link']."' target='_blank'>".$result['item'][$i]['title']."</a> (".$result['channel']['title'].")<br />";
$dat[] = $entry;
}
?>
</body>
</html>
このプログラムで出来た配列$dat → ヴィジュアル的に見やすく表示したもの
この記事へのトラックバック
1. goo RSSリーダー [ Web Surferの他愛もない日常 ] 2008年02月22日 12:42
自分は、ポータルサイトは、主にYahoo!JAPANや、Googleを使っているので、gooはあまり使っていなかったのだが、昨日、goo RSSリーダーをダウンロードしてみて、これは便利!と感じた。goo同様のポータルサイトで、楽天グループのinfoseekでも、infoseek RSSリーダーというRS...

アフィリエイトは儲かんないってば
