我有一个工作的服务,在那里我们做这样的呼出。
$sid = getenv("TWILIO_ACCOUNT_SID");
$token = getenv("TWILIO_AUTH_TOKEN");
$twilio = new Client($sid, $token);
$call = $twilio->calls
->create("+14155551212", // to
"+14155551212", // from
["url" => "http://demo.twilio.com/docs/classic.mp3"]
);
print($call->sid);
问题是当接收方有呼叫筛选时,对URL参数的回调在筛选开始后立即完成(带有callbackstatus "in-progress"!),这意味着我们必须在响应中添加暂停。
<Response>
<Pause length="10"/>
<Say>
This is an important message
</Say>
<Gather action="https://xxx" method="GET" timeout="15" speechTimeout="auto" numDigits="1" input="dtmf speech">
<Say>Please press 1 followed by the pound sign or say confirm to confirm your appointment</Say>
</Gather>
<Redirect method="GET">https://xxx</Redirect>
</Response>
是否有办法绕过筛选或使系统在筛选时不启动响应?
编辑:我已经添加了AMD选项,它似乎是正确的工作。现在唯一剩下的问题是当打电话到谷歌语音时,当有呼叫筛选时,我添加的语音记录在收件人实际接听之前开始读取
$call = $client->calls->create(
$to, $from,
array(
"url" => $url,
"statusCallback" => $statusURL,
"statusCallbackMethod" => 'POST',
"machineDetection" => "DetectMessageEnd",
"machineDetectionTimeout" => 5
)
);
您正在寻找应答机检测(AMD)。
通过设置MachineDetection
参数为Enable
或DetectMessageEnd
,可以使能AMD。
$call = $twilio->calls
->create("+14155551212", // to
"+14155551212", // from
[
"url" => "http://demo.twilio.com/docs/classic.mp3",
"machineDetection" => "Enabled"
]
);
当您使用MachineDetection
参数时,对url
的请求将包括AnsweredBy
参数。来自文档:
如果您希望Twilio在识别被调用方后立即返回
AnsweredBy
值,则使用Enable
。如果您想对人采取特定的操作(例如,连接到代理,播放消息),但在机器上挂断电话,这是有用的。如果您想在答录机上留言,请指定
DetectMessageEnd
。在这种情况下,Twilio将在检测到有人时立即返回AnsweredBy
,但对于应答机,AnsweredBy仅在到达问候语结束时返回,通常由哔哔声表示。
还有一个异步AMD的选项。有了异步检测,你的url
被立即调用,就像一个正常的调用一样,但是一旦Twilio执行了检测,一个异步webhook就会指向一个不同的URL,你可以使用回调数据来决定是否更新调用。