бот отвечает только на одну команду
делаю бота в телеграмме. Я создаю две команды, чтобы бот отвечал на две команды, а он отвечает только на одну
@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()
Ответы (2 шт):
Автор решения: IronGoose1758
→ Ссылка
Похоже, вы создали две функции с одинаковым названием. Сравнивать 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, "кушаю, а ты?")
Автор решения: biflé
→ Ссылка
В 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, но это меня бесит, так что я бы так не делал)