Greasemonkeyによるアプリケーション開発

第4回 Google Calendarの予定情報の取り込みと,さらなる拡張のアイデア

この記事を読むのに必要な時間:およそ 6.5 分

実装方針検討

JSON形式で予定情報を取得できる準備は整いました。あとは以下の手順で処理をすればカレンダアプリケーションに取り込むことができるでしょう。

  • (1) Google Calendar data APIにアクセスし,JSON形式で予定情報を取得する
  • (2) 取得したJSON文字列をevalし,予定情報を持つオブジェクトにする
  • (3) 予定情報オブジェクトから予定情報を取得し,スケジューラオブジェクトが管理する予定情報として取り込む
  • (4) スケジューラオブジェクトが外部から取り込んだ予定情報は編集/削除はできないようにする

(1)はGreasemonkeyが提供しているHTTPアクセス用関数GM_xmlhttpRequestを利用することで簡単に実装することができます。

ここで,GM_xmlhttpRequestの概説をしておきます。引数は以下の7つのフィールドを持つオブジェクトです。

method

HTTPのメソッドを文字列で指定します。必須項目。GET,POST,PUT,DELETEなど,HTTPのメソッドは何でも使えます。

url

アクセス先URLを文字列で指定します。必須項目。

headers

HTTPリクエストヘッダを,名前をフィールドとし,値をそのフィールドの文字列値として持つオブジェクトとして指定します。オプション項目。

例:ブラウザ上でフォームをPOSTで送信する動作をシミュレートする場合に必要なリクエストヘッダの指定

headers:{"Content-type":"application/x-www-form-urlencoded"}
data

HTTPリクエスト本体を文字列で指定します。オプション項目。

例:ブラウザ上でフォームをPOSTで送信する動作をシミュレートする場合

data:"q=" + encodeURIComponent("Greasemonkey アプリケーション gotin")
onload

リクエストが正常に終了した場合に呼ばれる関数を指定します。オプション項目。

onerror

リクエストの処理中にエラーが発生した場合に呼ばれる関数を指定します。オプション項目。

onreadystatechange

リクエストの処理中状態が変化したタイミングで呼ばれる関数を指定します。オプション項目。

onload,onerror,onreadystatechangeで指定する関数は以下の5つのフィールドを持つオブジェクトが引数として渡されます。

status

HTTPレスポンスのHTTPステータスコードを表す整数値。200なら正常終了,404ならNot Found,など。

statusText

サーバが返すステータステキストを表す文字列。ステータステキストはサーバにより返す文字列は変わる。

responseHeaders

HTTPレスポンスに含まれるHTTPヘッダーを表す文字列。リクエスト用ヘッダのフィールドheadersはオブジェクト形式だが,レスポンス用ヘッダはオブジェクトではなく文字列で返される。

responseText

HTTPレスポンス本体を表す文字列。

readyState

HTTPリクエストの段階を示す整数値。

  • 1:リクエスト準備中
  • 2:リクエスト準備完了
  • 3:リクエスト送信完了,レスポンス待機中
  • 4:レスポンス完了

利用例:

GM_xmlhttpRequest({
  method:"GET", 
  url:"http://www.google.com/calendar/feeds/gordon.timothy.nathanson%40gmail.com/public/full?alt=json",
  onload:function(x){alert(x.responseText)}
});

これで予定情報のJSON文字列をalertで出力することができます。図1はその主要部分の一部を示したものです。

図1 Google Calendar data APIのJSONフォーマットによるカレンダ情報の一部

{
    "version":"1.0",
    "encoding":"UTF-8",
    "feed":{"xmlns":"http://www.w3.org/2005/Atom",
         //中略
        "entry":[{
            "title":{"type":"text","$t":"第3回記事公開"},
            "content":{"type":"text"},
            "gd$when": [{
                "startTime":"2007-08-20",
                "endTime":"2007-08-21"}],
            "gd$where":[{}]},
                 :
  
                 :
}

(2)のJSON文字列のオブジェクト化はevalで行うことができます。ただし,JSON文字列の前後を()で囲む必要があります。

GM_xmlhttpRequest({
  method:"GET", 
  url:"http://www.google.com/calendar/feeds/gordon.timothy.nathanson%40gmail.com/public/full?alt=json",
  onload:function(x){
    alert(eval("(" + x.responseText + ")").feed.entry[0].title.$t);
  }
});

これで最初の予定情報のタイトルをalertで出力することができます。図1の場合であれば"第3回記事公開"が表示されるはずです。

この要領で予定情報を取得し,スケジューラオブジェクトが保持する予定情報として追加すれば,カレンダ上に表示することができます。

著者プロフィール

gotin(ゴチン:GOrdon TImothy Nathanson)

会社員です。肩書きは特にありません。Greasemonkeyは会社の後輩が使っていてそれ面白いじゃんって思って使い始めました。自宅サーバで作ったRuby on Railsな自作ブログツールで作った自作ブログにGreasemonkeyのユーザスクリプトを載せたりもしていたんですが,誰にも読んでもらえなくて寂しかったのです。で,作ったままほったらかしにしていたはてなダイアリーに載せたら自作ブログよりかはありがたいことに多少読んでもらえるようになり,その後いろいろあって,そして今ここにいます。

URLhttp://d.hatena.ne.jp/gotin/