Невозможно выйти из цикла при запуске бота 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):
- Почему вы создали свою функцию
send_msg
где уже естьsend_message
метод вtelebot
существуют? - Вы повторно объявляете обработчик остановки в цикле, что неверно!
Я предлагаю вам научиться пользоваться
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
, который завершает ваш рабочий цикл