TwiML™ Message: 開発者からのレスポンス

Twilio電話番号のひとつでメッセージが受信されると、Twilioはその番号に対して構成されたメッセージURLにHTTPリクエストを発行します。 そのリクエストへの応答の中で、メッセージに対して行うことをTwilioに指示できます。 番号のURLはこちらで構成できます。

HTTP クライアントとしての Twilio

Twilio は通常のウェブ ブラウザと同じように振る舞いますので、新しいことを覚える必要はありません。

  • Cookie : Twilio は通常のウェブ ブラウザと同じように、HTTP cookie を受信し、リクエストに追加します。
  • リダイレクト : Twilio は通常のウェブ ブラウザと同じように、HTTP リダイレクト (HTTP ステータス コード 301、307 など) をサポートします。
  • キャッシュ : Twilio は、HTTP ヘッダーでキャッシュが有効になっている場合 (ETag と Last-Modified ヘッダー)、および HTTP のメソッドが GET の場合、通常のウェブ ブラウザと同じように、ファイルをキャッシュします。

Cookie

Twilio は、2 つの電話番号の間でやり取りされる複数の SMS をまたいで cookie の状態を保持します。 このため、複数のメッセージを 1 つの会話として扱うことができ、その会話のセッション識別子などのデータを cookie に格納して、後で使用できます。 この会話の cookie は、4 時間使用しないと期限切れになります。

MIME Type に対応

Twilio はユーザー アプリケーションのレスポンスの MIME Type に応じて異なる動作をします。

MIME Type 動作
text/xml, application/xml, text/html Twilio は返却された文書を TwiML XML の命令のセットとして解釈します。 詳細は XML 動詞のセクションを参照してください。 これは最もよく使われるレスポンスです。
text/plain Twilioはメッセージ中にある送信者にテキストファイルの内容を返します。

Twilio の TwiML インタープリター

Twilio のリクエストに対してユーザー アプリケーションが XML で応答すると、Twilio は TwiML インタープリターでユーザ-の文書を実行します。 しくみをシンプルに保つために、TwiML インタープリターは、特別に命名された少数の XML 要素のみを解釈します。 TwiML では、これらの要素は 3 つのグループに分けられます。ルートの <Response> 要素動詞名詞です。 それぞれのグループについて説明します。

インタープリターはTwiMLドキュメントを上から下に見て動詞を順番に実行します。例として下記のTwiMLメッセージはhttps://demo.twilio.com/sms/welcomeにコントロールをリダイレクトする前に"Hello World" を送信者に返信します。

<?xml version="1.0" encoding="UTF-8" ?>
<Response>
    <Message>Hello World!</Message>
    <Redirect>https://demo.twilio.com/sms/welcome</Redirect>
</Response>

1 つの TwiML 文書に複数の <Message> 動詞を挿入して、複数のメッセージを送信できます。 たとえば、

<?xml version="1.0" encoding="UTF-8" ?>
<Response>
    <Message>This is message 1 of 2.</Message>
    <Message>This is message 2 of 2.</Message>
</Response>

TwiMLエレメントである、動詞、名詞は、大文字と小文字を区別します。<message><Message>の意味で使用するとエラーになります。属性名も同様に大文字と小文字を区別キャメルケースです。XMLコメントも入れることができ、インタープリターはそれらを無視します。

<Response> 要素

<Response> 要素は、Twilio の XML マークアップのルート要素です。 Twilio のリクエストに対する TwiML レスポンスでは、必ずすべての動詞をこの要素の中にネストします。 それ以外の構造は無効となります。

例:
<?xml version="1.0" encoding="UTF-8"?>
<Response>
    <Message>I'm hungry!</Message>
</Response>

TwiML 動詞

TwiMLドキュメントで最も使われるXMLエレメントはTwiML動詞です。動詞名は大文字小文字を区別します、属性名も同様です。一つのコアTwiMLメッセージ動詞と一つの第二動詞です。それぞれを詳しい説明があります。コア動詞は

  • <Message>到着したメッセージに返信をする。

制御フローが別の文書に移ったために、TwiML インタープリターが TwiML 文書内の動詞に到達しない場合がありますので、注意してください。 通常は、動詞の action 属性を設定している場合に起こります。 たとえば、<Message> の後に <Redirect> が続いており、<Message> に action URL を設定している場合、<Redirect> は不達となります。 この場合、SMS セッションのフローは、action URL リクエストに対するアプリケーションのレスポンスとして受信した TwiML に従って進みます。

制御フローに関係する動詞は、 <Message><Redirect> です。

TwiML 名詞

TwiMLの名詞は動詞の内側にネストできます。いずれの動詞でも可能です。しかし<Media><Body>名詞とともに使われる<Message>では、名詞であるXMLエレメントはネストできます。

ステータス・コールバック

ステータスコールバックは通話フローの制御を行わず、したがってTwiMLを返す必要はありません; しかしながら、ステータスコールバックにはContent-Type: text/xmlを伴った204 No Content または 200 OKと、Bodyには空の<Response/>をレスポンスとして返すことが推奨されます。 正しくレスポンスを返さないと、デバッガーで警告が発生します。

TwilioヘルパーライブラリーでTwiMLを生成する

Twilioでは、使い慣れたプログラミング言語でこうしたTwiMLを簡単に生成できるようにするヘルパーライブラリーを提供しています。

例2: Hello Worldという本文を送信し、TwiMLに制御をリダイレクトする

コードサンプルを読み込んでいます...
Language
SDKバージョン:
  • 5.x
SDKバージョン:
  • 7.x
SDKバージョン:
  • 3.x
SDKバージョン:
  • 5.x
SDKバージョン:
  • 6.x
SDKバージョン:
  • 5.x
形式:
  • TwiML
const MessagingResponse = require('twilio').twiml.MessagingResponse;

const response = new MessagingResponse();
const message = response.message();
message.body('Hello World!');
response.redirect('https://demo.twilio.com/sms/welcome');

console.log(response.toString());
using Twilio.TwiML;
using Twilio.TwiML.Messaging;
using System;


class Example
{
    static void Main()
    {
        var response = new MessagingResponse();
        var message = new Message();
        message.Body("Hello World!");
        response.Append(message);
        response.Redirect(url: new Uri("https://demo.twilio.com/sms/welcome"));

        Console.WriteLine(response.ToString());;
    }
}
<?php
require_once './vendor/autoload.php';
use Twilio\Twiml;

$response = new Twiml();
$message = $response->message();
$message->body('Hello World!');
$response->redirect('https://demo.twilio.com/sms/welcome');

echo $response;
require 'twilio-ruby'

response = Twilio::TwiML::MessagingResponse.new
response.message do |message|
    message.body('Hello World!')
end
response.redirect('https://demo.twilio.com/sms/welcome')

puts response
from twilio.twiml.messaging_response import Body, Message, Redirect, MessagingResponse

response = MessagingResponse()
message = Message()
message.body('Hello World!')
response.append(message)
response.redirect('https://demo.twilio.com/sms/welcome')

print(response)
import com.twilio.twiml.messaging.Body;
import com.twilio.twiml.messaging.Message;
import com.twilio.twiml.voice.Redirect;
import com.twilio.twiml.MessagingResponse;
import com.twilio.twiml.TwiMLException;


public class Example {
    public static void main(String[] args) {
        Body body = new Body("Hello World!");
        Message message = new Message.Builder().body(body).build();
        Redirect redirect = new Redirect.Builder()
            .url("https://demo.twilio.com/sms/welcome").build();
        MessagingResponse response = new MessagingResponse.Builder()
            .message(message).redirect(redirect).build();

        try {
            System.out.println(response.toXml());
        } catch (TwiMLException e) {
            e.printStackTrace();
        }
    }
}
<?xml version="1.0" encoding="UTF-8"?>
<Response>
    <Message><Body>Hello World!</Body></Message>
    <Redirect>https://demo.twilio.com/sms/welcome</Redirect>
</Response>
Hello Worldという本文を送信し、TwiMLに制御をリダイレクトする
コードサンプルを読み込んでいます...
Language
SDKバージョン:
  • 5.x
SDKバージョン:
  • 7.x
SDKバージョン:
  • 3.x
SDKバージョン:
  • 5.x
SDKバージョン:
  • 6.x
SDKバージョン:
  • 5.x
形式:
  • TwiML
const MessagingResponse = require('twilio').twiml.MessagingResponse;

const response = new MessagingResponse();
response.message('This is message 1 of 2.');
response.message('This is message 2 of 2.');

console.log(response.toString());
using Twilio.TwiML;
using System;


class Example
{
    static void Main()
    {
        var response = new MessagingResponse();
        response.Message("This is message 1 of 2.");
        response.Message("This is message 2 of 2.");

        Console.WriteLine(response.ToString());;
    }
}
<?php
require_once './vendor/autoload.php';
use Twilio\Twiml;

$response = new Twiml();
$response->message('This is message 1 of 2.');
$response->message('This is message 2 of 2.');

echo $response;
require 'twilio-ruby'

response = Twilio::TwiML::MessagingResponse.new
response.message(body: 'This is message 1 of 2.')
response.message(body: 'This is message 2 of 2.')

puts response
from twilio.twiml.messaging_response import Message, MessagingResponse

response = MessagingResponse()
response.message('This is message 1 of 2.')
response.message('This is message 2 of 2.')

print(response)
import com.twilio.twiml.messaging.Body;
import com.twilio.twiml.messaging.Message;
import com.twilio.twiml.MessagingResponse;
import com.twilio.twiml.TwiMLException;


public class Example {
    public static void main(String[] args) {
        Body body = new Body("This is message 1 of 2.");
        Message message = new Message.Builder().body(body).build();
        Body body2 = new Body("This is message 2 of 2.");
        Message message2 = new Message.Builder().body(body2).build();
        MessagingResponse response = new MessagingResponse.Builder()
            .message(message).message(message2).build();

        try {
            System.out.println(response.toXml());
        } catch (TwiMLException e) {
            e.printStackTrace();
        }
    }
}
<?xml version="1.0" encoding="UTF-8"?>
<Response>
    <Message>This is message 1 of 2.</Message>
    <Message>This is message 2 of 2.</Message>
</Response>
メッセージを2件送信する
コードサンプルを読み込んでいます...
Language
SDKバージョン:
  • 5.x
SDKバージョン:
  • 7.x
SDKバージョン:
  • 3.x
SDKバージョン:
  • 5.x
SDKバージョン:
  • 6.x
SDKバージョン:
  • 5.x
形式:
  • TwiML
const MessagingResponse = require('twilio').twiml.MessagingResponse;

const response = new MessagingResponse();
response.message('I\'m hungry!');

console.log(response.toString());
using Twilio.TwiML;
using System;


class Example
{
    static void Main()
    {
        var response = new MessagingResponse();
        response.Message("I'm hungry!");

        Console.WriteLine(response.ToString());;
    }
}
<?php
require_once './vendor/autoload.php';
use Twilio\Twiml;

$response = new Twiml();
$response->message('I\'m hungry!');

echo $response;
require 'twilio-ruby'

response = Twilio::TwiML::MessagingResponse.new
response.message(message: "I'm hungry!")

puts response
from twilio.twiml.messaging_response import Message, MessagingResponse

response = MessagingResponse()
response.message('I\'m hungry!')

print(response)
import com.twilio.twiml.messaging.Body;
import com.twilio.twiml.messaging.Message;
import com.twilio.twiml.MessagingResponse;
import com.twilio.twiml.TwiMLException;


public class Example {
    public static void main(String[] args) {
        Body body = new Body.Builder("I'm hungry!").build();
        Message message = new Message.Builder().body(body).build();
        MessagingResponse response = new MessagingResponse.Builder()
            .message(message).build();

        try {
            System.out.println(response.toXml());
        } catch (TwiMLException e) {
            e.printStackTrace();
        }
    }
}
<?xml version="1.0" encoding="UTF-8"?>
<Response>
    <Message>I'm hungry!</Message>
</Response>
重要なステータス更新を送信する

参考

インバウンドメッセージを待たずにメッセージを送信したいですか?アウトバウンドメッセージのドキュメントを御覧ください。

ヘルプが必要ですか?

誰しもが一度は考える「コーディングって難しい」。そんな時は、お問い合わせフォームから質問してください。 または、Stack Overflow でTwilioタグのついた情報から欲しいものを探してみましょう。

コードサンプルを読み込んでいます...
SDKバージョン:
  • 5.x
SDKバージョン:
  • 7.x
SDKバージョン:
  • 3.x
SDKバージョン:
  • 5.x
SDKバージョン:
  • 6.x
SDKバージョン:
  • 5.x
形式:
  • TwiML
const MessagingResponse = require('twilio').twiml.MessagingResponse;

const response = new MessagingResponse();
const message = response.message();
message.body('Hello World!');
response.redirect('https://demo.twilio.com/sms/welcome');

console.log(response.toString());
using Twilio.TwiML;
using Twilio.TwiML.Messaging;
using System;


class Example
{
    static void Main()
    {
        var response = new MessagingResponse();
        var message = new Message();
        message.Body("Hello World!");
        response.Append(message);
        response.Redirect(url: new Uri("https://demo.twilio.com/sms/welcome"));

        Console.WriteLine(response.ToString());;
    }
}
<?php
require_once './vendor/autoload.php';
use Twilio\Twiml;

$response = new Twiml();
$message = $response->message();
$message->body('Hello World!');
$response->redirect('https://demo.twilio.com/sms/welcome');

echo $response;
require 'twilio-ruby'

response = Twilio::TwiML::MessagingResponse.new
response.message do |message|
    message.body('Hello World!')
end
response.redirect('https://demo.twilio.com/sms/welcome')

puts response
from twilio.twiml.messaging_response import Body, Message, Redirect, MessagingResponse

response = MessagingResponse()
message = Message()
message.body('Hello World!')
response.append(message)
response.redirect('https://demo.twilio.com/sms/welcome')

print(response)
import com.twilio.twiml.messaging.Body;
import com.twilio.twiml.messaging.Message;
import com.twilio.twiml.voice.Redirect;
import com.twilio.twiml.MessagingResponse;
import com.twilio.twiml.TwiMLException;


public class Example {
    public static void main(String[] args) {
        Body body = new Body("Hello World!");
        Message message = new Message.Builder().body(body).build();
        Redirect redirect = new Redirect.Builder()
            .url("https://demo.twilio.com/sms/welcome").build();
        MessagingResponse response = new MessagingResponse.Builder()
            .message(message).redirect(redirect).build();

        try {
            System.out.println(response.toXml());
        } catch (TwiMLException e) {
            e.printStackTrace();
        }
    }
}
<?xml version="1.0" encoding="UTF-8"?>
<Response>
    <Message><Body>Hello World!</Body></Message>
    <Redirect>https://demo.twilio.com/sms/welcome</Redirect>
</Response>
SDKバージョン:
  • 5.x
SDKバージョン:
  • 7.x
SDKバージョン:
  • 3.x
SDKバージョン:
  • 5.x
SDKバージョン:
  • 6.x
SDKバージョン:
  • 5.x
形式:
  • TwiML
const MessagingResponse = require('twilio').twiml.MessagingResponse;

const response = new MessagingResponse();
response.message('This is message 1 of 2.');
response.message('This is message 2 of 2.');

console.log(response.toString());
using Twilio.TwiML;
using System;


class Example
{
    static void Main()
    {
        var response = new MessagingResponse();
        response.Message("This is message 1 of 2.");
        response.Message("This is message 2 of 2.");

        Console.WriteLine(response.ToString());;
    }
}
<?php
require_once './vendor/autoload.php';
use Twilio\Twiml;

$response = new Twiml();
$response->message('This is message 1 of 2.');
$response->message('This is message 2 of 2.');

echo $response;
require 'twilio-ruby'

response = Twilio::TwiML::MessagingResponse.new
response.message(body: 'This is message 1 of 2.')
response.message(body: 'This is message 2 of 2.')

puts response
from twilio.twiml.messaging_response import Message, MessagingResponse

response = MessagingResponse()
response.message('This is message 1 of 2.')
response.message('This is message 2 of 2.')

print(response)
import com.twilio.twiml.messaging.Body;
import com.twilio.twiml.messaging.Message;
import com.twilio.twiml.MessagingResponse;
import com.twilio.twiml.TwiMLException;


public class Example {
    public static void main(String[] args) {
        Body body = new Body("This is message 1 of 2.");
        Message message = new Message.Builder().body(body).build();
        Body body2 = new Body("This is message 2 of 2.");
        Message message2 = new Message.Builder().body(body2).build();
        MessagingResponse response = new MessagingResponse.Builder()
            .message(message).message(message2).build();

        try {
            System.out.println(response.toXml());
        } catch (TwiMLException e) {
            e.printStackTrace();
        }
    }
}
<?xml version="1.0" encoding="UTF-8"?>
<Response>
    <Message>This is message 1 of 2.</Message>
    <Message>This is message 2 of 2.</Message>
</Response>
SDKバージョン:
  • 5.x
SDKバージョン:
  • 7.x
SDKバージョン:
  • 3.x
SDKバージョン:
  • 5.x
SDKバージョン:
  • 6.x
SDKバージョン:
  • 5.x
形式:
  • TwiML
const MessagingResponse = require('twilio').twiml.MessagingResponse;

const response = new MessagingResponse();
response.message('I\'m hungry!');

console.log(response.toString());
using Twilio.TwiML;
using System;


class Example
{
    static void Main()
    {
        var response = new MessagingResponse();
        response.Message("I'm hungry!");

        Console.WriteLine(response.ToString());;
    }
}
<?php
require_once './vendor/autoload.php';
use Twilio\Twiml;

$response = new Twiml();
$response->message('I\'m hungry!');

echo $response;
require 'twilio-ruby'

response = Twilio::TwiML::MessagingResponse.new
response.message(message: "I'm hungry!")

puts response
from twilio.twiml.messaging_response import Message, MessagingResponse

response = MessagingResponse()
response.message('I\'m hungry!')

print(response)
import com.twilio.twiml.messaging.Body;
import com.twilio.twiml.messaging.Message;
import com.twilio.twiml.MessagingResponse;
import com.twilio.twiml.TwiMLException;


public class Example {
    public static void main(String[] args) {
        Body body = new Body.Builder("I'm hungry!").build();
        Message message = new Message.Builder().body(body).build();
        MessagingResponse response = new MessagingResponse.Builder()
            .message(message).build();

        try {
            System.out.println(response.toXml());
        } catch (TwiMLException e) {
            e.printStackTrace();
        }
    }
}
<?xml version="1.0" encoding="UTF-8"?>
<Response>
    <Message>I'm hungry!</Message>
</Response>