Почему в 2015 году получение голосовых сообщений все еще остается проблемой? С стационарными телефонами вам приходится иметь дело с устаревшим и дорогостоящим оборудованием. На мобильных телефонах вам нужно позвонить по номеру, ввести пароль и пролистывать голосовые сообщения, пока не найдете нужное. Разве не было бы проще просто получать текстовое сообщение, чтобы прослушать новое голосовое сообщение? К счастью, Twilio и немного кода на Java дают вам возможность сделать именно это.
В этой статье мы будем использовать Apache Tomcat и Twilio для создания виртуального автоответчика, который будет принимать и записывать все входящие вызовы. Затем автоответчик отправит вам ссылку для прослушивания оставленного вами сообщения.
Если вы не хотите следовать инструкциям и просто хотите увидеть код, он полностью размещен в открытом доступе в этом репозитории Github.
Первым шагом в создании нашего автоответчика является настройка среды. Давайте пройдем процесс настройки прямо сейчас.
Мы будем использовать Tomcat для запуска наших сервлетов. Twilio Quickstart может помочь вам начать работу с Tomcat и SDK Twilio. Альтернативно, вы можете просто скачать этот архив, который я собрал, содержащий Tomcat 8.0.26 и Twilio Java SDK 4.5.0.
Структура ваших файлов должна быть примерно такой после извлечения архива или завершения работы с quickstart:
**webapps/** директория, которая поставлялась с Apache. Вам не нужно беспокоиться об их удалении, так как они содержат домашнюю страницу Tomcat и страницы документации. Вы не увидите:
**AnsweringMachine.java**,
**CallRecorder.java** или
**web.xml**, потому что мы будем создавать эти файлы сами.
Если вы никогда раньше не использовали Tomcat, мы должны сначала проверить, могут ли наши сервлеты работать локально. Откройте терминал, перейдите в корневую директорию вашего проекта и выполните следующую команду:
Если вы получили ошибку
Cannot find ./bin/catalina.sh, мы можем легко исправить это, изменив разрешения файлов в нашей директории **bin/**. Выполните следующую команду в терминале из корневой директории вашего проекта, чтобы сделать это (источник):
Если вы видите страницу, подобную показанной выше, значит, ваша среда настроена правильно, и мы можем двигаться дальше!
Вы можете в любой момент остановить сервер Tomcat, выполнив следующую команду из корневой директории вашего проекта:
Если в вашем терминале отображается ошибка java.net.ConnectException: Connection refused, не волнуйтесь, это просто означает, что ваш сервер уже не работает, поэтому скрипту нечего останавливать.
Теперь, когда настройка позади, пришло время начать создание нашего веб-приложения. Мы начнем с сопоставления наших конечных точек с сервлетами в файле **web.xml** нашего сервера, который будет расположен в **/webapps/twilio/WEB-INF/**. Этот файл будет выглядеть следующим образом:
Первые несколько строк — это просто XML-метаданные, которые нам не нужно изменять. Блок **servlet** — это место, где мы даем имя нашему сервлету и говорим Tomcat искать Java-класс по пути **com.twilio.AnsweringMachine**.
Блок **servlet-mapping** указывает, что запросы, поступающие на конечную точку **/handle-call**, должны обрабатываться сервлетом с именем **AnsweringMachine**, который мы определили непосредственно перед ним. Давайте создадим класс **AnsweringMachine** сейчас!
Наш сервлет AnsweringMachine будет принимать все входящие вызовы на нашу «голосовую почту». Под «голосовой почтой» мы подразумеваем телефонный номер Twilio, который мы приобретем и настроим позже в этой статье.
Перейдите в **/webapps/twilio/WEB-INF/classes/com/twilio** и создайте новый файл под названием **AnsweringMachine.java**. Сервлет будет возвращать инструкции TwiML для записи всех входящих вызовов с использованием глагола `
Нам нужно импортировать ряд пакетов, чтобы использовать сервлеты и библиотеку Twilio. Поместите следующий код в верхнюю часть файла:
Наш класс AnsweringMachine будет иметь один метод под названием `service`, который будет обрабатывать входящие запросы. Используйте следующий код для создания класса AnsweringMachine и метода `service`:
Вы можете заменить «Brodan» на любое имя, которое пожелаете, в объекте `pleaseLeaveMessage`. Объект `TwiMLResponse`, который мы создаем, позволяет нам генерировать действительный TwiML-файл без фактического написания XML. `response.getWriter().print(twiml.toXML());` вернет ответ, эквивалентный следующему XML:
Вы заметите, что мы отправляем нашу запись на конечную точку **/twilio/handling-recording**, но у нас нет блока **servlet-mapping** для этой конечной точки в нашем файле **web.xml**. Чтобы справиться с этим, нам нужно создать еще один сервлет.
Снова откройте файл **web.xml** и добавьте следующие блоки выше **`
Это сопоставление отправит любые запросы, поступающие на конечную точку **/twilio/handle-recording**, сервлету **CallRecorder** для обработки. Нам также необходимо создать класс **CallRecorder**.
Перейдите в **/webapps/twilio/WEB-INF/classes/com/twilio** и создайте еще один новый файл с именем **CallRecorder.java**. Этот сервлет отправит исходящее сообщение, уведомляющее пользователя о получении голосового сообщения, и будет содержать ссылку на запись сообщения. К счастью для нас, Twilio берет на себя хранение записи, поэтому нам не нужно беспокоиться о записи файлов на наш сервер.
Нам снова нужно импортировать ряд пакетов. Поместите следующий код в верхнюю часть файла:
Класс **CallRecorder** должен быть настроен следующим образом:
Метод `service` просто передаст несколько параметров входящего запроса в новый метод под названием `sendSMS`, который мы создадим через минуту.
Нам необходимо настроить учетные данные нашей учетной записи для аутентификации с Twilio и отправки исходящих сообщений. Мы определим для этого несколько констант.
Добавьте следующие строки прямо под `public class CallRecorder extends HttpServlet {`:
Ваши ACCOUNT_SID, AUTH_TOKEN и TWILIO_NUMBER можно найти на панели управления вашей учетной записи Twilio. Установите YOUR_NUMBER на ваш фактический номер телефона.
Метод `sendSMS` должен быть помещен внутри вашего класса CallRecorder, прямо под методом `service`. Используйте следующий код для определения этого метода:
Здесь мы создаем экземпляр объекта `TwilioRestClient` с нашими учетными данными учетной записи и используем их для отправки исходящего SMS с помощью объекта `MessageFactory`. Текстовое сообщение будет содержать тело сообщения, информирующее пользователя о новом голосовом сообщении, и оно будет отправлено на указанный номер «Кому» с указанного номера «От». Не стесняйтесь изменять текст сообщения по своему усмотрению.
Это последнее, что нам нужно написать на Java. Уделите минуту, чтобы отпраздновать!
Здесь мы указываем пути к файлам Java-классов для классов, которые мы импортировали в верхнюю часть каждого файла .java. Всякий раз, когда вы вносите изменения в свои файлы .java, вам нужно будет выполнить эту команду для их перекомпиляции. Если вы получаете ошибки компиляции, значит, пути классов, указанные в вашей команде, некорректны, или вы выполняете команду не из той директории.
Далее нам нужно приобрести телефонный номер Twilio, который будет служить нашим автоответчиком. Следуйте этой замечательной гифке, чтобы сделать это:
Последний шаг перед записью звонков — сделать наш сервер Tomcat общедоступным, чтобы Twilio мог к нему получить доступ. Для этого мы можем использовать ngrok. Ngrok — это инструмент командной строки, который может создавать публичный туннель для доступа к вашему localhost. Если вы никогда раньше не использовали ngrok, рассмотрите возможность прочтения этой статьи Кевина Виннери, чтобы ознакомиться с ним. Вы также можете прочитать недавнюю статью моего коллеги Фила «6 потрясающих причин использовать ngrok при тестировании веб-перехватчиков», чтобы получить хорошее представление о расширенных возможностях Ngrok.
После установки ngrok выполните `$ ngrok http 8080` в терминале, и вы увидите окно, похожее на это:
Настройте URL-адрес запроса голоса (Voice Request URL) вашего номера Twilio из шага 4 вышеприведенной гифки, чтобы он указывал на ваш URL ngrok из окна выше с добавленной конечной точкой вашего Tomcat (например, `http://229cd6dd.ngrok.io/twilio/handle-call`). Затем прокрутите вниз и обязательно нажмите «Сохранить», чтобы сохранить настройки вашего номера Twilio.
Снова запустите сервер с помощью `$ sh bin/startup.sh` и давайте протестируем это чудо. Позвоните на свой номер Twilio, и вы услышите приветствие перед тем, как оставить голосовое сообщение. После того, как вы повесите трубку, вы должны получить текстовое сообщение со ссылкой для прослушивания только что сделанной записи.
Поздравляем! Теперь у вас есть совершенно новый автоответчик, и вам не пришлось иметь дело со стационарными телефонами или устаревшим оборудованием! Вот лишь несколько вещей, которые вы можете сделать с этим приложением:
— Настроить несколько автоответчиков для записи разных типов звонков, таких как поддержка клиентов, входящие заказы, отслеживание отгрузок и т. д.
— Принимать сообщения, не раскрывая свой настоящий номер.
— Позвонить себе и записать важные сообщения на потом.
Если вы заинтересованы в создании похожего приложения с Java и Twilio Voice, ознакомьтесь с моей недавней статьей «Как выполнить теплую передачу вызова с помощью Java и Twilio», в которой используется такая же настройка, как и в этой статье.
Если у вас возникли какие-либо проблемы или есть отзывы об этом руководстве, пожалуйста, не стесняйтесь оставлять комментарий ниже или связаться со мной через Twitter @brodan_ или написать мне по адресу chranj@twilio.com.