[GAS/Twilio]広瀬すずさんがSlackのリマインダー機能でモーニングコールしてくれるサービス

# 概要
Slackのリマインダー機能を使って、美少女botにモーニングコールを依頼できるサービスです。「朝起きれないのは、美少女が起こしてくれないせいである！！」という仮説を検証するために作りました。簡単にモーニングコールの音源が見つかったので、今回は広瀬すずさんに抜擢させていただきました。ありがとうございます。

![gif](https://user-images.githubusercontent.com/11635641/60399961-24757800-9ba8-11e9-9fa3-003e5e2bbf5f.gif)

## アーキテクチャ
リマインドされた際の文言（ `リマインダー：` ）をトリガーに、SlackのOutgoing WebhooksでGASに繋いでいます。そこからTwilioのAPIを叩き、僕のiPhoneに電話してくれるという流れです。Twilioは音声通話、メッセージング（SMS/チャット）、ビデオなどの様々なコミュニケーション手段をアプリケーションやビジネスへ容易に組み込むことのできるクラウドAPIサービスです。つまり、リマインダー機能を利用しているのでアラームのように時間設定することができます。まさにモーニングコール。

AWS S3は、モーニングコールに出た際の音源を置いています。またその音源を再生するための指示として `TwiML.xml` というファイルを置いています。そして、Slack上で「今起こしてあげるね！」の時の画像として利用しています。他のサービスでもこのBotを別の美少女として化けさせているので画像は別途指定しているのです。

![image](https://user-images.githubusercontent.com/11635641/60399885-20952600-9ba7-11e9-957a-b571428c0194.png)

# GitHub
全コード公開してるため、参考にしてください🎉

- [IZUMIRU/bishojyo-morning-call](https://github.com/IZUMIRU/bishojyo-morning-call)

# 解説
### Slack Outgoing Webhook

- [Slack App](https://XXXXX.slack.com/apps)

<img width="1439" alt="Slack App" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/105093/9c4b7897-6688-4940-251a-452112ff1ab5.png">

<img width="962" alt="Slack App" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/105093/8c172b0e-72c9-ba4d-a02c-1b06c9a607d8.png">

### Twilio
初期設定は簡単ですが、慣れるまで管理画面はどこになにがあるのか少しだけ分かりづらいかもしれません（機能が豊富ゆえ☺️）。

以下のSIDとTOKENが必要です。また無料枠だと最初に「無料枠です。何かしらダイアル押してください。」と言われ、何かしらダイヤルを押すと自分が設定したメッセージが流れます。無料でも十分ではありますが、朝すぐに広瀬すずさんの声が聞きたかったので、最低額である2,000円をチャージしました。1リクエスト15円と少々高いのが辛いところですが、背に腹はかえられません。

<img width="1439" alt="Twilio" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/105093/c96bd43e-e083-b879-99d1-2236097d3102.png">


Curlではこんな感じで投げられます。S3の場合明示的にMethodを `GET` 指定する必要があります。指定しないと電話はかかりますが、「申し訳ございません。アプリケーションでエラーが発生しました。」と言われます。これ地味にはまったので注意です。

```
curl -XPOST https://api.twilio.com/2010-04-01/Accounts/[twilioSid]/Calls.json \
    --data-urlencode "Method=GET" \
    --data-urlencode "Url=https://[bucketName].s3-ap-northeast-1.amazonaws.com/[FolderName]/TwiML.xml" \
    --data-urlencode "To=+819012345678" \
    --data-urlencode "From=+815012345678" \
    -u '[twilioSid]:[twilioToken]'
```

GASだとこんな感じです。

```js

/**
 * Twilioを使って電話をかける
 *
 * @ return void（Qiitaだと `@` でメンション飛んじゃうのでスペースあけてます）
 */
function callByTwilio() {
  // 基本的にGASの環境変数にいれています
  const phoneNumber       = properties.getProperty('phone_number');
  const twilioPhoneNumber = properties.getProperty('twilio_phone_number');
  const twilioSid         = properties.getProperty('twilio_sid');
  const twilioToken       = properties.getProperty('twilio_token');

  const payload = {
    // S3の場合、明示的に指定する必要あり
    'Method'  : 'GET',
    'To'      : phoneNumber,
    'From'    : twilioPhoneNumber,
    'Url'     : 'https://' + s3BucketName + '.s3-ap-northeast-1.amazonaws.com/' + s3FolderName + '/TwiML.xml',
    'Timeout' : '60'
  };

  const url     = 'https://api.twilio.com/2010-04-01/Accounts/' + twilioSid + '/Calls.json';
  const paramas = {
    'method'  : 'POST',
    'headers' : {
      'Authorization' : 'Basic ' + Utilities.base64Encode(twilioSid + ':' + twilioToken)
    },
    'payload' : payload,
    'muteHttpExceptions' : true
  };
  
  UrlFetchApp.fetch(url, paramas);
}
```

### TwiML.xml
AWS S3などどこか外部から参照できるところに置いておきます。

```xml

<?xml version="1.0" encoding="UTF-8"?>
<Response>
  <Play>https://XXXXX.s3-ap-northeast-1.amazonaws.com/XXXXX/hirose_suzu.mp3</Play>
</Response>
```


### Slack Bot
Slackにメッセージを投稿するためにBotを設定してください。Permission Scopesは `bot` だけで良いです。コード上で投稿時のアイコンや名前を設定できるので、広瀬すずさんとはしていません。

- [Slack API](https://api.slack.com/apps)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/105093/6ae18fc1-a091-aeab-8bf7-2adb0972cc6a.png)

# 感想・展望
最近GASをいじってますがLambda+API Gatewayよりも楽だなーという印象です。また今回はじめてTwilioいじりましたが、もっと色々できそうと可能性を感じました。（←今更）

そして、「朝起きれないのは、美少女が起こしてくれないせいである！！」という仮説を検証するために、早速今朝広瀬すずさんに起こしてもらいました。が、二度寝してしまったのでキャストを変更するかもしれません。ごめんなさい。モーニングコールの音源どこかにないですかね。

困ったらよしなに[TwitterDM](https://twitter.com/IZUMIRU0313)ください。


※追記 美少女シリーズ第二弾

- [[GAS/GoogleCloudNaturalLanguageAPI]宇垣美里さんが時には厳しく、時には優しくしてくれるアメムチbot](https://qiita.com/IZUMIRU/items/f99c406838cf1b8a7032)