Полное руководство по отслеживанию SMS-диалогов

Автор: | 30.07.2026

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

Однако, независимо от того, создаёте ли вы аналог WhatsApp или систему автоматизации рабочих процессов на базе SMS, приложения, требующие обмена несколькими сообщениями между вашим приложением и пользователем, скорее всего, потребуют от вас решения вопроса отслеживания состояния приложения между этими сообщениями. Чтобы помочь вам в этом, Twilio предлагает простое решение, позволяющее хранить состояние, связанное с диалогом в сообщениях: cookies.

В этой статье я покажу, как можно использовать HTTP-cookies для отслеживания SMS-диалога. Начну с объяснения принципов работы cookies в стандартном сценарии веб-браузера и веб-сервера, а затем покажу, что происходит, когда в дело вступает Twilio. В завершение я продемонстрирую, как создать простое приложение для отслеживания диалогов.

Cookie — это небольшой фрагмент данных, который отправляется с веб-сайта (сервера) и сохраняется браузером (клиентом). Давайте рассмотрим, как работают cookies в типичном сценарии взаимодействия веб-браузера и веб-сервера. Предположим, что браузер впервые отправляет запрос на определённый веб-сервер. Вот как выглядит процесс HTTP-запроса и ответа:

Клиент (веб-браузер) отправляет один GET-запрос на сервер для получения файла ‘index.html’. Когда сервер отвечает, он может вернуть в своём ответе одну или несколько cookies, каждая из которых определяется с помощью заголовка *Set-Cookie* в виде пары ключ/значение. В этом примере сервер включил в ответ два разных cookie, один из которых использует параметр *Expires* для явного указания срока действия этого cookie.

Для каждого cookie в ответе клиент создаёт ассоциацию между cookie и доменом сайта, который его предоставил. Создание этой ассоциации важно, так как позволяет браузеру знать, какие cookies необходимо включить при следующем запросе к тому же домену.

Теперь, когда сервер отправил cookies клиенту, клиент может изменять значения cookies и при последующих запросах к этому серверу отправлять эти cookies обратно. В приведённом ниже примере клиент отправляет два полученных cookie обратно на сервер, включая заголовок *Cookie* в свой HTTP-запрос:

Обратите внимание, как клиент берёт значения из каждого заголовка Set-Cookie, объединяет их в одну строку, разделённую точкой с запятой, и устанавливает эту строку в качестве значения заголовка Cookie. Это связано с тем, что спецификация HTTP допускает только один заголовок Cookie в HTTP-запросе, тогда как HTTP-ответ может содержать несколько заголовков Set-Cookie.

Возможность клиента сохранять cookies и обмениваться ими с сервером при каждом запросе и ответе позволяет клиенту сохранять состояние и передавать это состояние серверу.

Теперь давайте подробнее рассмотрим, как этот же процесс работает, если заменить веб-браузер в нашем примере на Twilio в качестве HTTP-клиента.

Когда пользователь отправляет текстовое сообщение на номер телефона Twilio, Twilio делает HTTP-запрос на URL-адрес, который вы настроили для этого номера телефона в параметре Sms Request URL. Этот URL обычно ведёт к веб-приложению, которое вы создали для обработки входящего SMS-сообщения и, при необходимости, возврата некоторых команд TwiML обратно в Twilio.

Поскольку Twilio делает HTTP-запросы так же, как и веб-браузер, взаимодействие между Twilio и вашим веб-сервером очень похоже на то, что я уже показал.

Существует два различия между тем, как браузер хранит cookies и как это делает Twilio. Во-первых, в отличие от браузера, который поддерживает как сессионные, так и постоянные cookies, Twilio обрабатывает все cookies как постоянные, независимо от наличия или отсутствия атрибута Expires. Все cookies, отправленные в Twilio, истекают через четыре часа, хотя вы можете использовать заголовок Expires, чтобы установить более короткий срок. Во-вторых, в отличие от браузера, который связывает сохранённый cookie с доменным именем, Twilio связывает каждый cookie с парой номеров телефонов To/From входящего SMS-сообщения.

Когда Twilio получает дополнительные входящие SMS-сообщения для конкретной пары номеров To/From, он проверяет, есть ли для этой пары сохранённые cookies. Если cookies существуют, они будут отправлены в HTTP-запросе к вашему веб-приложению.

Теперь, когда я показал, как работают cookies в типичном HTTP-запросе и ответе, давайте перейдём к созданию приложения Twilio, использующего cookies. Я начну с демонстрации создания простого приложения, которое использует cookies для отслеживания количества сообщений в одном SMS-диалоге.

Для создания приложения я буду использовать Flask — простой в использовании Python-микрофреймворк. Также я воспользуюсь библиотекой Twilio Python Helper, которая значительно упрощает генерацию TwiML, которую я буду возвращать в Twilio при получении SMS от пользователя. Наконец, если вы следите за процессом и у вас ещё нет учётной записи Twilio, сейчас самое время зарегистрироваться для бесплатной пробной версии. Конечно, если вы хотите сразу перейти к коду этого примера, он доступен в этом Gist.

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

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

Отлично, теперь у меня есть базовая инфраструктура приложения, и я могу создать код для отслеживания SMS-диалога.

Я начну с использования Flask для получения значения cookie с именем *messagecount* из входящего HTTP-запроса и увеличения его на единицу:

Обратите внимание, что если cookie не существует, что мы знаем не будет при первом запросе Twilio к моему приложению, я просто устанавливаю счётчик в ноль.

Затем с помощью библиотеки Twilio Python Helper я создаю TwiML-ответ, который хочу отправить обратно в Twilio. В данном случае я отправляю глагол, чтобы сказать Twilio отправить SMS-сообщение обратно человеку, который только что отправил его мне.

Наконец, я создаю новый HTTP-ответ, используя TwiML в качестве содержимого ответа, и добавляю в него новый cookie с помощью функции set_cookie:

В этом случае я создаю постоянный cookie, вычисляя новое время истечения срока действия, которое наступит через четыре часа, и затем включаю его в cookie, указывая аргумент *expires*.

Вот и всё. Twilio сохранит этот cookie и свяжет его с уникальной парой номеров телефонов To/From, отправивших сообщение. В следующий раз, когда этот номер телефона отправит мне сообщение (если это произойдёт в течение 4 часов), Twilio включит cookie в свой запрос к моему приложению, что позволит мне увеличить значение на единицу.

А поскольку Twilio связывает cookie с конкретной парой номеров телефонов To/From, если несколько пользователей отправляют сообщения на мой номер телефона Twilio, каждый из этих диалогов будет поддерживать свой собственный уникальный cookie messagecount.

Бывают случаи, когда необходимо хранить большие объёмы временных данных, для которых cookies не подходят. В таких случаях одним из вариантов является использование сессий, которые предлагают большинство веб-фреймворков, включая Flask.

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

По умолчанию Flask хранит данные сессии в cookie, но в моём случае, поскольку я хочу хранить большие объёмы данных, хранение их в cookie добавит ненужный объём каждому HTTP-запросу и ответу. Чтобы этого избежать, я использую расширение Flask под названием KVSession, которое заменяет стандартный механизм сессий Flask на тот, который хранит данные сессии в базе данных Redis на моём сервере.

Для использования KVSession в моём приложении мне нужно импортировать зависимость Flask Session и зависимость KVSessionExtension. Поскольку я хочу использовать Redis в качестве хранилища данных, мне также нужно импортировать redis и зависимость RedisStore.

После добавления зависимостей мне нужно указать секретный ключ, который Flask использует для цифровой подписи cookie, хранящей идентификатор сессии, настроить RedisStore и затем инициализировать KVSessionExtension:

Теперь я могу использовать объект session как обычно в своём приложении Flask, получая и сохраняя пары ключ/значение, которые будут сохранены в моей базе данных Redis:

KVSession заботится о создании подписанной cookie с уникальным идентификатором сессии за меня, так что всё, что мне нужно сделать, — это вернуть TwiML-ответ. При следующем запросе от Twilio KVSession извлечёт этот идентификатор и использует его для восстановления объекта сессии с соответствующими значениями.

До сих пор я говорил исключительно о сценариях, когда пользователь инициирует диалог с вашим приложением, отправляя SMS на ваш номер телефона Twilio. Однако что, если вы хотите, чтобы ваше приложение инициировало этот диалог, отправив начальное SMS-сообщение с помощью Twilio REST API?

Вашим первым побуждением может быть попытка использовать cookies так, как я продемонстрировал в предыдущих разделах этой статьи. Однако если подумать о том, как cookies передаются между клиентами и серверами, быстро становится ясно, что они не будут работать в этой ситуации. Давайте рассмотрим подробнее, почему.

Во всех приведённых мною примерах Twilio выступает в роли HTTP-клиента, а ваше веб-приложение — в роли сервера. Но когда вы используете REST API Twilio, эти роли меняются местами.

Теперь ваше приложение является HTTP-клиентом, инициирующим HTTP-запросы к серверам Twilio, и, как мы видели ранее, клиент не отправляет cookie при своём первом запросе. Только когда сервер возвращает cookie, клиент может начать включать его в последующие запросы, и, как видно из приведённой выше диаграммы, ответы, возвращаемые Twilio при запросах к API, не содержат cookie.

Независимо от того, нужно ли вам организовать сложный рабочий процесс бизнес-процесса или просто нужно удобное место для хранения часто используемых пользовательских данных, использование cookies в вашем приложении Twilio не составит труда. Поскольку Twilio является хорошо настроенным HTTP-клиентом, все методы, которые вы обычно используете для работы с cookies на веб-сайте, применимы и для использования cookies с приложением Twilio.

Советы, которые стоит запомнить, если вы решите использовать cookies в своём приложении Twilio: Twilio будет:

— создавать ассоциацию между cookie и уникальной парой номеров телефонов To/From,

— устанавливать максимальное время истечения cookie в четыре часа.

Готовы начать отслеживать свои собственные SMS-диалоги? Возьмите исходный код примера с cookies или примера с сессиями на GitHub и попробуйте сами. И если вы используете cookies в своём приложении, у вас есть вопросы о том, как Twilio отправляет и получает cookies, или вы хотите создать своё собственное приложение для отслеживания SMS-диалогов, не стесняйтесь написать мне по электронной почте или в Twitter.