PHPでRSSやAtomのフィードを取得する方法

PHPでRSSやAtomのフィードを取得する方法

この記事では、PHPを使って、ブログのRSSやAtomといったフィードのデータを読み込む方法を説明します。「Amebloの新着情報をリアルタイムで自分のウェブサイトに掲載したい」などといった場合に役立ちます。

サンプルデモ

下記は、2017年4月24日時点の、the pillowsの山中さわおさんのブログのフィードを取得し、タイトルと更新日時を最新5件まで表示させたものです。

ライブラリの入手

RSSやAtomフィードを読み込むための、便利なライブラリがあるので、それに便りましょう。いわゆるRSSパーサーで有名なものだと、MagpieRSSというライブラリがあるのですが、こちらは更新が止まっているようで、PHPのバージョンが高いと、色々と警告が出てしまったりと不具合があります。今回は、rss-phpというライブラリを利用してみましょう。

ダウンロードしたZIPファイル内に含まれる、Feed.phpのみを使用します。

rss-php-master.zip

  • rss-php-master
    • src
      • Feed.php

プログラミング

ライブラリを読み込む

ライブラリの使い方は簡単です。まずは、ライブラリファイルを読み込んで下さい。

PHP

require_once "./Feed.php" ;

続いて、インスタンスを作成します。好きな変数を決めて下さいね。サンプルでは$feedという変数にしてあります。

PHP

$feed = new Feed ;

フィードを読み込む

次に、loadRss()、またはloadAtom()というメソッドを利用して、フィードを読み込みます。RSSの場合と、Atomの場合で違うので、使い分けて下さいね。

PHP

// フィードのURL
$url = "http://syncer.jp/feed" ;

// RSSの場合
$rss = $feed->loadRss( $url ) ;

// Atomの場合
$atom = $feed->loadAtom( $url ) ;

各エントリーを処理する

取得した各エントリーは、$rss->item(または$atom->item)に、配列形式で複数含まれているので、foreach()でループ処理します。

PHP

foreach( $rss->item as $item )
{
	// 各エントリーの処理
}

フィードの構造は、ブログの種類によって違います。例えば、各エントリーが下記のようになっているフィードを処理するとしましょう。

XML

<item>
	<title>【閉店】中華そば椿@西新井-分厚く柔らかな肉とボリューム満点のつけ麺!</title>
	<link>tsubaki-adachiku-nishiarai</link>
	<pubDate>Fri, 13 Sep 2013 17:30:00 +0900</pubDate>
	<description><![CDATA[
閉店情報を追加しました。足立区西新井で一番の人気ラーメン店「中華そば椿」。アンデス高原豚の分厚くて柔らかいお肉と、ボリューム満点の麺が魅力。
	]]></description>
	<author>info@syncer.jp (Yuta Arai)</author>
	<guid isPermaLink="true">tsubaki-adachiku-nishiarai</guid>
</item>

値を取り出すには、各要素名を指定して下さい。次の通りです。簡単ですね。

PHP

// タイトル
$title = $item->title ;

// リンク
$link = $item->link ;

// 更新日時のUNIX TIMESTAMP
$timestamp = strtotime( $item->pubDate ) ;

// 詳細
$description = $item->description ;

例えば、dc:dateのような、特殊な要素名を取得する場合は、下記のように、波括弧とシングルクオートを利用して下さいね。

PHP

// 日時
//<dc:date>2015-02-25T18:00:00+09:00</dc:date>

// 更新日時のUNIX TIMESTAMP
$timestamp = strtotime( $item->{'dc:date'} ) ;

サンプルコード

一連の処理をまとめると、次の通りになります。ブログ(フィードの構造)の種類によって、処理を使い分けて下さい。

PHP

<?php

// ライブラリの読み込み
require_once "./Feed.php" ;
$feed = new Feed ;

// フィードのURL
$url = "https://syncer.jp/feed" ;

// RSSの場合
$rss = $feed->loadRss( $url ) ;

foreach( $rss->item as $item )
{
	// 各エントリーの処理
	$title = $item->title ;	// タイトル
	$link = $item->link ;	// リンク
	$timestamp = strtotime( $item->pubDate ) ;	// 更新日時のUNIX TIMESTAMP
	$description = $item->description ;	// 詳細

	// 表示
	echo '<a href="' . $link . '">' . $title . '</a> (' . date( "Y/m/d H:i" , $timestamp ) . ')<br>' ;
}

複数のブログに対応した処理

フィードの構造が違うといっても、日付以外の情報は、大体は共通しています。複数のブログに対応した日付(UNIX TIMESTAMP)の取得方法を書いてみたので、よろしければご利用下さい。Ameblo、Jugem、FC2、Livedoor、WordPress、はてなブログといった基本的なブログに対応しています。

PHP

// 日付の取得(UNIX TIMESTAMP)
foreach( array( "pubDate" , "date_timestamp" , "dc:date" , "published" , "issued" ) as $time )
{
	if( isset( $item->{ $time } ) && !empty( $item->{ $time } ) )
	{
		$timestamp = ( is_int( $item->{ $time } ) ) ? $item->{ $time } : strtotime( $item->{ $time } ) ;
		break ;
	}
}

// 仮に日付が取得できなかったらとりあえず現在時刻でも…(笑)
if( !isset( $timestamp ) )
{
	$timestamp = time() ;
}

ダウンロード

この記事で紹介した内容を1つのプログラムにしました。ダウンロードして、動作確認にご利用下さい。rss-phpに関しては、別途、GitHubからダウンロードして下さい。

ファイル一覧

SYNCER00299
Feed.php
get-feed.php Download

ファイル名をクリックすると内容を確認できます。「Download Zip」をクリックするとファイル一式をダウンロードできます。

Feed.phpはzipファイルの中に含まれていません。

Download Zip