とある技術の開発日記

Diary of irregular phrase programmer

TwilioとASP.NET MVCで簡単なアンケートプログラムの作り方

f:id:airish9:20150701163541p:plain

しばらく間が空きましたがTwilioネタの3回目になります。当初の目的であったアンケートシステムを作るうえで必要な、キー入力をTwilioで処理する方法をご紹介します。

前回の記事はコチラになります。

blog.hamamotsu.jp

前回は電話をかけるとTwilioで自動音声を再生して電話を切るだけでしたが、今回は相手からの操作を受け取って処理してみましょう。

Gatherタグを使用してユーザーからの入力を処理する

Twilioからのリクエストには様々なパラメータがありますが、今回はFromとToパラメータを使用して電話をかけてきた発信先と発信元を判断できるようにしました。 相手からの入力を処理する場合はBeginGatherを使用して処理を行います。numDigitsパラメータで入力する桁数を指定して、finishOnKeyパラメータで入力の終わりを検出します。actionとmethodで入力した内容を処理するURIを指定する事で入力後の処理へ引き継ぎます。

public ActionResult Sample(string From, string To, string CallSid)
{
    var response = new TwilioResponse();
    if (!string.IsNullOrEmpty(From))
    {
        var msg = "From is ";
        msg = (From == "+819012345678") ? msg += "TwilioUser" : msg += From;

        response.Say(msg);
    }
    response.BeginGather(new { numDigits = 2, action = "http://mytwiliowebsite.azurewebsites.net/TwilioSample/Call", method = "POST", finishOnKey = "#" })
        .Say("Hello")
        .Play("http://mytwiliostorage.blob.core.windows.net/music/friend.mp3")
        .Pause(30)
        .EndGather();

    response.Say("Goodbye");
    return TwiML(response);
}

返却されるXML(TwlML)は次のようになります。

<?xml version="1.0" encoding="utf-8"?>
<Response>
  <Gather numDigits="2" action="http://mytwiliowebsite.azurewebsites.net/TwilioSample/Call" method="POST" finishOnKey="#">
    <Say>Hello</Say>
    <Play>http://mytwiliostorage.blob.core.windows.net/music/friend.mp3</Play>
    <Pause length="30" />
  </Gather>
  <Say>Good bay</Say>
</Response>

ブラウザから実行するとFromパラメータが存在しないため電話番号を通知するSayタグは存在しません。 番号入力を受け取った後の処理の例は以下の様になります。

入力後の処理を作成する

Gatherタグから呼び出されるURLはDigitsパラメータを使用して作成するのがポイントです。

public ActionResult Call(string From, string To, string CallSid, string Digits)
{
    var response = new TwilioResponse();
    response.Say("Thank you call");

    switch (Digits)
    {
        case "1":
            response.Say("Digits is one.");
            break;

        case "2":
            response.Say("Digits is two.");
            response.Record(new { maxLength = 10, action = "http://mytwiliostorage.azurewebsites.net/TwilioSample/Recorded" });
            break;

        case "10":
            response.Say("Digits is ten.");
            break;
        default:
            break;
    }

    response.Say("Goodbye Twiliouser");
    return TwiML(response);
}

Digitsパラメータで入力されたキーを判定します。今回の例では'2'が入力された時は10秒間の音声を録音を行っていますが。入力されたキーごとに集計すればアンケートシステムとなります。

まとめ

  1. ユーザーからの入力待ちにはGatherタグを使用する
  2. Gatherタグで指定したURLにはDigitsパラメータが送信されるので、Digitsパラメータを元に処理を分岐する。

このようにアンケートアプリ程度なら簡単に作成する事ができます。