Google Chrome拡張からOAuthを使用してGoogleカレンダーにイベント登録する。

以前はてなブログに投稿した記事(URL失念)の改訂版です。

OAuth認証を利用し、Googleカレンダーにイベント登録するためのGoogle Chrome拡張を作ります。
#manifest.jsonは割愛します。

用意するもの

[chrome] Index of /trunk/src/chrome/common/extensions/docs/examples/extensions/oauth_contactsから以下の4つをダウンロードします。

  • chrome_ex_oauth.html
  • chrome_ex_oauthsimple.js
  • chrome_ex_oauth.js
  • onload.js

OAuth認証を利用するためのライブラリ群なのですが、中身はよくわかんなかったです。
ちなみにTutorial: OAuth – Google Chromeは未だにonload.jsを用意しろって書いてないですね…。onload.jsが必要になったのはchrome extensionのmanifestがv2でhtmlに直接スクリプトが書けなくなったのが原因で、呼び出し元はchrome_ex_oauth.htmlです。チュートリアルページにも詳しいサンプルコードがありますので、一度目を通しておくと役に立ちます。

background.js

スクリプトの本体です。今回はコンテキストメニューで呼び出すとイベントが登録されるようなものにしました。コード見たらだいたい何やってるかわかると思います。
注意点として、終日設定のイベントを登録する場合、時刻の登録は無し・終了日は設定したい日付に+1日する必要があります。カレンダーのIDはカレンダーの設定から取得出来ます。

chrome.contextMenus.create({
	"title" : "カレンダーに投稿",
	"type" : "normal",
	"contexts" : ["selection"],//テキストを選択した時のみ
	"onclick" : getClickHandler()
});

var oauth = ChromeExOAuth.initBackgroundPage({//OAuth設定
	"request_url": "https://www.google.com/accounts/OAuthGetRequestToken",
	"authorize_url": "https://www.google.com/accounts/OAuthAuthorizeToken",
	"access_url": "https://www.google.com/accounts/OAuthGetAccessToken",
	"consumer_key": "anonymous",
	"consumer_secret": "anonymous",
	"scope": "https://www.google.com/calendar/feeds/"
});


function getClickHandler() {
	return function(info, tab) {
		oauth.authorize(function(){//OAuthToken取得完了時に呼ばれる関数

			/**開始~終了日時設定**/

			var st ="";//開始日時
			var en ="";//終了日時

			var check = true;//終日設定フラグ

			if(check){//終日設定にする場合
				st = "yyyy-mm-dd";
				en = "stの日付に+1日した値";//+1しないと意図したとおりに設定出来ません
			}
			else {
				st = "yyyy-mm-dd(開始日)" + "T" + "hh" + ":" + "mm" + ":00.000+09:00";
				en = "yyyy-mm-dd(終了日)" + "T" + "hh" + ":" + "mm" + ":00.000+09:00";
			}
			/**設定終わり**/

			/**登録したいイベントのJSON*/
			var body = JSON.stringify({

				"data": {
					"title": "イベントのタイトル",
				"details": "イベントの内容",
				"transparency": "opaque",
				"status": "confirmed",
				//"location": "場所",
				"when": [
				{
					"start": st,
					"end": en
				}
				]
			}
			});

			oauth.sendSignedRequest(//リクエストの送信

				"https://www.google.com/calendar/feeds/" + "登録したいカレンダーのID" + "/private/full",

				function(response){//コールバック関数
					try{
						var p_res = JSON.parse(response);
						if(p_res.error){//エラー処理
							var err = p_res.error;
							alert("Error:" + err.message);
						}else{
							alert("登録完了しました");
						}
					} catch(e) {
						alert("Error:" + response);
					}
				},

				{
					"method": "POST",
					"headers": {"Content-Type": "application/json"},
					"body" : body
				}
			);
		});
	}
}

background.html

スクリプトを呼び出すためのbackground.html

<!doctype html>
<html>
	<head>
		<meta charset="utf-8" />
		<script src="chrome_ex_oauthsimple.js"></script>
		<script src="chrome_ex_oauth.js"></script>
		<script src="background.js"></script>
	</head>
	<body>
		<!--バックグラウンドです!-->
	</body>
</html>

初回呼び出し時にのみOAuth認証画面に飛ばされたあと、通常通り使えるようになります。
認証を解除したい場合は、拡張が使用しているlocalStorage変数を削除すれば大丈夫です。