@FromProg

Как убрать вызов функции с отправлением сообщения ботом в Телеграме после остановки?

Код:
@my_bot.message_handler(content_types = ['text'])
def msg(message):

	def send_bitcon_rate():
		source = requests.get(url_bitcoin, headers = headers)
		html = BeautifulSoup(source.text, 'lxml')
		kbd = types.ReplyKeyboardMarkup(row_width = 1)
		value_stop = types.KeyboardButton('stop')
		kbd.add(value_stop)
		my_bot.send_message(message.chat.id, 'Курс Bitcoin: {0}'.format(html.find('span', {'class': 'pid-1057391-last', 'id': 'last_last'}).get_text()), reply_markup = kbd)

	while True:
		if message.text == 'Bitcoin':
			send_bitcon_rate()
		elif message.text == 'stop':
			pass

my_bot.polling(none_stop = True, interval = 0)

Я пишу: Bitcoin
Бот: Курс Bitcoin: 34.340,0
Бот: Курс Bitcoin: 34.367,3
Я пишу: stop
Бот пишет через секунд 20 снова Курс Bitcoin: 34.336,3

Как мне сделать так, чтобы после остановки бот не вызывал эту функцию?
Как если моё последнее stop, то как он доходит до if message.text == 'Bitcoin':?
  • Вопрос задан
  • 71 просмотр
Решения вопроса 1
@twistfire92
Python backend developer
А чего вы ждали от while True?
Ваше сообщение "stop" даже не начало обрабатываться. Вы уходите в бесконечный цикл после первого же сообщения.

По-хорошему для каких-либо рассылок вам необходим еще один скрипт. Который будет только отправлять сообщения по таймеру. там не будет bot.pooling.

А в вашем скрипте необходимо добавить взаимодействие с базой данных. Туда вы будете записывать статус каждого пользователя. Из обработчика сообщения убирайте while, теперь там будет только запись в БД.

В новом скрипте, который будет заниматься рассылкой можете вставить while с каким-то таймингом ожидания. Скрипт каждый раз будет проходить по БД, выбирать ID пользователей, кому требуется отправлять курс битка и рассылать.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
@Onigire
stopped  = False  
...
@bot.message_handler(commands=['stop'])
def stop(message):
    global stopped
    bot.send_message(message.chat.id, 'Рассылка прекращена')
    stopped = True

...

while True:
    if not stopped:
        if message.text.lower() == 'bitcoin':
            send_bitcon_rate()

По идее так должно работать
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы