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


概要

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

アーキテクチャ

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

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

GitHub

解説

Slack Outgoing Webhook

Twilio

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

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だとこんな感じです。


/**
 * 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 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 だけで良いです。コード上で投稿時のアイコンや名前を設定できるので、広瀬すずさんとはしていません。

感想・展望

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

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

困ったらよしなにTwitterDMください。

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

面白い!勉強になった!と思ったら投げ銭いただけると、励みになります👨‍💻👩‍💻