以前はてなブログに投稿した記事(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変数を削除すれば大丈夫です。