Twilio可编程语音状态回调异常:未接听却触发in-progress状态
Twilio可编程语音状态回调异常:
in-progress在呼叫未接听时与ringing同时触发 我使用Twilio Node.js SDK配合Nest.js开发应用,目前遇到一个问题:需要处理answered(对应状态in-progress)事件,但该事件会在ringing触发后立即触发,即便呼叫并未被接听。我是通过第三方应用Hushed接收呼叫的,推测问题可能由Hushed导致。
相关代码
呼叫初始化代码
async init(to: string, from: string): Promise<string> { const call = await this.twilio.api.v2010.accounts(<ACCOUNT_SID>).calls.create({ url: `${API_URL}/api/twilio/stream`, statusCallback: `${API_URL}/api/twilio/statusCallback`, statusCallbackMethod: 'POST', statusCallbackEvent: ['initiated', 'ringing', 'answered', 'completed'], to, from, method: 'POST', record: true, }); // 其他业务代码 return call.sid; }
Twilio控制器代码
@Controller('twilio') export class TwilioController { @Post('statusCallback') statusCallBack(@Req() request: Request): void { console.log(request.body.CallStatus); } }
日志输出
initiated ringing in-progress # 和"ringing"同时打印 completed
按照Twilio的预期逻辑,这种状态触发顺序是不符合规范的。
问题分析
这个异常几乎可以确定是第三方通话应用Hushed的行为导致的。部分虚拟号码/通话应用会在呼叫振铃阶段就向Twilio返回"已接听"的信号,而非等待用户实际接听后再触发状态变更,这就导致Twilio误判呼叫状态,同时发送ringing和in-progress事件。
解决办法
- 验证其他接收端:换用普通实体手机或Twilio官方客户端接收呼叫,观察是否还会出现同样的状态异常。如果恢复正常,就能坐实是Hushed的问题。
- 添加状态校验逻辑:在代码层面增加额外判断,比如结合
CallDuration字段——真正被接听的呼叫,CallDuration数值会大于0,而误触发的in-progress事件对应的CallDuration通常为0。修改控制器代码如下:
@Controller('twilio') export class TwilioController { @Post('statusCallback') statusCallBack(@Req() request: Request): void { const callStatus = request.body.CallStatus; const callDuration = parseInt(request.body.CallDuration, 10); // 仅处理实际接听的in-progress事件 if (callStatus === 'in-progress' && callDuration > 0) { console.log('呼叫已实际接听'); // 在这里处理你的业务逻辑 } else { console.log(callStatus); } } }
- 联系Hushed技术支持:如果必须使用Hushed,可以联系他们的技术团队,确认是否存在状态回调的异常配置,或者是否有调整状态返回逻辑的可能。
内容的提问来源于stack exchange,提问作者Narek
相关产品推荐
相关产品推荐

