бот отвечает только на одну команду

Рейтинг: -1Ответов: 2Опубликовано: 05.04.2023

делаю бота в телеграмме. Я создаю две команды, чтобы бот отвечал на две команды, а он отвечает только на одну

@bot.message_handler(content_types=['text'])
def get_text_messages(message):
    if message.text == "как дела?":
        bot.send_message(message.chat.id, "отлично, а у вас как?")

@bot.message_handler(content_types=['text'])
def get_text_messages(message):
    if message.text == "что делаешь?":
        bot.send_message(message.chat.id, "кушаю, а ты?")

bot.infinity_polling()

Ответы

▲ 0

Похоже, вы создали две функции с одинаковым названием. Сравнивать message.text стоит через if/elif/else в одной функции:

def get_text_messages(message):
    if message.text == "как дела?":
        bot.send_message(message.chat.id, "отлично, а у вас как?")
    elif message.text == "что делаешь?":
        bot.send_message(message.chat.id, "кушаю, а ты?")
▲ 0

В Telebot по идее можно сделать фильтрацию несколькими способами. Например:

1. Через regexp

@bot.message_handler(regexp=r'как дела\?')
def how_are_you(message: types.Message):

    bot.send_message(
        message.from_user.id, 
        "отлично, а у вас как?",
    )

2. Через lambda-функции

@bot.message_handler(func=lambda message: message.text == 'что делаешь?')
def what_are_you_doing(message: types.Message):

    bot.send_message(
        message.from_user.id, 
        "кушаю, а ты?",
    )

Через классы-фильтры

Тут нам понадобится фильтр:

class Text(object):

    def __init__(self, text: str):

        self.text = text

    def __call__(self, message: types.Message) -> bool:

        return self.text == message.text

А дальше в сам хендлер мы сможем передать instance этого фильтра

@bot.message_handler(func=Text('Привет'))
def hello(message: types.Message):

    bot.send_message(
        message.from_user.id, 
        "И тебе привет!",
    )

Первые два способа описаны в документации, последний способ - то что пришло в голову) P.S. Можно и через if-elif-else, но это меня бесит, так что я бы так не делал)