我想我可能不太理解Twilio调用的流程。我有两种情况-一种是从浏览器呼叫电话(呼出),另一种是从手机呼叫浏览器(客户端)(呼入)。
对于这两个呼叫,当请求到达我的twilio Voice URL时,我将Twilio发送的post数据记录在日志文件中。
在这两种情况下,"direction“post变量都显示为"inbound”。我希望一个人会说“入站”,另一个人会说“出站”,或“出站拨号”(根据文档)。
然而,他们都说“入站”。所以我可能误解了Twilio是如何设置这个值的。有没有人能解释一下我搞错了什么?
我希望在我的应用程序中使用这个“方向”变量来确定呼叫是从客户机转出到手机,还是从手机转到客户端。也就是说,当一个请求到达我的twilio语音url时,我的代码可以确定它是浏览器的呼入,还是电话或其他客户端的呼出。
关于这两个场景的更多详细信息。
(1)我有一个简单的Twilio客户端,它存在于网页上。当我输入一个电话号码并单击connect时,它会调用Twilio javascript函数,该函数将连接传递给我在Twilio.Device.connect的Twilio Voice Url。
在这种情况下,我希望“方向”数据显示为"outbound“或"outbound-dial”,但它显示为"inbound“。
(2)我从手机向浏览器客户端发出呼叫,使用twilio注册电话号码查找客户端信息。
我希望“方向”数据显示为"inbound",它确实是这样。
任何帮助都将不胜感激。谢谢!
发布于 2021-03-23 03:22:35
对于任何找到这个的人,我找到了一个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'但是,在dial中有一个名为action的选项,您可以在其中指定呼叫结束时的操作。
let dial = resp.dial({
callerId: from,
action: 'YOUR_API_URL' // replace with your endpoint URL. default call method is POST.
})在那里我们可以看到DialCallStatus,它可以是完成/忙/失败等等。
另请注意,Twilio将抛出一个错误,因此不要忘记处理那里对Twilio的响应,否则它将在调用结束时显示"application err occurred“。我只是简单地在动作(调用结束)端点的开始处挂起,似乎它做到了这一点。
最后一点需要注意的是,出站的操作端点在响应中不像入站调用那样具有太多数据,因此您可以使用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));发布于 2021-05-02 19:16:45
作为对@露娜的回答的补充,我想添加一些注释,以帮助任何开发基于twiML的应用程序的人。
通常,当您使用twiML客户端(JS,IOS,Android)进行呼叫时,语音钩子会接收参数,这些参数可以帮助您识别呼叫是入站还是出带。例如,名为To:""且值为空的参数表示对twiML应用程序的入站请求没有拨打应用程序中的任何号码,因此可以放心地说,您的应用程序实际上是在尝试进行出站呼叫。
此外,From和Caller参数可以以client:开头,这与上面的意思相同。
https://stackoverflow.com/questions/45642195
复制相似问题