RSSフィードを読み込むPHPスクリプト
Category
PHP
外部サイトのRSSフィードを読み込む方法はいくつかあります。
例えば、Google Feed API等を利用してJavascriptで実装する方法です。
私の場合、PHPが利用できない環境で使う場合が多いです(設置も簡単です!)。
自分流にカスタマイズしたい場合は、PHPでスクリプトを作成するようにしています。
PHPでRSSフィードを読み込む方法としては、PHP5から追加されたSimpleXML関数を使えば比較的簡単に実装可能です。"simplexml_load_file"で取得する方法は、PHP側の設定で"allow_url_fopen"をOnにしないといけない場合が多いため、セキュリティ上好ましいとはいえません。"curl"と"simplexml_load_string"を使って"allow_url_fopen"をOffにし、セキュリティ面も考慮した上で取得する方法がよいと思います。
ですが、取得するフィードの仕様(RSS1.0や2.0)で書き方が多少違ったり、キャッシュを保持したい場合、スクリプトを作成するかPear等のライブラリを併用しないといけません。
そこで、RSSパーサである"Magpie RSS"を使い、取得するフィードの仕様が違っても使い回せて、キャッシュの設定・RSSフィードで取得するタイトルや概要文の文字数制限・不要なhtmlやスペース等の削除がPHP側でできるスクリプトを作成してみました。
Keyword:RSSフィード,MagpieRSS,キャッシュ保持
以下の内容で紹介していきます。
※テキストリンクをクリックするとその箇所までページがスクロールします。
Magpie RSSのダウンロードと設置
Magpie RSSとは?
GPLで公開されているRSSパーサです。
PHPでリモートからRSSを取得して解析・キャッシュを行うことができます。
対応フォーマットは、RSS0.9~1.0と1.0のモジュール、RSS2.0、Atomの一部です。
まず、Magpie RSSをダウンロードします。
以下サイトより”magpierss”をダウンロードします。
⇒ Magpie RSS – PHP RSS Parser
圧縮ファイルを解凍し中身を見ると、以下のような構成になっています。
補足
必要なファイルは”extlib”と”incファイル(rss_cache.inc、rss_fetch.inc、rss_parse.inc、rss_utils.inc)”です。
次に、キャッシュ保存用のフォルダを作成し、必要なファイル全てを”magpierss”等のフォルダ内に格納し、サーバーにアップロードします。
※cacheディレクトリのパーミッションは777等に変更してください。
MagpieRSSを使ってRSSフィードを取得するPHPスクリプトを作成する
feed.phpを作成し、Magpie RSSで以下のような設定をできるようにします。
- キャッシュ設定(キャッシュ保存期間とキャッシュ保存ディレクトリの設定)
- エンコード設定
- フィードの表示件数の設定
- 取得するタイトル・概要(抜粋)の文字数制限
- 取得する概要(抜粋)で不要なhtmlタグやスペースを削除
- RSSのフォーマット別に投稿日時を取得
feed.php
<?php // モジュール読込 require_once('magpierss/rss_fetch.inc'); // キャッシュ設定(キャッシュ保存期間を60分に設定) define('MAGPIE_CACHE_AGE', 60*60); // キャッシュ保存ディレクトリ define('MAGPIE_CACHE_DIR', 'magpierss/cache/'); // エンコード設定 define('MAGPIE_OUTPUT_ENCODING', 'UTF-8'); // フィードのURL $url = 'http://webcreator-net.com/feed/'; $rss = fetch_rss($url); // フィードの表示件数 $max = 5; // ループ処理 $i=1; // サイト名 echo "<h2 style=\"margin-bottom: 30px;\">".$rss->channel['title']."</h2>\n"; foreach ($rss->items as $item) { // 記事へのリンクを取得 $href = $item['link']; // 記事タイトルを取得 $title = $item['title']; // 概要(抜粋)を取得 $desc = $item['description']; // タイトル・概要(抜粋)の文字数を丸める $title = mb_strimwidth($title, 0, 50, "..."); $desc = mb_strimwidth($desc, 0, 200, "..."); // 概要(抜粋)のhtmlタグを削除 $desc = strip_tags($desc); // 概要(抜粋)の (半角スペース)と全角スペースを削除 $desc = str_replace(" ", "", $desc); $desc = str_replace(" ", "", $desc); $desc = str_replace(" ", "", $desc); // RSSのフォーマット別に投稿日時を取得 $timestamp = $item['date_timestamp']; if($timestamp == '') $timestamp = strtotime($item['dc']['date']); // 取得した投稿日時をdate関数で整形 $timestamp = date('Y/m/d', $timestamp); // 取得した内容をhtmlで出力 echo "<dl>"; echo "<dt style=\"margin-bottom: 7px;\"><span style=\"margin-right: 15px;\">".$timestamp."</span><a href=\"".$href."\" target=\"_blank\">".$title."</a></dt>"; echo "<dd style=\"margin: 0px 0px 25px 0px;padding-bottom: 25px;border-bottom: 1px dotted #969696;\">".$desc."</dd>"; echo "</dl>"; // ループ処理時に$iの値に1を追加 $i++; // $iの値が$maxの値を超えた場合ループを終了 if($i > $max){break;} } ?>
補足
●モジュール読込
Magpie RSSの”rss_fetch.inc”のパスを指定します。
●キャッシュ設定(キャッシュ保存期間を60分に設定)
キャッシュ設定をしていないとリロードする度にフィードを読み込みサーバー負荷の原因にもなりますので、例では60分に設定しました。
●キャッシュ保存ディレクトリ
キャッシュを保存するディレクトリを指定します。
●エンコード設定
出力するエンコードを指定します(日本語のサイトの場合UTF-8)。
これでも文字バケするような場合は、Magpie RSSのincファイルも変更します。
rss_fetch.incの360行目辺りの以下を変更します。
define(‘MAGPIE_OUTPUT_ENCODING’, ‘ISO-8859-1‘);
↓
define(‘MAGPIE_OUTPUT_ENCODING’, ‘UTF-8‘);
●フィードのURL
取得したいフィードのURLを指定します。
●フィードの表示件数
取得したフィードの表示件数を指定します。
●タイトル・概要(抜粋)の文字数を丸める
取得したフィードのタイトル・概要(抜粋)の文字数を制限します。
mb_strimwidth関数は、指定した幅で文字列を丸めて表示します。
mb_substr関数は、半角英数も全角文字も1文字として扱いますが、mb_strimwidth関数は、半角を1文字、全角を2文字として扱うという違いがあります。
[参考リンク]
mb_strimwidth関数
●概要(抜粋)のhtmlタグを削除
取得したフィードの概要(抜粋)にhtmlタグが含まれる場合、そのタグを削除します。
※PHPを含む場合、PHPも削除します。
●概要(抜粋)の (半角スペース)と全角スペースを削除
取得したフィードの概要(抜粋)に (半角スペース)と全角スペースが含まれる場合、そのスペースを削除します。
●RSSのフォーマット別に投稿日時を取得
日程の取得に関しては、RSSのフォーマットごとに配列のキーが異なりますので、このように書くことでRSS1.0とRSS2.0両方の日程を正確に取得することができます。
[RSS1.0]
$date = $item[‘dc’][‘date’];
[RSS2.0]
$date = $item[‘pubdate’]
と記述を分けなくてもよいということです。
※設定は取得内容に合わせて変更してください。
※echo文の箇所は、デザインに合わせて変更してください。
デモページで表示を確認する
RSSフィードを取得したデモページを用意しました。
2つのサイトからRSSフィードを取得しています。
1つは当サイトのRSSフィードで、WordPressで構築していますので、フィードのフォーマットはRSS2.0です。
もう1つはITmediaのRSSフィードで、フィードのフォーマットはRSS1.0です。
アメーバブログ等のPR広告を表示させないようにする方法 2012.9.3追記
フォームからのお問い合わせでもちょくちょくいただく、”アメーバブログ等のPR広告を表示させたくない場合のRSSフィードの取得”に関して追記します。
「PR広告を表示させない」+「表示件数にPR広告は含まない」といった記述を追記することでも対応できるのですが、もっと簡単な方法を紹介します。
※もちろん、アメーバブログ以外のPR広告も削除できます。
1.米国版Yahoo! IDを取得する
Flickrのアカウントを取得されている方は、米国版Yahoo! IDを使用していると思いますので、それでも構いません。
以下URLにアクセスし、米国版Yahoo! IDでログインします。
※Internet Explorerでは、Pipeが保存できませんので、Firefox等を使いましょう。
⇒ Pipes
2.Pipeを作成する
▼[Create a Pipe]ボタンをクリック
▼Pipeを作成する
“Sources”の中の”Fetch Feed”を選び、RSSフィードのURLを入力します。
“Operators”の中の”Filter”を選び、「item.title」を選択、「PR:」と入力します。
各パーツをつなげ、上部にある[Save]ボタンをクリックし、「Pipe Name」に任意のPipe Nameを入力した後、その下にある[Save]ボタンをクリックします。
※My Pipesの中に保存されます([Back to My Pipes]からも遷移可能)。
※保存内容が反映されるのにしばらく時間がかかります(10分位)。
▼PR広告なしのRSSフィードのURLを取得
下部にPR広告なしのフィードが表示されます。
[Get as RSS]をクリックすると、RSSフィードのページに遷移しますので、そのURLを控えておきます(feed.phpで使用します)。
※Pipe Nameは、”PR Delete”としました。
3.feed.phpを一部編集する
feed.php
<?php // モジュール読込 require_once('magpierss/rss_fetch.inc'); // キャッシュ設定(キャッシュ保存期間を60分に設定) define('MAGPIE_CACHE_AGE', 60*60); // キャッシュ保存ディレクトリ define('MAGPIE_CACHE_DIR', 'magpierss/cache/'); // エンコード設定 define('MAGPIE_OUTPUT_ENCODING', 'UTF-8'); // フィードのURL(PR広告削除用) $url = 'http://pipes.yahoo.com/pipes/pipe.run?_id=~&_render=rss'; $rss = fetch_rss($url); // フィードのURL(サイト名表示用) $url_ttl = 'http://~'; $rss_ttl = fetch_rss($url_ttl); // フィードの表示件数 $max = 5; // ループ処理 $i=1; // サイト名 echo "<h2 style=\"margin-bottom: 30px;\">".$rss_ttl->channel['title']."</h2>\n"; foreach ($rss->items as $item) { // 記事へのリンクを取得 $href = $item['link']; // 記事タイトルを取得 $title = $item['title']; // 概要(抜粋)を取得 $desc = $item['description']; // タイトル・概要(抜粋)の文字数を丸める $title = mb_strimwidth($title, 0, 50, "..."); $desc = mb_strimwidth($desc, 0, 200, "..."); // 概要(抜粋)のhtmlタグを削除 $desc = strip_tags($desc); // 概要(抜粋)の (半角スペース)と全角スペースを削除 $desc = str_replace(" ", "", $desc); $desc = str_replace(" ", "", $desc); $desc = str_replace(" ", "", $desc); // RSSのフォーマット別に投稿日時を取得 $timestamp = $item['date_timestamp']; if($timestamp == '') $timestamp = strtotime($item['dc']['date']); // 取得した投稿日時をdate関数で整形 $timestamp = date('Y/m/d', $timestamp); // 取得した内容をhtmlで出力 echo "<dl>"; echo "<dt style=\"margin-bottom: 7px;\"><span style=\"margin-right: 15px;\">".$timestamp."</span><a href=\"".$href."\" target=\"_blank\">".$title."</a></dt>"; echo "<dd style=\"margin: 0px 0px 25px 0px;padding-bottom: 25px;border-bottom: 1px dotted #969696;\">".$desc."</dd>"; echo "</dl>"; // ループ処理時に$iの値に1を追加 $i++; // $iの値が$maxの値を超えた場合ループを終了 if($i > $max){break;} } ?>
補足
変更箇所は、反転表示されている15~17行目のURLの箇所。
19~21行目の変数名とURLの箇所。
29~30行目のecho文内の変数名の箇所。
●フィードのURL(PR広告削除用)
“PR広告なしのRSSフィードのURLを取得”のところで控えておいたRSSフィードのURLを入力します(※“~”の箇所には、idが英数字で表示されます)。
●フィードのURL(サイト名表示用)
このままでは、Pipe Name(PR Delete)が表示されてしまうので、サイト名用の変数名に変更し、通常のRSSフィードのURLを入力します(※“http://~”の箇所には、通常のRSSフィードのURLを入力してください。サイト名を表示させない場合、19~21行目は必要ありません)。
以下の”Demo Page”ボタンをクリックすると、ラティア(社名)さんが公開されているアメーバブログ「ホームページ作成 ウェブデザイナー日記」のフィードが表示されます(PR広告が出なくなっているはずです)。
個人でアメーバブログは公開しておりませんので、上記のブログのフィードを取得させていただきましたことご了承ください。
関連記事(※当記事と関連性が高いと思われる記事)
Flickr APIで画像情報を取得するPHPスクリプト
2012/03/20CentOSにPHP5.3をインストール
2012/04/04APCでPHPの処理を高速化
2012/06/12PHPを5.3系にアップデートしました
2012/04/01CentOSでPHPのバージョンをアップデート
2011/12/23おすすめ書籍・商品(※当記事と関連性が高いと思われる書籍・商品)