如何通过Twilio Voice SDK检测外呼被拒接并转语音信箱?
解决Twilio Voice JS SDK外呼转语音信箱的状态捕获问题
核心原因
被叫拒接后转语音信箱时,Twilio会将呼叫标记为已接通(语音信箱属于自动应答的机器终端),因此SDK原生的reject、cancel事件不会触发。需要通过Twilio的机器检测功能+呼叫状态回调来识别这类场景。
具体解决方案
1. 启用机器检测并配置状态回调
发起外呼时必须开启机器检测,同时指定statusCallback接收呼叫全生命周期的状态通知:
- 若用TwiML发起呼叫,在
<Dial>标签中添加参数:
<Dial machineDetection="Enable" statusCallback="/your-webhook-url" statusCallbackEvent="initiated ringing answered completed"> <Number>+1234567890</Number> </Dial>
- 若用REST API发起呼叫(以Node.js为例):
const client = require('twilio')(yourAccountSid, yourAuthToken); client.calls.create({ url: 'https://your-server.com/twiml-endpoint', to: '+1234567890', from: '+0987654321', machineDetection: 'Enable', statusCallback: 'https://your-server.com/call-status-webhook', statusCallbackEvent: ['initiated', 'ringing', 'answered', 'completed'] });
2. 在Webhook中识别语音信箱场景
Twilio会向statusCallback地址发送POST请求,关键识别字段:
AnsweredBy:取值为machine(机器应答,含语音信箱)、human(真人应答)或空(未检测到)CallStatus:转语音信箱后最终会变为completed
在后端Webhook逻辑中,判断AnsweredBy === 'machine'即可标记为转语音信箱场景,之后可通过WebSocket或接口同步状态到前端。
3. 前端SDK配合处理
前端监听Call对象的disconnect事件,在呼叫结束后从后端获取识别结果:
const call = device.connect({ params: { To: '+1234567890' } }); call.on('disconnect', () => { fetch(`/api/call-status/${call.parameters.CallSid}`) .then(res => res.json()) .then(data => { if (data.answeredBy === 'machine') { console.log('呼叫已转至语音信箱'); // 执行你的业务逻辑 } }); });
注意事项
- 机器检测功能需额外付费,具体参考Twilio定价规则
AnsweredBy的检测结果并非100%精准,部分特殊语音信箱可能无法被识别- 确保
statusCallback地址可被Twilio公网访问(本地开发可使用ngrok等内网穿透工具)
内容的提问来源于stack exchange,提问作者Sobyt
相关产品推荐
相关产品推荐

