Собеседник или участник группы поставил, сменил или снял реакцию на сообщение. Реакцию с телефона номера канала 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 сообщил, кто её поставил; иначе приходят только свои реакции и реакции в личных чатах |
| реакции в личных чатах и группах приходят сразу |
Реакции, поставленные, пока канал был не на связи, не дочитываются.
Как обработать
Хранить текущую реакцию каждого участника на сообщении:
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) # реакцию сняли
Что дальше
- sendReaction — поставить реакцию самому.
- getAllowedReactions — какие реакции можно поставить.
- Свои сообщения — уведомления о действиях с номера канала.
