LAMPサーバーの応用で、PHPを使ってRSSフィードを表示させるにはどうしたらいいんだろうと思って調べてみたら、PHP5であれば、「simplexml_load_file」という関数で比較的簡単にRSSフィードを取得することができることがわかりました。ただし、titleやlinkなどの要素の構成がサイトによって微妙に異なるため、それぞれのRSSフィードのソースファイルの構造を確認して、記述方法を工夫する必要があります。以下、RSSとAtomのケースが混在していますが、それぞれのサービスに対応したコードになっているはずです。
Twitterの特定のユーザのつぶやきを表示させたり、ニコニコ動画の最新動画のリストや、YouTubeで特定のキーワードを検索した動画のリストをサムネール入りで表示させることもできます。
※ 色付けやレイアウトはCSSで指定しています。
ざっと確認したところ、次の3つのパターンに当てはまるものが多いようです。
【パターン1】
それぞれのエントリーのtitle要素とlink要素がitem要素で囲まれていて、URLがlink要素に挟まれたテキストで指定されている。
【パターン2】
それぞれのエントリーのtitle要素とlink要素がitem要素で囲まれていて、さらに全体がchannel要素で囲まれ、URLがlink要素に挟まれたテキストで指定されている。
【パターン3】(Atom?)
それぞれのエントリーのtitle要素とlink要素がentry要素で囲まれていて、URLがlink要素のhref属性で指定されている。
以下のコードに出てくる変数は、次のように各項目と対応しています。
$rssurl = rssやatomのフィードのURL
$outdata = 表示する項目
$num_of_data = 表示する項目の数
http://blog.livedoor.jp/ユーザ名/atom.xml
● フィードの構成
<entry>
<title>記事タイトル</title>
<link rel="alternate" type="text/html" href="URL" />
(コンテンツ)
</entry>
(独学Linuxの例)
<?php
$rssurl = "http://blog.livedoor.jp/vine_user/atom.xml";
$xml = simplexml_load_file($rssurl);
$num_of_data = 4;
$outdata = "";
for ($i=0; $i<$num_of_data; $i++){
$outdata .= "<li>";
$outdata .= "<a href=\"";
$outdata .= $xml->entry[$i]->link[href];
$outdata .= "\">";
$outdata .= $xml->entry[$i]->title;
$outdata .= "</a><br />\n";
$outdata .= "</li>";
}
print $outdata;
?>
http://(サイト名).blogspot.jp/atom.xml?alt=rss
● RSSフィードの構成
<channel xxxxxxx>
<item xxxxxxxxxx>
<title>記事タイトル</title>
<link>URL</link>
(コンテンツ)
</item>
</channel>
(Online Physicsの例)
<h4>Online-Physics Blogger</h4>
<?php
$rssurl = "http://online-physics.blogspot.jp/atom.xml?alt=rss";
$xml = simplexml_load_file($rssurl);
$num_of_data = 3;
$outdata = "";
for ($i=0; $i<$num_of_data; $i++){
$outdata .= "<li>";
$outdata .= "<a href=\"";
$outdata .= $xml->channel->item[$i]->link;
$outdata .= "\">";
$outdata .= $xml->channel->item[$i]->title;
$outdata .= "</a><br />\n";
$outdata .= "</li>";
}
print $outdata;
?>
https://twitter.com/statuses/user_timeline/アカウント名.rss
● RSSフィードの構成
<channel xxxxxxx>
<item>
<title>記事タイトル</title>
<link>URL</link>
(コンテンツ)
</item>
</channel>
※ アカウント名の部分に表示したいユーザのアカウントを入れてください。
<?php
$rssurl = "https://twitter.com/statuses/user_timeline/アカウント名.rss";
$xml = simplexml_load_file($rssurl);
$num_of_data = 10;
$outdata = "";
for ($i=0; $i<$num_of_data; $i++){
$outdata .= "<p>";
$outdata .= "<a href=\"";
$outdata .= $xml->channel->item[$i]->link;
$outdata .= "\">";
$outdata .= $xml->channel->item[$i]->title;
$outdata .= "</a><br />\n";
$outdata .= "</p>";
}
print $outdata;
?>
http://www.nicovideo.jp/newarrival?rss=atom
● フィードの構成
<entry>
<title>記事タイトル</title>
<link rel="alternate" type="text/html" href="URL" />
(コンテンツ)
</entry>
※ サムネールと解説と日付は、それぞれ<p>要素で囲まれていて、それら全体が<content>要素に挟まれています。
※ サムネールの右側が空白になってしまうのが難点。
<?php
$rssurl = "http://www.nicovideo.jp/newarrival?rss=atom";
$xml = simplexml_load_file($rssurl);
$num_of_data = 3;
$outdata = "";
for ($i=0; $i<$num_of_data; $i++){
$outdata .= "<li>";
$outdata .= "<a href=\"";
$outdata .= $xml->entry[$i]->link[href];
$outdata .= "\">";
$outdata .= $xml->entry[$i]->title;
$outdata .= "</a><br />\n";
$outdata .= "</li><p>";
$outdata .= $xml->entry[$i]->content;
$outdata .= "</p>";
}
print $outdata;
?>
http://www.youtube.com/rss/tag/(キーワード).rss
● RSSフィードの構成
<channel xxxxxxx>
<item>
<title>記事タイトル</title>
<link>URL</link>
(コンテンツ)
</item>
</channel>
※ サムネールや解説などは<description>要素で囲まれています。ratingなどが右にはみ出してしまうのが難点。
<?php
$rssurl = "http://www.youtube.com/rss/tag/(キーワード).rss"
$xml = simplexml_load_file($rssurl);
$num_of_data = 3;
$outdata = "";
for ($i=0; $i<$num_of_data; $i++){
$outdata .= "<li>";
$outdata .= "<a href=\"";
$outdata .= $xml->channel->item[$i]->link;
$outdata .= "\">";
$outdata .= $xml->channel->item[$i]->title;
$outdata .= "</a><br />\n";
$outdata .= "</li>";
$outdata .= $xml->channel->item[$i]->description;
$outdata .= "";
}
print $outdata;
?>
上記のコードは、構成が同じなら$rssurlの部分のみを変更すれば、他のサイトのデータを利用することもできるはずです。
某巨大掲示板の新着データを収集するRSSを提供しているサイトもあるようですし、投稿されたコメントの実況中継もできそうですね。興味ないので、やりませんけど(笑
ツイート
Twitterの特定のユーザのつぶやきを表示させたり、ニコニコ動画の最新動画のリストや、YouTubeで特定のキーワードを検索した動画のリストをサムネール入りで表示させることもできます。
※ 色付けやレイアウトはCSSで指定しています。
ざっと確認したところ、次の3つのパターンに当てはまるものが多いようです。
【パターン1】
それぞれのエントリーのtitle要素とlink要素がitem要素で囲まれていて、URLがlink要素に挟まれたテキストで指定されている。
【パターン2】
それぞれのエントリーのtitle要素とlink要素がitem要素で囲まれていて、さらに全体がchannel要素で囲まれ、URLがlink要素に挟まれたテキストで指定されている。
【パターン3】(Atom?)
それぞれのエントリーのtitle要素とlink要素がentry要素で囲まれていて、URLがlink要素のhref属性で指定されている。
以下のコードに出てくる変数は、次のように各項目と対応しています。
$rssurl = rssやatomのフィードのURL
$outdata = 表示する項目
$num_of_data = 表示する項目の数
ライブドア・ブログのフィードを取得する
● フィードのURLhttp://blog.livedoor.jp/ユーザ名/atom.xml
● フィードの構成
<entry>
<title>記事タイトル</title>
<link rel="alternate" type="text/html" href="URL" />
(コンテンツ)
</entry>
(独学Linuxの例)
<?php
$rssurl = "http://blog.livedoor.jp/vine_user/atom.xml";
$xml = simplexml_load_file($rssurl);
$num_of_data = 4;
$outdata = "";
for ($i=0; $i<$num_of_data; $i++){
$outdata .= "<li>";
$outdata .= "<a href=\"";
$outdata .= $xml->entry[$i]->link[href];
$outdata .= "\">";
$outdata .= $xml->entry[$i]->title;
$outdata .= "</a><br />\n";
$outdata .= "</li>";
}
print $outdata;
?>
BloggerのRSSフィードを取得する
● RSSフィードのURLhttp://(サイト名).blogspot.jp/atom.xml?alt=rss
● RSSフィードの構成
<channel xxxxxxx>
<item xxxxxxxxxx>
<title>記事タイトル</title>
<link>URL</link>
(コンテンツ)
</item>
</channel>
(Online Physicsの例)
<h4>Online-Physics Blogger</h4>
<?php
$rssurl = "http://online-physics.blogspot.jp/atom.xml?alt=rss";
$xml = simplexml_load_file($rssurl);
$num_of_data = 3;
$outdata = "";
for ($i=0; $i<$num_of_data; $i++){
$outdata .= "<li>";
$outdata .= "<a href=\"";
$outdata .= $xml->channel->item[$i]->link;
$outdata .= "\">";
$outdata .= $xml->channel->item[$i]->title;
$outdata .= "</a><br />\n";
$outdata .= "</li>";
}
print $outdata;
?>
Twitterのつぶやきを表示する
● RSSフィードのURLhttps://twitter.com/statuses/user_timeline/アカウント名.rss
● RSSフィードの構成
<channel xxxxxxx>
<item>
<title>記事タイトル</title>
<link>URL</link>
(コンテンツ)
</item>
</channel>
※ アカウント名の部分に表示したいユーザのアカウントを入れてください。
<?php
$rssurl = "https://twitter.com/statuses/user_timeline/アカウント名.rss";
$xml = simplexml_load_file($rssurl);
$num_of_data = 10;
$outdata = "";
for ($i=0; $i<$num_of_data; $i++){
$outdata .= "<p>";
$outdata .= "<a href=\"";
$outdata .= $xml->channel->item[$i]->link;
$outdata .= "\">";
$outdata .= $xml->channel->item[$i]->title;
$outdata .= "</a><br />\n";
$outdata .= "</p>";
}
print $outdata;
?>
ニコニコ動画の最新動画をサムネール付きで表示する
● フィードのURLhttp://www.nicovideo.jp/newarrival?rss=atom
● フィードの構成
<entry>
<title>記事タイトル</title>
<link rel="alternate" type="text/html" href="URL" />
(コンテンツ)
</entry>
※ サムネールと解説と日付は、それぞれ<p>要素で囲まれていて、それら全体が<content>要素に挟まれています。
※ サムネールの右側が空白になってしまうのが難点。
<?php
$rssurl = "http://www.nicovideo.jp/newarrival?rss=atom";
$xml = simplexml_load_file($rssurl);
$num_of_data = 3;
$outdata = "";
for ($i=0; $i<$num_of_data; $i++){
$outdata .= "<li>";
$outdata .= "<a href=\"";
$outdata .= $xml->entry[$i]->link[href];
$outdata .= "\">";
$outdata .= $xml->entry[$i]->title;
$outdata .= "</a><br />\n";
$outdata .= "</li><p>";
$outdata .= $xml->entry[$i]->content;
$outdata .= "</p>";
}
print $outdata;
?>
YouTubeの検索動画をサムネール付きで表示する
● RSSフィードのURLhttp://www.youtube.com/rss/tag/(キーワード).rss
● RSSフィードの構成
<channel xxxxxxx>
<item>
<title>記事タイトル</title>
<link>URL</link>
(コンテンツ)
</item>
</channel>
※ サムネールや解説などは<description>要素で囲まれています。ratingなどが右にはみ出してしまうのが難点。
<?php
$rssurl = "http://www.youtube.com/rss/tag/(キーワード).rss"
$xml = simplexml_load_file($rssurl);
$num_of_data = 3;
$outdata = "";
for ($i=0; $i<$num_of_data; $i++){
$outdata .= "<li>";
$outdata .= "<a href=\"";
$outdata .= $xml->channel->item[$i]->link;
$outdata .= "\">";
$outdata .= $xml->channel->item[$i]->title;
$outdata .= "</a><br />\n";
$outdata .= "</li>";
$outdata .= $xml->channel->item[$i]->description;
$outdata .= "";
}
print $outdata;
?>
上記のコードは、構成が同じなら$rssurlの部分のみを変更すれば、他のサイトのデータを利用することもできるはずです。
某巨大掲示板の新着データを収集するRSSを提供しているサイトもあるようですし、投稿されたコメントの実況中継もできそうですね。興味ないので、やりませんけど(笑
ツイート
成功挨拶
Good article, thanks for sharing
success greeting