コケムスシェルター

アンテナサイト入門【PHP】

アンテナサイトを作ってみる。
→完成サンプル

『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>";
?>

これで日付と、リンク付きの記事タイトルがリスト表示される。
→テスト1

画像取得

文字だけではさみしいので、画像も表示してみる。
画像は、「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>";

}
?>

→テスト3

『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[うぇぶ屋がとんだ]

コメントを残す

メールアドレスが公開されることはありません。