こんにちは。
最近体重の増加が止まりません。秋ですねー。 逆に電話の着信が減った気がします。 前者を治す方法は皆目検討がつきませんが、後者なら解決できそうです。
そこで、 「slackでコマンド命令を与えると、自分の電話が鳴ってカラオケに誘われる。」 ってのをやってみたいと思います。
twilio
twilioとは「クラウド通信企業」であり、プログラムを使って簡単に電話がかけられるAPIを提供している会社です。 本社はアメリカにあり、日本ではKDDIウェブコミュニケーションズさんが代理店としてサービスを提供しています。
お試し期間ならクレジットカード登録もいらないので、気軽に試せますね。
API利用するにあたって必要なもの
- twilioアカウント登録
- 050電話番号の取得
- この番号からかかってくるようになります。(お試しでも取得できました)
- 認証用AccessTokenの確認
- コンソールダッシュボードに表示されているのでコピっときます。
サンプルプログラムを試す
ドキュメントもしっかり整備されてます。
今回は、AWSのLambdaにプログラムを置きたかったので、Nodeで書くことにします。
https://jp.twilio.com/docs/quickstart/node/programmable-voice
↑に記載された通りに書き換えてローカルPC上で動かすだけで、電話がかかってきました。
書き換えたのは以下だけ
- accountSid
- authToken
- to
- from
実に簡単。
音声レスポンス命令の作成とアップロード
電話がかかってきた際に、特定の文言を喋らせたり、音楽データを流したり、通話を録音したりすることができます。 それを制御するのが、TWIMLと呼ばれるXMLです。
<Say>: 発信者にテキストを読み上げます。 <Play>: 発信者に音声ファイルを再生します。 <Record>: 通話や通話の一部を録音します。 <Gather>: 発信者がダイヤルした数字を取得します。 <Dial>: 相手の電話番号またはカンファレンスに電話をかけ、発信者を接続します。 <Sms>: 通話中に SMS メッセージを送信します。
自分で設定した音声レスポンスを使う場合はアップグレードが必要みたいです。 管理画面から、クレジットを登録して、2000円だけ入れてみました。
今回は カラオケに誘われる 為に、以下の内容のxmlファイルをサーバ(amazon S3)にアップロードし、公開設定を行いました。
<?xml version="1.0" encoding="UTF-8"?> <Response> <Say voice="alice">let's go karaoke</Say> </Response>
プログラム書き換え
xmlのアップロードが完了したので先程のプログラム内の url
箇所を S3にアップしたxmlの公開urlに書き換えます。
client.calls.create({ url: 'https://xxxxxx.xxxxxx/xxxxxx.xml',
Debugger
プログラムを動かしたら電話はかかってきたのですが、 「アプリケーションエラーが発生しました」とアナウンスされました。
おやおや?と悩んでいたら、twilioの管理画面にDebugger機能があったので見てみました。
むむ?POSTでアクセスに行っているではないか・・。 デフォルトではこのような挙動になるようです。
プログラムを修正して、methodにGETを指定します。
client.calls.create({ url: 'https://xxxxxx.xxxxxx/xxxxxx.xml', method: 'GET', ...
これで無事に読み上げてくれました。
AWS Lambdaにプログラムを配置
Lambdaは最近よく聞くサーバレスアーキテクチャ。 リクエスト待受するために常にサーバを立てておくのではなく、必要な時に呼び出されて実行プログラムが起動する仕組み。イベントドリブンな感じ。
今回は、
- API gateway
- Lambda
を組み合わせ、作成したURLが叩かれた時に先程のプログラムが動くようにしました。
Lambda関数
Lambda関数として動かす為に、先程のプログラムに handler
の関数名を指定します。
exports.handler = function(event, context) { // プログラム ... }
https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/nodejs-prog-model-handler.html
NodeプロジェクトとしてZip圧縮
Lambdaでは、node_modulesも含めてアップする必要があるため、zipに固めます。
$ zip -r index.zip index.js node_modules
Lambdaにアップロード
Select blueprint templateのようなものですかね。今回はAPI Gatewayと連携するので「api-gateway-authorizer-nodejs」を選びました
Configure triggers API Gatewayを選択
Configure function
Name: callme Runtime: Node.js 4.3 Code Entry Type: Upload a .ZIP file 先程固めたzipをアップロード Hander: index.hander // 先程のプログラム(index.js)をhandlerの名でexportしたので。ファイル名やhandler名が異なってるとエラーになるので注意。 Role: create new role from template Role Name: test 残りはデフォルト
API Gateway
- APIを作成して、GETをLambdaで作成したcallmeファンクションと紐付け
- APIのデプロイで、公開(stageは新規作成) するとURLが手に入ります!!
slackのコマンドでプログラムを呼び出そう
さて、呼び出しURLが決まったので、これを直接呼び出してもいいんですが、 どうせならSlackから特定のコマンドを入力した時に、呼び出すようにしてみましょう。
slackのAppDirectoryで
Slash Commands
を選択。
叩いてみたら 電話かかってきましたー
まとめ
少し今更感もありますが、twilioもLambdaも興味あったけど使ったことがなかったので遊んでみました。
サービスでアカウント登録後に電話がかかってきて、音声で流れてきたコードを入力して完了という流れがたまにありますが、twilio使ってるんですかね?
コールセンターや受付サービスなどたくさんの事例があるみたいです。
サーバ監視で障害発生したら電話で叩き起こすってのもよくありですが、いいですね。
遅刻メンバーを叩き起こす・・。
さて、寒くなってきましたが、皆さん風邪にはお気をつけください。
では一人カラオケへ行こうかな。いやジムですかね。
それでは、失礼します。