我喜欢在我的twilio设置上提出一些建议,以解决我试图解决的问题。
概述:
我们系统中的每个用户都配置了一个twilio电话号码,可以发送给任何人与他们联系。
如果personA通过配置的twilio电话号码联系我们系统中的用户(userB),我们希望将它们与userB连接(如果可用)。如果userB不可用,我们希望将personA指向语音邮件。换句话说,我们希望确保我们能够控制语音邮件体验和语音邮件本身,以便我们可以将其存储在我们的系统中,而不是将语音邮件留在用户B的设备上。
当前解决方案:
当前解决方案的问题:
在此解决方案中,何时转移personA对语音邮件的呼叫的控制权由对UserB的调用结果控制,这似乎不是最理想的。例如,我们可能根本无法呼叫UserB。在这种情况下,personA将无限期地留在队列中。
在这种情况下我想要发生的事情是轮询队列中的人员A以检查队列中的时间,并且如果队列中的时间大于阈值,则将呼叫转移到语音邮件。但是,似乎不可能准确地知道呼叫在队列中无人值守的时间,因为:
即使主叫方正在收听等待音乐,队列中的通话状态仍为in-progress
。这与PersonA的电话回复的状态相同。
如果UserB拨入队列,则当桥接方断开连接时,呼叫才会出列,而且PersonA呼叫的呼叫状态不会发生变化,表明他们已连接到UserB。
问题
答案 0 :(得分:14)
Twilio开发者传道者在这里。
我认为你可能在队列中有一些过于复杂的东西。您实际上可以提供消息并在原始呼叫中收集,而无需自己拨出电话并最终连接两个电话。
以下是:
您的来电TwiML应如下所示:
<Response>
<Dial action="/call_complete" timeout="30">
<Number url="/whisper">
ONWARD DIAL NUMBER
</Number>
</Dial>
</Response>
在连接两个呼叫之前,为<Number>
名词提供URL将播放该URL的TwiML内容。您可以在此处使用<Gather>
来确保用户已接听电话,而不是他们自己的语音信箱系统:
/whisper
<Response>
<Gather numDigits="1" timeout="10" action="/gather_result">
<Say voice="alice">You are receiving a call, press any key to accept</Say>
</Gather>
<Hangup/>
</Response>
/gather_result
需要确定是否按下了某个键。如果它被按下,那么我们将进入调用,我们可以使用空响应,因为这会将控制权返回到原始<Dial>
。如果没有按下任何数字,我们会挂断此端,这会导致原始<Dial>
完成并指向其action
属性。 (我不确定你使用的语言是什么,但这里有一些Rubyish伪代码)
/gather_result
<Response>
if params["Digits"] and params["Digits"].empty?
<Hangup/>
end
</Response>
/call_complete
操作结束后, <Dial>
将被调用。如果此时呼叫状态为“已完成”或“已应答”,则用户已接听电话并正确回应耳语,我们可以挂机。如果是其他任何内容,我们会将呼叫重定向到我们的语音邮件记录器。
/call_complete
<Response>
if params["DialCallStatus"] == "completed" or params["DialCallStatus"] == "answered"
<Hangup/>
else
<Say voice="alice">The call could not be answered this time, please leave a message</Say>
<Record action="/record_complete" />
end
</Response>
最后,您的/record_complete
操作可以使用录制网址执行任何操作并挂断电话。
/record_complete
<Response>
<Hangup/>
</Response>
这可以通过Twimlets实现,如in this blog post所述。如果这有帮助,请告诉我。