Telegram-бот - Получить результаты опроса

Я работаю над разработкой бота для Telegram, который может инициировать опросы в групповых чатах и ​​собирать голоса в этих опросах.

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

Теперь мне интересно, как я могу получить голоса, отправленные для опроса. Любые рекомендации по этому поводу будут очень признательны.

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
0
680
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы можете прослушивать обновления типа опроса (Update.poll), чтобы получить информацию об опросе.

Вот как:

  1. Telegram отправляет обновления (Update.poll) каждый раз, когда кто-то голосует или опрос закрывается.
  2. Следите за этими обновлениями, чтобы отслеживать ход опроса.
  3. Вы можете закрыть опрос, используя сохраненные chat_id и message_id для вызова конечной точки API stopPoll.
  4. Это запускает финальное событие Update.poll со всеми необходимыми вам результатами.
  5. В этом обновлении вы найдете такую ​​информацию, как общее количество избирателей (Poll.total_voter_count) (см. документацию ) и количество людей, выбравших каждый вариант (PollOptions.voter_count) ( см. документацию).

Таким образом, вы сможете отслеживать свой опрос и анализировать результаты после его завершения.

Редактировать:

Чтобы получить информацию о пользователе, проголосовавшем в опросе, во-первых, опрос должен быть неанонимным. Во-вторых, вам нужно прослушать тип обновления poll_answer.

Подробную информацию о свойствах можно найти в документации PollAnswer.

Если вы хотите сохранить (возможно, в базе данных), какой пользователь проголосовал за какой вариант, вы должны сохранить его по мере возникновения события, поскольку невозможно получить его позже.

Редактировать 2:

Обновление опроса, кажется, можно вообще не слушать. Когда вы останавливаете опрос, бот возвращает детали завершенного опроса. Итак, это просто:

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.

Редактировать 3

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)

Надеюсь это поможет.

Благодарю за ваш ответ. Если возможно, не могли бы вы предоставить пример фрагмента кода для обработки события update.poll? Кроме того, мне интересно, можно ли получить подробную информацию о проголосовавших пользователях. Спасибо!

user3918128 15.04.2024 11:57

Используете ли вы какие-либо модули/оболочку API-интерфейса бота для создания своего бота Telegram или полагаетесь на простые http-запросы из своего скрипта? Я не очень хорошо разбираюсь в Python, но если вы упомянете используемый модуль, я попробую его написать. А вот подробный пример файла, который я создал в Dart Надеюсь, это поможет.

HeySreelal 15.04.2024 19:02

Кроме того, я отредактировал исходный ответ, добавив информацию о том, как получить информацию о пользователе, который отметил/удалил голосование.

HeySreelal 15.04.2024 19:14

я использую модуль «telegram». но для создания опроса в групповом чате я использую HTTP-запрос. Спасибо

user3918128 15.04.2024 23:49

Вот функция, которую я использую для создания опроса 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: / /код для сохранения идентификатора опроса и идентификатора сообщения

user3918128 16.04.2024 12:51

эй, спасибо, что поделились фрагментом кода. я еще раз отредактировал свой первоначальный ответ, чтобы показать, как получить информацию об опросе.

HeySreelal 16.04.2024 16:32

Спасибо большое за правки, но остановить опрос, к сожалению, не вариант. Я все еще не понимаю, как я могу слушать обновления опросов. Если возможно, не могли бы вы привести пример? Использование getUpdates, похоже, не помогает; он просто возвращает ответ 200 OK без каких-либо данных. Спасибо

user3918128 19.04.2024 12:32

Эй, спасибо, что ответили. Я не очень хорошо разбираюсь в Python, но, исходя из моего базового понимания, я написал код для прослушивания обновлений «poll» и «poll_answer». Еще раз отредактировал исходный ответ, чтобы он содержал код. Дайте мне знать, если это сработает. С уважением :)

HeySreelal 19.04.2024 18:50

Большое спасибо за правки. Да, они сработали.

user3918128 21.04.2024 12:02

Другие вопросы по теме