Как сделать многоуровневое меню в телеграмм боте?
Всем привет! Не судите строго, я новичок в программировании. Возникла потребность в создании бота в телеграмме, который будет содержать в себе каталог. Структура: Категории(кнопки)=>Подкатегории(кнопки)=>Товары(кнопки)=> Описание товара и фото(текст и картинка). Но столкнулся с проблемой после подкатегорий не появляются кнопки товаров. Что я делаю не так?))) И ещё вопрос, я хочу, чтобы после выбора товара отправлялись описание и картинка, правильный ли я кода использую? Пример кода:
import telebot from telebot import types from requests import get bot=telebot.TeleBot('ТОКЕН') # выбираем категории @bot.message_handler(commands=['start', 'help']) def category(message): keyboard_category = types.ReplyKeyboardMarkup(resize_keyboard=True) key_1_1 = types.KeyboardButton('1_1') keyboard_category.add(key_1_1) bot.reply_to(message, "Привет! Я помогу подобрать товар!", reply_markup=keyboard_category) # выбираем подкатегории @bot.message_handler(content_types = ['text']) def subcategory(message): if message.text == "1_1": keyboard_subcategory = types.ReplyKeyboardMarkup(resize_keyboard=True) key_2_1 = types.KeyboardButton('2_1') keyboard_subcategory.add(2_1) bot.send_message(message, 'Выберите подкатегорию', reply_markup=keyboard_subcategory) # выбираем товар из подкатегории @bot.message_handler(content_types = ['text']) def tovar(message): if message.text == "2_1": keyboard_tovar = types.ReplyKeyboardMarkup(resize_keyboard=True) key_3_1 = types.KeyboardButton('3_1') keyboard_tovar.add(key_id1) bot.send_message(message, 'Выберите товар по названию и я пришлю вам подробности', reply_markup= keyboard_tovar) @bot.message_handler(content_types = ['text']) def abc(message): if message.text == "3_1" bot.send_message(message.chat.id, "Описание товара") bot.send_photo(message.chat.id, get("Ссылка на картинку").content) bot.polling()
Отслеживать
задан 15 ноя 2020 в 10:18
Артем Сыромятников Артем Сыромятников
1 1 1 серебряный знак 1 1 бронзовый знак
зачем вам куча хендлеров на обработку текста, если можно сделать всё в одном? первый будет if , последующие elif . а вообще посмотрите в сторону inline кнопокй
16 ноя 2020 в 6:10
1 ответ 1
Сортировка: Сброс на вариант по умолчанию
@bot.message_handler(commands=['start', 'help']) def category(message): keyboard_category = types.ReplyKeyboardMarkup(resize_keyboard=True) key_1_1 = types.KeyboardButton('1_1') keyboard_category.add(key_1_1) bot.reply_to(message, "Привет! Я помогу подобрать товар!", reply_markup=keyboard_category) @bot.message_handler(content_types=['text']) def subcategory(message): if message.text == "1_1": keyboard_subcategory = types.ReplyKeyboardMarkup(resize_keyboard=True) key_2_1 = types.KeyboardButton('2_1') keyboard_subcategory.add(key_2_1) # key_2_1 не использовалась bot.send_message(message.chat.id, 'Выберите подкатегорию', reply_markup=keyboard_subcategory) elif message.text == "2_1": keyboard_tovar = types.ReplyKeyboardMarkup(resize_keyboard=True) key_3_1 = types.KeyboardButton('3_1') keyboard_tovar.add(key_3_1) # key_3_1 не использовалась bot.send_message(message.chat.id, 'Выберите товар по названию и я пришлю вам подробности', reply_markup=keyboard_tovar) elif message.text == "3_1": # потеряли двоеточие bot.send_message(message.chat.id, "Описание товара") bot.send_photo(message.chat.id, 'https://cs13.pikabu.ru/images/big_size_comm/2020-06_3/159194100716237333.jpg') # просто укажите ссылку на картинку bot.polling()
и пример на inline кнопках:
def keyboard(where_call): kb = types.InlineKeyboardMarkup() if where_call == 'start': kb_1 = types.InlineKeyboardButton(text='1_1_inline', callback_data='1_1_inline') kb.add(kb_1) return kb elif where_call == 'subcategory': kb_2 = types.InlineKeyboardButton(text='2_1_inline', callback_data='2_1_inline') kb.add(kb_2) return kb elif where_call == 'product': kb_3 = types.InlineKeyboardButton(text='3_1_inline', callback_data='3_1_inline') kb.add(kb_3) return kb @bot.message_handler(commands=['start', 'help']) def category(message): bot.reply_to(message, "Привет! Я помогу подобрать товар!", reply_markup=keyboard('start')) @bot.callback_query_handler(func=lambda call: True) def callback_inline(call): if call.data == '1_1_inline': bot.edit_message_text(chat_id=call.message.chat.id, message_id=call.message.message_id, text='подкатегория', reply_markup=keyboard('subcategory')) elif call.data == '2_1_inline': bot.edit_message_text(chat_id=call.message.chat.id, message_id=call.message.message_id, text='товар', reply_markup=keyboard('product')) elif call.data == '3_1_inline': bot.edit_message_text(chat_id=call.message.chat.id, message_id=call.message.message_id, text='Описание товара') bot.send_photo(call.message.chat.id, 'https://cs13.pikabu.ru/images/big_size_comm/2020-06_3/159194100716237333.jpg')
Многоуровневое меню в Bot Telegram, как сделать кнопку назад на каждом уровне?
Хелп товарищи, не могу разобраться, перепробовал разные варианты из туториалов
Код ниже:
import telebot from telebot import types bot = telebot.TeleBot('ТОКЕН') @bot.message_handler(commands=['start']) def start(message): markup = types.ReplyKeyboardMarkup(resize_keyboard=True, row_width=1) item1 = types.KeyboardButton('меню') item2 = types.KeyboardButton('инфо') markup.add(item1, item2) bot.send_message(message.chat.id, 'Привет, !'.format(message.from_user), reply_markup=markup) @bot.message_handler(content_types=['text']) def bot_message(message): if message.chat.type == 'private': if message.text == 'меню': markup = types.ReplyKeyboardMarkup(resize_keyboard=True, row_width=1) item1 = types.KeyboardButton('раздел 1') item2 = types.KeyboardButton('раздел 1.2') back = types.KeyboardButton(' Назад') markup.add(item1, item2, back) bot.send_message(message.chat.id, 'меню', reply_markup=markup) elif message.text == 'раздел 1': markup = types.ReplyKeyboardMarkup(resize_keyboard=True, row_width=1) item1 = types.KeyboardButton('товар 1') item2 = types.KeyboardButton('товар 2') back = types.KeyboardButton(' Назад') markup.add(item1, item2, back) bot.send_message(message.chat.id, 'раздел 1', reply_markup=markup) elif message.text == ' Назад': markup = types.ReplyKeyboardMarkup(resize_keyboard=True, row_width=2) item1 = types.KeyboardButton('меню') item2 = types.KeyboardButton('инфо') markup.add(item1, item2) bot.send_message(message.chat.id, ' Назад', reply_markup=markup) bot.polling(none_stop = True)
- Вопрос задан более года назад
- 545 просмотров
4 комментария
Простой 4 комментария
Как сделать многоуровневое меню телеграм бота ( inline — callback) на python?
Как сделать, что бы при нажатии на кнопку — открывалось новое меню из нескольких кнопок, с возможностью вернутся к главному меню?
- Вопрос задан более трёх лет назад
- 19231 просмотр
Комментировать
Решения вопроса 0
Ответы на вопрос 2

SuckMyPython @SuckMyPython
matrix.polling(none_stop=True)
Надо добавить в bot.send_message необязательный параметр reply_markup=key (т.е. помимо отправления текста бот создаст меню), предварительно указав необходимую информацию.
Вот пример на скорую руку (изменение 3 кнопки):
@bot.message_handler(commands=["start"]) def inline(message): key = types.InlineKeyboardMarkup() but_1 = types.InlineKeyboardButton(text="NumberOne", callback_data="NumberOne") but_2 = types.InlineKeyboardButton(text="NumberTwo", callback_data="NumberTwo") but_3 = types.InlineKeyboardButton(text="NumberTree", callback_data="NumberTree") key.add(but_1, but_2, but_3) bot.send_message(message.chat.id, "ВЫБЕРИТЕ КНОПКУ", reply_markup=key) @bot.callback_query_handler(func=lambda c:True) def inline(c): if c.data == 'NumberOne': bot.send_message(c.message.chat.id, 'Это кнопка 1') if c.data == 'NumberTwo': bot.send_message(c.message.chat.id, 'Это кнопка 2') if c.data == 'NumberTree': key = types.InlineKeyboardMarkup() but_1 = types.InlineKeyboardButton(text="NumberOne", callback_data="NumberOne") but_2 = types.InlineKeyboardButton(text="NumberTwo", callback_data="NumberTwo") but_3 = types.InlineKeyboardButton(text="NumberTree", callback_data="NumberTree") key.add(but_1, but_2, but_3) bot.send_message(c.message.chat.id, 'Это кнопка 3', reply_markup=key)
Чат-боты в Telegram на Python. Часть 2. Создаём и настраиваем меню
Продолжаем писать чат-бота для Telegram — добавляем кнопки и интерактив.


Иллюстрация: Катя Павловская для Skillbox Media

Антон Яценко
Изучает Python, его библиотеки и занимается анализом данных. Любит путешествовать в горах.
В первой части урока по чат-ботам для Telegram мы создали на Python эхо-бота с помощью библиотеки aiogram. Сам эхо-бот работает просто, а его функция очевидна из названия: в ответ на сообщение пользователя он присылает тот же текст. Если вы ещё не читали первую часть, начните с неё.
Во второй части урока поработаем над меню: добавим для пользователей клавиатуру с быстрыми ответами и инлайн-кнопки для перехода на сайт Skillbox. Начнём с создания меню, но сначала разберёмся с видами возможных клавиатур.
Виды клавиатур
Библиотека aiogram позволяет создать на Python клавиатуры двух видов, отличающиеся друг от друга расположением кнопок:
- Reply-кнопки для шаблонных ответов, которые закрепляются вместо основной клавиатуры на экране. Часто используются в чат-ботах как меню. Создаются с помощью метода ReplyKeyboardMarkup.
- Инлайн-кнопки, связанные с сообщениями в чате. При этом пользователь видит и основную клавиатуру. Создаются с помощью метода InlineKeyboardMarkup.
Создание меню
Наш эхо-бот для Telegram сейчас позволяет только отправлять текстовые сообщения и получать их обратно. Давайте проапгрейдим его и добавим кнопки с готовыми сообщениями, которые не надо вводить самому. Это будут reply-кнопки.
Нам понадобится класс ReplyKeyboardMarkup — для начала импортируем его и дополнительные необходимые классы:

Если нажать на любую кнопку, текст кнопки отправится в чат, а Telegram-бот пришлёт в ответ эту же фразу:

Можно создавать сколько угодно шаблонов, а также связывать кнопку с новыми действиями. Попробуем это на примере инлайн-клавиатур.
Инлайн-кнопки на aiogram
Инлайн-кнопки отличаются от обычных тем, что связаны не с областью клавиатуры в мессенджере, а с каким-то сообщением в Telegram-чате. Самый простой пример инлайн-кнопки — это меню в канале @BotFather, с помощью которого мы создавали токен для доступа к API Telegram. Например, вот так в нём выглядит инлайн-меню с уже созданными ботами:

Создадим на Python для нашего бота инлайн-кнопки со ссылками на Skillbox Media и курсы по программированию. Для этого вернёмся к разделу с импортами в коде и добавим ещё одну строку, чтобы можно было использовать необходимые классы:

Всё получилось. Теперь инлайн-клавиатура появляется при отправке команды /ссылки в бот.
Заключение
В нашем эхо-боте для Telegram появилось два вида меню, написанных на Python: reply-кнопки для быстрых сообщений и инлайн-кнопки для перехода на блог и сайт Skillbox. Для создания сложных ботов — например, ботов онлайн-магазинов — можно самостоятельно изучить документацию к библиотеке aiogram: попробовать новые классы, методы и объекты.
Читайте также:
- С# для новичков: развеиваем мифы и пишем простого чат-бота
- Тест. Какой язык создадите вы — Java или Python?
- Что можно сделать на JavaScript и что нельзя