Перейти к содержимому
Socialift
Возможность

Интеграция вебхуков

Вебхук — это HTTP-запрос, который платформа сама отправляет вам при событии. Python SDK Socialift даёт вашему endpoint'у готовые блоки для вебхуков Meta: verify_challenge отвечает на GET-проверку, verify_request проверяет X-Hub-Signature-256 по сырому телу, parse_events разбирает доставку на события, а dedupe_key даёт стабильный ключ для отсева повторов. Передачу событий в CRM пишет ваш код.

Обновлено:

Что такое вебхук и чем он отличается от API

Вебхук — это HTTP-запрос, который сервер отправляет на ваш адрес в момент события. В обычном API запрос инициируете вы и ждёте ответа; в вебхуке наоборот — платформа вызывает вас. Поэтому о новом сообщении Direct или заполненной заявке вы узнаёте вскоре после события, без периодического опроса.

У Meta это происходит в два этапа: сначала адрес подтверждается GET-запросом (hub.mode, hub.verify_token, hub.challenge), затем события приходят POST-запросами с подписью HMAC-SHA256 в заголовке X-Hub-Signature-256.

Основная практическая сложность — правильно посчитать подпись: HMAC считается по сырому потоку байтов. Если распарсить JSON и сериализовать его заново, изменятся пробелы и порядок полей, и подпись не совпадёт.

Как подключить вебхук Meta

  1. Откройте endpoint

    Нужен HTTPS-адрес, поддерживающий методы GET и POST.

  2. Ответьте на запрос подтверждения

    Если в GET-запросе hub.verify_token совпадает с вашим значением, верните значение hub.challenge обычным текстом.

  3. Проверьте подпись

    Сравните значение из X-Hub-Signature-256 с HMAC-SHA256 от сырого тела, посчитанным на секрете приложения.

  4. Разберите события

    В одной доставке может прийти несколько объектов и изменений. Превратите каждое в отдельное событие.

  5. Сделайте дедупликацию

    Meta не присылает ID события и может повторить доставку. Собирайте ключ из содержимого (leadgen_id, mid сообщения, ID комментария) — в SDK это dedupe_key(event) — и храните его в уникальной колонке.

  6. Отвечайте быстро

    Возвращайте 200 сразу и уносите тяжёлую работу в очередь — иначе Meta посчитает доставку неуспешной.

Правильная проверка подписи

Код ниже показывает стандартную проверку из документации Meta без SDK. В Socialift SDK та же проверка — функция verify_request(app_secret, body, headers), которую вы вызываете в своём endpoint'е.

verify.py
import hmac, hashlib

def verify(raw_body: bytes, header: str, app_secret: str) -> bool:
    # заголовок выглядит так: "sha256=abcdef..."
    if not header or not header.startswith("sha256="):
        return False
    expected = hmac.new(
        app_secret.encode(), raw_body, hashlib.sha256
    ).hexdigest()
    # сравнение за постоянное время — защита от timing-атак
    return hmac.compare_digest(expected, header.split("=", 1)[1])

Обратите внимание: raw_body — это сырые байты от фреймворка. Если считать по результату json.dumps(request.json), подпись почти всегда не совпадёт.

Что даёт Socialift SDK

01

Проверка подписи

verify_request(app_secret, body, headers) сверяет X-Hub-Signature-256 за постоянное время и возвращает False, если подписи нет или она неверна, — отвечайте 403.

02

Разбор событий

Структура entry/changes/messaging разворачивается в единый поток событий.

03

Удаление дублей

Meta не даёт ID события; dedupe_key(event) строит стабильный ключ из содержимого. Запишите его в уникальную колонку — и дубль сделки в CRM не появится.

04

Повторы со стороны Meta

Если endpoint не ответил, Meta повторяет доставку до 36 часов — будьте идемпотентны через dedupe_key. RetryPolicy в SDK относится только к исходящим API-запросам; пересылку событий в CRM и её повторы делает ваш код.

05

Догрузка содержимого лида

В событии leadgen только ID (leadgen_id, form_id, page_id). Ответы формы забираются fb.lead(leadgen_id, page_token) и приводятся к имени/телефону/email через socialift.leads.normalize(). Для страниц, подключённых в кабинете, сервер делает это сам — лиды видны в Playground через GET /crm/leads.

06

Диагностика

«Statistika» (статистика) в кабинете показывает активации SDK и вызовы API/Playground с числом ошибок. Доставки вебхуков там не видны — логируйте их в своём endpoint'е.

Какие события приходят

Какие события приходят — Таблица возможностей по платформам
СобытиеInstagramFacebookТипичное действие в CRM
Новое сообщение Instagram DirectестьнетСоздать или обновить контакт и сделку
Комментарий под постоместьестьСоздать задачу, поставить в очередь ответа
Заполнена форма Lead AdsестьестьСоздать лид и назначить менеджера
Доступ отозванестьестьПометить подключение как разорванное

естьнетТаблицу можно прокрутить вбок

Примечания и ограничения

Для вебхуков комментариев Instagram приложение должно быть в режиме Live, для comments нужен Advanced Access, а аккаунт должен быть публичным. Лиды из рекламы в Instagram приходят событием leadgen страницы Facebook. Вебхуки LinkedIn доступны только приложениям с одобренным сценарием; LinkedIn-клиент Socialift их не обрабатывает — данные забираются запросами.

Чек-лист безопасности endpoint'а

  • Никогда не обрабатывайте запрос с непроверенной подписью.
  • Не держите verify_token и app_secret в коде — только в переменных окружения.
  • Endpoint должен быть доступен исключительно по HTTPS.
  • Ограничьте размер тела запроса и защитите разбор JSON.
  • Ставьте события в очередь: ответ должен быть 200, обработка — позже.
  • Сохраняйте ключ дедупликации и метку времени (entry.time) — для отсева дублей и аудита.

Частые вопросы

Как работает вебхук?

Когда на платформе происходит событие, она отправляет POST-запрос на ваш HTTPS-адрес. В теле — содержимое события, в заголовке — подпись. Вы проверяете подпись и возвращаете 200, подтверждая приём.

Почему не совпадает подпись вебхука?

Чаще всего подпись считают не по сырому телу, а по повторно сериализованному JSON. Вторая причина — неверный секрет приложения. Третья — прокси или фреймворк изменяет тело запроса.

Может ли одно событие прийти дважды?

Да. Meta повторяет неуспешную доставку до 36 часов, поэтому дубли — норма. ID события Meta не присылает: собирайте ключ из содержимого (в SDK — dedupe_key) и храните в уникальной колонке.

Можно ли обойтись опросом вместо вебхука?

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

Источники

  1. Meta — начало работы с вебхуками
  2. Meta — вебхуки Instagram
  3. LinkedIn — проверка вебхуков

Связанные страницы

Подключите вебхуки сегодня

Получите токен и проверьте подпись первого события Meta через verify_request.

Получить бесплатный токен →