PHP

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,キャッシュ保持

RSSフィードを読み込むPHPスクリプト

以下の内容で紹介していきます。
テキストリンクをクリックするとその箇所までページがスクロールします。

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

圧縮ファイルを解凍し中身を見ると、以下のような構成になっています。

Magpie RSS

補足

必要なファイルは”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);

        // 概要(抜粋)の&nbsp;(半角スペース)と全角スペースを削除
        $desc = str_replace("&nbsp;", "", $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も削除します。

●概要(抜粋)の&nbsp;(半角スペース)と全角スペースを削除
取得したフィードの概要(抜粋)に&nbsp;(半角スペース)と全角スペースが含まれる場合、そのスペースを削除します。

●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です。

Demo Page

アメーバブログ等の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]ボタンをクリック

Pipes1

▼Pipeを作成する

Pipes2

“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を取得

Pipes3

下部に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);

        // 概要(抜粋)の&nbsp;(半角スペース)と全角スペースを削除
        $desc = str_replace("&nbsp;", "", $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広告が出なくなっているはずです)。

個人でアメーバブログは公開しておりませんので、上記のブログのフィードを取得させていただきましたことご了承ください。

Demo Page

List

関連記事(※当記事と関連性が高いと思われる記事)

Flickr APIで画像情報を取得するPHPスクリプト

2012/03/20
Flickr APIで画像情報を取得するPHPスクリプト
スコア:18 ※スコアの数値が大きいほど、関連性の高い記事です。 2014.7.6追記 久しぶりの追記です...。 久方ぶりに!?当サイトを見てみたら、Flickr画像が取得できていない状態になっていました。また、数件お問い合わせで「... 続きを読む...

CentOSにPHP5.3をインストール

2012/04/04
CentOSにPHP5.3をインストール
スコア:17 ※スコアの数値が大きいほど、関連性の高い記事です。 以下を前提にインストールするものとします。 CentOS5系でのインストール手順 PHP5.3とMySQLをインストール 基本、デフォルトのリポジトリ経由でインストール... 続きを読む...

APCでPHPの処理を高速化

2012/06/12
APCでPHPの処理を高速化
スコア:16 ※スコアの数値が大きいほど、関連性の高い記事です。 PHPアクセレーターAPCとは? PHPアクセレーターとは、PHPのスクリプトを最適化してコンパイルされた状態でデータをキャッシュし、以後同じデータにアクセスがあった際... 続きを読む...

PHPを5.3系にアップデートしました

2012/04/01
PHPを5.3系にアップデート
スコア:16 ※スコアの数値が大きいほど、関連性の高い記事です。 サーバー移行を行ったついでにPHPを5.3系にアップデートしました。 サイト公開時は、とりあえずWordPressの最新版がインストールできる環境(PHPはVer.5.... 続きを読む...

CentOSでPHPのバージョンをアップデート

2011/12/23
CentOS
スコア:16 ※スコアの数値が大きいほど、関連性の高い記事です。 CentOSでyumを使ってPHPを5.2系にアップデートする手順 外部のリポジトリでよく聞くのは以下の2つだと思います。 ・Les RPM de Remi ・Utte... 続きを読む...

おすすめ書籍・商品(※当記事と関連性が高いと思われる書籍・商品)

ページの先頭へ