Как сделать теплый перевод вызова с помощью Java и Twilio Voice

Автор: | 01.08.2026

Звонки в службу поддержки или на аналогичные линии часто могут приводить к не самым приятным впечатлениям. Часто меня просто перебрасывают от одного оператора к другому без какого-либо контекста о том, с кем я разговариваю и когда меня переводят. Такие звонки очень напоминают следующее:

В этой записи блога мы создадим очень простой колл-центр, поддерживающий теплые переводы, используя вспомогательную библиотеку Twilio для Java и сервер Apache Tomcat.

Если вас интересует только готовый результат, весь код, использованный в этой статье, можно найти на Github здесь.

Первый шаг к созданию нашего колл-центра — настройка среды. Поскольку мы используем Tomcat для реализации нашего веб-сервера, вы можете следовать руководству Twilio Quickstart, чтобы начать работу с Tomcat и SDK Twilio. Не спешите и убедитесь, что ваша среда настроена правильно, прежде чем продолжить чтение этой статьи. Если вы никогда раньше не работали с Maven, я рекомендую выбрать Вариант 2 в руководстве по быстрому старту и загрузить .jar файл напрямую.

Если вы следовали руководству по быстрому старту, ваша структура файлов должна выглядеть примерно так:

После того как Tomcat заработает, мы можем проверить, работают ли наши сервлеты локально. Откройте терминал, перейдите в корневой каталог вашего проекта и выполните следующую команду:

После запуска сервера перейдите по адресу localhost:8080 в веб-браузере, и мы должны увидеть стартовую страницу Apache Tomcat:

Наш сервер работает локально, но нам потребуется публичный доступ к нему, чтобы Twilio мог до него достучаться. Для этого мы можем использовать ngrok. Ngrok — это инструмент командной строки, который может создать публичный туннель для доступа к вашему localhost. Если вы никогда раньше не использовали ngrok, рекомендую прочитать запись в блоге Кевина Уиннери (Kevin Whinnery), чтобы познакомиться с ним. После установки ngrok выполните команду $ ngrok http 8080 в терминале и перейдите по предоставленному URL (см. изображение ниже) в браузере.

Мы должны увидеть ту же стартовую страницу, что и на localhost:8080, что означает: наш сервер теперь доступен публично. Прежде чем двигаться дальше, уделите минутку, чтобы оценить эту кошку в варежках:

Для обработки входящих запросов нам нужна карта, которая укажет нашему серверу Tomcat, какие Java-файлы обрабатывают какие запросы. Мы можем сопоставить сервлеты с конечными точками в файле **web.xml** нашего сервера, который будет находиться в **/webapps/twilio/WEB-INF/**. Этот сервлет будет обрабатывать все входящие и исходящие вызовы для наших двух операторов. Настройте этот файл следующим образом:

Это сопоставление указывает нашему веб-серверу, что при поступлении запроса на URL /handle-caller он должен перенаправить его в класс TwilioCallerServlet. Давайте создадим этот класс в новом файле.

Перейдите в **/webapps/twilio/WEB-INF/classes/com/twilio** и создайте новый файл с именем **TwilioCallerServlet.java**. Этот сервлет будет возвращать инструкции TwiML в зависимости от входящего вызывающего абонента.

Сначала нам нужно импортировать ряд пакетов, чтобы использовать сервлеты и библиотеку Twilio. Поместите следующий код в начало вашего файла:

Теперь мы можем создать наш класс TwilioCallerServlet. Класс будет содержать метод service, который будет обрабатывать входящие HTTP-запросы и создавать HTTP-ответы. Поместите следующий код после ваших импортов:

Этот код создает новый объект TwiMLResponse() и добавляет к нему глагол Dial и существительное Conference. Это означает, что когда Twilio обработает этот TwiML, вызывающий абонент будет помещен в конференцию с именем «SupportRoom». Если вы хотите узнать больше о глаголах TwiML, ознакомьтесь с документацией Twilio здесь.

Прежде чем двигаться дальше, давайте убедимся, что наш TwilioCallerServlet работает и возвращает правильный TwiML. Нам нужно скомпилировать наши Java-файлы, прежде чем наш сервер Tomcat сможет их использовать. Во время компиляции вы должны указать classpath jar-файла, содержащего SDK Twilio. Перейдите в корневой каталог вашего проекта и выполните эту команду для компиляции всех ваших java-файлов:

Если вы получаете ошибки компиляции, значит, classpaths, указанные в вашей команде, неверны, или вы запускаете команду из неправильного каталога.

Теперь нам нужно перезапустить сервер Tomcat, чтобы наши изменения вступили в силу. Сделайте это, выполнив команду $ sh bin/shutdown.sh, а затем снова запустив $ sh bin/startup.sh. Помните, что вам нужно будет перезапускать сервер каждый раз после перекомпиляции Java-файлов, чтобы изменения вступили в силу.

Перейдите по адресу http://localhost:8080/twilio/handle-caller в вашем браузере, и вы должны увидеть следующее:

Замените каждую переменную соответствующими данными: Ваши ACCOUNT_SID и AUTH_TOKEN можно найти на панели управления вашего аккаунта Twilio. CALL_ENDPOINT будет URL-адресом, сгенерированным вашим сервером ngrok, к которому добавлено сопоставление вашего сервлета (Например: *http://229cd6dd.ngrok.io/twilio/handle-caller*). ARTEMIS_NUMBER — это номер телефона вашего первого оператора. Это номер, который будет отвечать на все входящие звонки, поступающие на ваш номер Twilio. BARNABAS_NUMBER — это номер телефона, который получит теплый перевод от Артемиса. Наконец, SUPPORT_NUMBER — это ваш номер Twilio, на который будут звонить абоненты.

Теперь давайте добавим немного дополнительной логики для обработки переводов операторов и исходящих вызовов. Добавьте следующий код перед строкой response.setContentType(«application/xml»);:

Наш сервлет проверяет, была ли нажата «1» на клавиатуре первым оператором (Артемисом) после отключения от конференции. Если да, наш второй оператор (Варнавас) будет набран, и Артемис будет снова подключен к конференции.

Если ввод не был отправлен, мы должны проверить, откуда поступает входящий вызов. Если обычный абонент звонит на ваш номер Twilio, он должен быть соединен с Артемисом. Артемису будет отправлен другой TwiML, содержащий глагол Gather для сбора ввода с клавиатуры. В сочетании с атрибутом setHangupOnStar это позволяет Артемису нажать «*1», чтобы позвонить Варнавасу.

Вы заметите, что мы не определили функцию makeCall. Давайте добавим эту функцию прямо перед закрывающей скобкой класса. Следующий код будет совершать вызовы для нас с использованием TwilioRestClient:

На экране настройки номера (Setup Number), в разделе Voice (Голос), установите для параметра ‘Request URL’ значение CALL_ENDPOINT, которое мы использовали в нашем коде, и нажмите «Сохранить»:

Не забудьте перезапустить сервер Tomcat и убедиться, что ваш туннель ngrok работает. Вы можете протестировать свое приложение, попросив кого-нибудь позвонить на ваш номер Twilio. Ваш первый оператор (Артемис) получит телефонный звонок и будет помещен в конференцию с абонентом. Когда Артемис нажмет «*1», ваш второй оператор (Варнавас) получит звонок и будет помещен в ту же конференцию. Это позволяет Артемису представить абонента, прежде чем передать его Варнавасу.

Поздравляем! Вы создали колл-центр, поддерживающий теплый перевод входящих абонентов. С теплыми переводами ваши абоненты теперь будут чувствовать себя примерно так:

Примечание: Это очень простая реализация колл-центра, и ее можно улучшить множеством способов. Следите за будущими публикациями по Java, которые будут расширять то, что мы создали здесь.

Если у вас возникли какие-либо проблемы или есть отзывы об этом руководстве, пожалуйста, не стесняйтесь оставлять комментарии ниже или связаться со мной в Twitter @brodan_ или по электронной почте chranj@twilio.com.