アンテナサイトを作ってみる。
『simplexml_load_file』でアンテナサイトを作る
まず、アンテナサイトの基本、RSSを読み込んで配信してみる。
外部RSSをPHPで取得するには、関数「simplexml_load_file」を使う。
※「simplexml_load_file」はサーバーのphp.ini設定で「allow_url_fopen」を有効にしないと使えないので注意
タイトル:よくわかるPHPの教科書
著者:たにぐち まこと 出版社:毎日コミュニケーションズ 発行日:2010-09-14 |
入門書『よくわかるPHPの教科書』のサンプルを参考に書く↓
<?php $xml = simplexml_load_file('http://rss.fnn-news.com/fnn_news.xml'); echo "<ul>"; foreach($xml->channel->item as $entry){ $entrydate = date ( "Y.m.d",strtotime ( $entry->pubDate ) ); echo "<li>$entrydate<a href='$entry->link'>$entry->title</a></li>"; } echo "</ul>"; ?>
これで日付と、リンク付きの記事タイトルがリスト表示される。
画像取得
文字だけではさみしいので、画像も表示してみる。
画像は、「preg_match」で取得↓
<?php $xml = simplexml_load_file('http://rss.fnn-news.com/fnn_news.xml'); foreach($xml->channel->item as $entry){ echo "<article>"; //サイトリンク $site_title = $xml->channel->title; $site_link = $xml->channel->link; $site_titlelink = "<a href='$site_link'>$site_title</a>"; echo $site_titlelink; //日付 $date = date ( "Y.m.d",strtotime ( $entry->pubDate ) ); echo $date; //記事リンク $titlelink = "<a href='$entry->link'>$entry->title</a>"; echo $titlelink; //画像 preg_match('/<img.*>/i', $entry->description, $entryimg); echo $entryimg[0]; echo "</article>"; } ?>
『MagpieRSS』でアンテナサイトを作る
アンテナサイトを作るなら、複数のRSSを読み込み、日付順に並び替える必要がある。また表示速度を上げるためにキャッシュ機能も欲しい。
「simplexml_load_file」で複数読み込み、並び替えて、「cron」で定期更新して~云々。という方法もある。
が、今回はライブラリ(MagpieRSS)の力を借りる。
最終コード(15.06.21修正)↓
<?php //RSS $rssUrl=array( 'http://blog.livedoor.jp/news4vip2/index.rdf',//ニュー速クオリティ 'http://himasoku.com/index.rdf',//ひま速 'http://kanasoku.info/index.rdf',//カナ速 'http://workingnews.blog117.fc2.com/?xml',//働くモノニュース 'http://blog.livedoor.jp/dqnplus/index.rdf',//痛いニュース 'http://majikichi.com/index.rdf',//マジキチ速報 '' ); //MagpieRSS require_once('../magpierss-0.72/rss_fetch.inc');//MagpieRSSロード※パス指定注意 define('MAGPIE_OUTPUT_ENCODING','UTF-8');//Encode define('MAGPIE_CACHE_ON', false);//Cacheを残す時間 //配列編集 foreach ($rssUrl as $no => $rss_url) { $rss = @fetch_rss($rss_url); if ($rss != NULL) { for ($i=0; $i<count($rss->items); $i++) { $rss->items[$i]["site_title"] = $rss->channel["title"]; $rss->items[$i]["site_link"] = $rss->channel["link"]; } $rssItemsArray[] = $rss->items; } }//--▲foreach-- $concatArray = array(); for($i=0;$i<count($rssItemsArray);$i++){ $concatArray = array_merge($concatArray,$rssItemsArray[$i]);} foreach ($concatArray as $no => $values) { //RSSの種類によって日付を取得 if($values['published']){$date = $values['published'];}//Atom1.0 elseif($values['dc']['date']){$date = $values['dc']['date'];}//RSS1.0 elseif($values['pubdate']){$date = $values['pubdate'];}//RSS2.0 $date=date("Y-m-d H:i:s",strtotime($date));//形式を揃える //Filter $nowtime = date("Y-m-d H:i:s",strtotime( "now" ));//現在時刻の取得 if($date > $nowtime){//未来記事の排除 }elseif(preg_match("/AD/", $values["title"])){//広告記事の排除 }elseif(preg_match("/PR/", $values["title"])){ }else{ //値の定義 $title=$values["title"]; $link=$values["link"]; $site_title=$values["site_title"]; $site_link=$values["site_link"]; //画像取得 $content=$values["content"]["encoded"]; preg_match('/<img.*>/i', $content, $img_all); if(empty($img_all[0])) { $content = $values['description']; preg_match('/<img.*>/i', $content, $img_all); } preg_match('/http.*?(\.gif|\.png|\.jpg|\.jpeg$|\.bmp)/i', $img_all[0], $gazo); if(empty($gazo[0])) {$gazo = "http://azaz.clouver.jp/antenna/noimage.png";} else{$gazo = $gazo[0];} //配列 $rssArray[]=array($date, $title, $link, $site_title, $site_link,$gazo); }//--▲if--Filter-- }//--▲foreach-- //配列設定 $num = 50;//最大件数 if(count($rssArray)>$num){$count=$num;}else{$count=count($rssArray);}//取得件数優先 rsort($rssArray);//並び替え //HTML整形 for ($i=0; $i<$count; $i++) { $date=date("m/d H:i",strtotime($rssArray[$i][0])); $title=$rssArray[$i][1]; $link=$rssArray[$i][2]; $site_title=$rssArray[$i][3]; $site_link=$rssArray[$i][4]; $gazo=$rssArray[$i][5]; $datelink = "<div class='date'>$date</div>"; $gazolink = "<a target='_blank' href='$link'><div class='trim'><img src='$gazo' /></div></a>"; $titlelink = "<div class='title'><a href='$link'>$title</a></div>"; $site_titlelink = "<div class='site_title'><a href='$site_link'>$date - [$site_title]</a></div>"; echo "<article>$gazolink$titlelink$site_titlelink</article>"; }//--▲for-- ?>
プログラムコード補足
基本は「5分で作れるアンテナサイト!RSSを取得して更新順に表示させてみた。(http://wcb.jp)」を参考に。
追加機能は、画像の取得、未来記事の削除。
未来記事の削除
未来記事は、日付でフィルター↓
//Filter $nowtime = date("Y-m-d H:i:s",strtotime( "now" ));//現在時刻の取得 if($date > $nowtime){}
画像取得
「if」と「preg_match」多用で処理しているが、…軽量化の余地ありそう。
1.<content>内からを探す→画像取得OK
↓見つからない時
2.<description>内から<img>を探す→画像取得OK
↓見つからない時
3.「noimage.png」を表示
//画像取得 $content=$values["content"]["encoded"]; preg_match('/<img.*>/i', $content, $img_all); if(empty($img_all[0])) { $content = $values['description']; preg_match('/<img.*>/i', $content, $img_all); } preg_match('/http.*?(\.gif|\.png|\.jpg|\.jpeg$|\.bmp)/i', $img_all[0], $gazo); if(empty($gazo[0])) {$gazo = "http://azaz.clouver.jp/antenna/noimage.png";} else{$gazo = $gazo[0];}
キャッシュ設定
MagpieRSSの初期設定では3600秒(=60分=1時間)。キャッシュは、好きな数字に変更可↓
define('MAGPIE_CACHE_AGE','1800');//cacheを1800秒記録
define('MAGPIE_CACHE_ON', false);//cacheを残さない
その他
補足・注意点
・当記事で紹介しているプログラムは、phpが動作する環境が必要です。
・『MagpieRSS』も公式サイト(http://sourceforge.net/projects/magpierss/files/)から入手してください。最新バージョンは『magpierss-0.72』です。(2013年現在)
・アメーバブログなど、アクセスを制限しているサイトの画像表示はできません。
・Atomの画像取得には未対応。
参考・関連リンク
・アンテナサイト作成[BABEL]
・MagpieRSSを利用すると、RSSの作成が簡単に行える[はじめてのWordPressまとめ]
・MagpieRSSとMixItUpを使ってレスポンシブなアンテナサイトをつくってみた。その1[うぇぶ屋がとんだ]