Twilio任务分配回调修改会议友好名及重定向获取TaskSid问题
呼叫流程构建问题与解决方案探讨
场景与需求
我正在构建一套呼叫流程,核心逻辑如下:
- 来电者通过Flex控制台的Conference功能连接坐席
- 坐席可将来电者转至其他IVR(包括外部IVR),且自身不退出当前会议
- 来电者完成IVR交互后,需转回坐席等待的同一会议
当前实现与问题
已编写两个Twilio函数:
assignmentCallback(JS):用于创建会议,当前以TaskSid作为会议的friendlyName- 重定向函数:用于将来电者转回原会议
遇到的问题:
- 尝试在
assignmentCallback中将会议的friendlyName设置为call_sid,但无效果 - 重定向函数目前仅能获取
CallSid参数,无法直接拿到TaskSid,导致无法准确定位原会议
相关代码
assignmentCallback 函数
const client = context.getTwilioClient(); const api_response = await client.taskrouter.v1.workspaces(WorkspaceSid) .tasks(TaskSid) .reservations(ReservationSid) .update({ instruction: 'conference', from: _from, friendlyName: call_sid, to: assigned_worker_uri, endConferenceOnExit: true, startConferenceOnEnter: false }) .then(reservation => console.log(reservation.workerName))
重定向函数
exports.handler = function(context, event, callback) { console.log("context: ", context); console.log("event: ", event); const { CallSid, TaskSid} = event; console.log('CallSid: ', CallSid); console.log('TaskSid: ', TaskSid); console.log('Executing redirect_conference'); return Response( callback, `<?xml version="1.0" encoding="UTF-8"?> <Response> <Say voice="woman">Thank you for your patience. You are now connecting with an agent</Say> <Dial> <Conference endConferenceOnExit="false">${TaskSid}</Conference> </Dial> </Response>` ); };
解决方案建议
方案1:修复friendlyName设置为CallSid的问题
你在assignmentCallback中设置friendlyName: call_sid无效,是因为TaskRouter的Reservation Update指令里的friendlyName字段仅用于内部标识,不会直接映射到Conference的friendlyName。正确做法是主动创建Conference资源,再将坐席和来电者接入:
const client = context.getTwilioClient(); // 1. 创建以CallSid为friendlyName的会议 const conference = await client.conferences.create({ friendlyName: call_sid, statusCallback: "你的状态回调地址", statusCallbackMethod: "POST" }); // 2. 更新Reservation,接入已创建的会议 const api_response = await client.taskrouter.v1.workspaces(WorkspaceSid) .tasks(TaskSid) .reservations(ReservationSid) .update({ instruction: 'conference', from: _from, conferenceSid: conference.sid, // 指定会议SID to: assigned_worker_uri, endConferenceOnExit: true, startConferenceOnEnter: false }) .then(reservation => console.log(reservation.workerName));
后续重定向函数就可以用CallSid作为会议标识接入。
方案2:在重定向函数中获取TaskSid
如果坚持用TaskSid作为会议标识,有两种方式获取:
- 通过CallSid关联查询TaskSid:
在重定向函数中,查询与当前CallSid绑定的Task(需确保Task的Attributes中包含call_sid字段):exports.handler = async function(context, event, callback) { const client = context.getTwilioClient(); const { CallSid } = event; // 查询关联的Task const tasks = await client.taskrouter.v1.workspaces(context.WORKSPACE_SID) .tasks.list({ evaluateTaskAttributes: `call_sid == "${CallSid}"` }); const TaskSid = tasks.length > 0 ? tasks[0].sid : null; // 生成响应XML const response = `<?xml version="1.0" encoding="UTF-8"?> <Response> <Say voice="woman">感谢您的等待,现在为您连接坐席</Say> <Dial> <Conference endConferenceOnExit="false">${TaskSid || CallSid}</Conference> </Dial> </Response>`; callback(null, new Twilio.twiml.VoiceResponse().append(response)); }; - 转IVR时主动传递TaskSid:
坐席转IVR时,在跳转URL中携带TaskSid参数,重定向函数就能直接从event中读取。
总结
- 将会议
friendlyName设为CallSid可行,但需主动创建Conference资源,不能依赖Reservation Update的friendlyName字段 - 重定向函数可通过CallSid关联查询TaskSid,或转IVR时主动传递参数获取TaskSid
内容的提问来源于stack exchange,提问作者Rishabh Mishra
相关产品推荐
相关产品推荐

