wordpressからの更新通知を自動的にgoogleスプレッドシートなどに保存したいと思い、ちょっとやってみました。
wordpress等のブログサービスの更新を通知する方法としてweblogUpdates.pingがあります。これはXML-RPCで定義された通知用のXMLを検索サービス等に通知するものです。これをgasで受けとり処理することでブログの更新を自動的にスプレッドシートに反映することを考えます。
weblogUpdates.pingの受け取り
最初に、wordpressから送信されるpingをgasで受け取る必要があります。 gasでは、作成したスクリプトをウェブアプリケーションとして公開する際に、getメソッドに対する応答、postメソッドに対する応答をそれぞれdoGet,doPost関数として定義する事ができます。
今回はPOSTなので、doPostとして以下の様なコードを作成することで、送られて来たpingのタイトル、URL、RSSフィードのURLが取得可能です。
function doPost(e) {
//送信されたxmlの受け取り
var xml = e.postData.getDataAsString();
var document = XmlService.parse(xml);
var root = document.getRootElement();
var methodName = document.getRootElement().getChildren("methodName");
var params = document.getRootElement().getChild("params").getChildren();
//ブログ名
var title = params[0].getChildren()[0].getChildText("string");
//URL
var url = params[1].getChildren()[0].getChildText("string");
//RSS等更新通知部分のURL
var feed = params[2].getChildren()[0].getChildText("string");
if (methodName[0].getText() == "weblogUpdates.extendedPing") {
/*
更新処理
*/
}
}dopost.js
受け取ったRSSフィードURLから更新部分を取得する
上記のpingは、あくまで更新の通知のみなので、更新内容を得るためには、送られて来たURLのフィードを解析する必要があります。
今回は上記の関数のfeedを渡す想定で、そのブログの最新の記事のタイトルとそのURLを取得するコードを以下に記載します。
function parseRss(url) {
//引数で渡されたURLのRSSの解析
var xml = UrlFetchApp.fetch(url).getContentText();
var document = XmlService.parse(xml);
var root = document.getRootElement();
var entries = document
.getRootElement()
.getChild("channel")
.getChildren("item");
//最新の記事のタイトルとURL
//更新のたびに通知される想定なので、必要なのはその時点での最も最新の記事情報のみ
var title = entries[0].getChild("title").getText();
var link = entries[0].getChild("link").getText();
/*
スプレッドシート等への書き込み処理
*/
}parseRss.js
最後にこのコードを作成したgasをウェブアプリケーションとして公開して、そのURLをwordpressのping送信先に追加すれば、完了です。 この時注意が必要な点として、送信するwordpressはgoogleから見れば、そのユーザとは無関係の第3者なので、公開時は「全員(匿名ユーザを含む)」設定で公開する必要があります。そのため、実際の更新の際に特定のURLのフィードしか使わないのであれば、doPost内でそのURL以外を弾く処理等を加えておいたほうが良いと思います。
これらを使うことで、wordpressの更新のたびに自動的に通知がGASに送られ、通知を受け取ったGASはそこからRSSを解析、最新記事の情報を自動で処理することが出来ます。
ただし、実際に動作させる際の問題として、RSSフィードにキャッシュが効いている場合、通知時にフィードを読んだ際にまだ最新の記事が追加されていない可能性があります。そのため、取得まで時間をとることや更新時にキャッシュを削除する等の対応が必用です。