理系学生日記

おまえはいつまで学生気分なのか

Twilioで電話をかけてみる

業務上でTwilioとお友達になる必要があるので、すこし使ってみました。

サインアップ

とりあえずサインアップするだけならすぐにできます。

Twilioは電話番号を起点とするサービスになっていますが、 日本ではローカル電話番号の取得はかなり厳密になっており、企業・法人としてこの電話番号を取得するためにはそれなりの手続きが必要になります。

このため、無料サインアップを行った時には、1つだけアメリカの番号が割り当てられます。

電話をかけてみる

特定の番号に電話する場合は以下のようなHTTPリクエストを送ります。

ここで、VERIFIED_NUMBERはサインアップ時に登録した自分の電話番号です。 ACCOUNT_SIDAUTH_TOKENは、アカウントIDとシークレットと考えれば良いでしょう。 TWILIO_NUMBERはサインアップ時にTwilioが払い出してくれた電話番号です。

$ VERIFIED_NUMBER=+81xxxxxxxxxxx 
$ ACCOUNT_SID=xxxxxxxxxxxxxxxxxxxxxxxxxx
$ AUTH_TOKEN=xxxxxxxxxxxxxxxxxxxxxxxxxxxx
$ TWILIO_NUMBER=+xxxxxxxxxxxxxx

$ curl -X POST https://api.twilio.com/2010-04-01/Accounts/$ACCOUNT_SID/Calls.json \
  --data-urlencode "Url=http://demo.twilio.com/docs/voice.xml" \
  --data-urlencode "To=$VERIFIED_NUMBER" \
  --data-urlencode "From=$TWILIO_NUMBER" \
  -u $ACCOUNT_SID:$AUTH_TOKEN > hoge

このコマンドを実行すると、アメリカから電話がかかってきます。 Urlパラメータで示されるのは、TwiMLと呼ばれるマークアップで、 電話がかかってきたときにTwilioへ何をしてほしいのかを表現します。

上記で設定されたURLにアクセスすると以下のようなTwiMLになっており、SayPlayで表現されていることが分かります。

$ curl -Lo - http://demo.twilio.com/docs/voice.xml
<?xml version="1.0" encoding="UTF-8"?>
<Response>
    <Say voice="alice">Thanks for trying our documentation. Enjoy!</Say>
    <Play>http://demo.twilio.com/docs/classic.mp3</Play>
</Response>

SayはいわゆるTTS、テキストを読んでくれるというVerbです。 PlayはMP3やWAVといったファイルを電話で再生してくれるVerbですね。

受電時の動き

以下はRespond to Incoming Phone Calls in Javaからの引用です。 Twilioの電話番号に電話がかかってくると、Twilioのシステムから我々が作るアプリにHTTPリクエストが送信されます。 HTTPレスポンスとしてTwiMLを返却すると、Twilio側が転送や録音といった動作をしてくれる、というのが基本的な動きです。

架電時の動き

「電話をかけてみる」で記載したcurlコマンドがまさにこれです。 「どの番号から」(from)「どの番号へ」(to)電話をかけて、何をするのか(url or 'Twiml`)を記載します。

下記はMake Outbound Phone Calls with Node.jsにあるJSでの架電サンプル。

const accountSid = process.env.TWILIO_ACCOUNT_SID;
const authToken = process.env.TWILIO_AUTH_TOKEN;
const client = require('twilio')(accountSid, authToken);

client.calls
    .create({
        twiml: '<Response><Say>Ahoy, World!</Say></Response>',
        to: '+1xxxxxxxx',
        from: '+1xxxxxxxx'
    })
    .then(call => console.log(call.sid));

いろいろできそうなので、時間のある時に遊んでみます。