Многоканальный чат с Twilio и Google App Engine

Автор: | 27.07.2026

*Это перепечатанный пост от разработчика Twilio, Кевина Уиннери, первоначально опубликованный в блоге Google Cloud Platform.*

Google App Engine позволяет разработчикам сосредоточиться на логике своего приложения, предоставляя масштабируемую инфраструктуру и высокоуровневые API для управления постоянством данных, файлами и других общих потребностей веб-приложений. XMPP и Channels являются одними из этих API, что делает создание потрясающих приложений для обмена сообщениями в реальном времени в браузере невероятно простым.

Сегодня мы подробно рассмотрим пример приложения (посмотрите его в действии, исходный код), которое интегрирует эти две службы App Engine (плюс SMS-сообщения от Twilio) в приложение группового чата, объединяющее пользователей через SMS, XMPP и браузерные клиенты чата.

Мы не будем разбирать каждую строку кода, но в общих чертах это приложение занимается получением входящих сообщений и отправкой исходящих. Давайте посмотрим, как мы это делаем через SMS, XMPP и Channels.

Отправка SMS-сообщений с помощью API Twilio требует регистрации в аккаунте Twilio. После регистрации вы можете использовать свой Account SID и Auth Token для аутентифицированных запросов к REST API Twilio. Вы можете просто использовать встроенную службу URL Fetch в App Engine для взаимодействия с API Twilio, но наша официальная вспомогательная библиотека для Java значительно упрощает аутентификацию запросов и сериализацию данных, предоставляя интерфейс POJO для ресурсов и функциональности Twilio. В этом примере мы будем использовать вспомогательную библиотеку Twilio. Если вы ищете справочные примеры, специфичные для App Engine, наши друзья из Google включили эту справочную документацию на свой сайт.

В нашем приложении чата вся исходящая связь и отправка сообщений обрабатываются классом MultichannelChatManager. В этом приложении мы добавляем подписчиков в чат-комнату в набор в памяти. Когда приходит время отправить сообщение, мы проходим по всем членам этого набора и отправляем сообщения всем подписчикам. Мы отправляем сообщения SMS-подписчикам, используя вспомогательную библиотеку Twilio на строке № 56:

Чтобы получать входящие сообщения, вам потребуется приобрести номер телефона Twilio или использовать тот, который вам был предоставлен при регистрации в аккаунте Twilio. Вы можете настроить этот номер телефона для отправки HTTP POST на URL, который вы выберете, при получении SMS-сообщения (этот шаблон обратного вызова называется веб-хуком). В этом примере приложения у нас есть Java-сервлет с файлом web.xml, настроенным для приема входящих SMS. В настройках вашего номера Twilio вы введете https://yourappname.appspot.com/sms, как показано ниже:

В самом сервлете мы сначала обрабатываем входящие SMS-сообщения, ища команду «STOP», которая укажет, что этот пользователь больше не хочет получать текстовые сообщения от приложения. Затем мы проверяем, подписан ли пользователь (ищем его номер телефона). Наконец, мы отправляем сообщение, используя наш класс MultichannelChatManager.

Когда Twilio отправляет вашему приложению детали SMS-сообщения с помощью HTTP-запроса, он ожидает, что ваше приложение ответит в формате XML, называемом TwiML. TwiML — это простой набор из менее чем 20 XML-тегов, который сообщает Twilio, как отвечать на входящие сообщения. Вывод нашего SMS-сервлета — это XML-документ (TwiML), который отправит SMS обратно пользователю, если он отпишется:

App Engine предоставляет простой API для отправки и получения сообщений XMPP. Наше приложение чата может получать новые сообщения через XMPP и отправлять их всем подписанным клиентам, аналогично тому, как наше приложение работает для SMS.

Приложения App Engine по умолчанию имеют связанное с ними имя пользователя XMPP, которое имеет вид «appname@appspot.com». Первая часть имени пользователя — это ваш уникальный идентификатор приложения App Engine, а вторая — домен appspot, на котором работает ваше приложение. Чтобы отправить сообщение через XMPP в наше приложение чата, нам нужно отправить сообщение на «twiliosandbox@appspot.com» с клиента чата, который поддерживает XMPP. Если вы использовали настольный клиент чата Adium для Google Talk, взаимодействие может выглядеть примерно так:

Чтобы наше приложение могло получать входящие сообщения XMPP, нам нужно настроить сервлет-обработчик входящих сообщений в нашем конфигурационном файле web.xml. Эта схема обратного вызова веб-хука — тот же тип механизма событий, который используется Twilio для доставки SMS-сообщений нашему приложению. В этом сервлете мы получаем входящий POST-запрос с информацией о входящем сообщении чата:

API Channel позволяет осуществлять серверную передачу данных подключенным клиентам в приложении App Engine. В нашем приложении чата мы будем использовать этот API для отправки новых сообщений чата в браузерные клиенты.

Чтобы наш сервер мог отправлять сообщения чата в браузер, клиент должен получить идентификатор от нашего сервера. Мы настраиваем сервлет для выдачи этих идентификаторов (и для обработки входящих сообщений чата, созданных в браузере с помощью JavaScript) в web.xml. Сервлет генерирует уникальный идентификатор для подключенного клиента на основе текущего системного времени:

В браузере мы получаем идентификатор текущего пользователя через XHR. Сначала мы включаем клиентскую библиотеку JavaScript Channel, запрашивая специальный URL на сервере App Engine. Затем мы используем jQuery для выполнения GET-запроса к нашему серверу, чтобы получить идентификатор клиента:

Когда мы получаем идентификатор клиента, мы используем его для настройки службы Channel App Engine в браузере для данных, отправляемых с сервера. Данные, отправляемые с сервера, обрабатываются в функции обратного вызова, которая обновляет поле textarea на странице. Когда пользователь вводит сообщение чата в браузере, мы выполняем POST-запрос к нашему ChatServlet, который использует класс MultichannelChatManager для публикации сообщения всем подключенным клиентам. Здесь мы используем API Channel для отправки данных в подключенные веб-браузеры:

В этом обзоре мы рассмотрели три API обмена сообщениями, которые отлично работают на App Engine: Twilio SMS, XMPP и Channels. В нашем примере использовался Java, но все три API также будут работать с Python и Go (Twilio имеет вспомогательную библиотеку, которую вы можете использовать для Python).

Используя платформы, такие как Twilio и App Engine, разработчики могут создавать коммуникационные приложения, которые ранее требовали бы экспертных знаний и инфраструктуры, за долю времени. Я надеюсь, что вы сможете использовать эти API для взаимодействия с вашими пользователями, где бы они ни находились.

Исходный код приложения доступен на GitHub здесь.