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

Опрос

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

Собеседник или участник группы создал опрос.

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 в личном чате — ответом цитатой на опрос; в группе не приходят

Голос в 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.

Что дальше

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