Группа поиска Twilio с использованием функций Twilio. (он же FindMe)

Я пытаюсь создать группу охоты с Twilio Twiml

Нужно ли мне настраивать разные twimlbin для каждого номера в группе поиска?

Или есть способ объединить все это в единый Twimlbin?

Twimlbin 1:
<Response>
    <Dial 
         action="http://www.ourapp.com/webhook;FailUrl=/Twimlbin 2" 
         timeout="10" 
         callerId="555-555-5555">
         NUMBER1
    </Dial>
</Response>


Twimlbin 2:
<Response>
    <Dial 
         action="http://www.ourapp.com/webhook;FailUrl=/Twimlbin 3" 
         timeout="10" 
         callerId="555-555-5555">
         NUMBER2
    </Dial>
</Response>

... Repeat N times for each agent ...

Спасибо :-)


person Marcus    schedule 25.07.2017    source источник


Ответы (1)


Проповедник разработчиков Twilio здесь.

Бины TwiML отлично подходят для статических битов TwiML, но для вашего варианта использования требуется нечто большее.

Я рекомендую вам ознакомиться с функциями Twilio, которые позволяют запускать код Node.js в инфраструктуре Twilio. Я создал и протестировал версию, которая работает с функциями Twilio < / а>.

Вот объяснение того, как это работает:

Начните с массива ваших чисел:

const numbers = [...];

Затем в функции проверьте, завершено ли состояние вызова, и положите трубку, если это так.

exports.handler = function(context, event, callback) {
  const response = new Twilio.twiml.VoiceResponse();
  if (event.DialCallStatus === "complete" || event.finished) {
    // Call was answered and completed or no one picked up
    response.hangup();
  } else {

Если нет, мы подбираем следующий номер для звонка. Если в URL-адресе указан следующий номер. Если вы сохраните его в переменной, в противном случае выберите первое число в массиве:

    const numberToDial = event.nextNumber ? event.nextNumber : numbers[0];

Затем назначьте следующий номер для набора из массива.

    let url;
    const currentNumberIndex = numbers.indexOf(numberToDial);
    if (currentNumberIndex + 1 === numbers.length) {
      // no more numbers to call after this.
      url = "/hunt?finished=true";
    } else {
      const nextNumber = numbers[currentNumberIndex + 1];
      url = "/hunt?nextNumber=" + encodeURIComponent(nextNumber);
    }

Затем сгенерируйте TwiML, чтобы набрать следующий номер и передать URL-адрес в качестве действия. Вы можете добавить свой собственный URL-адрес в качестве statusCallbackUrl, чтобы отслеживать статусы.

    const dial = response.dial({ action: url });
    dial.number({ statusCallback: "https://yourapp.com/statuscallback" }, numberToDial);
  }

  callback(null, response);
}

Я не могу обещать, что это сработает, но я надеюсь, что вы видите, к чему я клоню. Сообщите мне, если это поможет.

person philnash    schedule 25.07.2017
comment
Это почти работает! Но он каждый раз звонит по одному и тому же номеру. Почему-то он не увеличивается при поиске URL-адресов? NextNumber = Любые идеи с благодарностью получены. - person Marcus; 26.07.2017
comment
Также в первом блоке кода отсутствовал}: else {должно быть} else { - person Marcus; 26.07.2017
comment
Я думаю, что исправил это, понял, что числа всегда будут в массиве, и мне нужно было проверить, является ли текущий номер последним в массиве, а не вообще. Я обновил код около бита, который начинается let url; const currentNumberIndex ... . Дайте мне знать, если это решит проблему. - person philnash; 26.07.2017
comment
БУМ! Это сделало это. Спасибо. Единственная проблема сейчас в том, что я получаю: Атрибут statusCallback не может появляться в элементе Dial. если там есть statusCallback. (Я изменил statusCallbackUrl на statusCallback) - person Marcus; 26.07.2017
comment
Ах хорошо. Вместо этого мы можем сделать statusCallback для <Number>. Я обновлю ответ. - person philnash; 26.07.2017
comment
Ознакомьтесь с полностью протестированной версией этого, включая возможность укажите URL-адрес для перенаправления, если никто не ответит. - person philnash; 26.07.2017