Gratio начал или закончил первую полную загрузку истории канала. По этому уведомлению приложение показывает «Синхронизация» и начинает перенос переписки, когда история готова, — опрашивать getSyncStatus по таймеру не нужно.
typeWebhook |
syncStateChanged |
typeMessage |
— |
| Флаг настроек | stateWebhook |
| Каналы | MAX, Telegram, WhatsApp, почта, чат на сайте |
Пример
Загрузка истории закончилась, все 128 чатов догружены до начала:
{
"typeWebhook": "syncStateChanged",
"instanceData": {"idInstance": 7100000001, "wid": "79990000001", "typeInstance": "max", "channel": "max"},
"timestamp": 1792300000,
"syncState": "synced",
"chats": {"total": 128, "done": 128},
"messages": 112300
}
Поля
| Поле | Описание |
|---|---|
syncState |
syncing — загрузка началась, synced — закончилась |
chats.total, chats.done |
сколько чатов загружается и сколько догружено до начала |
messages |
сколько сообщений в истории канала |
timestamp |
когда состояние сменилось |
Уведомление приходит дважды: в начале первой полной загрузки и в её конце. Новые чаты потом догружаются без уведомлений, ход загрузки в любой момент — getSyncStatus.
У уведомления нет idMessage, senderData, messageData и eventId. Ключ от повторной обработки — пара timestamp + syncState.
Сообщения, загруженные из истории, уведомлениями не приходят — их читают getChatHistory.
Как обработать
Когда история готова, перенести переписку всех чатов в свою систему:
def on_sync(body: dict) -> None:
if body["typeWebhook"] != "syncStateChanged":
return
channel = body["instanceData"]["idInstance"]
if body["syncState"] == "syncing":
show_status(channel, f"Синхронизация · {body['chats']['done']} из {body['chats']['total']} чатов")
elif body["syncState"] == "synced":
show_status(channel, "История загружена")
start_import(channel) # пройти getChats и листать getChatHistory каждого чата
show_status и start_import — ваш код.
Что дальше
- getSyncStatus — ход загрузки в любой момент.
- getChatHistory — листать историю чата до начала.
- stateInstanceChanged — смена состояния канала.
