Отправка и получение WhatsApp из Python
Получение выполняет маршрут вашего веб-фреймворка: он отвечает на GET для проверки Meta и принимает POST-запросы. Отправка выполняется HTTPS-запросом к Cloud API с phone number id и токеном номера. Наш SDK не нужен, устанавливать тоже ничего не нужно.
GET для проверки Meta и POST для событий. Это сторона получения.
Окно после сообщения клиента, когда можно отправлять свободный текст.
Ошибка при отправке свободного текста вне этого окна.
Как получать сообщения в Python?
Используйте два обработчика на одном маршруте, в любом фреймворке, который уже применяете.
Обработчик GET отвечает на проверку Meta. Он считывает hub.mode, hub.verify_token и hub.challenge из строки запроса, сверяет токен со своим и возвращает challenge как необработанное тело ответа. Возврат JSON здесь является самой частой ошибкой и завершается без понятного сообщения.
Обработчик POST получает события. Быстро верните 200, а работу выполните после этого, потому что Meta считает медленный ответ ошибкой и повторяет запрос. Так одно сообщение может быть обработано дважды. Поставьте его в очередь или передайте фоновой задаче вместо обработки внутри запроса.
Сообщения приходят с идентификатором wamid. Дедупликацию по нему стоит добавить сразу, поскольку повторные запросы являются нормой.
Как отправлять сообщения?
Отправьте один POST на эндпоинт сообщений Cloud API для phone number id, используя bearer-токен.
Оба значения берутся из подключения: панель управления показывает их, а get_api_credentials возвращает их, если вы хотите получать данные через помощника. В этом запросе нет ничего специфичного для нас, поэтому подойдёт любая HTTP-библиотека, а сам запрос выглядит как в документации Meta.
При выборе тела важен срок. В течение 24 часов после последнего сообщения клиента отправляйте объект `text`. После этого отправляйте объект `template` с названием одобренного шаблона и его языком. Клиент, знающий только первую структуру, отлично работает при тестировании, но ломается на первом ночном сообщении и возвращает ошибку 131047.
Что ещё нужно обработчику для работы в продакшене?
Три вещи, которые легко пропустить и дорого добавлять позже.
Делайте дедупликацию по идентификатору сообщения, потому что Meta повторяет запросы. Проверяйте подпись запроса, если обработчик открыт в интернете: иначе отправить запрос на ваш URL сможет любой, кто его узнает. И учитывайте, сколько времени прошло с последнего сообщения контакта, чтобы путь отправки сам выбирал `text` или `template`.
Для этого не нужны фреймворк или библиотека. Нужны набор, проверка и сравнение. Если добавить их до первого клиента, интеграция будет работать спокойно, а не требовать постоянного внимания.
Распространённые ошибки
- Возврат JSON вместо необработанного значения challenge в GET для проверки.
- Обработка до возврата 200. Meta повторяет медленные запросы, и сообщение обрабатывается дважды.
- Отправка свободного текста без проверки окна. Возвращается 131047, и кажется, что ничего не произошло.
Подключите номер на easycoexistence.com, укажите адрес вебхука для своего маршрута и возьмите phone number id и токен из панели управления. От US$ 9 за номер в месяц, до US$ 2 при большом объёме, первые 7 дней бесплатно.
Часто задаваемые вопросы
Есть ли SDK для Python?
Не от нас, и он вам не нужен. API принадлежит Meta, документацию предоставляет Meta, а доступ возможен через любую HTTP-библиотеку.
Какой фреймворк выбрать?
Любой. Нужен маршрут, который отвечает на GET и принимает POST, а это умеет каждый веб-фреймворк Python.
Как не обработать сообщение дважды?
Делайте дедупликацию по идентификатору wamid в полезной нагрузке. Meta повторяет запросы по задумке, поэтому это ожидаемая ситуация, а не редкий случай.
Команда сможет продолжать пользоваться телефоном?
Да. Coexistence сохраняет работу WhatsApp Business на том же номере, а ваш обработчик получает отправленные командой сообщения как события-эхо.
Читайте дальше
Готовы начать?
Настройте WhatsApp Coexistence за несколько минут, а не месяцев. Приложение продолжит работать на телефоне.
Начать бесплатный пробный периодПроверено по состоянию на