通过Twilio Task Router接受预约后,如何接通来电?
解决TaskRouter调用dequeue()后无法接通来电的问题
你遇到的核心问题是:仅调用reservation.dequeue()只是触发了任务分配后的通话路由指令,但坐席端缺少**媒体接收终端(Twilio Device)**来建立实际通话,同时TwiML应用的配置和关联环节缺失。以下是具体解决步骤:
1. 必须配置Twilio Device接收通话
坐席端需要初始化Twilio Device来处理浏览器端的通话,这是接通来电的必要条件。示例代码如下:
import { Device } from 'twilio-client'; // 注意:这里的token必须包含`voice`权限,且关联了正确的TwiML应用SID(后台生成Token时指定) const device = new Device(workerToken); // 监听来电事件 device.on('incoming', (call) => { // 可结合UI让坐席点击接听按钮后执行accept call.accept(); }); // 启动Device监听 device.connect();
2. 后台生成Worker Token时关联TwiML应用
生成Worker Token的后台代码中,必须指定twiml_app_sid参数,这个TwiML应用的Voice URL需要返回能路由到坐席Client的TwiML:
- TwiML应用的Voice URL返回示例:
<Response> <Dial answerOnBridge="true"> <Client>{{To}}</Client> </Dial> </Response>
- 后台生成Token的核心代码(以Node.js为例):
const twilio = require('twilio'); const client = twilio(accountSid, authToken); const workerToken = client.taskrouter.workspaces(workspaceSid) .workers(workerSid) .tokens.create({ twimlAppSid: '你的TwiML应用SID', // 关联TwiML应用 permissions: ['voice', 'taskrouter'] // 必须包含voice权限 });
3. 优化reservation.dequeue()调用
在reservationCreated事件中调用dequeue()时,需明确指定通话的路由目标(坐席的Client身份),确保Twilio能正确找到对应的Device:
worker.on("reservationCreated", async function (reservation) { console.log('reserved', reservation); // 从Worker属性中获取预先配置的Client身份(比如client:cain) const contactUri = worker.attributes.contact_uri; await reservation.dequeue({ to: contactUri, from: reservation.task.attributes.from // 来电号码 }); });
关键逻辑说明
reservation.dequeue()的作用是通知Twilio将待接来电路由到指定终端,但终端(Twilio Device)必须提前初始化并处于监听状态。- TwiML应用是Twilio处理通话的规则中心,关联到Worker Token后,当dequeue触发时,Twilio会调用TwiML应用的Voice URL获取路由指令,从而将来电转接到坐席的Device。
内容的提问来源于stack exchange,提问作者Cain Wang
相关产品推荐
相关产品推荐

