Edited at

電話をかけるだけでツイートできるシステムのエラーについて

More than 1 year has passed since last update.

先日投稿した、"電話をかけるだけでツイートできるシステムを作った"にて発生していた問題についてTwilioのエバンジェリストの方よりエラーに関するコメントをいただきました。ありがとうございます。

Twilioに関する問題が解決できたので、軽くまとめます。


エラー内容

投稿を見て頂ければ分かりますが、通話終了時になぜかTwilio側でエラーが発生するというもの。

具体的なエラー内容としては、通話終了時に「申し訳ございません。アプリケーションのエラーが発生いたしました。通話を終了します。」とアナウンスが流れて、TwilioのDebuggerには12100 - Document parse failureと表示されます。


原因

コメントにて、


Twilioがエラーを返すのは、get.phpがTwiMLを返してないからだと思われます。action属性は、コールの続きを実行するためのものであり、TwiMLが戻ることを期待しています。


と教えていただきました。

get.phpの処理が終わると自動的にTwiMLに戻って、通話が終了するものだと思っていましたがこれが原因らしく、TwiMLのactionget.phpに処理が渡された後、そこで処理が止まっていたようです。


解決策

get.phpでTwiMLを返すように以下のように修正しました。


get.php

<?php

// 録音ファイルURLの取得
$recordingUrl = $_GET['RecordingUrl'];
$recordingUrl .= ".wav";

// 録音ファイルのダウンロード
exec("wget -N -O ./record.wav $recordingUrl");

//pythonの実行
exec("python ./tweet.py");

echo '<?xml version="1.0" encoding="utf-8"?>';
echo '<Response>';
echo '<Say voice="woman" language="ja-jp">';
echo '終了します。';
echo '</Say>';
echo '<Hangup/>';
echo '</Response>';

?>


このように書き換えると、#キーを押して録音を終了した後正常に「終了します」とアナウンスされて電話が切断されました。もちろんTwilioのデバッガーにもエラーは表示されませんでした。


recordingStatusCallbackについて


また、Record動詞で録音をした場合、音声が長いとaction属性で処理をしようとした際に、Twilio側で音声データの準備が間に合わないことがあります。

ですので、録音データを正確に取得したい場合は、recordingStatusCallbackをご利用ください。こちらですとTwiMLを返す必要はありません(204応答を返すか、200応答を返してください)。


ともアドバイスいだたきました。

これはTwiMLでrecord動詞で録音してURLを取得する方法だと、音声の長さなどによってデータの準備が間に合わず、次の処理に進めないことがあるというもの。確かに短い文章でしか検証していませんでしたが、長くなると十分にありえます。

代わりにrecordingStatusCallbackを使うと、URLの準備ができてからデータを取得できるので対策ができるそうです。

詳しくはこちら

またこの方法だとTwiMLを返す必要がなく、代わりにHTTPステータスコードの200か204を返してくださいとのこと。

これはリファレンスに載っていない(?)ので注意が必要です。


感想

リファレンスをしっかり見る癖がついていないので色々と適当実装が多い。(見ても分からない)

また修正加えてる途中にふと「TwiMLとPHPのファイル分ける必要あるのかこれ」と思ったりも・・・