我正在使用Twilio构建一个简单的会议,其中会议由代理使用Twilio客户端启动,并且联系人被调用并添加到此会议中。在将此联系人添加到会议之前,我们希望在会议室中公布联系人的姓名(例如:<Say>Now Joining Sam Carter </Say>
)。根据数据库中的电话号码计算出该人的姓名。
当连接呼叫时,执行以下TwiML,将联系人连接到会议:
<Dial callerId="+1415xxxxxxx" record="true" action="/my/action/url">
<Conference endConferenceOnExit="true" >ConferenceRoom1</Conference>
</Dial>
有没有办法在执行<DIAL>
动词之前将消息发送到会议中。如果我在<SAY>
之前写<DIAL>
动词,那么它会向联系人播放消息,而不是在CONFERENCEROOM1中播放消息。
是否有像onConferenceEnter这样的事件,当某个参与者进入会议时,可以用它来触发另一个TwiML?请建议实现此行为的最佳方法。
答案 0 :(得分:2)
问题的简短回答是它不能通过Twiml事件完成,但可以使用他们的REST API进行一种黑客攻击。
问题已经在SO上提出,答案可以在这里找到:
Use Say verb to all Conference participants
如果问题/答案被删除/删除我已将其粘贴在下方:
这里的东西应该类似于一个好的端到端解决方案。
首先,用户拨入并通过标准提示获取会议室的PIN及其名称。
<?xml version="1.0" encoding="UTF-8"?>
<Response>
<Gather action="/conference/pin" finishOnKey="#">
<Say>Please the conference pin number followed by the pound key.</Say>
</Gather>
</Response>
<?xml version="1.0" encoding="UTF-8"?>
<Response>
<Say>Say your name and then press the pound key.</Say>
<Record action="/conference/name" finishOnKey="#" />
</Response>
现在,一旦你有用户的引脚和录音,就会发生两件事;邮件到/ conference / name的响应将包含动词,将用户放在房间中:
<?xml version="1.0" encoding="UTF-8"?>
<Response>
<Dial>
<Conference>{conference ID}</Conference>
</Dial>
</Response>
...并且,与此异步,它将使用REST API将新呼叫发回会议室。
POST /2010-04-01/Accounts/{AccountSid}/Calls
From = {your conference phone number}
To = {your conference phone number}
SendDigits = wwww{conference PIN}#
Url = /conference/announce?name={name ID}
现在,下一点变得令人困惑。 Twilio现在将与您的回拨URL进行通话,以获取呼叫的传入结束,以及您为呼叫的传出结束指定的URL。您的来电处理程序需要检测到会议线路正在回调并且行为方式不同;它首先需要用简单的TwiML进行响应,允许呼出的呼出端进入会议室的引脚。
<?xml version="1.0" encoding="UTF-8"?>
<Response>
<Gather action="/conference/announce-pin" finishOnKey="#" />
</Response>
POST的SendDigits参数将提供TwiML所期望的位数。然后,该操作应通过新呼叫中的会议进行响应。
<?xml version="1.0" encoding="UTF-8"?>
<Response>
<Dial>
<Conference>{conference ID}</Conference>
</Dial>
</Response>
最后一个难题是你在POST中指定的URL发出的TwiML。这是将环回呼叫添加到会议后将运行的标记。
<?xml version="1.0" encoding="UTF-8"?>
<Response>
<Play>/conference/name-recordings/{name ID}</Play>
<Say>has joined the call.</Say>
<Hangup />
</Response>
该标记运行,将呼叫者的姓名和消息播放到会议室,然后挂断。
答案 1 :(得分:2)
为了其他人的利益,这就是我实现此行为的方式:
代理商已经使用Twilio客户端启动了会议,他已经参加了会议。一旦参与者即将加入同一会议,使用REST API修改实时电话会议的URL。
TwilioRestClient client = new TwilioRestClient(ACCOUNT_SID, AUTH_TOKEN);
Map<String, String> filter = new HashMap<String, String>();
filter.put("From", "client:AGENT1");
filter.put("Status", "in-progress");
CallList callList = account.getCalls(filter);
Call agentsCall = null;
for (Call inProgressCall : callList) {
agentsCall = inProgressCall;
break; //return the first one only..there shouldn't be more
}
Map<String, String> agentsCallParams = new HashMap<String, String>();
agentsCallParams.put("Url", "http://myserver.com/twiml/agentmessage.xml");
agentsCallParams.put("Method", "GET");
agentsCall.update(agentsCallParams);`
上面的代码段将更新现有调用的twiml,如下所示。
<?xml version="1.0" encoding="UTF-8"?>
<Response>
<Say>Now joining {name of the participant}</Say>
<Dial>
<Conference>Conference1</Conference>
</Dial>
</Response>
上述Twiml将更新呼叫,以<SAY>
动词播放消息,然后将座席重新加入会议。
现在,让参与者通过返回以下Twiml来加入同一个会议:
<?xml version="1.0" encoding="UTF-8"?>
<Response>
<Dial>
<Conference>Conference1</Conference>
</Dial>
希望这有帮助!!!