现在与Twilio一起工作了一个月左右,对Twiml和Twilios NodeJS SDK基础有了很好的了解。
现在尝试着处理复杂的工作流程,例如排队呼叫者。 到目前为止,我已经成功使呼叫者入队,然后通过SDK触发了到代理的出站呼叫。
我的问题,如果座席正忙于另一个客户(例如,他们正在“通话中”),我不希望他们的SIP线路再次呼叫。现在,如果有另一位客户打来电话,并且队列中没有人,则SIP线路会振铃!
唯一可行的方法是,如果有超过1个人等待出队。
相反,我希望twilio保留它们入队,一旦调用queue/left
函数,然后触发座席的电话响起。
到目前为止,这是我的代码库(重要内容被截断了)
//function invite()
...
const terminationURI = `termination=${termination}`; //termination is the SIP endpoint which is dynamic in my WebApp.
twiml.enqueue({action: `queue/left?${terminationURI}`, method: 'POST', waitUrl: `queue/wait?${terminationURI}` }, 'queue');
...
这将返回一个Twiml,如下所示:
<?xml version=\"1.0\" encoding=\"UTF-8\"?>
<Response>
<Enqueue action=\"queue/left?termination=%sip%sipuri.sip.us1.twilio.com\" method=\"POST\" waitUrl=\"queue/wait?termination=%sip%sipuri.sip.us1.twilio.com\">queue</Enqueue>
</Response>
这可以正常工作,将客户添加到Queue中,并调用queue / wait函数。 函数等待调用执行以下操作:
//function queue/wait()
//"body" is the Query parameters that Twilio posts to my WebApp
...
//The issue is CurrentQueueSize is ALWAYS 1 even if there is an active call with the single agent
if(body.CurrentQueueSize == 1 && body.QueuePosition == 1)
{
twiml.play('http://com.twilio.sounds.music.s3.amazonaws.com/oldDog_-_endless_goodbye_%28instr.%29.mp3');
const client = require('twilio')(accountSid, authToken);
client.calls.create({
to: 'sip:'+event.queryStringParameters.termination+';region=au1',
from: body.From,
twiml: "<Response><Dial><Queue>queue</Queue></Dial></Response>",
})
.then(call => console.log(call.sid));
}
else
{
const people = body.QueuePosition
twiml.say(`Thanks for calling! We'll be with you shortly. You are in position number ${people}`);
twiml.play('http://com.twilio.sounds.music.s3.amazonaws.com/oldDog_-_endless_goodbye_%28instr.%29.mp3');
twiml.redirect();
}
这将向呼叫者返回一个Twiml,如下所示(播放“保持音乐”并触发通话)
<?xml version=\"1.0\" encoding=\"UTF-8\"?>
<Response>
<Play>http://com.twilio.sounds.music.s3.amazonaws.com/oldDog_-_endless_goodbye_%28instr.%29.mp3</Play></Response>
最后,一旦第一个呼叫者离开队列,就会触发queue/left()
Webhook,该Webhook基本上检查队列中是否还有其他人,如果是,请致电该代理的SIP电话。
//function queue/left()
if(body.QueueSid)
{
const client = require('twilio')(accountSid, authToken);
client.queues(body.QueueSid)
.fetch()
.then(q => {
if(q.currentSize > 0)
{
client.calls.create({
to: 'sip:'+event.queryStringParameters.termination+';region=au1',
from: body.From,
twiml: "<Response><Dial><Queue>queue</Queue></Dial></Response>",
})
.then(call => {});
}
});
}
非常感谢您的帮助!