23
22

More than 1 year has passed since last update.

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

Last updated at Posted at 2022-05-10

IFTTTとLINE Botでカンタンに「観に行こうと思ってたのにー泣!」を回避

私は、映画の公開情報を偶然に知ることが多い。
例えばシネコンの前を通りかかってポスターを見かけたり、電車の中でTwitter見てたら流れてきたり、あと駅構内を歩いていたら広告看板見つけたり、あと電車内の広告などで見つけたり。
家でパソコン開いて検索してるならゆっくりメモることもできるけど、いかんせん歩いてる最中だったりするから、上映期間をスケジュールにパパっと入れられないシチュエーションも多い。
そして毎回「コレ絶対観たいから忘れないようにしなきゃ!」と思っても、忘れる。そして見過ごす!!
なので、「気が付いたら上映終わってた」のパターンがとても多い。「映画館で観たかったのにー!」って何度なったことか。
これを手間なくカンタンに解決したい。
今日はこの私得でしかない自動化にトライ。
使うのは、IFTTT

全体構造/Siri→IFTTT(iOSカレンダー→Googleカレンダー)→LINE Bot

無題のプレゼンテーション (1).jpg
Siriに入れた映画最終日スケジュールがiOSカレンダーへ→自動でGoogleカレンダーに転記され→LINE Botのリプライメッセージで、聞いた時点から一か月間の終了日を教えてくれる。

完成したのでLINE Bot動かしてみた

IFTTTのアプレットでiOSカレンダーとGoogleカレンダーをつなげる

まずiPhoneでIFTTTのアプリをダウンロード。アプリ内で「iOS Calender to Google Calender」と検索するとこのアプレットが出てくる。
スクリーンショット 2022-05-11 015606.png
これで自分のGoogleアカウントと紐付けるだけ!!

日本語で使いやすいアプレットを紹介している参考記事
https://www.webhack.jp/archives/11990

試しにSiriで「5/18 面白い映画ってカレンダーに入れて」と音声入力

File (1).jpg
チェックすると、アプレットがちゃんと動いてるのがわかる。
Googleカレンダーもこの通り。
スクリーンショット 2022-05-11 112416.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にリプライで返す

'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でめちゃくちゃカンタンに日時をコードに書く技

さきほどのコードのこの部分。

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

魔法のコード無しの時はこんな複雑怪奇なフォーマットで書かなきゃいけなかったのが、

  var params = {
    timeMin: '2022-03-10T06:00:00+09:00',
    timeMax: '2023-08-31T06:00:00+09:00',

こう!!

  var params = {
    timeMin: dayjs().format(),
    timeMax: dayjs().add(1, "month").format(),

今回一番感動したポイントでした・・・

23
22
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
23
22