IFTTT「観たかった映画が気が付いたら終わってる！」を無くす自動化

# IFTTTとLINE Botでカンタンに「観に行こうと思ってたのにー泣！」を回避
**私は、映画の公開情報を偶然に知ることが多い。**
例えばシネコンの前を通りかかってポスターを見かけたり、電車の中でTwitter見てたら流れてきたり、あと駅構内を歩いていたら広告看板見つけたり、あと電車内の広告などで見つけたり。
家でパソコン開いて検索してるならゆっくりメモることもできるけど、いかんせん歩いてる最中だったりするから、上映期間をスケジュールにパパっと入れられないシチュエーションも多い。
そして毎回「コレ絶対観たいから忘れないようにしなきゃ！」と思っても、忘れる。そして見過ごす！！
**なので、「気が付いたら上映終わってた」のパターンがとても多い。「映画館で観たかったのにー！」って何度なったことか。**
これを手間なくカンタンに解決したい。
今日はこの私得でしかない自動化にトライ。
使うのは、[IFTTT](https://ifttt.com/explore)！
## 全体構造／Siri→IFTTT(iOSカレンダー→Googleカレンダー)→LINE Bot
![無題のプレゼンテーション (1).jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2573810/c77eb40b-d89a-1f7a-420f-dd85ca2a3b80.jpeg)
Siriに入れた映画最終日スケジュールがiOSカレンダーへ→自動でGoogleカレンダーに転記され→LINE Botのリプライメッセージで、聞いた時点から一か月間の終了日を教えてくれる。

## 完成したのでLINE Bot動かしてみた
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">SiriとIFTTTとつなげて、今月終わりそうな映画を知らせてくれるLINE Bot作った！<a href="https://twitter.com/hashtag/IFTTT?src=hash&amp;ref_src=twsrc%5Etfw">#IFTTT</a> <a href="https://twitter.com/hashtag/LINEBot?src=hash&amp;ref_src=twsrc%5Etfw">#LINEBot</a> <a href="https://twitter.com/hashtag/Siri?src=hash&amp;ref_src=twsrc%5Etfw">#Siri</a> <a href="https://twitter.com/hashtag/%E3%82%AB%E3%83%AC%E3%83%B3%E3%83%80%E3%83%BC?src=hash&amp;ref_src=twsrc%5Etfw">#カレンダー</a> <a href="https://twitter.com/hashtag/%E6%98%A0%E7%94%BB?src=hash&amp;ref_src=twsrc%5Etfw">#映画</a> <a href="https://t.co/vFsFWwqwyA">pic.twitter.com/vFsFWwqwyA</a></p>&mdash; __7ENDO__ (@__7ENDO__) <a href="https://twitter.com/__7ENDO__/status/1524082791771951104?ref_src=twsrc%5Etfw">May 10, 2022</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

## IFTTTのアプレットでiOSカレンダーとGoogleカレンダーをつなげる
まずiPhoneで[IFTTT](https://ifttt.com/explore)のアプリをダウンロード。アプリ内で「iOS Calender to Google Calender」と検索するとこのアプレットが出てくる。
![スクリーンショット 2022-05-11 015606.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2573810/c3dcb020-513e-60c7-b22e-7e87020f802e.png)
これで自分のGoogleアカウントと紐付けるだけ！！

**日本語で使いやすいアプレットを紹介している参考記事**
https://www.webhack.jp/archives/11990
### 試しにSiriで「5/18 面白い映画ってカレンダーに入れて」と音声入力
![File (1).jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2573810/cad09c9b-5e9a-6521-9cb1-66369edd8254.jpeg)
チェックすると、アプレットがちゃんと動いてるのがわかる。
Googleカレンダーもこの通り。
![スクリーンショット 2022-05-11 112416.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2573810/61dacbe5-7033-8983-9633-d6b15185d45e.png)


## GoogleカレンダーのAPIを取得してLINE Botとつなげる
ここからが一番大変だった・・・
### GoogleカレンダーのAPI取得／参考にした記事
・GoogleカレンダーのAPI取得で参考になった記事はまずこちら。
https://resowork.com/ggl-calendar-via-nodejs
・Node.jsで書く場合はインストールのための最新情報はここからゲット。
https://www.npmjs.com/package/node-google-calendar
### コード／Googleカレンダーから特定期間の情報をLINE Botにリプライで返す
```js
'use strict';

const express = require('express');
const line = require('@line/bot-sdk');
const dayjs = require('dayjs')
//import dayjs from 'dayjs' // ES 2015
dayjs().format();
//console.log(dayjs().format());
const PORT = process.env.PORT || 3000;

// Messaging APIを利用するための鍵を設定します。
const config = {
  channelSecret: '*******',
  channelAccessToken: '*******'
};

const client = new line.Client(config);

async function handleEvent(event) {
  if (event.type !== 'message' || event.message.type !== 'text') {
    return Promise.resolve(null);
  }
  // ユーザーにリプライメッセージを送ります。
  /*************************
  sample.js
  *************************/
  // ----------------------
  // パッケージのインスタンス生成
  // ----------------------
  var Calendar = require('node-google-calendar'),
    config   = require('./credentials/calendar-config'),

    calId    = config.calendarId.myCal;
  var cal = new Calendar(config);
  // ----------------------
  // カレンダーイベントの取得
  // ----------------------
  // 取得する対象期間を指定
  // timeMin（現在日時）からtimeMax（一か月後）の間のカレンダーイベントが取得される
  var params = {
    timeMin: dayjs().format(),
    timeMax: dayjs().add(1, "month").format(),
  }
  const calEvents = await cal.Events.list(calId, params);
  console.log(calEvents);
  //console.log(calEvents[0].summary);
  //console.log(calEvents[0].summary);
  if (event.message.text == '今月は？') {
    // 映画のタイトルと上映終了日を返す
    return client.replyMessage(event.replyToken,  {
      type: 'text',
      text: calEvents[0].summary + calEvents[0].start.date
    });
  } else {
    // 聞き方を間違えてますよ！など
    return client.replyMessage(event.replyToken,  {
      type: 'text',
      text: "聞き方間違えてます！\n「今月は？」と聞いてください。"
    });
  }
  /*
  cal.Events.list(calId, params)
  .then(calEvents => {
    console.log(calEvents[0].summary);
    return client.replyMessage(event.replyToken,  {
      type: 'text',
      text: calEvents[0].summary
    });
  })
  .catch(err => {
    console.log(err.message);
  });
  */
}

// ここ以降は理解しなくてOKです
const app = express();
app.get('/', (req, res) => res.send('Hello LINE BOT! (HTTP GET)'));
app.post('/webhook', line.middleware(config), (req, res) => {

  if (req.body.events.length === 0) {
    res.send('Hello LINE BOT! (HTTP POST)');
    console.log('検証イベントを受信しました！');
    return;
  } else {
    console.log('受信しました:', req.body.events);
  }

  Promise.all(req.body.events.map(handleEvent)).then((result) => res.json(result));
});

app.listen(PORT);
console.log(`ポート${PORT}番でExpressサーバーを実行中です…`);
```
Siri→IFTTT(iOSカレンダー→Googleカレンダー)→LINE Botリプライメッセージ完成ー－－！！

参考にしたのはこちら！
https://qiita.com/NagaharaHitomi/items/6f0bc022a49a21132be1

# 大事なオマケ：みんなに知ってほしい、Node.jsでめちゃくちゃカンタンに日時をコードに書く技
さきほどのコードのこの部分。
```js
const dayjs = require('dayjs')
//import dayjs from 'dayjs' // ES 2015
dayjs().format();
```
これが！すごいのです！！！これを入れるだけで、スペシャルカンタンなフォーマットを手に入れられるんです！！！
もう**Node.jsで日時を書く魔法のコード**！！
Node.jsのオフィシャルページにこっそり（堂々と）書いてある。
https://day.js.org/docs/en/installation/node-js

魔法のコード無しの時はこんな複雑怪奇なフォーマットで書かなきゃいけなかったのが、
```js
  var params = {
    timeMin: '2022-03-10T06:00:00+09:00',
    timeMax: '2023-08-31T06:00:00+09:00',
```
こう！！
```js
  var params = {
    timeMin: dayjs().format(),
    timeMax: dayjs().add(1, "month").format(),
```
今回一番感動したポイントでした・・・