【Node.js】Google CalendarAPIで取得した内容をSlackにつぶやく

#はじめに
予定やタスクの管理をGoogleカレンダーで行っている
Googleカレンダーはカレンダーごとに通知のタイミングを設定できる(1分前、10分前、1時間前、1日前)
だが、通知される内容はタイトルと時間だけで何分前の通知かわからない
それによって、結局時間を確認しないといけなかったりする
iPhoneだと通知は確認や履歴が見づらい、他の通知に埋もれてしまったり不満が多い
なので、Google CalendarのAPIを叩いて、時間が来たらSlackに内容とその予定まで何分前かつぶやくものを作りたいと思う
(必要そうな知識のみ書いていきます)
今回のサンプルプログラム
[GoogleCalendar_Notice_Slack](https://github.com/Kurowasi/GoogleCalendar_Notice_Slack)

#環境
前提としてNPMコマンドが実行できる状況を想定しています

#手順
##1. Expressを使ってWebアプリケーションを構築する
まずアプリを入れておくディレクトリの作成

```
$ mkdir hoge
$ cd hoge
$ npm init
```

expressを使える準備を行う

```
$ npm install --save express
$ npm install --save express-generator
```

expressを利用してWebアプリケーションを構築する

```
$ express -e プロジェクト名
$ cd プロジェクト名
$ npm install
```

成功したか確認

```
$ npm start
```

以下のように出たら成功

```
> プロジェクト名@0.0.0 start ディレクトリ名
> node ./bin/www
```

##2. Google Calendar APIを利用できるようにする
まず[Google API Console](https://www.google.co.jp/url?sa=t&rct=j&q=&esrc=s&source=web&cd=1&cad=rja&uact=8&ved=0ahUKEwjz7O7o07TSAhULjLwKHYi2DAwQFggiMAA&url=https%3A%2F%2Fconsole.developers.google.com%2F%3Fhl%3DJA&usg=AFQjCNGj0x-PAc20W6CsV-wXWgvq6l3kgA&sig2=eq9X8xL_0uFVU-MgCM9uSA&bvm=bv.148441817,d.dGc)にアクセス

『認証情報』を押下して、『プロジェクトを作成』を押下

![キャプチャ5.PNG](https://qiita-image-store.s3.amazonaws.com/0/130026/d9365315-a572-f37a-79b8-0e1e4cb4458e.png)

適当なプロジェクト名を入力して『作成』を押下

![キャプチャ6.PNG](https://qiita-image-store.s3.amazonaws.com/0/130026/cbc4bed6-c42b-fea3-bf60-98d1df0689b9.png)

『認証情報を作成』を押下し、『OAuthクライアントID』を押下

![キャプチャ8.PNG](https://qiita-image-store.s3.amazonaws.com/0/130026/219b1926-4558-8b3c-2801-0de260b9fc14.png)

『同意画面を設定』を押下

![キャプチャ9.PNG](https://qiita-image-store.s3.amazonaws.com/0/130026/c3b5a365-b30f-be15-a7d2-ed1407b68ae8.png)

ユーザに表示するサービス名を適当に入力し、『保存』を押下

![キャプチャ10.PNG](https://qiita-image-store.s3.amazonaws.com/0/130026/e55922aa-1eb8-069a-9b98-f9fe991a5ae2.png)

『その他』を選択し、適当な名前を入力して『作成』を押下

![キャプチャ11.PNG](https://qiita-image-store.s3.amazonaws.com/0/130026/f7b9bb17-efef-cf54-8e25-b105689a20c3.png)

『OK』を押下

![キャプチャ12.PNG](https://qiita-image-store.s3.amazonaws.com/0/130026/c1e31105-9b5f-03c1-24d6-0460ba2c5474.png)


クライアント名を押下

![キャプチャ13.PNG](https://qiita-image-store.s3.amazonaws.com/0/130026/7de2c7d3-714f-c264-459c-5649ac21a828.png)

『JSONをダウンロード』を押下
![キャプチャ14.PNG](https://qiita-image-store.s3.amazonaws.com/0/130026/0a8383c1-6362-3225-411f-75f612cf5caf.png)


##3. Google APIを利用して、値を取得する
2.で取得したclient_secret_hogehogehogehogehogehogehoge.jsonファイルを
client_secret.jsonに名前を変え
1.で作成したフォルダのapp.jsと同じディレクトリに置いておく
![キャプチャ15.PNG](https://qiita-image-store.s3.amazonaws.com/0/130026/2c3538c8-e149-4aa1-b550-197feb840dd8.png)



[Google CalendarAPI のNode.jsのサンプル](https://developers.google.com/google-apps/calendar/quickstart/nodejs)のStep 3: Set up the sampleのコードをapp.jsのコメントの部分に追加する

```app.js
// production error handler
// no stacktraces leaked to user
app.use(function(err, req, res, next) {
  res.status(err.status || 500);
  res.render('error', {
    message: err.message,
    error: {}
  });
});

/* 以下に追加 */
/*************/


module.exports = app;
```

##4. 実行する
app.jsがあるディレクトリで以下のコマンドを実行

```
$ npm start
```
以下のように表示されたら成功
![キャプチャ16.PNG](https://qiita-image-store.s3.amazonaws.com/0/130026/4cfe6eba-348f-1b5e-4ed9-4538b919815c.png)

白くなっている部分をコピーして、ブラウザで叩く
適当なアカウントを押下

![キャプチャ17.PNG](https://qiita-image-store.s3.amazonaws.com/0/130026/a7bed839-91c0-1adf-c482-c9e6648c8e0c.png)

『許可』を押下

![キャプチャ18.PNG](https://qiita-image-store.s3.amazonaws.com/0/130026/af2db736-3981-6924-4f41-f0719f101cfa.png)

表示された権限コードをコピーして、コマンドプロントに張り付けてEnter
以下のように表示され、『calendar-nodejs-quickstart.json』が作成されていたら成功
![キャプチャ19.PNG](https://qiita-image-store.s3.amazonaws.com/0/130026/d57f3be2-bc11-7ca4-be4f-15da56d8a22e.png)

##5. 1時間で認証が切れてしまう問題を解決
何度もAPIを叩く場合は以下のブログ(ステマ)を参考にしてください
[【Node.js】GoogleAPIのOAuth2の認証が1時間で切れてしまう問題](http://kurowasi2525.hatenablog.com/entry/2017/03/01/162605)

##6. Slack APIについて
Slack APIに関しては以下の投稿(ステマ)を参考にしてください
[【Node.js】expressとbotkitを使って自分のURLを叩いたらBotがSlackにつぶやくサンプル【SlackBot】](http://qiita.com/Kurowasi/items/a6498e35abbf7b77f47e)


#終わりに
多分、これで必要な知識は記述したと思います
全てやったことを記述すると長くなってしまうのでプログラムについては[GitHub](https://github.com/Kurowasi/GoogleCalendar_Notice_Slack)を見てください
この記事内以外でも質問があれば、コメントやTwitter、メールなどをください