2016/10/15(土)Google Feed APIの代替その2

Google Feed APIの代替からの続きです。

 開発の終わったMagpieRSSを使い続けるのも少し心配なので、今もメンテナンスされているSimplePieを使ってみた。公式サイトからダウンロードしたファイルのうち、libraryフォルダとautoloader.phpをサーバーにアップして、RSSの指定と表示の加工をするスクリプトを同じ階層に置けばいい。サンプルは以下。

 simplepieget.php

 いろんなサイトを参考にして書いたスクリプトは以下。

 simplepieget.txt

 これをMODXで使おうと思ったが、Feed.phpやMagpieRSSとは違ってスニペットからは動かない。どうもキャッシュの仕様がバッティングしているようだ。以前はSimplePieのMODXプラグインがあったが、もはやない。仕方がないので、JSONファイルを出力してGoogle Feed APIのようにJavaScriptで読み込んで表示することにした。参考サイトはPHP用 Google Feed API が完全に廃止されてしまった時の対応方法。ここはRSS-PHP(Feed.php)を使っているが、JSONさえ出力すれば、あとは同じだ。この方法ならMODXだけでなく、他のCMSでも使えるので汎用性がある。

サンプル Simplepie Test

スクリプト simplepieget.txt

JSファイル simplepieget.js

 表示したいページに
<dl id="simplepieget"></dl>

と書けばOK。ただし、JSONファイルを更新するにはスクリプトにアクセスするか、定期的にCRONで動かす必要がある。

 久しぶりにCRONを使ったら、うまく動かない。コマンドラインからスクリプトを実行してみると、「Could not open input file」とエラーが出る。スクリプトのパスは絶対パスで書かなくてはいけないのだった。スクリプトの中のautoloader.phpとJSONファイルの出力先も絶対パスに書き換える必要がある。これで動いた。うまく動けば、「JSONファイル出力OK。」と表示されます。

 しばらく使っていたのだが、時々、表示されないことがある。戻るボタンを使った時などブラウザがキャッシュを読むので、JavaScriptのページ読み込みのイベントが発生しないからだろう。考えてみると、読み込みだけなら、PHPを使った方が簡単だ。JSONファイルのままだとまた加工しなければいけないので、整形したテキストファイルを出力してそれをPHPで読めばいい。simplepieget.txtの最後の行を削除して以下のようなテキストファイルの出力を書く。

$filename = 'simplefeed.txt'; //←出力するテキストファイル。絶対パスで書く
try{
file_put_contents($filename, $html);
        echo "テキストファイル出力OK。"
        }catch(Exception $e){
        echo "テキストファイルの出力に失敗しました。"
        }

 読む込みは以下のような感じでページに書くか、feedget.phpなどのファイル名で実行する。

<?php
$filename = 'simplefeed.txt';
$file = file_get_contents($filename);
echo $file;
?>

 echoをreturnに変えると、MODXのスニペットにも登録できる。

2016/10/01(土)Google Feed APIの代替

 先日、GoogleからFeed APIを終了すると最後通告のメールが来た。以前から非推奨となっていたが、いよいよ2016年12月15日で終了するそうだ。Feed APIはトップページに使っているので代替策を考えなくてはいけない。検索してみると、代替のPHPスクリプトがいろいろ公開されている。セキュリティーを考えれば、PHPの設定でallow_url_fopen=offで動くものが望ましい。

 simplexml_load_fileやfile_get_contentsなどを使っているスクリプトはこの時点でアウト(cURLなどでRSSを取得してsimplexmlを解析に使うのなら良い。複数のRSSに並列リクエスト後マージして返す関数 - Qiitaなど参照)。Feed.php(rss-php)はSimpleXMLとcURLを使い、allow_url_fopen=offの環境でも大丈夫のようだ。

 PHPでRSSやAtomのフィードを取得する方法「Google Feed API」の代替として「rss-php」でRSSやAtomフィードを取得・表示するなどでスクリプトが公開されている。ただしRSSかATOMのどちらかにしか対応しない。両方対応するように少し手を加えた。映画ニュースサイトのRSSを取得したサンプルは以下。

【サンプル】movienews.php

【スクリプト】movienews.txt(拡張子は.phpに変え、UTF-8で保存する。ファイル名は何でも良いです)

 MODXで使う場合はスニペットに登録する。最後から2番目の行の

echo "<dl>" . $html . "</dl>";

を「return $html」に書き換えて、assets/snippetsにアップロード。スニペットを新規作成し、

return @require MODX_BASE_PATH.'assets/snippets/movienews.php';

とスニペットコードに書き、movienewsの名前で保存する。呼び出すページに

[[movienews]]

と書けばOK。

 ただし、Feed.phpでRSS1.0の解析の仕方がよく分からない。というか、パースできない。しょうがないので2005年から更新されていないのであまり気が進まなかったが、Magpie RSSを使ってみた。これは難なく、RSS1.0のフィードを解析できた。古いといっても、RSSの技術自体が2005年当時から変わったわけではない。車輪の再発明をしたい人は別にして、手っ取り早くGoogleから乗り換える代替スクリプトとしては良いと思う。以下はMagpie RSSを利用したサンプル。参考にしたのは複数RSSの統合して更新日時でソートする方法について(MagpieRSS使用) - PHPプロ!Q&A掲示板

【サンプル】feedall.php

【スクリプト】feedall.txt

 Google Feed APIのように表示すると以下の通り。

【サンプル】magpieget.php

【スクリプト】magpieget.txt

 Feed.php、Magpie RSSともキャッシュを作成して、設定時間ごとにRSSファイルを取得する。毎回、取りに行かないのでサーバーへの負荷は抑えることができるだろう。言うまでもなく、cURLが使えない環境では動きません。

 この記事をアップした途端にスクリプトにエラーが出た。調べてみると、リアルサウンドのフィードにエラーがあった。おかしな文字が混ざっているために、フィードの読み込みができない。というわけでmovienews.phpの方にはエラーの内容表示処理を追加した。

このエントリーの続き→Google Feed APIの代替その2