Помощь с telegram ботом на Python(telebot)
У меня есть два обработчика, первый вызывается с помощью команды /start
и в ней появляется сообщение с inline-кнопками, а второй обработчик нужен для того что бы обрабатывать callback
одной из кнопки в первом обработчике (при нажатие появляются inline-кнопки). И я хочу сделать так что бы при нажатие на кнопку в первом обработчике сообщение и кнопки там удалились и появилось сообщение второго обработчика с его кнопками.
ПРИМЕР
Я пишу /start и мне бот пишет сообщение:
выберите вариант:
кнопка1
кнопка2
Если я нажму на кнопку1 к примеру, тогда это сообщение должно удалиться и появится новое, которое должно выводиться при нажатие на кнопку1.
Если говорить коротко мне нужно сделать кнопку НАЗАД.
@bot.message_handler(commands=['start'])
def start(message):
keyboard = telebot.types.InlineKeyboardMarkup(row_width=1)
#КНОПКИ
profile = telebot.types.InlineKeyboardButton(text="? Профиль", callback_data="profile")
shop = telebot.types.InlineKeyboardButton(text="? Магазин", url="https://ru.stackoverflow.com/")
instructions = telebot.types.InlineKeyboardButton(text="? Инструкция", callback_data="instructions")
support = telebot.types.InlineKeyboardButton(text="?️ Техническая поддержка", url="https://ru.stackoverflow.com/")
aboutUs = telebot.types.InlineKeyboardButton(text="❗ О нас", url="https://ru.stackoverflow.com/")
keyboard.add(profile, shop, instructions, support, aboutUs)
bot.send_message(message.chat.id, Выберите операцию:', reply_markup=keyboard)
@bot.callback_query_handler(func=lambda call: True)
def callback_handler(call):
if call.data == "instructions":
profile_keyboard = telebot.types.InlineKeyboardMarkup(row_width=1)
#КНОПКИ ПРОФИЛЯ
get_token = telebot.types.InlineKeyboardButton("❓️ Как получить токен", callback_data="get_token")
video_inst = telebot.types.InlineKeyboardButton("❓️ Видео-инструкция", url="https://ru.stackoverflow.com/")
gonna_back = telebot.types.InlineKeyboardButton("⬅️ НАЗАД", url="https://ru.stackoverflow.com/")
profile_keyboard.add(get_token, video_inst, gonna_back)
bot.send_message(call.message.chat.id, "? Выберите вопрос:", reply_markup=profile_keyboard)
elif call.data == "get_token":
bot.send_message(call.message.chat.id, "<b>Для получение токен...</b> \n1)
Вот к примеру в первом обработчике я нажимаю на кнопку profile = telebot.types.InlineKeyboardButton(text="? Профиль", callback_data="profile")
и как сделать так что бы при ее нажатие сообщение обработчика в которой находится эта кнопка удалилась, появился обработчик другого сообщение?
Ответы (1 шт):
Накидал вам небольшой пример:
import telebot
from telebot import types
bot = telebot.TeleBot('TOKEN')
@bot.message_handler(commands=['start'])
def start(message):
send_start_message(message)
# Вынесем отправку стартового сообщения с кнопками в отдельную функцию для удобства
def send_start_message(message):
keyboard = types.InlineKeyboardMarkup(row_width=1)
profile_button = types.InlineKeyboardButton(text="? Профиль", callback_data="profile")
shop_button = types.InlineKeyboardButton(text="? Магазин", url="https://ru.stackoverflow.com/")
instructions_button = types.InlineKeyboardButton(text="? Инструкция", callback_data="instructions")
support_button = types.InlineKeyboardButton(text="?️ Техническая поддержка", url="https://ru.stackoverflow.com/")
about_button = types.InlineKeyboardButton(text="❗ О нас", url="https://ru.stackoverflow.com/")
keyboard.add(profile_button, shop_button, instructions_button, support_button, about_button)
bot.send_message(message.chat.id, 'Выберите операцию:', reply_markup=keyboard)
# Зачем принимать все калбэки и гарадить ифы? Обработаем каждый в своей функции.
@bot.callback_query_handler(func=lambda call: call.data == "instructions")
def instructions_callback(call):
bot.delete_message(call.message.chat.id, call.message.message_id) # Удаляем старое сообщение
send_instructions_message(call.message)
# Функция отправки сообщения с инструкциями и кнопкой "Назад"
def send_instructions_message(message):
keyboard = types.InlineKeyboardMarkup(row_width=1)
get_token_button = types.InlineKeyboardButton("❓️ Как получить токен", callback_data="get_token")
video_inst_button = types.InlineKeyboardButton("❓️ Видео-инструкция", url="https://ru.stackoverflow.com/")
back_button = types.InlineKeyboardButton("⬅️ НАЗАД", callback_data="back")
keyboard.add(get_token_button, video_inst_button, back_button)
bot.send_message(message.chat.id, "Выберите вопрос:", reply_markup=keyboard)
# Обработчик нажатия на кнопку "Назад"
@bot.callback_query_handler(func=lambda call: call.data == "back")
def back_callback(call):
bot.delete_message(call.message.chat.id, call.message.message_id) # Удаляем старое сообщение
send_start_message(call.message) # Отправляем стартовое сообщение как при старте
bot.polling()