アンテナサイトを作ってみる。
『simplexml_load_file』でアンテナサイトを作る
まず、アンテナサイトの基本、RSSを読み込んで配信してみる。
外部RSSをPHPで取得するには、関数「simplexml_load_file」を使う。
※「simplexml_load_file」はサーバーのphp.ini設定で「allow_url_fopen」を有効にしないと使えないので注意
![]() |
タイトル:よくわかるPHPの教科書
著者:たにぐち まこと 出版社:毎日コミュニケーションズ 発行日:2010-09-14 |
入門書『よくわかるPHPの教科書』のサンプルを参考に書く↓
1 2 3 4 5 6 7 8 9 | <?php 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」で取得↓
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | <?php 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修正)↓
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 | <?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 ); 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)」を参考に。
追加機能は、画像の取得、未来記事の削除。
未来記事の削除
未来記事は、日付でフィルター↓
1 2 3 | //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」を表示
1 2 3 4 5 6 7 8 9 10 | //画像取得 $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 ); else { $gazo = $gazo [0];} |
キャッシュ設定
MagpieRSSの初期設定では3600秒(=60分=1時間)。キャッシュは、好きな数字に変更可↓
1 | define( 'MAGPIE_CACHE_AGE' , '1800' ); //cacheを1800秒記録 |
1 | 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[うぇぶ屋がとんだ]