Перейти к содержимому

syncGap

Обновлено 17 октября 2026

Связь с мессенджером иногда рвётся: перезапуск, сеть, переподключение сеанса. При подключении Gratio дочитывает пропущенное и отдаёт обычными уведомлениями. Если догон упёрся в предел или площадка не отдала историю чата, приходит syncGap: в этих чатах с момента from могут не хватать сообщений.

typeWebhook syncGap
typeMessage —
Флаг настроек нет — приходит всегда
Каналы MAX, Telegram, почта

Пример

За простой в чате с Марией в MAX набралось больше 500 сообщений:

{
  "typeWebhook": "syncGap",
  "instanceData": {"idInstance": 7100000001, "wid": "79990000001@c.us", "typeInstance": "v3", "channel": "max"},
  "timestamp": 1791826035,
  "reason": "too_deep",
  "from": 1791820000,
  "chatIds": ["8695836"],
  "eventId": "gap:too_deep:1791820000000:f8af1f6cf977d167"
}

Поля

Поле Описание
reason почему дочитано не всё — таблица ниже
from с какого момента могут быть пропуски, секунды Unix
chatIds чаты, где могут быть пропуски; [] — какие именно, площадка не сообщила
timestamp когда Gratio обнаружил разрыв
eventId ключ от повторной обработки

У уведомления нет idMessage, senderData и messageData.

Причины

reason Что случилось
too_many_chats за простой изменилось больше 100 чатов. chatIds — те, что не дочитаны; в Telegram пусто: за пределом выдачи чатов не видно
too_deep в чате больше 500 сообщений за простой; у почты — больше 200 писем, chatIds пусто
fetch_failed площадка не отдала историю чата

Как устроен догон

  • До 500 сообщений на чат, по 100 самым свежим чатам; у почты — до 200 писем.
  • Пропущенное приходит в общем порядке времени по всем чатам, как если бы связь не рвалась.
  • Новые сообщения, пришедшие во время догона, ждут и уходят следом: новое не обгоняет пропущенное.
  • Дублей нет: то, что уже пришло, второй раз не придёт.
  • Правки за простой приходят уведомлениями о правке (см. Правка); удаления и реакции за простой не дочитываются — их видно в getChatHistory.
  • Посты каналов и сообщения групп дочитываются так же.

Если syncGap не пришёл, догон прошёл полностью — ничего делать не нужно.

Что делать

  1. Пометьте диалоги из chatIds для оператора: «могли пропустить сообщения с …».
  2. Дочитайте их методом getChatHistory: он берёт сообщения с сервера мессенджера, в том числе за простой.
  3. chatIds пустой — сверьте самые свежие чаты из getChats.
  4. Не дочитывайте все чаты подряд без пауз — см. Темп и лимиты.

Канал потерял сеанс совсем — придёт не syncGap, а stateInstanceChanged с notAuthorized.

Как обработать

Поставить чаты в очередь на сверку с историей:

def on_sync_gap(body: dict) -> None:
    if body["typeWebhook"] != "syncGap":
        return
    since = body["from"]
    if body["chatIds"]:
        for chat_id in body["chatIds"]:
            flag_dialog(chat_id, f"могли пропустить сообщения с {since}")
            enqueue_history_check(chat_id, since=since)   # getChatHistory с паузами между чатами
    else:
        enqueue_recent_chats_check(since=since)           # getChats, затем история свежих чатов

Что дальше

Была ли статья полезна?