@Jfr0s

В телеграм боте выполняются две функции одновременно. Что делать?

Пишу /start, выбираю сначала /random, там дальше выбираю рандомное число от до, мне выдало число, возвращаюсь назад, выбираю /coronavirus и мне выдается ошибка которая должна отображаться только когда я захожу в секцию /random. Пж попробуйте код и помогите мне как-то.

import telebot
from telebot import types
import COVID19Py
import random

covid19 = COVID19Py.COVID19()
bot = telebot.TeleBot('Токен вставте свой')


@bot.message_handler(commands=['start', 'back'])
def start(message):
    markup = types.ReplyKeyboardMarkup(resize_keyboard=True, row_width=2)
    but1 = types.KeyboardButton('/coronavirus')
    but2 = types.KeyboardButton('/random')
    markup.add(but1, but2)
    n = f"<b>Доброго дня {message.from_user.first_name}!</b>\nВиберіть що вам потрібно:"
    bot.send_message(message.chat.id, n, parse_mode='html',
                     reply_markup=markup)


@bot.message_handler(commands=['random'])
def random_start(message):
    markup = types.ReplyKeyboardMarkup(
        resize_keyboard=True, row_width=2)
    btn1 = types.KeyboardButton('Рандомне число від 1 до 2')
    btn2 = types.KeyboardButton('Рандомне число від 1 до 5')
    btn3 = types.KeyboardButton('Рандомне число від 1 до 10')
    btn4 = types.KeyboardButton('Рандомне число від 1 до 50')
    btn5 = types.KeyboardButton('Рандомне число від 1 до 100')
    btn6 = types.KeyboardButton('Рандомне число від 1 до 1000')
    btn7 = types.KeyboardButton('/back')
    markup.add(btn1, btn2, btn3, btn4, btn5, btn6, btn7)

    send_message = "Виберіть від якого до якого число ви хочете получити рандомне число:"
    bot.send_message(message.chat.id, send_message,
                     parse_mode='html', reply_markup=markup)


@bot.message_handler(content_types=['text'])
def run_nui(message):
    x = message.text
    finn = ""
    if x == 'Рандомне число від 1 до 2':
        finn = random.randint(1, 2)
    elif x == 'Рандомне число від 1 до 5':
        finn = random.randint(1, 5)
    elif x == 'Рандомне число від 1 до 10':
        finn = random.randint(1, 10)
    elif x == 'Рандомне число від 1 до 50':
        finn = random.randint(1, 50)
    elif x == 'Рандомне число від 1 до 100':
        finn = random.randint(1, 100)
    elif x == 'Рандомне число від 1 до 1000':
        finn = random.randint(1, 1000)
    else:
        bot.send_message(
            message.chat.id, "Будь ласка виберіть один із варіантів", parse_mode='html')

    bot.send_message(message.chat.id, finn, parse_mode='html')


@bot.message_handler(commands=['coronavirus'])
def covid_start(message):
    markup = types.ReplyKeyboardMarkup(
        resize_keyboard=True, row_width=2)
    btn1 = types.KeyboardButton('По всьому світу')
    btn2 = types.KeyboardButton('Україна')
    btn3 = types.KeyboardButton('Росія')
    btn4 = types.KeyboardButton('Білорусь')
    btn5 = types.KeyboardButton('/back')
    markup.add(btn1, btn2, btn3, btn4, btn5)

    send_message = "Щоб узнати дані про коронавірус напишіть назву країни: "
    bot.send_message(message.chat.id, send_message,
                     parse_mode='html', reply_markup=markup)


@bot.message_handler(content_types=['text'])
def covid_func(message):
    finl = ""
    getmes = message.text.strip().lower()
    if getmes == "сша":
        location = covid19.getLocationByCountryCode("US")
    elif getmes == "україна":
        location = covid19.getLocationByCountryCode("UA")
    elif getmes == "росія":
        location = covid19.getLocationByCountryCode("RU")
    elif getmes == "білорусь":
        location = covid19.getLocationByCountryCode("BY")
    elif getmes == "італія":
        location = covid19.getLocationByCountryCode("IT")
    elif getmes == "франція":
        location = covid19.getLocationByCountryCode("FR")
    elif getmes == "німеччина":
        location = covid19.getLocationByCountryCode("DE")
    elif getmes == "японія":
        location = covid19.getLocationByCountryCode("JP")
    elif getmes == "іспанія":
        location = covid19.getLocationByCountryCode("ES")
    elif getmes == "чехія":
        location = covid19.getLocationByCountryCode("CZ")
    elif getmes == "китай":
        location = covid19.getLocationByCountryCode("CN")
    elif getmes == "канада":
        location = covid19.getLocationByCountryCode("CA")
    elif getmes == "австрія":
        location = covid19.getLocationByCountryCode("AT")
    elif getmes == "польща":
        location = covid19.getLocationByCountryCode("PL")
    else:
        location = covid19.getLatest()
        finl = f"<u>Дані по світу:</u>\n<b>Хворі: </b>{location['confirmed']:,}\n<b>Смертей: </b>{location['deaths']:,}"

    if finl == "":
        finl = f"<u>Дані по країні:</u>\n<b>Останні дані:</b>\n<b>"f"Хворі: </b>{location[0]['latest']['confirmed']:,}\n<b>Смертей: </b>" f"{location[0]['latest']['deaths']:,}"

    bot.send_message(message.chat.id, finl, parse_mode='html')
  • Вопрос задан
  • 434 просмотра
Пригласить эксперта
Ответы на вопрос 1
@twistfire92
Python backend developer
Во-первых
Поменяйте местами описание функций

@bot.message_handler(content_types=['text'])
def run_nui(message):

и
@bot.message_handler(commands=['coronavirus'])
def covid_start(message):


Любая команда - это текст, поэтому @bot.message_handler(content_types=['text']) сработает на любой команде. А все хэндлеры перебираются сверху вниз, и выполнится первый, подходящий под условия. Так что если ввести команду /coronavirus, то до хэндлера @bot.message_handler(commands=['coronavirus']) не дойдет, т.к. выше есть @bot.message_handler(content_types=['text'])

Во-вторых:
Такого быть не должно
finn = ""
...
...
...
bot.send_message(message.chat.id, finn, parse_mode='html')

Бот не может отправить пустое сообщение, на это и ругается

Там и дальше много вопросов к коду и к логике работы, но, думаю, вы справитесь!

Удачи в дальнейшем! Не болейте!
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Похожие вопросы