やりたいこと
アプリケーションからGoogleカレンダーに予定を追加することはGoogle Calendar APIを利用すれば可能です。当然ながら、カレンダーに予定を追加するためには、ユーザ認証が必要なわけですが、この認証がかなり複雑です。特に、Calendar APIのクイックスタートに掲載されている方法は、ブラウザによるGoogleアカウントでのログイン操作が必要で、アプリケーションからの利用には向いていません。
そこで今回は、JWT(JSON Web Token)を使って、ブラウザからのログイン操作なしで特定のGoogleカレンダーに予定を追加することをやってみます。
全体の流れ
JWTを使ってGoogleカレンダーに予定を追加する全体の流れは以下の通りです。
1.Google Calendar APIの有効化
2.Googleカレンダーへのサービスアカウントの権限追加
3.予定の投稿用プログラムの作成
Google Calendar APIの有効化
まずは、Google Calendar APIを有効化します。そして、Calendar APIを通じてカレンダーに予定を追加する専用アカウントであるサービスアカウントを作成し、このサービスアカウントを利用するためのKey情報(JSON)を取得します。
①Google Cloud プラットフォームサイトにアクセス
Google Calendar APIを有効にするためにGoogle Cloud プラットフォームにアクセスします。
②Calendar APIを検索
検索欄に「calendar」と入力して検索して、Google Calendar APIを選択します。ちなみに、カタカナで検索しても出てこないので、ちゃんと英語で検索しましょう。
③Calendar APIを有効化
Google Calendar APIの画面で「有効にする」ボタンをクリックして、Google Calendar APIを有効化します。
④認証情報の追加
次に、画面左側の「認証情報」を選択します。
⑤認証情報の追加
画面上部の「+認証情報を作成」をクリックし「ウィザードで選択」をクリックします。
⑥認証情報の設定
認証情報の設定画面で、以下のように入力して「必要な認証情報」ボタンをクリックします。
・APIを呼び出す場所:その他の非UI(cronジョブ、デーモンなど)
・アクセスするデータの種類:アプリケーションデータ
・App Engineまたは・・・:いいえ、使用していません
⑦サービスアカウントの追加
IAMと管理のサービスアカウントの画面に遷移したら「+サービスアカウントを作成」ボタンをクリックします。
⑧サービスアカウントの設定
サービスアカウントの設定画面で必要事項を入力します。また、サービスアカウントのメールアドレスが後で必要になるので、テキストエディタなどにメモしておきましょう。メモしたら「作成」ボタンをクリックします。
※サービスアカウント名などは、任意の名前でOKです。
⑨役割の設定
この画面は、設定不要なので「続行」ボタンをクリックします。
⑩キーの作成
この画面の「+キーを作成」ボタンをクリックします。
出てきた右側の画面で、キーのタイプで「JSON」を選択し、「作成」ボタンをクリックします。すると、キーファイルがダウンロードされるので、このファイルを保存します。
(11)完了
キーが作成されていることを確認し、「完了」ボタンをクリックします。
Googleカレンダーへのサービスアカウントの権限追加
次に、Googleカレンダーに新しいカレンダーを追加して、先ほど作成したサービスアカウントにイベントの登録・閲覧権限を付与します。
①Googleカレンダにアクセス
ブラウザで新しいタブを開きGoogleカレンダーを開きます。そして「他のカレンダー」の右側にある「+」をクリックします。
②新しいカレンダーの作成
出てきたポップアップウィンド内の「新しいカレンダーを作成」を選択します。
③カレンダーの名前の入力
作成するカレンダーの名前を適当に入力し、「カレンダーを作成」ボタンをクリックします。
画面下に「カレンダーを作成しました」と表示されたら、画面左上の「⇦」ボタンをクリックして戻ります。
④カレンダーの設定1
作成したカレンダーがマイカレンダーの欄に追加されている事を確認し、作成したカレンダーの右にある、「・・・」ボタンをクリックします。
⑤カレンダーの設定2
ポップアップで表示されるメニューから「設定と共有」を選択します。
⑥ユーザの追加
「特定のユーザとの共有」の欄にある「+ユーザを追加」ボタンをクリックします。
⑦メールアドレスと権限の設定
出てきたウィンドウに、上でメモしたサービスアカウントのメールアドレスを入力し、エンターを押します。また、権限欄は「予定の変更権限」を選択し、「送信」ボタンをクリックします。
※メールアドレスを入力した後に「エンターキー」を押して確定しないと「送信」ボタンが押せないので注意です。
⑧カレンダーIDのメモ
最後に、後ほど必要となるカレンダーIDをテキストエディタなどにメモしておきます。
予定の投稿用プログラムの作成
最後に、Google Calendar APIをキックし、予定を登録するプログラムを作成していきます。なお、今回使用した環境は以下の通りです。
・OS :Ubuntu 18.04.1
・node:10.16.0
・npm :6.11.3
①Google APIのインストール
まずは、nodeからGoogle Calendarを利用するために、GoogleAPIsパッケージをインストールします。
$npm install googleapis
②プログラムの作成
JWTを用いてGoogle Calendarに予定を登録するプログラム「InsertCalendar.js」を作成します。なお、以下の変数は適宜、変更してください。
・keyfile変数:上でダウンロードしたサービスアカウントのキーファイル名
・calendarId変数:上でメモしたカレンダーID
・event変数:登録する予定の情報
また、キーファイルとプログラムは同じフォルダに格納してくださいね。
const {google} = require('googleapis');
//-----------------------------------------------------------------------
const keyfile='./api-project-xxxxxxxxxxxx-7c5ac86d4f1b.json';
const calendarId='xxxxxxxxxxxxxxx@group.calendar.google.com';
//-----------------------------------------------------------------------
const event = {
'summary': 'テスト予定',
'location': '東京駅',
'description': '',
'start': {
'dateTime': '2019-10-12T10:00:00+09:00',
'timeZone': 'Asia/Tokyo',
},
'end': {
'dateTime': '2019-10-12T11:00:00+09:00',
'timeZone': 'Asia/Tokyo',
},
'attendees': [],
'colorId': 1,
'reminders': {
'useDefault': false,
'overrides': [
{'method': 'email', 'minutes': 24 * 60},
{'method': 'popup', 'minutes': 10},
],
},
};
//-----------------------------------------------------------------------
process.env.GOOGLE_APPLICATION_CREDENTIALS = keyfile
const key = require(keyfile);
const scope = ['https://www.googleapis.com/auth/calendar', 'https://www.googleapis.com/auth/calendar.events'];
const jwt = new google.auth.JWT(key.client_email, null, key.private_key, scope)
const calendar = google.calendar("v3");
jwt.authorize((err, response) => {
calendar.events.insert({
auth: jwt,
calendarId: calendarId,
resource: event,
}, (err, event) => {
if (err) {
console.log('エラー:' + err);
return;
}
console.log('予定を登録しました');
});
})
プログラム自体を見てもらえれば、何をやっているかは理解できると思います。認証部分はKeyfileを読み込むだけであり、OAuth2を使う場合と比較してかなり簡潔なプログラムとなっているのが、わかると思います。
③テスト
それでは、作成したプログラムを実行してみましょう!!!
「予定を登録しました」と出れば、正常に動いています。
$node insertCalendar.js
予定を登録しました
$
Googleカレンダーの画面も確認してみましょう。ちゃんと、予定が登録されました!!
おわりに
今回はJWTを使って、Google Calendarに予定を登録することをやってみました。次は、この機能を使って、子供のミルクやオムツの時間を記録する「みるく&おむつボタン」を作ってみようと思っています。
コメント