为什么我的Twilio nodejs转录尝试两次调用客户端?

时间:2017-09-22 00:18:20

标签: node.js twilio

它打电话给客户两次并制作1 37秒(在twilio仪表板中)电话,两个成绩单,一个22秒长,另外5秒长,任何人都有任何想法? 当我直接拨打电话并录音时,电话通话持续19秒。多数民众赞成我的成绩单应该是19秒长。它绕着某个地方循环。

我使用了真实的凭据和真实的电话号码。

var twilio = require('twilio');
var client = require('twilio')(accountSid, authToken);


const VoiceResponse = require('twilio').twiml.VoiceResponse;

client.calls.create({
  url: 'http://107.170.228.177:80/sendT',
  to: '+17000000',
  from: '+10000000'

})

app.post('/sendT', urlencodedParser, function(req, res) {
  console.log('made to send t')

  const rt = new VoiceResponse();
  rt.record({
    transcribe: true,
    transcribeCallback: '/rT'
  });
  res.status(200);
  res.send(rt.toString());
  console.log('RT string' + rt.toString());
})

app.post('/rT', urlencodedParser, function(req, res) {
  console.log('made to receiveT post');
  var ttemp = req['body'].TranscriptionText;
  console.log('transcription text ' + ttemp);
  var masterFile = __dirname + "/master/t.json";
  fs.writeFile(masterFile, ttemp, function(err) {}) //
  res.status(200);
  res.send();
});

NodeJS输出

RT string<?xml version="1.0" encoding="UTF-8"?><Response><Record transcribe="true" transcribeCallback="/rT"/></Response>
made to send t
RT string<?xml version="1.0" encoding="UTF-8"?><Response><Record transcribe="true" transcribeCallback="/rT"/></Response>
made to send t
RT string<?xml version="1.0" encoding="UTF-8"?><Response><Record transcribe="true" transcribeCallback="/rT"/></Response>
made to receiveT post
*call transcript*
made to receiveT post
*call transcript*

1 个答案:

答案 0 :(得分:1)

Twilio开发者传道者在这里。

这里发生的事情非常特定于您正在使用的<Record> TwiML。

当录制完成后,Twilio将向action attribute that you set on the <Record>发出HTTP请求,以便立即查看如何处理该呼叫。如果没有action属性,Twilio会将该请求发送到当前文档网址,即本例中的/sendT端点。

这就是导致循环的原因,然后<Record>再次出现在Twilio中,并在5秒后超时,此时呼叫决定结束。现在你得到两个录音,包括5秒的沉默。

要解决此问题,您应该添加action属性,该属性指向仅将TwiML返回<Hangup/>的端点。

app.post('/sendT', urlencodedParser, function(req, res) {    
  const rt = new VoiceResponse();
  rt.record({
    transcribe: true,
    transcribeCallback: '/rT',
    action: '/hangup'
  });
  res.status(200);
  res.send(rt.toString());
})

app.post('/hangup', function(req, res) {
  const hangup = new VoiceResponse();
  hangup.hangup();
  res.status(200);
  res.send(hangup);
})

或者,您可以不保留action网址,只需查看请求,看看它是否已经录制,并根据该条件有条件挂断。

app.post('/sendT', urlencodedParser, function(req, res) {    
  const rt = new VoiceResponse();
  if (typeof req.body.RecordingUrl !== 'undefined') {
    rt.hangup();
  } else {
    rt.record({
      transcribe: true,
      transcribeCallback: '/rT',
      action: '/hangup'
    });
  }
  res.status(200);
  res.send(rt.toString());
})

让我知道这是否有帮助。