Невозможно выйти из цикла при запуске бота Telegram

Я создаю Telegram Bot с помощью pyTelegramBotAPI, который в реальном времени отправляет обновления текущих матчей по крикету. Я хочу разорвать цикл всякий раз, когда пользователь вводит команду «/ stop». Я искал различные источники, а также пробовал несколько способов добиться того же, но все тщетно. Цикл продолжает повторяться. Самое близкое, что я достиг, - это выйти из программы, подняв ошибку. Кроме того, внутри цикла метод getUpdates всегда возвращает пустой список. Я также написал проблему для того же на GitHub.

      def loop(match_url): 
    prev_info = "" 
    #continuously fetch data 
    while True: 
        response = requests.get(match_url) 
        match_score = response.json()['score'] 
        #display only when the score updates 
        if str(match_score) != prev_info: 
            prev_info = str(match_score) 
            info.send_msg(match_score, chat_id) 
        else: 
            pass 
        #this handler needs to be fixed 
        @bot.message_handler(commands=['stop', 'end']) 
        def stop(message):
            #code to break the loop 

1 ответ

Решение

Вы неправильно используете пакет (pyTelegramBotAPI):

  1. Почему вы создали свою функцию send_msg где уже есть send_message метод в telebot существуют?
  2. Вы повторно объявляете обработчик остановки в цикле, что неверно!

Я предлагаю вам научиться пользоваться pyTelegramBotAPI должным образом!

Вот демонстрационный код, решающий вашу проблему:

      import telebot
from time import sleep

bot = telebot.TeleBot(BOT_TOKEN)
flag = 1

@bot.message_handler(commands=['loop'])
def loop(msg):
    while flag:
        bot.send_message(msg.chat.id, "ping")
        sleep(1)

@bot.message_handler(commands=['stop', 'end'])
def stop(msg):
    global flag
    flag = 0
    bot.send_message(msg.chat.id, "stopped")


bot.polling(none_stop=True)

Объяснение:

  • Объявлена ​​как глобальная переменная, и ей присвоено значение 1
  • "loop" обработчик для запуска цикла, который отправляет вам сообщение "ping" каждую секунду
  • обработчик остановки, который меняет flag к 0, который завершает ваш рабочий цикл
Другие вопросы по тегам