はじめに
2015年12月02日にGoogle Feed APIが突如として利用できなくなり、
RSSフィードが表示されないという事態に陥った方が多いかと思います。(12/4現在は復活した模様)
筆者もその一人で急ぎ代替手段を探しましたが、調査当時は対応方法が見つからなかったり
古いバージョン(1.0系)RSSでの取得方法だったりと、欲しい代替手段を中々見つけられませんでした。
今回調査して得られた様々な対応方法を組み合わせ Google Feed API を使わない
RSS表示方法をどうにか確立出来たので、代替手段を探してる方向けに共有いたします。
JQueryを使った方法もありますが、prototype.jsを使っているページがあると競合により表示されなくなるので使用しませんでした。
実装前提は以下のとおりです。
言語: PHP5.4
RSSバージョン: 2.0
json,javascript も使用
処理の流れ
- RSSフィードを取得してjsonファイルで保存 (rss.php)
- フィードのjsonファイルを読み込みid=feedが指定されたhtmlタグを整形 (loadrss.js)
- ページアクセス時にjsを読み込ませる (hoge.html)
rss.php
<?php
//時差表記
date_default_timezone_set('Asia/Tokyo');
// 言語を日本語に設定
mb_language("ja");
// 文字エンコードを設定
mb_internal_encoding("UTF-8");
// RSSのソース元
$feed_url = "http://~~~~~~~~~~~"; <=※ここに、今まで使っていたRSS取得のURLを格納する
$rss = simplexml_load_file($feed_url);
//RSSフィードの取得指定数
$rss_num = 4;
// RSSフィードの分だけループ
$i=0;
foreach ($rss->channel->item as $item) {
//詳細・リンク・日付を、変数に格納する
$json[$i]['desc'] = (string)$item->title;
$json[$i]['link'] = (string)$item->link;
$json[$i]['date'] = (string)$item->pubDate;
//指定数になったら、取得を止める
$i++;
if($rss_num <= $i) break;
}
$fp = fopen('feed.json', 'w');
fwrite($fp, json_encode($json));
fclose($fp);
?>
loadrss.js
var data = new XMLHttpRequest();
data.open("GET", "feed.json", true);
data.onload = function() {
var json = JSON.parse(this.responseText);
//出力先要素(ID指定)を変数に格納
var container = document.getElementById("feed");
//フィードの分だけループ
for (var i = 0; i < json.length; i++) {
var entry = json[i];
var div = document.createElement("li");
var a = document.createElement("a");a.href = entry.link;
a.target = "_blank" ;
a.appendChild(document.createTextNode(entry.desc));
div.appendChild(a);
container.appendChild(div);
}
}
data.send(null);
hoge.html
<html lang="ja">
<head>
<script type="text/javascript" src="loadrss.js">
</script>
</head>
<body>
<ul id="feed"></ul>
</body>
</html>
cronスケジュールでrss.phpを毎時実行に設定すれば、1時間ごとに自動的に最新情報が読まれます。
/etc/crontab
0 * * * * hoge php /path/to/rss.php
実行タイミングはお好みでどうぞ。