Google Apps ScriptとY!Pipesを組み合わせて使ってみた
ひさしぶりに Google Apps Script を触ってみましたが、js でいろんなことができるのでいいですね!
と思っていたら、外部の html の取得で躓きました orz
割と有名かもですが、Google Apps Script の UrlFetchApp.fetch()
による html の取得では、utf-8 以外の日本語を読み込むと文字化けしてしまいます。
この手の不具合はいい加減解消していてもいい気がしますが、まだなんざんすね、、、
結論から言ってしまうと、Web サイトの取得とおおざっぱな切抜きを Y!Pipes で。
以上を json で取得して、チョキチョキと整形してセルに展開するのを Google Apps Script で行います。
これで、任意の Web ページの内容を js から取得できます。
その前に、js 用の文字コード変換ライブラリ ecl.js をとってきて、Apps 用にコードを変更しつつやってみましたが文字を復元できませんでした(>o<;
最終的に Opensocial ガジェットで使うデータなので、Opensocial ガジェット中でやらせてもいいのですが、html のすべてを読み込んでしまうと通信量が大きくなってしまいます。Google SpreadSheets のセルにデータを並べて、それを json や csv で取得できればクライアントへの負荷が減らせてクライアント側のコードも楽できます。それに csv の速さはほんとにすばらしいです。
さて、ここで一旦 SpreadSheets はあきらめて、今度は Y!Pipes を触り始めました。
Y!Pipes は結構前からちょっとづつ触っていますが、まだよくわかってなくてたいしたことはできません、、、
でも今回はちょうどおあつらえ向きの Pipes を発見できてサクサクできました(^o^v
http://pipes.yahoo.com/pipes/pipe.edit?_id=ovbgOzvz3RG85vRvwjSbTQページの URL と切り出し開始、切り出し終端を指定することで、結果を json で取得できます。
その際には上記では使われていますが、Split の指定をはずしておくのがいいでしょう。このパラメータは最終的に Feed のアイテムの配列を作りたいときに使うっぽいですが、今回は単に html テキストの切抜きだけなので不要です。
json で出力するための url を Y!Pipes からもらったら、その URL を Google Apps Script から読み込みます。
var data = UrlFetchApp.fetch(url);
テキストで帰ってきますが、ちょうど json テキストをパースしてくれる関数があります。
var json = Utilities.jsonParse(data.getContentText());
お目当てのhtmlはこんな感じで取り出せます。
output( json.value.items[0].content);
今回制作した SpreadSheet は公開設定にしてあるので、Apps Script も含めてみることができると思います。
https://spreadsheets.google.com/ccc?key=0AoY86MXyTfuodGg0eDhrR3EtaDdUY0FwTUFTbG0wbVE最後に、Y!Pipes は独自の GUI で操作できますが複雑なことは難しかったりできなかったりします。その点、Google Apps Script はよく知った js なので結構いろんなことがガシガシできます。Y!Pipes で取得、Apps Script で操作、は結構いいな~と思いました。
いつどうなるか分からない無料のサービスを二つも使うのはちょっと怖いですが、、(^-^;
一応、僕はそういえば YQL を一切触ったことないことを付記しておきます。。。そういえば YQL も日本語の文字化けがあった気がしますが解消してますよね?
1 件のコメント
vegeneet
コメント失礼します。
同じく文字化けで躓き不便なので以下を作成しました。
http://webtounicode.appspot.com/
指定したURLのutf-8のソースを返すページです。
var url ="http://webtounicode.appspot.com/sign?content="
+"http://code.google.com"
な感じでurlにutf-8変換したソースをgetできます。
対応エンコード:euc-jp(x-euc-jp),shift-jis(sjis)などです。
content="text/html; charset="の部分を
見て判定しているだけなので精度はそんなよくないです。
以上失礼しました。