Канал сменил состояние: подключился к мессенджеру, начал переподключаться или потерял сеанс. По этому уведомлению приложение узнаёт, что отправка временно не работает или нужна новая привязка номера.
typeWebhook |
stateInstanceChanged |
typeMessage |
— |
| Флаг настроек | stateWebhook |
| Каналы | MAX, Telegram, WhatsApp, почта |
Пример
Канал MAX снова на связи после переподключения:
{
"typeWebhook": "stateInstanceChanged",
"instanceData": {"idInstance": 7100000001, "wid": "79990000001@c.us", "typeInstance": "v3", "channel": "max"},
"timestamp": 1791826035,
"stateInstance": "authorized"
}
Поля
| Поле | Описание |
|---|---|
stateInstance |
новое состояние — таблица ниже |
timestamp |
когда состояние сменилось |
instanceData.wid |
номер или адрес аккаунта канала; "", пока площадка его не сообщила |
У уведомления нет idMessage, senderData, messageData и eventId. Ключ от повторной обработки — пара timestamp + stateInstance.
Состояния
stateInstance |
Что значит | Что делать |
|---|---|---|
authorized |
канал на связи, отправка и приём работают | ничего |
starting |
канал подключается или переподключается — обычно несколько секунд | подождать; отправка в это время отвечает с задержкой или 400 not_authorized |
notAuthorized |
сеанса нет: номер не привязан, сеанс завершили на телефоне, площадка его отозвала или почта перестала принимать вход | привязать номер или ящик заново в кабинете |
wrongAccount |
к каналу подключили не тот аккаунт, что был привязан раньше; отправка закрыта | выйти из этого аккаунта в кабинете и привязать прежний |
Текущее состояние в любой момент — getStateInstance.
Переподключение — обычное дело: перезапуск, сеть, обновление. Пока канал в starting, входящие не теряются: после подключения Gratio дочитает пропущенное сам. Не дочитал всё — придёт syncGap.
Как обработать
Предупредить оператора, если канал потерял сеанс, и не тревожить из-за коротких переподключений:
def on_state(body: dict) -> None:
if body["typeWebhook"] != "stateInstanceChanged":
return
channel = body["instanceData"]["idInstance"]
state = body["stateInstance"]
set_channel_state(channel, state, since=body["timestamp"])
if state in ("notAuthorized", "wrongAccount"):
notify_admin(f"Канал {channel}: нужна привязка в кабинете ({state})")
elif state == "starting":
schedule_check(channel, after_seconds=120) # всё ещё starting через 2 минуты — проверить
Для повторной проверки вызовите getStateInstance. Канал застрял в starting — reboot.
