Rss/Atomフィードデータ取得して出力する方法

RSSデータを取得して出力する方法をご紹介したいと思います。
なんとなく今更感たっぷりですが、まあ、使える用途はあると思います。

個人的に使うのならリーダーで見たら良いのですけど不特定多数に紹介するという方法なら利用価値有るのではないでしょうか?

個人的にsimplexml_load_stringの関数を使ってみたかっただけなんです。
でも汎用性が有るように作ってみました。結構便利な関数です。今回cURLという関数も初めて知りました。
参考サイトたくさんあったのですが、いくつかわからなくなりました(汗)


スポンサーリンク

RSS/ATOM取得コード

まず2つの関数を作ります。ファイルの一番上とかに記述しておいたら良いでしょう。
xmlデータを読み込んで出力する関数です。

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
<?php
function rss_get_contents($url){
	$curl = curl_init();
	curl_setopt($curl, CURLOPT_URL, $url );
	curl_setopt($curl, CURLOPT_HEADER, false );
	curl_setopt($curl, CURLOPT_RETURNTRANSFER, true );
	curl_setopt($curl, CURLOPT_FOLLOWLOCATION, true);
	curl_setopt($curl, CURLOPT_MAXREDIRS, 1);
	$result = curl_exec($curl);
	curl_close($curl);
	return $result;
}
 
function outPutRss($rss, $maxsize = 5) {
 
	if (isset($rss->channel->title)) {
		$site_name = $rss->channel->title;
		$site_url  = $rss->channel->link;
	} else {
		$site_name = $rss->title;
		$site_url  = $rss->link['href'];
	}
 
	printf('<h2><a href="%s" target="_blank">%s</a></h2>',  $site_url, $site_name);
 
	if (isset($rss->item)) {
		$items = $rss->item;
	} elseif (isset($rss->channel->item)) {
		$items = $rss->channel->item;
	} else {
		$items = $rss->entry;
	}
 
	$i = 0;
	foreach ($items as $item) {
		if($i >= $maxsize){
			break;
		} else {
			$i++;
			if (isset($item->link)) {
				$link = $item->link;
			} else {
				$link = $item->link['href'];
			}
 
			$title = $item->title;
			if (isset($item->description)) {
				$content = $item->description;
			} else {
				$content = $item->content;
			}
			$content = strip_tags($content);
			$content = mb_strimwidth($content, 0, 300, '・・・', 'UTF-8');
			$pubDate = $item->children('http://purl.org/dc/elements/1.1/');
			if (isset($item->pubDate)) {
				$time = $item->pubDate;
			} elseif (isset($pubDate->date)) {
				$time = $pubDate->date;
			} elseif (isset($item->issued)) {
				$time = $item->issued;
			} else {
				$time = $item->published;
			}
			$dt = new DateTime($time);
			$time = $dt->format('Y/m/d H:i:s');
			printf('<dt><a href="%s" target="_blank">%s</a>(%s)</dt>', $link, $title, $time);
			printf('<dd>%s</dd>', $content);
		}
	}
}
;?>

あとはHTMLの中に下記を入れてしまえば出来上がりです。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<?php 
$rss_urls = array(
	"http://feeds.feedburner.com/hatena/b/hotentry",
	"http://jp.techcrunch.com/feed/",
	"http://feeds.lifehacker.jp/rss/lifehacker/index.xml",
	"http://rss.dailynews.yahoo.co.jp/fc/rss.xml",
	"http://rss.itmedia.co.jp/rss/2.0/topstory.xml",
);
 
foreach ($rss_urls as $url) :
$result = rss_get_contents($url);
$rss = simplexml_load_string($result);
;?>
<dl>
<?php outPutRss($rss,10);?>
</dl>
<?php endforeach;?>

これで出力されます。$rss_urlsに複数のフィードのURLを入れていけば、複数取得します。
outPutRss($rss,10)の10は件数ですそのサイト最新の10件を取得します。20でも3でもすきなように数字を変えてください。

何個かのブログで試してみましたが、googleとかのRSSはなぜか取得できませんでした。。。。
だいたい主要なものはうまく取得できているのですが、取得できないものもございますのでご了承くださいませ。

以上ですー

デモサイト

参考サイト
PHPでRSSを読み込む方法
PHPのプログラムからRSSを取得する方法
PHPメモ:file_get_contentsの代替にcURLを使う

Pocket
LINEで送る

スポンサーリンク

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です