Преобразование вызова Twilio в конференцию

#node.js #reactjs #twilio

Вопрос:

У меня есть заявление (Node.js серверная часть и интерфейс React), который предоставляет функцию исходящих и входящих вызовов с использованием Twilio. Я хотел бы добавить функциональность голосового коучинга (дополнительное активное, пассивное или шепчущее подключение третьего лица (разговор только с одной другой стороной). Я предполагаю, что для этого мне нужно преобразовать обычные звонки в голосовые конференции, а затем при необходимости добавить участника конференции.

Самое сложное для меня — это способ преобразовать вызов (или перейти) в конференцию, чтобы между приложением Twilio и обычным пользователем мобильного телефона (и дополнительным сторонним тренером) была конференция. Как этого можно достичь? Мой вопрос касается как исходящих, так и входящих звонков.

Мой код для исходящих звонков (запущен с интерфейса):

Внешний интерфейс:

 const params = { To: ' 48123456789, fromNumber: ' 480987654321 };    
let call = await device.connect(params);
 

Бэкэнд:

 const response = new VoiceResponse();
const dial = response.dial({ callerId: fromNumber, record: "record-from-answer", recordingStatusCallback: "/twilio/voice/record" });
dial.number(req.body.To);
res.set("Content-Type", "text/xml");
res.send(response.toString());
 

Входящие звонки — серверная часть:

 const response = new VoiceResponse();
const dial = response.dial({
  callerId: req.body.From,
  answerOnBridge: true,
  record: "record-from-answer",
  recordingStatusCallback: "/twilio/voice/record",
});
const client = dial.client();
client.identity('user@mydomain.com');
res.set("Content-Type", "text/xml");
res.send(response.toString());
 

Ответ №1:

Лучшим вариантом, скорее всего, было бы поместить их в <Conference> » а » в начале разговора. Поместите входящий вызов в конференцию, затем, используя REST API, вы можете инициировать исходящий вызов второй стороне. Когда они ответят, вы добавите их в ту же конференцию.

Если вы не можете этого сделать, вам нужно будет использовать REST API для перенаправления каждого вызова на конференцию. Перенаправление указывает Twilio, чтобы новый TwiML выполнялся для определенного идентификатора SID вызова. ТвиМЛ выглядел бы примерно так:

 <Response>
  <Dial>
    <Conference>NewConferenceCall</Conference>
  </Dial>
</Response>
 

Вы также можете ознакомиться с документами для изменения вызовов в реальном времени.

Вы можете использовать существующий код и сделать что-то вроде этого:

response.dial().conference('NewConferenceCall');

Это инициирует конференц-связь, а не стандартный голосовой вызов. Как только у вас состоится конференц-связь с вашими абонентами, вы можете добавить нового участника, отправив запрос на отправку в конечную точку участников.

Комментарии:

1. Я понимаю, но как я могу «позвонить на конференцию»? Я не использую инструкции TWIML, просто обычный код JS в узле. Когда я отправляю ответ, эквивалентный TWIML, который Вы опубликовали (dial.conference(«имя конференции»)), пользователь присоединяется к пустой конференции вообще без вызова.

2. Я обновил свой ответ выше, чтобы показать, как вы можете создать конференц-связь в своем коде JS. Пожалуйста, дайте мне знать, если у вас есть какие-либо другие вопросы или проблемы.

3. Спасибо. Я попробовал response.dial().conference(), но после этого я (как абонент) слышу только ожидающую музыку, и номер не вызывается. Функция response.dial().number (), похоже, не работает после заявления конференции. Приведет ли добавление нового участника к набору исходящего номера? Также — можно ли добавить участника в конференцию, которая создается в том же запросе (сразу после response.dial().conference())?

4. Не могли бы вы попробовать что-нибудь в этом роде и дать мне знать, сработает ли это для вас? const twiml = new VoiceResponse(); twiml.say('Please wait while we dial you into the call.'); twiml.dial().conference('my-conference-room'); res.writeHead(200, {'Content-Type': 'text/xml'}); res.end(twiml.toString());

5. Он просто переводит меня в режим ожидания и воспроизводит музыку в ожидании после сообщения. Вообще никакого звонка.

Ответ №2:

После долгой битвы я сам открыл для себя душу, может быть, кому-то она пригодится. Решение состояло в том, чтобы создать дополнительный вызов (на внешний номер) в том же запросе после создания конференции и ввода в нее пользователя. Вызовы должны обеспечивать перенаправление TWIML на конференцию после выполнения вызова. Вот код:

 const response = new VoiceResponse();
const dial = response.dial({ callerId: fromNumber, record: "record-from-answer", recordingStatusCallback: "/twilio/voice/record" });
dial.conference(conferenceId, {
  startConferenceOnEnter: true,
  endConferenceOnExit: true,
  beep: false,
  //waitUrl: "",
});
res.set("Content-Type", "text/xml");
res.send(response.toString());
client.calls.create({
  to: To,
  from: fromNumber,
  twiml:
    '<Response><Dial><Conference startConferenceOnEnter="true" endConferenceOnExit="true" beep="false">'  
    conferenceId  
    "</Conference></Dial></Response>",
});
 

Вот решение, которое я нашел сам для входящего вызова:

 const fromNumber = req.body.From;
const toNumber = req.body.To;
const identity = await phoneController.getUserIdentityForPhoneCall(toNumber);
console.log("Calling client: "   identity);
const client = phoneController.getTwilioClient();
const response = new VoiceResponse();
const dial = response.dial({
  callerId: req.body.From,
  answerOnBridge: true,
  record: "record-from-answer",
  recordingStatusCallback: "/twilio/voice/record",
});
const conferenceId = "call_"   req.body.CallSid;
const params = {
  startConferenceOnEnter: true,
  endConferenceOnExit: true,
  beep: false,
};
dial.conference(params, conferenceId);
res.set("Content-Type", "text/xml");
res.send(response.toString());
console.log("dialing client: "   "client:"   identity);
client.calls.create({
  to: "client:"   identity,
  from: fromNumber,
  callerId: fromNumber,
  twiml:
    '<Response><Dial><Conference startConferenceOnEnter="true" endConferenceOnExit="true" beep="false">'  
    conferenceId  
    "</Conference></Dial></Response>",
});