Skip to main content

События poll и poll_answer

При взаимодействии с опросом боту приходят два типа событий.

poll

Когда состояние опроса изменилось (новый голос, закрытие). Содержит полное состояние опроса.

{
"update_id": 123,
"poll": {
"id": "1714326600000",
"question": "Какой ваш любимый язык?",
"options": [
{"text": "Python", "voter_count": 5},
{"text": "JavaScript", "voter_count": 8}
],
"total_voter_count": 13,
"is_closed": false,
"is_anonymous": true,
"type": "regular",
"allows_multiple_answers": false
}
}

Когда приходит:

  • Новый голос (анонимный или нет)
  • Опрос закрыт через stopPoll
  • Истёк open_period

poll_answer

Когда конкретный юзер проголосовал (только для не-анонимных опросов).

{
"update_id": 124,
"poll_answer": {
"poll_id": "1714326600000",
"user": {"id": 999, "first_name": "Иван"},
"option_ids": [1]
}
}

option_ids — массив индексов выбранных вариантов. Для quiz всегда один элемент.

Если юзер передумал и поменял ответ — приходит ещё одно событие с новыми option_ids. Если убрал голос — option_ids: [].

Подписка на события

Чтобы получать эти события через webhook, укажите в setWebhook:

{
"url": "https://...",
"allowed_updates": ["message", "callback_query", "poll", "poll_answer"]
}

Без allowed_updates события poll/poll_answer не приходят по умолчанию.

Анонимность

  • Анонимный опрос — приходит только poll (с агрегатами), poll_answer НЕ приходит.
  • Не-анонимный — приходят оба события.

Это защита приватности юзеров: бот не должен знать кто как проголосовал в анонимном опросе.

Use cases

# Подсчёт правильных ответов в серии quiz
correct_count = {}

@dp.poll_answer()
async def on_answer(answer):
user_id = answer.user.id
poll_id = answer.poll_id
if poll_correct[poll_id] in answer.option_ids:
correct_count[user_id] = correct_count.get(user_id, 0) + 1