Собеседник или участник группы создал опрос.
typeWebhook |
incomingMessageReceived |
typeMessage |
pollMessage |
| Флаг настроек | incomingWebhook |
| Каналы | MAX, Telegram, WhatsApp |
Пример
Олег создал опрос в группе MAX:
{
"typeWebhook": "incomingMessageReceived",
"instanceData": {"idInstance": 7100000001, "wid": "79990000001@c.us", "typeInstance": "v3", "channel": "max"},
"timestamp": 1791823840,
"idMessage": "117428964100983274",
"eventId": "msg:-80040066617372:117428964100983274",
"senderData": {
"chatId": "-80040066617372", "chatName": "3А · Робототехника", "chatType": "group",
"sender": "1111111", "senderName": "Олег", "senderType": "user",
"senderContactName": "", "senderPhoneNumber": 0
},
"messageData": {
"typeMessage": "pollMessage",
"pollMessageData": {
"name": "Когда удобнее занятие?",
"options": [{"optionName": "Суббота"}, {"optionName": "Воскресенье"}],
"allowToChangeAnswer": false
}
}
}
Поля
| Поле | Описание |
|---|---|
pollMessageData.name |
вопрос |
pollMessageData.options[].optionName |
варианты ответа по порядку |
pollMessageData.allowToChangeAnswer |
всегда false — поле для совместимости с Green API |
Можно ли выбрать несколько вариантов, Gratio не передаёт.
Остальные поля конверта — в статье Формат уведомления.
Голоса
| Канал | Голоса участников |
|---|---|
| MAX | уведомлениями не приходят |
| Telegram | уведомлениями не приходят |
| в личном чате — ответом цитатой на опрос; в группе не приходят |
Голос в WhatsApp: Мария выбрала «Суббота» в опросе, который отправила школа. Текст — выбранные варианты через запятую, в quotedMessage — опрос и его вопрос:
{
"typeWebhook": "incomingMessageReceived",
"instanceData": {"idInstance": 7100000001, "wid": "79990000001@c.us", "typeInstance": "whatsapp", "channel": "whatsapp"},
"timestamp": 1791823900,
"idMessage": "3EB0A1F4C2D98E7B6A5C",
"eventId": "msg:79991234567:3EB0A1F4C2D98E7B6A5C",
"senderData": {
"chatId": "79991234567@c.us", "chatName": "Мария", "chatType": "user",
"sender": "79991234567@c.us", "senderName": "Мария", "senderType": "user",
"senderContactName": "", "senderPhoneNumber": 0
},
"messageData": {
"typeMessage": "quotedMessage",
"extendedTextMessageData": {"text": "Суббота", "stanzaId": "3EB0C767D26A1D5A6F0B", "participant": ""},
"quotedMessage": {
"stanzaId": "3EB0C767D26A1D5A6F0B",
"participant": "",
"typeMessage": "textMessage",
"textMessage": "Когда удобнее занятие?"
}
}
}
Голос сняли — текст (голос снят). Опроса нет в истории канала — текст (голос в опросе, которого нет в истории).
Как обработать
Записать опрос и, для WhatsApp, считать голоса по ответам на него:
polls: dict[str, dict[str, int]] = {} # idMessage опроса → вариант → голоса
def on_poll(body: dict) -> None:
data = body["messageData"]
if data["typeMessage"] == "pollMessage":
options = [o["optionName"] for o in data["pollMessageData"]["options"]]
polls[body["idMessage"]] = {name: 0 for name in options}
return
quoted = data.get("quotedMessage")
if quoted and quoted["stanzaId"] in polls: # голос WhatsApp
for choice in data["extendedTextMessageData"]["text"].split(", "):
if choice in polls[quoted["stanzaId"]]:
polls[quoted["stanzaId"]][choice] += 1
Это упрощённый подсчёт: повторный голос того же участника заменяет прежний, храните последний голос каждого sender.
Что дальше
- sendPoll — отправить опрос.
- Ответ цитатой — как устроены ответы на сообщения.
