[Twilio]内線接続&会話を録音してみよう#8

2013.04.25

Twilio番号から別電話へ接続

セキュリティの重要性が叫ばれている昨今、「電話で携帯に連絡してもらいたいが、携帯番号はあまり教えたくない!」という場合があるかもしれません。
そういった場合、相手にIVRへ電話をかけてもらい、任意の内線番号を押すことで自分の携帯に接続されるなら、
携帯番号を教えなくても、IVR番号と内線番号で連絡をとることができます。
Twilioであれば、そんな機能も簡単に実装できます。

環境構築方法

実行環境およびTwilioアカウントについては、第1回記事第2回記事を見て設定&確認しておいてください。
今回も第4回のサンプルをベースに作成するので、
Heroku環境とそのサンプルを用意しましょう。

IVRで接続先を選択して通話する

今回実装する機能は、次のようなものです。

  • 1.IVR(Twilioの番号)へ電話すると、メニュー音声が流れる
  • 2.メニューから接続先を選択すると、その番号へ接続される
  • 3.ついでに会話内容を録音したので、その内容を再生

相手へ接続したとき、通知される番号はTwilioの番号なので、発信元の番号は相手に知られることはありません。
では、サンプルを実装してみましょう。

1.Voice Request URLを指定

またまた今回も番号管理ページで使用する電話番号部分をクリックし、音声通話情報設定ページで、Voice Request URLを下記のように指定しましょう。

http://<デプロイしたサーバのドメイン>/menu

/menuはメニュー音声読み上げのためのTwiMLを返します。

2.アプリケーションを修正

app.jsに3つルート情報を追加します。
/connectOpはIVRで選択された番号によって接続先を選択します。
/connectOpResultは、通話終了後、録音していた通話内容を再生します。

・
・
//メニュー音声再生
app.get('/menu', routes.menu);
//押された番号によって接続先選択
app.get('/connectOp', routes.connectOp);
//通話終了後の通話音声再生
app.get('/connectOpResult', routes.connectOpResult);
・
・

index.jsに関数を追加/修正します。menu関数を今回の機能にあうように修正しましょう。

・
・
exports.menu = function (req, res) {
    var resp = new twilio.TwimlResponse();
    var opt = {
        voice: 'woman',
        language: 'ja-jp'
    }
    resp.say('こちらは、クラスメソッド株式会社です。', opt).gather({
            action: 'http://<デプロイしたサーバのドメイン>/connectOp',
            method: 'GET',
            finishOnKey: '#',
            timeout: 20
        }, function () {
            this.say('Aさんへ連絡したい方は一番', opt)
                .say('Bさんへ連絡したい方は二番を押してください。', opt)
                .say('入力が完了したら、シャープを押してください。担当者におつなぎいたします。', opt);
        });

    res.writeHead(200, {'Content-Type': 'text/xml'});
    console.log(resp);
    res.end(resp.toString());
};

以前の記事で紹介したように、gather関数を指定して発信者にキー操作を依頼しています。
キー操作終了後は、/connectOpへTwilioがリクエストを行います。

キー操作終了後、/connectOpリクエストが行われ、connectOp関数が実行されます。
ここでは、入力した番号に応じた担当者へ接続します。

exports.connectOp = function (req, res) {
    var pushNumber = req.query.Digits;
    var resp = new twilio.TwimlResponse();
    var opt = {
        voice: 'woman',
        language: 'ja-jp'
    }
    if (pushNumber === "1") {
        resp.say('いちばんがおされました。Aさんへ接続します。', opt).dial('+810000000000', {
                action: 'http://<デプロイしたサーバのドメイン>/connectOpResult',
                method: "GET",
                callerId: '<正しいTwilio電話番号>',
                record: true
            });
    } else if (pushNumber === "2") {
        resp.say('にばんがおされました。Bさんに接続します。', opt).dial('+811111111111', {
                action: 'http://<デプロイしたサーバのドメイン>/connectOpResult',
                method: "GET",
                callerId: '<正しいTwilio電話番号>',
                record: true
            });
    } else {
        resp.say('終了します。', opt);
    }

    res.writeHead(200, {'Content-Type': 'text/xml'});
    console.log(resp);
    res.end(resp.toString());
};

dial関数を使用し、第1引数の番号へ接続しています。
第2引数のactionは、通話終了後に実行されるURLです。また、callerIdにTwilio番号を設定しなければ通話はできません。
また、record属性をtrueにしているので、通話内容が録音されます。

最後に、通話終了後に通話内容を再生するための関数です。ここは以前やったのと同じですね。

exports.connectOpResult = function (req, res) {
    var recordingUrl = req.query.RecordingUrl;
    var resp = new twilio.TwimlResponse();
    var opt = {
        voice: 'woman',
        language: 'ja-jp'
    }

    resp.say('録音した音声を再生します。', opt)
        .play(recordingUrl)
        .say('通話を終了します。', opt)

    res.writeHead(200, {'Content-Type': 'text/xml'});
    console.log(resp);
    res.end(resp.toString());
};

3.Herokuにデプロイして確認

いつものように、Herokuへログイン後、デプロイしましょう。
※もちろん、Herokuである必要はないです

% heroku login //IDパスワード入力
% git add .
% git commit -m "内線機能追加"
% git push heroku master

デプロイと起動が完了したら、Voice Request URLで指定した電話番号にかけてみましょう。
メニューで選択した番号とTwilioを介して通話できます。そして、相手に通知される番号はTwilioの番号になっています。
さらに、会話終了後には直前の会話内容が再生されます。

まとめ

いかがでしょうか。非常に簡単に内線機能(会話録音機能のおまけつき)ができてしまいました。
Dial機能にはこれ以外にもおもしろそうな機能があるので確認してみてください。

参考サイトなど