【问题标题】:Twilio direction for outgoing and incoming calls is always "inbound"拨出和拨入呼叫的 Twilio 方向始终为“入站”
【发布时间】:2018-01-20 09:13:22
【问题描述】:

我相信我可能不太了解 Twilio 调用的流程。我有两种情况 - 一种是我从浏览器拨打电话(拨出),另一种是我从手机拨打浏览器(客户端)(拨入)。

对于这两个调用,当请求到达我的 Twilio Voice URL 时,我会将 twilio 发送的发布数据记录在日志文件中。

在这两种情况下,“方向”后置变量都表示“入站”。我希望一个说“入站”,另一个说“出站”或“出站拨号”(根据文档)。

但他们都说“入站”。所以我可能误解了 Twilio 是如何设置这个值的。有人可以解释一下我做错了什么吗?

我希望在我的应用程序中使用这个“方向”变量来确定呼叫是从客户端打到电话,还是从电话打到客户端。即,当请求到达我的 twilio 语音 url 时,我的代码可以确定是对浏览器的呼入,还是对电话或其他客户端的呼出。

有关这两种情况的更多详细信息。

(1) 我有一个简单的 Twilio 客户端,它存在于网页上。当我输入电话号码并单击连接时,它会调用 Twilio.Device.connect javascript 函数,该函数将连接传递到我在 Twilio 的 Twilio Voice Url。

在这种情况下,我希望“方向”数据说“出站”或“出站拨号”,但它说的是“入站”。

(2) 我从手机拨打浏览器客户端,使用 twilio 注册的电话号码查找客户端信息。

我希望“方向”数据说“入站”,它确实如此。

任何帮助将不胜感激。谢谢!

【问题讨论】:

  • 这不是一个真正的编程问题,因此最好将其发送给 Twilio support 并提供一些示例 SID,他们将能够解释。
  • 您找到解决方案了吗?我正在设置这个确切的场景,我看到的和你做的一样。

标签: javascript twilio


【解决方案1】:

作为对@Luna 回答的补充,我想添加一些注释,以帮助任何人开发基于 twiML 的应用程序。

通常,当您使用 twiML 客户端(JS、IOS、Android)拨打电话时,语音挂钩会接收参数,这些参数可以帮助您识别呼叫是入站还是带外。例如,一个名为 To:"" 且值为空的参数意味着对您的 twiML 应用程序的入站请求没有拨打您应用程序中的任何号码,因此可以肯定地说您的应用程序实际上是在尝试拨出绑定调用。

另外,FromCaller 参数可能以 client: 开头,这与上面的含义相同。

【讨论】:

    【解决方案2】:

    对于任何发现这个的人,我找到了一个 github issue,上面写着这是设计使然。

    从 Twilio 客户端(例如您的情况下的 iOS 移动客户端)发出呼叫时,您实际上是在向您的 TwiML 应用程序发出“入站”呼叫请求。为了区分这两个用例(Twilio 号码入站与移动客户端发起的呼叫),我的建议是在您的应用程序服务器中使用不同的端点

    它还建议我们创建两个单独的端点来处理输入/输出场景。虽然我认为这是非常糟糕的设计,但除了变通方法外,我们无能为力...

    似乎这还不够,在以下每种情况下,出站呼叫的状态都是“完成”:OUTBOUND ANSWERED - OUTBOUND OUR USER CANCELLED THE CALL - OUTBOUND CALL RECEIVER REJECTED THE CALL

    以下是呼出状态回调的示例响应(在上述每个场景中都相同):

    ApiVersion: '2010-04-01',
    Called: '',
    CallStatus: 'completed',
    Duration: '1',
    From: 'client:Anonymous',
    CallDuration: '4',
    Direction: 'inbound',
    Timestamp: 'Mon, 22 Mar 2021 18:03:11 +0000',
    AccountSid: 'XXXXXXXX',
    CallbackSource: 'call-progress-events',
    ApplicationSid: 'XXXXXXXXX',
    Caller: 'client:Anonymous',
    SequenceNumber: '0',
    To: '',
    CallSid: 'XXXXXXXXXXXX'
    

    但是,拨号中有一个名为action 的选项,您可以在其中指定通话结束时的操作。

    let dial = resp.dial({ 
      callerId: from,
      action: 'YOUR_API_URL' // replace with your endpoint URL. default call method is POST.
    })
    

    在那里我们可以看到DialCallStatus可以完成/忙碌/失败等。

    另外请注意,Twilio 会抛出一个错误,所以不要忘记在那里处理对 Twilio 的响应,否则它会在调用结束时显示“发生应用程序错误”。我只是在动作开始(通话结束)端点挂断,似乎它成功了。

    最后一点是,出站的操作端点在响应中没有像入站呼叫那样的太多数据,因此您可以使用DialCallSid 参数和fetch the call resource 检索信息

    // Download the helper library from https://www.twilio.com/docs/node/install
    // Your Account Sid and Auth Token from twilio.com/console
    // and set the environment variables. See http://twil.io/secure
    const accountSid = process.env.TWILIO_ACCOUNT_SID;
    const authToken = process.env.TWILIO_AUTH_TOKEN;
    const client = require('twilio')(accountSid, authToken);
    
    client.calls('CAXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX')
          .fetch()
          .then(call => console.log(call.to));
    

    【讨论】:

      猜你喜欢
      • 2016-05-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多