拨出和拨入电话的Twilio方向始终为"入站"

时间:2017-08-11 19:03:59

标签: javascript twilio

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

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

在这两种情况下,"方向" post变量表示" inbound"。我希望有人说"入境"和另一个"出站",或"出站拨号" (根据文件)。

然而他们都说"入境"。所以我可能误解了Twilio如何设置这个值。有人可以解释一下我的错误吗?

我希望能够使用这个"方向"变量以在我的应用程序中确定呼叫是从客户端发送到电话,还是从电话进入客户端。即当请求到达我的twilio语音网址时,我的代码可以确定它是对来电的来电,还是对电话或其他客户的拨出电话。

有关这两种情况的更多细节。

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

我希望"方向"数据说"出境"或" outbound-dial"在这种情况下,它会说" inbound"。

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

我希望"方向"数据说"入站",它做的。

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

2 个答案:

答案 0 :(得分:0)

对于发现此内容的任何人,我都发现了一个 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< /p>

// 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));

答案 1 :(得分:0)

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

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

此外,FromCaller 参数可以以 client: 开头,这与上述含义相同。