最近Twilioで遊んでいます。先日、Javaで電話をかけることができました。
kikutaro777.hatenablog.com
今度は電話をうけて、音声を流してみようと思い、以下のQuickstartをやってみました。
jp.twilio.com
受信の仕組みは簡単で次のとおりです。
・Twilioの電話番号に電話をする
・あらかじめTwilioで設定したURLにWebhookで通知する
・Webhookを受けて処理を返す
Webhookの受信サーバとして、ドキュメントではJavaのWebフレームワークであるSparkを使っていましたが、自分はSpring Boot(2.1.3)でやりました。コードはいたってシンプルで次のとおりです。GETメソッドのhelloは確認用で、POSTメソッドが電話の受信処理です。
package tech.kikutaro.twiliowebhook;
import com.twilio.twiml.VoiceResponse;
import com.twilio.twiml.voice.Say;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
@RestController
@SpringBootApplication
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
@GetMapping("/hello")
public String getMethodName() {
return "hello";
}
@PostMapping("/")
public String callPhone() {
Say say = new Say.Builder("hello").build();
VoiceResponse voiceResponse = new VoiceResponse.Builder()
.say(say)
.build();
System.out.println(voiceResponse.toXml());
return voiceResponse.toXml();
}
}
ローカル環境で起動したサーバをインターネット上に公開するため、ngrokを利用します。
ngrok.exe http 8080
ForwardingのURLが生成されたので、コピーします。

Twilioの「通話着信時」の部分へ設定します。

これで準備が整ったので、自分のスマホからTwilioの電話番号に電話をかけました。すると、電話の応答とともにWebhookでPOSTメソッドが呼び出され、コンソールにも応答で返す以下の内容が表示されました。
xml version="1.0" encoding="UTF-8"<Response><Say>hello</Say></Response>
で、電話から「hello」と流れてくるのを期待していたのですが、なぜかすぐに切れてしまいます。なぜ…?
応答コードなどに問題があるのかと思って、以下の通話ログを確認してみました。


応答は200で、Bodyにしっかりリクエストは入っていて、問題ないようにみえる。。。

とりあえずWebhookで受信はできたけど、音声は流れず残念な結果でした。ググってみたけど意外と情報がなかったので、もうちょっと調べる必要がありそうです。