如何创建Twilio呼叫应答组?实现TaskRouter呼叫轮询转语音信箱
TaskRouter多座席呼叫转派+语音信箱实现方案
你的TaskRouter当前运行正常,座席通过JavaScript客户端接听来电,需要实现呼叫依次转派给多位座席(未接听则自动转下一位),全部未接听时转语音信箱,同时来电者全程播放等待音乐。以下是具体实现步骤:
1. 给来电者添加等待音乐(修改enqueue-call.php)
在<Enqueue>标签中加入waitUrl属性,指向一个播放循环音乐的XML文件,确保来电者等待时能听到音乐:
<?php $digit_pressed = $_REQUEST['Digits']; // 后续可扩展西班牙语逻辑,当前默认英文 $language = ($digit_pressed == '1') ? "en" : "en"; $wfSid = 'WW.......'; header("Content-Type: application/xml; charset=utf-8"); ?> <Response> <Enqueue workflowSid="<?php echo $wfSid; ?>" waitUrl="wait-music.php"> <Task>{"selected_language": "<?php echo $language ?>"}</Task> </Enqueue> </Response>
新建wait-music.php文件,用来循环播放等待音乐:
<?php header("Content-Type: application/xml; charset=utf-8"); ?> <Response> <Play loop="0">你的公开HTTPS等待音乐URL</Play> <!-- 替换为你自己的等待音乐地址,必须是HTTPS可访问 --> </Response>
2. 配置TaskRouter Workflow转派规则
登录Twilio控制台,找到对应Workflow(即代码中的$wfSid),编辑任务路由配置,设置超时转派和最终语音信箱规则:
{ "task_routing": { "filters": [ { "filter_friendly_name": "优先派给在线座席", "expression": "selected_language == 'en' && worker.activity_name == 'Available'", "targets": [ { "queue": "WQ你的英文队列SID", "timeout": 20, // 座席20秒未接听则触发超时转派 "priority": 10 } ] }, { "filter_friendly_name": "超时后转派下一位在线座席", "expression": "selected_language == 'en' && worker.activity_name == 'Available' && task.attempts < 3", // 最多尝试3位座席 "targets": [ { "queue": "WQ你的英文队列SID", "timeout": 20, "priority": 8 } ] }, { "filter_friendly_name": "全部座席未接,转语音信箱", "expression": "task.attempts >= 3", "targets": [ { "queue": "WQ你的英文队列SID", "timeout": 0, "priority": 5, "callback_url": "https://你的域名/fallback-to-voicemail.php" // 触发语音信箱逻辑 } ] } ], "default_filter": { "queue": "WQ你的英文队列SID" } } }
规则说明:
task.attempts:TaskRouter自动记录的任务派单次数,每次超时后自动递增timeout:设置座席的接听等待时长(单位:秒),可根据需求调整task.attempts < 3:控制最多尝试派给3位座席,可修改数值调整次数
3. 创建语音信箱处理文件
新建fallback-to-voicemail.php,当所有座席都未接听时,Twilio会调用这个文件,引导来电者留语音:
<?php header("Content-Type: application/xml; charset=utf-8"); ?> <Response> <Say voice="Polly.Joanna-Neural" language="en-us">抱歉,目前没有可用座席接听你的来电,请在嘟声后留言。</Say> <Record maxLength="60" action="handle-voicemail.php" method="POST"/> <!-- maxLength限制留言时长为60秒 --> <Say voice="Polly.Joanna-Neural" language="en-us">感谢你的留言,再见。</Say> <Hangup/> </Response>
可选:新建handle-voicemail.php处理录音后的逻辑(比如保存录音地址、发送通知):
<?php $recording_url = $_REQUEST['RecordingUrl']; $call_sid = $_REQUEST['CallSid']; // 这里添加你的业务逻辑:例如将录音URL和呼叫信息存入数据库,发送邮件/短信通知管理员等 header("Content-Type: application/xml; charset=utf-8"); ?> <Response> <Hangup/> </Response>
4. 座席客户端配合设置
确保座席的JavaScript客户端正确处理来电通知,超时未接听时让TaskRouter触发转派逻辑(示例代码):
// 监听新任务分配事件 worker.on('task.created', function(task) { // 显示来电提醒给座席 alert('有新来电,请及时接听'); // 可选:设置自动拒绝超时任务(时长略短于Workflow的timeout,避免冲突) setTimeout(function() { if (task.status === 'pending') { task.reject('未接听'); } }, 18000); // 18秒后自动拒绝 }); // 接听按钮点击事件 document.getElementById('answer-btn').addEventListener('click', function() { task.accept().then(function() { // 用Twilio Device接听呼叫 Twilio.Device.connect({TaskSid: task.sid}); }); });
关键注意事项
- 确保Workflow中的队列SID、回调URL都正确指向你的公开HTTPS资源
- 等待音乐地址必须是Twilio可访问的HTTPS链接
- 测试时可让座席处于在线状态但不接听,验证超时转派和语音信箱流程
内容的提问来源于stack exchange,提问作者Garret Brown
相关产品推荐
相关产品推荐

