PHPで複数のサイトからRSSをfavicon付きで取得して、リストにする方法です。
PHPの関数でもできるらしいですが、各サイトのそれぞれの形式に対応するとか、文字コードとかなんやらかんやら面倒やったので、
Magpie RSS:http://magpierss.sourceforge.net/ を利用しました。
まず最初に参考にした偉大な先人のサイト
参考:複数のRSSを統合して更新日時でソートする方法[PHP] | DEZIMO.COM - FireworksやWEBのことなど -
参考:リンク先のFaviconを取得・表示できるWebサービス(API)とJavaScript・プラグインまとめ : web memo.Ver.2
参考:Magpie RSS - PHP RSS Parser
ソース
<!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" lang="ja" xml:lang="ja"> <head> <meta type charset="UTF-8"/> <title>RSS Feeds Frame</title> <link rel="stylesheet" href="style.css" /> </head> <body> <?php require_once('magpierss/rss_fetch.inc'); //MagpieRSSロード define('MAGPIE_OUTPUT_ENCODING','UTF-8'); //読み込むRSSを配列に格納 $rssUrl=array( "http://nyanyanyanya.jp/feed", "http://piyopiyopiyo.com/rss.xml" ); //表示する記事の"総"件数 $num=20; $HTMLbody =""; if($datacount !== 0){ foreach ($rssUrl as $no => $rss_url) { if ($rss_url != '') { //URLからRSSを取得 $rss = @fetch_rss($rss_url); $rss->items = array_slice($rss->items, 0, 1);// 後ろの数字が各RSSから取得する記事数 if ($rss != NULL) { for ($i=0; $i<count($rss->items); $i++) { //サイトのタイトルをitemsに格納 $rss->items[$i]["site_title"] = $rss->channel["title"]; $rss->items[$i]["site_link"] = $rss->channel["link"]; } //itemsだけ別配列に格納 $rssItemsArray[] = $rss->items; } } } $concatArray = array(); if (is_array($rssItemsArray)) { for($i=0;$i<count($rssItemsArray);$i++){ //配列を統合する $concatArray = array_merge($concatArray,$rssItemsArray[$i]); } foreach ($concatArray as $no => $values) { //「RSS広告は除外する」 if(preg_match("/PR:/", $values["title"])){ }else{ $title=$values["title"]; $link=$values["link"]; $site_link=$values["site_link"]; //記事ごとに必要な項目を抽出 $rssArray[]=array($title, $link, $site_link); } } //配列をユーザー定義関数でソート if ($rssArray) { usort($rssArray, 'cmp'); } if (count($rssArray) > $num) { $count=$num; } else { $count=count($rssArray); } //必要な件数分だけHTML整形 $HTMLbody ="<ul id=\"feed_body\">"; for ($i=0; $i<$count; $i++) { $title=$rssArray[$i][0]; $link=$rssArray[$i][1]; $site_link=$rssArray[$i][2]; $favicon="<img src=\"http://favicon.hatena.ne.jp/?url=".$site_link."\" />"; $HTMLbody .="<li class=\"feed_list\">" .$favicon. "<span class=\"entry_title\"> <a href=\"".$link."\" target=\"_blank\">".$title."</a> </span> </li>"; } $HTMLbody .="</ul>"; } }else{ $HTMLbody .="まだ記事がありません。"; } //======================================================= // 多次元配列ソート用比較関数 // この場合は配列の1番目の項目を降順にソート //======================================================= function cmp($a, $b) { if ($a[0] == $b[0]) return 0; return ($a[0] > $b[0]) ? -1 : 1; } ?> <?php echo $HTMLbody ?> </body> </html>
基本的には、
参考:複数のRSSを統合して更新日時でソートする方法[PHP] | DEZIMO.COM - FireworksやWEBのことなど -
こちらのものを転用しています。
ありがとうございます!
変更箇所
- 各サイトからの記事数を制御できるようにしました。
- faviconを表示させてます。
- 最終的に出力するHTMLの記述をひとつのul内に収めました。
各サイトからの記事数を制御する。
$rss->items = array_slice($rss->items, 0, 1);// 後ろの数字が各RSSから取得する記事数 //$rss->items = array_slice($rss->items, 0, 4);// 4件取得します。 //$rss->items = array_slice($rss->items, 0, 10);// 10件取得します。
後ろの数字を変えることで、読み込み件数を制御できます。
faviconを表示する。
Magpie RSSのパラメータ?として、各サイトのフィードから取得するitemsという配列ですが、中身がこうなってます。
array( title => 'Weekly Peace Vigil', link => 'http://protest.net/NorthEast/calendrome.cgi?span=event&ID=210257', description => 'Wear a white ribbon', dc => array ( subject => 'Peace' ), ev => array ( startdate => '2002-06-01T11:00:00', enddate => '2002-06-01T12:00:00', type => 'Protest', location => 'Northampton, MA' ) );
最初にchannelなる単位でサイトを取得して、そのサイト単位でitemsなる配列にデータを格納してるみたいです。
ということで、faviconが入ってなーい!
フィードの一覧なので、favicon無しはさみしい・・。
てなわけで。
参考:リンク先のFaviconを取得・表示できるWebサービス(API)とJavaScript・プラグインまとめ : web memo.Ver.2
こちらから、はてなの非公式?faviconサービスAPIを。
$favicon="<img src=\"http://favicon.hatena.ne.jp/?url=".$site_link."\" />";
http://favicon.hatena.ne.jp/?url=[取得したいサイトのURL]
これを、imgタグのソースに指定します。
faviconが取得できなかったときに、デフォルト画像を返してくれるところも素晴らしいー!
最終的なHTMLをulタグに収める。
これは割愛。
最後のfor文の外に出すだけ。
おわりに
Magpie RSSの設置方法などは、色々なところで記事があるので書いてません。
いやー便利な世の中だわ。