Twilioブログ

Twilio Functionsを使った電話転送の作り方

こんにちは、Twilio事業部のkatsu.tです。

先日、ノンコーディングで作れるTwilio Studioを使った電話転送の作り方をご紹介いたしましたが、本ブログではTwilio Functionsを使って、node.jsで電話転送アプリの作り方をご紹介いたします。

電話転送アプリの概要

  • Twilioの電話番号にかかってきた電話を特定の電話番号に転送する
  • 転送先が電話に出なかった時に留守電を録音してSMSで通知する

事前準備

使用するTwiML

今回は以下TwiMLを使用します。

Dial

リファレンス

TwiML<Dial> 動詞を使用すると、現在の発信者を別の通話者に接続することができます。

Say

リファレンス

<Say> 動詞は、発信者に対して、テキストの文字列を読み上げることができます。

Record

Record

<Record> 動詞は、発信者の音声を録音し、録音した音声ファイルの URL を返却します。

作り方

まず初めに、CLIを使ってTwilio Functionsを使用できるようにプラグインを入れます。
twilio loginは実施済みとします。

twilio plugins:install @twilio-labs/plugin-serverless

続いて、function用のプロジェクトを作成します。

twilio serverless:init call-forwarding

デフォルトでassets配下とfunctions配下にファイルができているので中身のファイルは削除します。

.envファイルに以下項目を追加します。
MY_PHONE_NUMBER=+8190xxxxxxxx //your phone number
CALLER_ID=+8150xxxxxxxx //your twilio number

これで、準備が整いました。
それでは早速電話転送アプリを作っていきたいと思います。

処理は、

「電話を転送する → 留守電を録音する留守電のURLをSMSで送信する」

の順番で呼び出されるのですが、実装する際に次のfunctionを呼び出す処理を行うため

「留守電のURLをSMSで送信する留守電を録音する電話を転送する」

の順番で実装していきます。

留守電のURLをSMSで送信するfunction

まず留守電の録音が終了し、録音ファイルが生成された時のコールバックを受け取って録音ファイルのURLをSMSで送信するfunctionを作っていきます。
以下内容でrecording-status-call-back.jsと名前をつけてfunctionsフォルダ内にファイルを作成します。

exports.handler = async function (context, event, callback) {
    if (event.RecordingDuration != 0 && event.RecordingStatus == 'completed') {
        // SMSを送信する
        let client = context.getTwilioClient();
        let body = '留守電があります。' + event.RecordingUrl;
        await client.messages
            .create({
                body: body,
                from: 'A-machine',
                to: context.MY_PHONE_NUMBER
            });
    }
    callback(null, {});
};

留守電を録音するfunction

続いて、電話を転送した相手が電話に出なかった時に、留守電を録音するfunctionを作成します。
以下内容でcall-status-call-back.jsと名前をつけてfunctionsフォルダ内にファイルを作成します。

exports.handler = async function (context, event, callback) {
    let twiml = new Twilio.twiml.VoiceResponse();
    if (event.DialCallStatus == 'busy' || event.DialCallStatus == 'no-answer' || event.DialCallStatus == 'failed') {
        twiml.say({
            voice: 'alice',
            language: 'ja-JP'
        }, '現在電話に出ることができません。発信音の後にメッセージをどうぞ');
        twiml.record({
            recordingStatusCallback: 'recording-status-call-back'
        });
        // SMSを送信する
        let client = context.getTwilioClient();
        let body = event.From + 'から電話がありました。'
        await client.messages
            .create({
                body: body,
                from: 'A-machine',
                to: context.MY_PHONE_NUMBER
            });
    }

    twiml.hangup();
    callback(null, twiml);
};

電話を転送するfunction

最後にTwilioで着信した電話を自分の携帯電話に転送するfunctionを作成していきます。
以下内容でforward-call.jsと名前をつけてfunctionsフォルダ内にファイルを作成します。

exports.handler = function(context, event, callback) {
    let twiml = new Twilio.twiml.VoiceResponse();
    twiml.dial({
        action: 'call-status-call-back',
        callerId: context.CALLER_ID,
        timeout: 15
    }, context.MY_PHONE_NUMBER);
    callback(null, twiml);
};

デプロイ!

それぞれのfunctionが作成できたら、最後にTwilio Functionsに以下コマンドでデプロイします。

twilio serverless:deploy

デプロイができたら、購入済みの電話番号と紐付けを行います。
保有している電話番号一覧から紐付けたい電話番号を選び設定を開きます。

A CALL COMES INにFunctionを選択します。

select-type-1

デプロイしたfunctionの中からforward-callを選択します。

select-function-1

設定が完了したら最後に「Save」をクリックして、Twilio Functionsを使った電話転送は完成です!

早速、設定した電話に電話をかけてみて試してみてください!

まとめ

今回は、Twilioがもっているサーバーレスの仕組みを使って、Twilioだけで完結する電話転送アプリを作成しました。Functionsを使えばStudioだけでは実現できない複雑な機能を作ることができます。これを機にFunctionsの活用も是非お試しください!

アプリケーションエンジニア 葛 智紀
アプリケーションエンジニア 葛 智紀

前職でiOS、Androidのネイティブアプリケーション開発、AngularやLaravelを用いたウェブアプリケーション開発に従事。KDDIウェブコミュニケーションズではTwilioの最新情報の発信やTwilioを用いた地域課題解決を担当。 個人では、Google Developer Group Tokyoのオーガナイザーを務める。

Share!!

この記事を読んだ人へのオススメ

  • お役立ち情報
  • イベント情報
  • 相談会申込
  • 導入事例