Twilio - 如何将现有呼叫转移到会议

时间:2014-03-25 18:54:18

标签: twilio conference

对于twilio,在一个现有的电话(2条腿 - 呼叫腿和叫腿)上,我想将呼叫转移到会议室。两条腿都必须进入房间 如何在不丢失一条腿或另一条腿的情况下桥接双腿?

谢谢

问候

4 个答案:

答案 0 :(得分:7)

防止呼叫被丢弃的诀窍是使用“动作”网址进行会话并修改子支路以便在同一会议中移动。

以下是在2人之间启动呼叫然后将其升级到会议的详细流程

(1)创建一个TwiML Response API来拨打会议中的呼叫(基于适合您的业务逻辑)。这是一个简单的例子TwiML(http://www.mocky.io/v2/584ac0f81000002b14fb0205

<Response>
<Dial>
<Conference>letItGoSimple</Conference>
</Dial>
</Response>

(2)当您发起呼叫时,您的 Url 参数应设置为返回如下所示的TwiML(例如Twiml:http://www.mocky.io/v2/584ac8a3100000c914fb0214

<Response>
<Dial action="http://www.mocky.io/v2/584ac0f81000002b14fb0205" method="GET">
<Number>+44xxxxxxxx</Number>
</Dial>
</Response>

请注意,操作网址已从第一步设置为TwiML。这在此流程中非常重要,因为这可以防止在修改呼叫的Child Leg时丢弃呼叫。

(3)执行第2步后,双方将直接通话(无会议)

(4)当您要将呼叫升级到会议时,请将 Url 设置为Twiml拨入会议的子呼叫SID,

Example : 
curl -XPOST https://api.twilio.com/2010-04-01/Accounts/ACxxxxxxxxxxxx/Calls/CAyyyyyyyyyyyyyy -d "Url=http://www.mocky.io/v2/584ac0f81000002b14fb0205" -d "Method=GET"  -u ‘accountSID:authToken'

修改电话的子节目非常重要。

(5)执行第4步时会发生什么

  • 子呼叫将被重定向到Url并将被拨入会议
  • 家长电话将转为行动,并将在同一会议中拨打

希望这会有所帮助。

答案 1 :(得分:3)

Twilio传道者在这里。

所以最好的答案是将两个电话都放入会议开始。由于您必须使用API​​来启动第二条腿,因此它更加困难,但它可以让您更灵活地移动呼叫支路。

如果那不可能,那么它会变得更具挑战性,因为今天没有很好的方法来获得第二个呼叫的SID。您可能需要做的是使用REST API中的Calls list resource来查找第二次调用的SID。您可以使用list filter parameters 状态来查找特定呼叫。一旦拥有第二条腿的呼叫资源,它就会包含一个名为parent_call_sid的参数,该参数是原始来电的SID。

既然你有两个呼叫支持的SID,你可以使用REST API到redirect both calls到新的语音网址,它返回包含<Conference>名词的TwiML。

希望有所帮助。

答案 2 :(得分:1)

Twilio员工在这里。

要添加到am1704的答案,同一主题的变体是在<Redirect>之后使用<Dial>动词:

<Response>
  <Dial>
    <Number>+44xxxxxxxx</Number>
  </Dial>
  <Redirect method="GET">http://www.mocky.io/v2/584ac0f81000002b14fb0205</Redirect>
</Response>

一旦将子呼叫转移到会议,TwiML将继续<Dial>之后的动词。

这两种技术都需要了解呼叫状态。在某些调用中,所需的下一步可能是<Hangup>。在其他人中,人们可能希望将父节点移动到会议中。

答案 3 :(得分:0)

该线程很有帮助,但是有一个建议可以补充am1704所说的内容-

如果要避免使用am1704使用的action =方法,还可以移动子腿,然后移动父腿,并使用第二个HTTP(curl)请求。请注意,呼叫的方向在这里很重要:父支路是首先拨打的支路。同样重要的是,您一次接一个地执行每个curl请求,而不是同时执行。

这是一个如何在node.js中发送HTTP请求的示例,它将更新一条腿。您需要执行两次。

var ACCTSID = process.env.ACCTSID;  // Twilio Account SID
var AUTHTOKEN = process.env.AUTHTOKEN;  // Twilio Auth Token
var request = require('request');

function parentFunction() { // update a call in progress to move it to a conference

  console.log('parameter: ' + parent); // log param

  SID = parent.SID ; console.log('SID to add to conf: ' + SID); // The SID of the parent call
  end = parent.end ; console.log('end call on exit: ' + end) // end conference on exit - true or false
  xml = '<Response><Dial><Conference endConferenceOnExit=\"' + end + '\" beep=\"' + beep +'\">' + key + '</Conference></Dial></Response>'; console.log('xml: ' + xml); //xml

  formData = {
    Twiml: xml
    }

   options = { 
     method: 'POST',
     auth: {
       user: ACCTSID,
       pass: AUTHTOKEN
     },
     url: 'https://api.twilio.com/2010-04-01/Accounts/' + ACCTSID + '/Calls/' + SID + '.json',
     headers:
     { 
       'cache-control': 'no-cache',
       'Content-Type': 'text/plain'
     },
     form: formData //your payload
   };

   request(options, function (error, response, body) {
     if (error) throw new Error(error);
     console.log('response body for: ' + SID + ':' + body);

  });
}