Связь с мессенджером иногда рвётся: перезапуск, сеть, переподключение сеанса. При подключении 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 не пришёл, догон прошёл полностью — ничего делать не нужно.
Что делать
- Пометьте диалоги из
chatIdsдля оператора: «могли пропустить сообщения с …». - Дочитайте их методом getChatHistory: он берёт сообщения с сервера мессенджера, в том числе за простой.
chatIdsпустой — сверьте самые свежие чаты из getChats.- Не дочитывайте все чаты подряд без пауз — см. Темп и лимиты.
Канал потерял сеанс совсем — придёт не 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, затем история свежих чатов
Что дальше
- getChatHistory — дочитать историю чата.
- stateInstanceChanged — состояние канала.
- Как получать уведомления — что гарантирует Gratio.
