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

2016/07/12(火)prime dayに買ったもの

 amazonのプライムデー、買う物がないなあと思って見ていたが、ほしい物リストに入れていたトランセンドのマイクロSDXCカード64GBが1500円と安かったのでサクッと購入。通常は1980円なので480円(24%引き)のお得。通常価格でも十分安いんですけどね。

 カートに入れて15分以内に購入しないと割引にならない。これだと焦って買う人多いでしょう。amazon考えてるな。

 さらに以前から読みたかった水野敬也「夢をかなえるゾウ」のKindle本がセールで99円だったので買った。ゾウの格好をした神様、ガネーシャがやって来て主人公に成功するための秘訣を教える。小説スタイルの自己啓発本。ガネーシャの関西弁がおかしくて一気読みした。

【amazon】【Amazon.co.jp限定】Transcend microSDXCカード 64GB Class10 UHS-I対応 400× (無期限保証) TS64GUSDU1PE (FFP)

2016/01/20(水)検索エンジン最適化

 一昨年11月、この日記のシステムをtDiaryから今のadiaryに移した。当初はWordPressに移行するためのツールとして使う予定だったが、使ってみたらこれで十分と思えたのでそのまま使い続け、今月、バージョンアップもした。

 好感を持ったのは日記を更新すると、「adiary利用者のページ」に通知されて掲載されること。Web日記を書き始めた頃(ブログという言葉もまだなかった頃)に使用していたハイパー日記システムもこういう通知システムがあったので、懐かしさを感じたわけです。

 あの頃はよく、一覧に表示された日記を巡回して日記システム利用者同士でコメントのやり取りをしていた。といってもコメント欄はなかったので、相手の日記の記事タイトルをリンクして自分の日記にコメントを書くという方式。相手はアクセスログからそれを知り、同じ方式でコメントを返す。第三者には意味が分かりにくかったが、そんなにアクセスは多くなかったのでそれでも良かったのです(考えてみれば、Twitter上での返信もこれに近い)。

 adiaryにはアクセスログ解析ツールもカウンターもない。必要な場合はGoogle Analyticsなど他のツールを使えばいいのだが、手軽に見られるアクセス解析ツールがあると、便利ではあると思う。

 そういう昔話はいいとして、tDiaryの時は日付ごとのタイトルではなく、セクションごとのタイトルにしていたので、移行の結果、(no title)と表示される日記がほとんどになった。まあ、それでもいいや、セクションにタイトルはあるんだしと思って放置していたが、当然のことながら、ブラウザに表示されるページタイトルも(no title)になってしまう。AdSenseを本格的に始めた以上、このままではまずい。検索エンジン最適化(SEO)のためには修正した方がいいだろう。

 というわけで、ぼちぼち修正を始めた。修正が必要な日記は1000日分近い。DBファイルをダウンロードして秀丸マクロで一気にやってみようかと思ったが、調べたらadiaryには日記本文を記録したファイルのほかにタイトル一覧のファイルもあって、両方書き換えるのはスクリプトやマクロでは難しい。できたにしても整合性が取れなくなる恐れがある。一つ一つ修正していった方が安全確実でしょう。

 修正はセクションのタイトルを日記のタイトルにし、余計なタグを消すだけ。要する時間は日記1日分あたり30秒もかからないぐらいなので大したことはない。ただ、1000日分近くあると、すぐには終わらない。少しずつやっていくしかない。

カレンダーの位置修正

 スマホでこの日記を見ると、カレンダーが下のようにずれて表示される。

カレンダー

 スタイルシート(sphone.css)を見たら、以下のようになっていた。

table.calendar {

margin-left: auto;

margin-right: auto;

}

 これだと画面に対してセンタリングしてしまうので、margin-left:1em;に変更した。設定自体を削除してもいいと思う。

修正後のカレンダー

2016/01/16(土)WordPressのAdSenseプラグイン

 この日記をいろいろカスタマイズしていたら、ほぼ放置状態の読書日記Reading Diary, Maybe(WordPress使用)の方も手を入れたくなった。で、久しぶりにモバイル用の表示を見てびっくり。ページの3カ所にGoogle AdSenseの広告が表示されていたのだ。モバイル用の広告は設定した覚えがなかった。というか、モバイル表示の中にAdSense枠を入れるためにどこをいじればいいのか、設定方法を知らない。AdSenseの枠はPCページのサイドバーに1個置いてただけだったはず。プラグインも入れてないし…。

 などと思いながら、AdSenseのページを読んだら、ブラウザに広告ブロックソフトを入れていると、ダッシュボードのAdSenseプラグインも表示されない、と書いてあった。

 Firefoxの広告ブロックアドオン(使っているのはuBlock)をオフにしたら、プラグインが現れた。モバイル広告の自動最適化もオンにしてあった。うーん、いつ入れたんだろう? ま、それはいいのだが、Googleにとってモバイル広告の自動最適化とは文頭と文中と最後に広告を配置することなのか。文中の広告はちょっとうるさく感じるんだけど。

 いくらAdSenseを設定してもサイトの更新頻度が少ないと、アクセス数は伸びず、広告収入を得るのは難しい。支払い額の最低が月8000円というのは一般のブログにとって、けっこうなハードルの高さだ。その点、amazonアソシエイトはギフト券での支払いなら最低500円だし、制約額に応じて支払われるのでアクセスが少ないページでも収入の機会はある。実際、僕はAdSenseからお金をもらったことは一度もない(だいたい、支払い方法の設定すらしていなかった)が、amazonからは数回ギフト券をもらった。

AdSenseプラグインを実行すると、こうなる。

 それにしてもAdSenseプラグイン、かなり優秀だ。PCの場合、ページを分析してどこに広告を置けばいいか、指示してくれる。画像の赤いマークがそれで、これをクリックすると、緑色の部分のように広告挿入イメージが表示される。しかもトップページ、単一記事ページ、固定ページのそれぞれに指定ができる。普通はAdSenseのコードを貼り付ける作業が必要だが、それをGUIでできるのがすごい。大したものだ。さすがGoogle純正品だ。

 CMSのシェアトップを誇るWordPressはブログだけでなく、一般サイトにもかなり採用されている。だからGoogle自らプラグインを用意しているのだろう。こんなに楽にAdSenseが導入できるのなら、利用している人が多いのも分かる。