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

Реакция

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

Собеседник или участник группы поставил, сменил или снял реакцию на сообщение. Реакцию с телефона номера канала Gratio присылает как outgoingMessageReceived.

typeWebhook incomingMessageReceived; своя реакция — outgoingMessageReceived
typeMessage reactionMessage
Флаг настроек incomingWebhook; своя реакция — outgoingMessageWebhook
Каналы MAX, Telegram, WhatsApp

Пример

Мария поставила 👍 на сообщение школы в MAX:

{
  "typeWebhook": "incomingMessageReceived",
  "instanceData": {"idInstance": 7100000001, "wid": "79990000001@c.us", "typeInstance": "v3", "channel": "max"},
  "timestamp": 1791823700,
  "idMessage": "117428956522361912:reaction:8695836:1",
  "eventId": "react:8695836:117428956522361912:8695836:1",
  "senderData": {
    "chatId": "8695836", "chatName": "Мария", "chatType": "user",
    "sender": "8695836", "senderName": "Мария", "senderType": "user",
    "senderContactName": "", "senderPhoneNumber": 0
  },
  "messageData": {
    "typeMessage": "reactionMessage",
    "extendedTextMessageData": {"text": "👍"},
    "quotedMessage": {"stanzaId": "117428956522361912", "participant": ""}
  }
}

Поля

Поле Описание
idMessage id события: {id}:reaction:{автор}:{n}
messageData.extendedTextMessageData.text эмодзи; "" — реакцию сняли
messageData.quotedMessage.stanzaId idMessage сообщения, на которое отреагировали
messageData.quotedMessage.participant всегда ""
senderData.sender кто поставил реакцию — и в группе тоже

Остальные поля конверта — в статье Формат уведомления.

Смена и снятие

  • У одного автора на сообщении — одна реакция. Сменил — новое уведомление с новым эмодзи, снял — уведомление с text: "".
  • Каждая смена увеличивает n в idMessage и eventId: …:8695836:1, …:8695836:2.
  • Тот же эмодзи повторно не присылается.

Храните последнюю реакцию каждого автора: новое уведомление заменяет прежнюю реакцию этого sender.

В группе

chatId — группа, sender — участник, который поставил реакцию:

"senderData": {
  "chatId": "-80040066617372", "chatName": "3А · Робототехника", "chatType": "group",
  "sender": "8695836", "senderName": "Мария", "senderType": "user",
  "senderContactName": "", "senderPhoneNumber": 0
}

Реакции в группах MAX

MAX сообщает о реакции только автору сообщения. Реакции на сообщения самого номера канала приходят сразу. Реакции на чужие сообщения — например, родители лайкают отчёт педагога, написанный с его телефона, — Gratio отслеживает сам:

Где сообщение Реакция придёт
в одной из 20 групп с самыми свежими сообщениями участников за секунды
в другой группе, сообщению меньше 48 часов не позже чем через ~30 минут
сообщению больше 48 часов не отслеживается — смотрите getChatHistory
  • Формат тот же: quotedMessage.stanzaId — сообщение, на которое отреагировали, sender — кто.
  • Список 20 групп пересобирается сам: ожившая группа входит в него, затихшая выходит.
  • В одной группе отслеживается до 50 свежих чужих сообщений.
  • После перезапуска канала Gratio берёт под наблюдение свежие сообщения групп из истории. Реакции, поставленные до перезапуска, повторно не приходят.

В других каналах

Канал Особенности
MAX реакции на чужие сообщения в группах — по правилам выше
Telegram в группе реакцию участника видно, если Telegram сообщил, кто её поставил; иначе приходят только свои реакции и реакции в личных чатах
WhatsApp реакции в личных чатах и группах приходят сразу

Реакции, поставленные, пока канал был не на связи, не дочитываются.

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

Хранить текущую реакцию каждого участника на сообщении:

reactions: dict[tuple[str, str, str], str] = {}   # (чат, сообщение, автор) → эмодзи


def on_reaction(body: dict) -> None:
    data = body["messageData"]
    if data["typeMessage"] != "reactionMessage":
        return
    key = (body["senderData"]["chatId"], data["quotedMessage"]["stanzaId"], body["senderData"]["sender"])
    emoji = data["extendedTextMessageData"]["text"]
    if emoji:
        reactions[key] = emoji
    else:
        reactions.pop(key, None)                    # реакцию сняли

Что дальше

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