Google Apps ScriptからWordPressのAPIにアクセス

記事タイトルとURLをコピーする
こんにちは、CSチームのかわむらです。
サーバーワークスエンジニアブログにある「はてなブックマーク」「Twitter」「いいね!」ボタンのカウントをGoogle Apps Scriptを使って集計してみました。
Google Apps Scriptについては下記の記事が参考になると思います。
Google Spreadsheetsの上で動くので、データの取得さえできてしまえばグラフにするのは簡単です。
Google Apps Scriptはサーバーサイドで実行されるJavaScriptなのだから、ブログ記事からHTMLを取得してスクレイピングするくらい簡単だろうと思っていたのですが、予想以上に大変で挫折しかけました。
そこでWordPressのAPIを使い簡単になんとか実装できました。一度スプレッドシートに取り込んでしまえば、データの利用の幅は広がるので他でも活用できそうです。

ウェブサービスへのアクセス

ウェブサービスへのアクセスにはUrlFetchAppクラスを使います。HTTPResponseの例にある通り、ほんの2行でヘッダーを取得して表示することができます。
var response = UrlFetchApp.fetch("http://www.google.com/");
Browser.msgBox(response.getHeaders().toSource());
簡単ですね。

XML-RPCを使うための準備

WordPress APIへはXML-RPCを使ってアクセスします。今回はJavaScriptのXML-RPCクライアントのライブラリ"Mimic"をGoogle Apps Scriptで使えるように修正した"XML-RPC client on Google Apps Script"を使わせていただきました。
  1. ブログのURL、ユーザ名、パスワードを用意します。
  2. Google Spreadsheetのスクリプトエディタを開いてダウンロードしたMimic-for-Google-Apps-Scriptをペーストします。

BlogIDを取得する

動作確認も含めて、まずはブログIDを取得してみます。
  1. スクリプトエディタにonOpenとgetBlogidをペーストし保存します。
  2. onOpenの"ブログのURL", "ブログのID", "ブログのパスワード"を設定して、[サンプル]メニューからgetBlogidを実行するとブログIDが表示されます。
  3. このブログIDをonOpenのG.wordpress.blogidに設定します。これは後ほど記事リストの取得で使用します。
onOpen
[javascript]
var G = new Object();

G.wordpress = {
  url: "ブログのURL",
  blogid: "",
  username: "ブログのID",
  password: "ブログのパスワード",
  recentposts: 10
};

function onOpen() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();

  var menu = [{name: "blogid", functionName: "getBlogid"},
              {name: "entlylist", functionName: "getEntrylist"}]

  ss.addMenu('[サンプル]', menu);
}
[/javascript]
getBlogid
[javascript]
function getBlogid() {
  var request = new XmlRpcRequest(G.wordpress.url + 'xmlrpc.php', 'blogger.getUsersBlogs');
    request.addParam('');
    request.addParam(G.wordpress.username);
    request.addParam(G.wordpress.password);

  var r = request.send().parseXML();

  var blogid = 'BlogID: ' + r[0]['blogid'];
  Browser.msgBox(blogid);
}
[/javascript]

記事のリストとURLを取得する

  1. スクリプトエディタにgetEntrylistをペーストし保存します。
  2. [サンプル]メニューからgetEntrylistを実行します。初めて実行する時は認証ダイアログが開くので実行を許可します。
getEntrylist
[javascript]
function getEntrylist() {
  var posts = new Array();

  // 記事のリストを取得します
  var request = new XmlRpcRequest(G.wordpress.url + 'xmlrpc.php', 'metaWeblog.getRecentPosts');
    request.addParam(G.wordpress.blogid);
    request.addParam(G.wordpress.username);
    request.addParam(G.wordpress.password);
    request.addParam(G.wordpress.recentposts);

  var entlylist = request.send().parseXML();

  // postidを指定して記事ごとのURLを取得します
  for (var n in entlylist) {
    var request = new XmlRpcRequest(G.wordpress.url + 'xmlrpc.php', 'metaWeblog.getPost');
      request.addParam(entlylist[n].postid);
      request.addParam(G.wordpress.username);
      request.addParam(G.wordpress.password);

    var r = request.send().parseXML();

    // 配列に格納します
    if (r.post_status == 'publish') {
      posts.push([entlylist[n].postid, entlylist[n].title, r.permaLink]);
    }
  }

  // スプレッドシートに書き出します
  var sheet = SpreadsheetApp.getActiveSheet();
  var range = sheet.getRange(2, 1, posts.length, 3);
  range.setValues(posts);
}
[/javascript]
こんな感じで記事リストを取得することができました。
取得したブログ記事リスト
次回はGoogle Apps Scriptでblogger APIにアクセスする手順を書きたいと思います。