YQLをTitaniumで使うと色々捗る

ウェブサービスと連携したアプリを作る場合、何らかの形でアプリにデータを渡す必要がある。通常であれば、DBからのデータをJSONXMLで出力して、それをアプリが見に行けば良いのだけど、ウェブ側の事情でそれを用意して貰えない場合がある。

そんな時、YQLを使ってみて非常に便利だったのでまとめておく。

用途としては

  • 既存のページをパースして必要なデータを収集する
  • RSSなどをパースして必要な(ry
  • 外部のサービスとのマッシュアップ

などが考えられる。

まずはコンソールを開いて、このブログのタイトル一覧を取得してみる。
「YOUR YQL STATEMENT」に以下を入力し、「JSON」を選択「TEST」ボタンをクリック。

use "http://yqlblog.net/samples/data.html.cssselect.xml";
select * from data.html.cssselect where url="d.hatena.ne.jp/zebevogue/" and css="h3.title a"

[追記 at 2012/05/03]use句が抜けていたのを修正しました。

レスポンスは以下のようになります。

cbfunc({
 "query": {
  "count": 1,
  "created": "2012-04-21T06:30:05Z",
  "lang": "en-US",
  "diagnostics": {
   "publiclyCallable": "true",
   "url": [
    {
     "execution-start-time": "16",
     "execution-stop-time": "18",
     "execution-time": "2",
     "proxy": "DEFAULT",
     "content": "http://www.datatables.org/data/data.html.cssselect.xml"
    },
    {
     "execution-start-time": "141",
     "execution-stop-time": "141",
     "execution-time": "0",
     "proxy": "DEFAULT",
     "content": "http://css2xpath.googlecode.com/svn/trunk/build/css2xpath.min.js"
    },
    {
     "execution-start-time": "144",
     "execution-stop-time": "5680",
     "execution-time": "5536",
     "proxy": "DEFAULT",
     "content": "http://d.hatena.ne.jp/zebevogue/"
    }
   ],
   "log": "xpath //h3[contains(concat(' ',normalize-space(@class),' '),' title ')]//a",
   "query": {
    "execution-start-time": "144",
    "execution-stop-time": "5713",
    "execution-time": "5569",
    "params": "{url=[d.hatena.ne.jp/zebevogue/]}",
    "content": "select * from html where url=@url and xpath=\"//h3[contains(concat(' ',normalize-space(@class),' '),' title ')]//a\""
   },
   "javascript": {
    "execution-time": "5692",
    "instructions-used": "20318",
    "table-name": "data.html.cssselect"
   },
   "user-time": "5714",
   "service-time": "5538",
   "build-version": "26535"
  },
  "results": {
   "results": {
    "a": [
     {
      "href": "/zebevogue/20120405/1333618087",
      "id": "1333618087",
      "name": "1333618087",
      "content": "MAMPのPEARを「ちゃんと」設定する方法(pearコマンドが動かないのを修正する方法)"
     },
     {
      "href": "/zebevogue/20120404/1333503933",
      "id": "1333503933",
      "name": "1333503933",
      "content": "Titaniumのドキュメントをダウンロードする方法"
     },
     {
      "href": "/zebevogue/20120402/1333330143",
      "id": "1333330143",
      "name": "1333330143",
      "content": "WebViewのクリックイベントをTitaniumへ渡す"
     },
     {
      "href": "/zebevogue/20120324/1332528629",
      "id": "1332528629",
      "name": "1332528629",
      "content": "MAMPのphpMyAdminを最新版に変更する"
     },
     {
      "href": "/zebevogue/20120317/1331933386",
      "id": "1331933386",
      "name": "1331933386",
      "content": "Adobe Shadowが便利過ぎた件"
     }
    ]
   }
  }
 }
});

結果はresults以下にオブジェクトとして取得できているのが分かる。すばらしい。これだけで他のアプリケーションとの連携がメチャクチャ楽になるのが分かっていただけると思う。

では次にTitanium側で使ってみる事にします。(公式APIドキュメント

コードは以下の通り。

var query = 'select * from data.html.cssselect where url="d.hatena.ne.jp/zebevogue/" and css="h3.title a"';
Titanium.Yahoo.yql(query, function (d) {
    var alinks = d.data.results.a;
    for (var i in alinks) {
        //後はごにょごにょしてください
    }
});

楽チン過ぎます。

「THE REST QUERY」にURIがあるので、RESTで取得する場合でも簡単に使えそうです。