Я работаю над разработкой бота для Telegram, который может инициировать опросы в групповых чатах и собирать голоса в этих опросах.
Я успешно реализовал создание опросов с помощью конечной точки API sendPoll. После создания опроса я сохраняю как идентификатор сообщения, так и идентификатор опроса.
Теперь мне интересно, как я могу получить голоса, отправленные для опроса. Любые рекомендации по этому поводу будут очень признательны.






Вы можете прослушивать обновления типа опроса (Update.poll), чтобы получить информацию об опросе.
Вот как:
Update.poll) каждый раз, когда кто-то голосует или опрос закрывается.chat_id и message_id для вызова конечной точки API stopPoll.Update.poll со всеми необходимыми вам результатами.Poll.total_voter_count) (см. документацию ) и количество людей, выбравших каждый вариант (PollOptions.voter_count) ( см. документацию).Таким образом, вы сможете отслеживать свой опрос и анализировать результаты после его завершения.
Чтобы получить информацию о пользователе, проголосовавшем в опросе, во-первых, опрос должен быть неанонимным. Во-вторых, вам нужно прослушать тип обновления poll_answer.
Подробную информацию о свойствах можно найти в документации PollAnswer.
Если вы хотите сохранить (возможно, в базе данных), какой пользователь проголосовал за какой вариант, вы должны сохранить его по мере возникновения события, поскольку невозможно получить его позже.
Обновление опроса, кажется, можно вообще не слушать. Когда вы останавливаете опрос, бот возвращает детали завершенного опроса. Итак, это просто:
chatId = -4194582143
msgId = 0 # set this when you send the poll
pollId = ""
def stop_poll():
baseurl = f"api.telegram.org/bot{TOKEN}/stopPoll"
parameters = {
"chat_id": chatId,
"message_id" msgId,
}
response = requests.get(url=baseurl, data=parameters, timeout=15)
if response.status_code != 200:
print("Error while posting to telegram API %s", response.status_code)
else:
print(response.json())
# response will contain the stopped poll details
# this includes total_voter_count, `options` with voters_count for each option
# check more here: https://core.telegram.org/bots/api#poll
Но, еще раз, если вы хотите отслеживать пользователей, которые проголосовали за какой вариант, вам нужно рекурсивно вызывать getUpdates и проверять тип обновлений poll_answer.
import requests
import time
def get_updates(bot_token):
url = f"https://api.telegram.org/bot{bot_token}/getUpdates?allowed_updates=[\"poll\", \"poll_answer\"]"
response = requests.get(url)
if response.status_code == 200:
updates_json = response.json()
if updates_json["ok"]:
updates = updates_json["result"]
return updates
else:
print("Failed to fetch updates. Response not okay.")
return None
else:
print(f"Failed to fetch updates. Status code: {response.status_code}")
return None
def process_poll(poll):
# Implement your logic to handle incoming polls here
print("Received a new poll:", poll)
def process_poll_answer(poll_answer):
# Implement your logic to handle incoming poll answers here
print("Received a poll answer:", poll_answer)
def process_updates(updates):
for update in updates:
if "poll" in update:
process_poll(update["poll"])
elif "poll_answer" in update:
process_poll_answer(update["poll_answer"])
def fetch_and_process_updates(bot_token):
while True:
updates = get_updates(bot_token)
if updates:
process_updates(updates)
# Add a delay between each update request to avoid flooding the API
time.sleep(1) # You can adjust the delay as needed
BOT_TOKEN = "your_bot_token_here"
fetch_and_process_updates(BOT_TOKEN)
Надеюсь это поможет.
Используете ли вы какие-либо модули/оболочку API-интерфейса бота для создания своего бота Telegram или полагаетесь на простые http-запросы из своего скрипта? Я не очень хорошо разбираюсь в Python, но если вы упомянете используемый модуль, я попробую его написать. А вот подробный пример файла, который я создал в Dart Надеюсь, это поможет.
Кроме того, я отредактировал исходный ответ, добавив информацию о том, как получить информацию о пользователе, который отметил/удалил голосование.
я использую модуль «telegram». но для создания опроса в групповом чате я использую HTTP-запрос. Спасибо
Вот функция, которую я использую для создания опроса def new_telegram_poll(): baseurl = (f"api.telegram.org/bot{TOKEN}/sendpoll") параметры = { "chat_id": -4194582143, "вопрос": 'Пятница Grand Sport 12:30-14:00?', "options":json.dumps([ '+', '-' ]), "is_anonymous":False, "allows_multiple_answers":False, "type":" Regular", } response = Requests.get(url=baseurl,data=parameters, timeout=15) if response.status_code != 200: print("Ошибка при отправке в Telegram API %s", response.status_code) else: / /код для сохранения идентификатора опроса и идентификатора сообщения
эй, спасибо, что поделились фрагментом кода. я еще раз отредактировал свой первоначальный ответ, чтобы показать, как получить информацию об опросе.
Спасибо большое за правки, но остановить опрос, к сожалению, не вариант. Я все еще не понимаю, как я могу слушать обновления опросов. Если возможно, не могли бы вы привести пример? Использование getUpdates, похоже, не помогает; он просто возвращает ответ 200 OK без каких-либо данных. Спасибо
Эй, спасибо, что ответили. Я не очень хорошо разбираюсь в Python, но, исходя из моего базового понимания, я написал код для прослушивания обновлений «poll» и «poll_answer». Еще раз отредактировал исходный ответ, чтобы он содержал код. Дайте мне знать, если это сработает. С уважением :)
Большое спасибо за правки. Да, они сработали.
Благодарю за ваш ответ. Если возможно, не могли бы вы предоставить пример фрагмента кода для обработки события update.poll? Кроме того, мне интересно, можно ли получить подробную информацию о проголосовавших пользователях. Спасибо!