Настройка телеграм бота
Когда нажимаю одну из кнопок и получаю ответ, дальнейшие нажатия кнопок ни к чему не приводят. Как это исправить?
import telebot
from telebot import types
bot = telebot.TeleBot('токен бота')
@bot.message_handler(commands=['start'])
def start(message):
markup = types.ReplyKeyboardMarkup()
btn1 = types.KeyboardButton('Абонименты')
markup.row(btn1)
btn2 = types.KeyboardButton('Запись')
btn3 = types.KeyboardButton('Акции')
btn4 = types.KeyboardButton('Правила')
btn5 = types.KeyboardButton('Адрес')
markup.row(btn2, btn3)
markup.row(btn4, btn5)
bot.send_message(message.chat.id, 'Здравствйте!', reply_markup=markup)
bot.register_next_step_handler(message, on_click)
def on_click(message):
if message.text == 'Абонименты':
bot.send_message(message.chat.id, 'Действующие абонименты:')
elif message.text == 'Запись':
bot.send_message(message.chat.id, 'запись')
elif message.text == 'Акции':
bot.send_message(message.chat.id, 'действующие акции:')
elif message.text == 'Правила':
bot.send_message(message.chat.id, 'правила')
elif message.text == 'Адрес':
bot.send_message(message.chat.id, 'адрес')
bot.polling(non_stop=True)
Ответы (3 шт):
Автор решения: Савельев Даниил
→ Ссылка
Для нормальной работы кнопок нужен callback, который мы обрабатываем
# Подобным образом
@bot.callback_query_handler(func=lambda call: True)
def callback(call):
Исправленный код
import telebot # этот импорт тоже нужен
from telebot import types
bot = telebot.TeleBot('токен бота')
@bot.message_handler(commands=['start'])
def start(message):
markup = types.InlineKeyboardMarkup(row_width=2) # две кнопки в ряд
button_season_tickets = types.InlineKeyboardButton('Действующие абонементы', callback_data='Действующие абонементы')
# при нажатии кнопки получаем нужный call
button_registration = types.InlineKeyboardButton('Запись', callback_data='Запись')
button_promotion = types.InlineKeyboardButton('Акции', callback_data='Акции')
button_rules = types.InlineKeyboardButton('Правила', callback_data='Правила')
button_address = types.InlineKeyboardButton('Адрес', callback_data='Адрес')
markup.add(button_season_tickets, button_registration, button_promotion, button_rules, button_address)
bot.send_message(message.chat.id, 'Здравствйте!', reply_markup=markup)
@bot.callback_query_handler(func=lambda call: True) # эта функция нужна для работы call
def callback(call):
if call.message: # проверяем был ли call с кнопки
if call.data == 'Действующие абонементы': # ищем что нужно сделать в ответ на наш call
bot.send_message(call.message.chat.id, 'Действующие абонементы')
season_tickets(call) # запускаем заготовленный callback_query_handler
elif call.data == 'Запись':
bot.send_message(call.message.chat.id, 'Запись')
elif call.data == 'Акции':
bot.send_message(call.message.chat.id, 'Акции')
elif call.data == 'Правила':
bot.send_message(call.message.chat.id, 'Правила')
elif call.data == 'Адрес':
bot.send_message(call.message.chat.id, 'Адрес')
@bot.callback_query_handler(func=lambda call: True)
def season_tickets(call):
bot.send_message(call.message.chat.id, 'Информация по абонементам')
bot.polling(non_stop=True)
Дополнительная информация есть в документации по pyTelegramBotAPI
Автор решения: Савельев Даниил
→ Ссылка
Для того чтобы были те кнопки, которые в примере то можно сделать так:
import telebot
from telebot import types
bot = telebot.TeleBot("Токен_Бота")
@bot.message_handler(commands=['start'])
def start(message):
markup = types.ReplyKeyboardMarkup(resize_keyboard=True)
btn1 = types.KeyboardButton('Абонименты')
btn2 = types.KeyboardButton('Запись')
btn3 = types.KeyboardButton('Акции')
btn4 = types.KeyboardButton('Правила')
btn5 = types.KeyboardButton('Адрес')
markup.row(btn1)
markup.row(btn2, btn3)
markup.row(btn4, btn5)
bot.send_message(message.chat.id, 'Здравствуйте!', reply_markup=markup)
@bot.message_handler(func=lambda message: True)
def on_click(message):
if message.text == 'Абонименты':
bot.send_message(message.chat.id, 'Действующие абонименты:')
elif message.text == 'Запись':
bot.send_message(message.chat.id, 'Запись:')
elif message.text == 'Акции':
bot.send_message(message.chat.id, 'Действующие акции:')
elif message.text == 'Правила':
bot.send_message(message.chat.id, 'Правила:')
elif message.text == 'Адрес':
bot.send_message(message.chat.id, 'Адрес:')
else:
bot.send_message(message.chat.id, 'Пожалуйста, выберите один из предложенных вариантов.')
bot.polling(non_stop=True)
Автор решения: TheDEKK
→ Ссылка
Я тоже сталкивался с такой проблемой. Решал ее тем, что просто добавлял в функцию с первым реагированием на кнопку:
if call.data == 'Первой имя лямбы функции':
bot.send_message(call.message.chat.id, text='Текст 1')
elif call.data == 'Имя лямбы функции':
bot.send_message(call.message.chat.id, text='Текст 2')