enebularとLINE Messaging APIを使用してGoogleカレンダーにスケジュール登録しようとしてみた

#####概要
最近自分のスケジュール管理をGoogleカレンダーで行っているのですが、スケジュールを登録する時に一回一回カレンダーを開くのが面倒です。そこでいつも使用しているLINEからスケジュールの登録ができるようになれば便利ではないかと考えて、LINEからGoogleカレンダーにスケジュールを登録する方法を試してみました。またLINEを使用する際にセキュアなサーバーを用意するのが面倒なので、enebularを使用して開発コストを下げることにしました。　

#####今回やってみること
今回はGoogleカレンダーのAPIをnode-redから叩くようにします。node-redはenebularから使用するようにします。
LINEからコマンドを送信するには、httpsサーバーが必要になりますので、enebularをhttpsサーバーとして使用します。

#####使用機材
汎用pc スマートホン　

#####方法
Googleカレンダーとenebularを連携する。
LINEとenebularを連携する。
LINEとbot方式でやり取りする
やり取りの中で取得したデータを利用してGoogleカレンダーにスケジュールとして登録する

#####実際の手順
まずはGoogleカレンダーを使用するためのノードをインストールします。
右側のハンバーガーメニューから、パレットの管理、ノードのインストールを選択します。
そこで、node-red-node-google をインストールします。

Googleカレンダーとenebularの連携については[こちら](https://qiita.com/satosiyonezawa/items/dd1d5628dd6e56eadc7b)のページがわかりやすかったので、[こちら](https://qiita.com/satosiyonezawa/items/dd1d5628dd6e56eadc7b)のページの手順通りにgoogleカレンダーとenebularの連携を行っていきます。
GoogleのAPIのkeyの発行が多少面倒に感じますが、こちらの手順通りに行ったら簡単に発行することができました。

次にenebularとLINEの連携をします。
http inノードを用意してメソッドはPOSTにします。
パスは任意につけてください。今回は/caltestにしました。

次に[LINEのdeveloperサイト](https://developers.line.biz/ja/)からプロバイダーを作成して、Mssaging APIで新規チャンネルを作成します。
チャネル名や業種などは適当に入力してください。

応答設定で、応答モードをBot、あいさつメッセージをオフ、応答メッセージもオフ、webhookをオンにします。
webhook設定でenebularのurlを設定します。enebularのurlに先ほど設定したパスを追加して設定します。
(例)https://ev2-example.herokuapp.com/caltest
のようになります。
これをセットして検証を行い、okが返ってきたら準備は完了です。

ここからいよいよLINEとGoogleカレンダーの連携の実装になるのですが、今回は実装が間に合わなかったので要素だけの検証になります。
Googleカレンダーに予定を登録するところ
入力する日付をLINEで受信するところの確認までになります。
興味がある方は組み合わせて実装してもらえるとうれしいです。

まずはGoogleカレンダーに予定をセットする確認になります。
フローはこのようにシンプルなものから試していってください。
![enebularカレンダー.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/244155/13806746-f3a6-fc45-384d-7ca402e78004.png)
injectノードをトリガーにして、必要な情報をjsonとしてgoogleカレンダーのノードに渡します。

functionの中のコード例です。

```javascript
let startDatetime
let endDatetime
let summary
let description
let colorId


startDatetime="2021-12-29T10:00:00+09:00"
endDatetime = "2021-12-29T11:00:00+09:00"
summary = "テスト入力"
description = "入力確認のためのテスト"
colorId = 2

msg.payload = {
    "start":{
        dateTime:startDatetime
    },
    "end":{
        dateTime:endDatetime
    },
    summary,
    description,
    colorId
}

return msg;
```
まずはapiが使用できるかのか、べた書きで確認から行っていくと良いと思います。

次にLINEで日付を入力できるようなメッセージを送信します。
こちらのフローもこのようにシンプルなモノから確認していくと良いと思います。
![LINEのカレンダー入力.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/244155/0b737a89-e0bc-2e2a-771e-f5e31805e10c.png)
http requestノードのメソッドはPOST、送信先URLはhttps://api.line.me/v2/bot/message/push にする必要があります。

functionノードの中のコード例はこのようになります。

```javascript
var post_request = {
  "headers": {
      "content-type": "application/json; charset=UTF-8",
      "Authorization": " Bearer " + "チャンネルアクセストークン"
  },
  "payload": {
      "to": " ユーザーID",
      "messages": [  
          {
              "type": "text",
              "text": "時間を入力してください",
              "quickReply": {
                  "items": [
                      {
                          "type": "action",
                          "action":
                            {
                              "type":"datetimepicker",
                              "label":"Select date",
                              "data":"storeId=12345",
                              "mode":"datetime",
                            //   "initial":"2017-12-25t00:00", //初期表示
                              "max":"2022-01-24t23:59",
                              "min":"2020-12-25t00:00"
                            }
                      }
                  ]
              }
          }
      ]
  }
}

return post_request
```
これを自分のLINEに送信すると、日時の入力が簡単にできるようになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/244155/00411bbc-7fde-5d0b-fcd5-bbe9806aa990.png)
このようにLINEの中で時間入力が簡単にできるようになります。

入力した日時をenebular側で受信できるようにします。
このようなフローを用意すれば簡単に受信確認ができます。
![LINEのカレンダー入力.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/244155/033d8b30-45f8-894c-af24-957272fe9f02.png)
httpinノードに関しては、最初に設定した状態のまま使用します。

日時の受信確認まではできましたので、スイッチノードで場合分けをすることによって、LINEボット形式で必要情報を取得することができると考えられます。取得したデータをもとにGoogleカレンダーにスケジュール登録をすると、LINEからGoogleカレンダーにスケジュールを登録できるようになります。

#####考察と感想
今回実装を間に合わせることができませんでしたが、着想からすぐに検証を始めることができましたので、プロトタイプの際にはenebularはやはり便利だと感じました。
インフォモーションで可視化のチュートリアルも試してみたのですが、こちらも簡単に可視化することができました。
少し試してみたい時などにはenebularは非常に便利だと思います。

今回実装が間に合わなかった分については、大みそかハッカソンで実装しようと思います。

鉞、編集リクエスト等大歓迎ですので、よろしくお願いします。

#####参考情報
[enebularでGoogleカレンダーの予定の時間がきたらフローを開始する](https://qiita.com/satosiyonezawa/items/dd1d5628dd6e56eadc7b)
[node-red-node-google](https://flows.nodered.org/node/node-red-node-google)
[LINE公式ドキュメント](https://developers.line.biz/ja/docs/messaging-api/actions/)