在离开来电前提示接受代理人

我已经在Twilio / node.js上build立了一个基本的工作stream程,将来电转接到座席的电话。 由于代理商可能在手机/手机上设置了语音信箱,我想通过“收集”指令提示他们接受。 如果按1,则呼叫将被转移(“出队”指令)。 否则,保留将被拒绝。

我的问题是,我不知道如何下令:如果我在排队之前收集,那么收集似乎还不知道“谁问”。 但是,如果在收集之前排队,则提示消息将被呼叫者(即将到来的客户端)听到,并且拒绝预留将为时已晚。

Twilio开发者在这里传道。

在这种情况下,您不应该使用“出列”来回应赋值callback。 相反,您应该使用“呼叫”指令来启动对座席的呼叫 。

通过呼叫指令,您可以在呼叫连接到座席时提供一个URL。 在这一点上,你应该读出你的消息,并使用<Gather>以确保代理准备好的电话。 当代理按下button或<Gather>超时时, <Gather>action属性将被请求。 然后,如果您发现用户确实input了一个数字,通过检查Digits参数,您可以使用TwiML来响应<Dial> <Queue> 。 为了拨打保留引用的实际呼叫者,您需要将reservationSid属性添加到<Queue>元素。 您将在任务分配webhook中收到ReservationSid作为参数 。 当通话桥接它将接受预订。

如果<Gather>超时,那么您应该拒绝该保留,并将其传递给下一个工作人员。

让我知道这是否有帮助。

编辑

示例TwiML用于这种情况。

您首先使用调用指令来响应带有JSON的分配callback:

 { "instruction": "call", "to": AGENT_PHONE_NUMBER, "from": YOUR_TWILIO_NUMBER, "url": "https://example.com/worker_call?ReservationSid=${req.body.ReservationSid}&TaskSid=${req.body.TaskSid}" } 

请注意,我已将传入请求中的ReservationSidTaskSid添加到工作人员接听电话时调用的TaskSid的URL中。

然后,当工作人员接听他们的电话Twilio呼叫我们上面设置的url ,我们用它来问他们是否要接听电话。

 # /worker_call <Response> <Gather action="/gather_result?ReservationSid=${req.query.ReservationSid}&TaskSid=${req.query.TaskSid}" numDigits="1"> <Say voice="alice">You have an incoming call, dial any number to accept</Say> </Gather> <Redirect>/gather_result?ReservationSid=${req.query.ReservationSid}&TaskSid=${req.query.TaskSid}</Redirect> </Response> 

请注意,我将ReservationSidTaskSid从传入的请求URL传递到<Gather>操作的URL。 现在,当动作URL被调用时,我们需要根据调用是否被接受来进行响应。 我需要使用一些实际的代码而不是TwiML,所以我会用Node来完成。 我们需要能够在REST API中调用保留资源,所以这里有一些设置:

 const accountSid = 'ACXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'; const authToken = 'your_auth_token'; const workspaceSid = 'WSXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'; const twilio = require('twilio') const client = twilio(accountSid, authToken); app.post('/gather_result', function(req, res) { const twiml = new twilio.twiml.VoiceResponse(); if (req.body.Digits && req.body.Digits.length > 0) { // There was a positive result, call the Queue and connect the caller const dial = twiml.dial(); dial.queue({queue: req.query.ReservationSid}); res.send(twiml.toString()); } else { // no response, reject the reservation. client.taskrouter.v1 .workspaces(workspaceSid) .tasks(req.query.TaskSid) .reservations(req.query.ReservationSid) .update({ reservationStatus: 'rejected' }) .then(function() { // once the reservation is updated, then hangup the call. twiml.hangup(); res.send(twiml.toString()); }); } });