Содержание
Установка библиотеки Telebot
Перед началом разработки необходимо убедиться, что у вас установлен Python и менеджер пакетов pip. Следующий шаг — установка библиотеки Telebot.
Проверка установки библиотеки
Чтобы проверить, успешно ли установлена библиотека, запустите Python интерпретатор и импортируйте Telebot:
Создание простого Telegram-бота
Прежде чем приступить к кодированию, необходимо зарегистрировать вашего бота в BotFather и получить токен для доступа.
Пример кода для создания простого бота
Этот код создает бота, который будет отвечать пользователям на команду /start.
Создание кнопок с помощью Telebot
Кнопки позволяют сделать взаимодействие с ботом более интерактивным. В Telebot существует два основных класса для работы с кнопками: InlineKeyboardButton и InlineKeyboardMarkup.
Пример кода для создания кнопок
Этот код добавляет две кнопки в сообщение, которое отправляется пользователю.
Кнопки Reply Keyboard.
Теперь давайте сделаем так, что как только мы будем запускать бота у нас сразу же будет появляться, как в BotFather.Для создания таких кнопок мы будем использовать точно такую же структуру, как мы это делали для встроенных кнопок. Тут будет отличаться только то, что вместо InlineKeyboardMarkup() мы будем использовать ReplyKeyboardMarkup(), а также для самих кнопок нам надо использовать класс KeyboardButton. Этот класс принимает просто название кнопки. Тут мы уже не можем указать url как делали это раньше, а также не можем указывать callback_data. Дизайн и добавление кнопок происходит также, как это делалось во встроенных кнопках.
После каждого урока вы можете заходить на моего telegram бота, чтобы посмотреть результат работы, после каждого урока:.
Также вы можете подписаться на telegram канала, где будут выкладываться все коды на python с моих уроков:.
Встроенные кнопки.
Ранее при получении команды /start мы отправляли текст пользователю «Приветствуем вас, {имя пользователя}, в нашем telegram боте».
Давайте же теперь будем при получении команды /start будем отправлять нашему пользователю тот же самый текст, но только уже с кнопками. Возьмем нашу программу, написанную в прошлом уроке(программа есть в telegram канале:) и добавим в нашу функцию, где мы обрабатывали команду /start, команды для появления кнопок.
Для начала создадим некий объект, который назовем, например, markup, далее нам надо обратиться к такому значению как types. Чтобы это значение корректно работало, его необходимо сначала подключить. Поэтому в самом вверху мы из библиотеки telebot импортируем types (from telebot import types). Далее мы будем создавать с вами встроенные кнопки, поэтому нас будет интересовать такой класс, на основе которого мы все это будем делать, как InlineKeyboardMarkup(). Далее мы обращаемся к нашему markup, к методу add и будем добавлять по одной новой кнопке.
Чтобы нам добавить некую новую кнопку, мы опять обращаемся к types, далее говорим какую кнопку мы будем создавать(нас интересует InlineKeyboardButton, т.е. встроенная кнопка). В качестве параметров мы должны указать текст для кнопки(у меня это будет ‘Перейти в telegram группу’) и также, если мы переходим по какой-либо ссылке, нам надо в качестве параметра указать url и здесь же мы указываем саму ссылку группу или сайт, который будет открываться при нажатии на данную кнопку(в моем случае будет открываться моя группа в telegram). Теперь давайте попробуем вывести нашу кнопку с сообщением. И тут в методе send_message мы передаем еще один параметр, который называется reply_markup и в качестве значения передаем наш объект markup. Теперь при запуске бота, когда мы введем команду /start, то наш бот выдаст нам текст, а также нашу встроенную кнопку, при нажатии на которую мы будем переходить в нашу telegram группу.
Давайте теперь добавим еще одну кнопку ‘help’, при нажатии на которую нам будет выдаваться текст, ранее написанный для команды /help.Кнопки будут добавляться точно также, только теперь у нас не будет url адреса, а вместо этого у нас будет такой параметр, как callback_data и тут я напишу ‘hlp’. Callback_data означает то, что при нажатии на данную кнопку будет вызываться некая функция, которая как раз и будет отвечать за действия этой кнопки, и куда мы будем передавать некоторые значения.Теперь же если мы запустим бота, то у нас появятся наши кнопки, но кнопка help пока работать не будет.
Также перед тем, как мы создадим функцию, для кнопки help, я вам покажу, как вы можете располагать наши кнопки. Сейчас же наши кнопки находятся друг под другом. Для чтобы поместить несколько кнопок в один ряд, нам надо вынести создание кнопок из самой функции add и создать отдельные объекты(в моем случае они будут называться bot1 и bot2), в которые мы в качестве значения будем прописывать создание кнопок. А далее вместо мы будем использовать другой метод под названием. И уже сюда мы будем добавлять наши объекты, в которых хранятся создание кнопок.
И теперь если мы оба объекта помести в метод, то наши кнопки будут находиться в одном ряду.
Давайте теперь напишем функцию, которая будет приводить в работу нашу кнопку help. Чтобы нам создать данную функцию мы должны прописать декоратор, который называется @bot.callback_query_handler()(это специальный декоратор для обработки параметров callback_data).Внутри декоратора мы пишем анонимную функцию, где мы говорим один неким параметр, в случае если он будет пустым, то возвращаем значение True.(func = lambda callback: True).Далее мы создаем функция, например, callback_message. Тут же мы будем принимать один некий параметр, который мы принимаем в декораторе(callback).Теперь мы обращаться с и будем получать то, что передается при нажатии на некую кнопку (в моем случае help). Например, в случае, если у нас пользователь нажимает на кнопку help, то у нас отправляется callback_data с такой информацией, как hlp. Здесь же мы перехватываем эту отправку и выполняем некие действия, в нашем случае это отправка сообщения пользователю. Прописываем bot.send_message с которым мы ознакомились в прошлых уроках. Теперь мы пишем параметр и также пишем наш текст, который хотим отправить. Теперь наша кнопка будет успешно работать!
Классы KeyboardButton и InlineKeyboardButton.
Данные классы определяют атрибуты и методы, одноименные с названиями аргументов.
KeyboardButton(text, request_contact=None, request_location=None, request_poll=None, **_kwargs):
Объект KeyboardButton представляет собой одну кнопку клавиатуры для ответа текстом text, который отображается на кнопке. Необязательные аргументы исключают друг друга. Импортируется из основного модуля.
- text (str) — текст кнопки. Если ни одно из дополнительных полей не используется, оно будет отправлено боту в виде сообщения при нажатии кнопки.
- request_contact (bool, необязательно) — если True, то при нажатии будет отправлен телефонный номер пользователя, как контакт. Доступно только в приватных чатах.
- request_location (bool, необязательный) — если True, то при нажатии будет отправлено текущее местоположение пользователя. Доступно только в приватных чатах.
- request_poll (KeyboardButtonPollType, необязательно) — если указано, то при нажатии кнопки пользователю будет предложено создать опрос и отправить его боту. Доступно только в приватных чатах.
- **_kwargs (dict) — произвольные ключевые аргументы.
InlineKeyboardButton(text, url=None, callback_data=None, switch_inline_query=None, switch_inline_query_current_chat=None, callback_game=None, pay=None, login_url=None, **_kwargs)
Объект InlineKeyboardButton представляет одну кнопку встроенной клавиатуры. Допускается использовать ровно одно из необязательных полей. Импортируется из основного модуля.
Создание встроенные клавиатуры для Telegram-бота
Внимание! Пакеты python-telegram-bot версии 13.x будут придерживаться многопоточной парадигмы программирования (*на данный момент актуальна версия 13.15). Пакеты версий 20.x и новее предоставляют чистый асинхронный Python интерфейс для Telegram Bot API. Дополнительно смотрите основные изменения в пакете python-telegram-bot версии 20.x.
Всякий раз, когда бот отправляет сообщение, он может передать специальную клавиатуру с предопределенными параметрами ответа. Приложения Telegram, которые получают сообщение, будут отображать эту клавиатуру для пользователя. Нажатие любой из кнопок немедленно отправит соответствующую команду. Таким образом можно значительно упростить взаимодействие пользователя с ботом.
Встроенные клавиатуры Telegramm в сообщения бота.
Бывают случаи, когда нужно что-либо сделать, не отправляя никаких сообщений в чат. Например, когда пользователь меняет настройки или просматривает результаты поиска. В таких случаях можно использовать встроенные InlineKeyboardButton клавиатуры, которые интегрированы непосредственно в сообщения, которым они принадлежат.
В отличие от настраиваемых клавиатур KeyboardButtons, которые посылают текст кнопки в качестве ответа, нажатие кнопок на встроенных клавиатурах InlineKeyboardButton не приводит к отправке сообщений в чат. Вместо этого встроенные клавиатуры поддерживают кнопки, которые работают за кулисами: кнопки обратного вызова, кнопки с URL и переключение на встроенные кнопки.
Когда используются кнопки обратного вызова (с аргументом callback_data), бот может обновлять свои существующие сообщения или клавиатуры. При нажатии на такую кнопку, бот просто получает соответствующий запрос. Получив запрос, бот может отображать результат в уведомлении в верхней части экрана чата или в предупреждении.
Алгоритм построения и отправки кнопок в Telegram чат.
Для создания макета кнопок со столбцами n_cols из списка кнопок необходимо создать функцию build_menu(), которая будет шаблоном для построения кнопок:
def build_menu(buttons, n_cols, header_buttons=None, footer_buttons=None): menu = [buttons[i:i + n_cols] for i in range(0, len(buttons), n_cols)] if header_buttons: (0, [header_buttons]) if footer_buttons: ([footer_buttons]) return menu
В коде выше определены списки header_buttons и footer_buttons, их можно использовать чтобы поместить кнопки в первую или последнюю строку соответственно.
В приведенном ниже фрагменте кода нужно заменить… соответствующим значением аргумента callback_data — это строка (UTF-8 1-64 байта) с данными, отправляемые боту в ответном запросе при нажатии кнопки. Если будете использовать кнопки KeyboardButtons для создания списка кнопок button_list, то для построения передаваемой в чат клавиатуры из кнопок используйте ReplyKeyboardMarkup вместо InlineKeyboardMarkup.
# список кнопок button_list = [InlineKeyboardButton(«col1», callback_data=…), InlineKeyboardButton(«col2», callback_data=…), InlineKeyboardButton(«row 2″, callback_data=…)] # сборка клавиатуры из кнопок `InlineKeyboardButton` reply_markup = InlineKeyboardMarkup(build_menu(button_list, n_cols=2)) # отправка клавиатуры в чат для ВЕРСИИ 13.x bot.send_message(chat_id=chat_id, text=»Меню из двух столбцов», reply_markup=reply_markup) # или # отправка клавиатуры в чат для ВЕРСИИ 20.x # await bot.send_message(chat_id=chat_id, text=»Меню из двух столбцов», reply_markup=reply_markup)
Или, если нужна динамическая версия, используйте генератор списка для динамического создания button_list из списка строк:
# построение простых кнопок для ответа # текстом, расположенным на кнопках some_strings = [«col1», «col2», «row2″] button_list = [[KeyboardButton(ss)] for ss in some_strings] # сборка клавиатуры из кнопок `KeyboardButton` reply_markup = ReplyKeyboardMarkup(build_menu(button_list, n_cols=2)) # отправка клавиатуры в чат для ВЕРСИИ 13.x bot.send_message(chat_id=chat_id, text=»Меню из двух столбцов», reply_markup=reply_markup) # или # отправка клавиатуры в чат для ВЕРСИИ 20.x # await bot.send_message(chat_id=chat_id, text=»Меню из двух столбцов», reply_markup=reply_markup)
Это особенно полезно, если поместить внутрь вспомогательного метода, такого как get_data_buttons, для работы с динамическими данными и обновления меню в соответствии с вводом пользователя.
Чтобы обработать callback_data, необходимо подключить обработчик CallbackQueryHandler.
CallbackQueryHandler(callback, pattern=None, block=True):
Объект CallbackQueryHandler представляет собой обработчик запросов обратного вызова Telegram. Может использовать дополнительную фильтрацию на основе регулярных выражений модуля re.
- callback — Функция обратного вызова для этого обработчика. Будет вызываться, когда сообщение должно быть обработано этим обработчиком.
- pattern=None (str, необязательно) — шаблон регулярного выражения. Если не None, то для поиска совпадений в (должно ли сообщение обрабатываться этим обработчиком) будет использоваться функция ().
- run_async=False (bool) — (удален в версии 20.x) определяет, будет ли обратный вызов выполняться асинхронно.
- block=True (bool) — (новое в версии 20.x) определяет, следует ли ожидать возвращаемого значения обратного вызова перед обработкой следующего обработчика в.process_update().
Базовый пример, использующий встроенную клавиатуру.
Примечание Этот пример будет работать в версии пакета 13.x. Для асинхронной версии пакета 20.x необходимые изменения прокомментированы в коде.
import logging from telegram import InlineKeyboardButton, InlineKeyboardMarkup, Update from import Updater, CommandHandler, CallbackQueryHandler (format=’%(asctime)s — %(name)s — %(levelname)s — %(message)s’, level=) logger = (__name__) def start(update, _): keyboard = [[InlineKeyboardButton(«Option 1», callback_data=’1′), InlineKeyboardButton(«Option 2», callback_data=’2′),], [InlineKeyboardButton(«Option 3″, callback_data=’3′)],] reply_markup = InlineKeyboardMarkup(keyboard) # для версии 13.x.reply_text(‘Пожалуйста, выберите:’, reply_markup=reply_markup) # для версии 20.x необходимо использовать оператор await # await.reply_text(‘Пожалуйста, выберите:’, reply_markup=reply_markup) def button(update, _): query = update.callback_query variant = # `CallbackQueries` требует ответа, даже если # уведомление для пользователя не требуется, в противном # случае у некоторых клиентов могут возникнуть проблемы. # смотри. () # для версии 20.x необходимо использовать оператор await # await () # редактируем сообщение, тем самым кнопки # в чате заменятся на этот ответ. query.edit_message_text(text=f»Выбранный вариант: {variant}») # для версии 20.x необходимо использовать оператор await # await query.edit_message_text(text=f»Выбранный вариант: {variant}») def help_command(update, _):.reply_text(«Используйте `/start` для тестирования.») # для версии 20.x необходимо использовать оператор await # await.reply_text(«Используйте `/start` для тестирования.») if __name__ == ‘__main__’: # в версии 13.x создаются 2 объекта: # `updater` и диспетчер `app` updater = Updater(«TOKEN») app = # для версии 20.x необходимо создать только 1 объект # приложение через `()` # app = ().token(«TOKEN»).build() app.add_handler(CommandHandler(‘start’, start)) app.add_handler(CallbackQueryHandler(button)) app.add_handler(CommandHandler(‘help’, help_command)) # Запуск бота в версии 13.x происходит # через объект `updater` updater.start_polling() () # Запуск бота в версии 20.x # app.run_polling()
Пример встроенной клавиатуры с 2-мя состояниями для версии 13.x.
Данный пример снабжен комментариями, так что понять как и что работает не составит труда. Он так же демонстрирует использование обработчиков CallbackQueryHandler и ConversationHandler.
import logging from telegram import InlineKeyboardButton, InlineKeyboardMarkup, Update from import (Updater, CommandHandler, CallbackQueryHandler, ConversationHandler,) # Ведение журнала логов (format=’%(asctime)s — %(name)s — %(levelname)s — %(message)s’, level=) logger = (__name__) # Этапы/состояния разговора FIRST, SECOND = range(2) # Данные обратного вызова ONE, TWO, THREE, FOUR = range(4) def start(update, _): «»»Вызывается по команде `/start`.»»» # Получаем пользователя, который запустил команду `/start` user =.from_user («Пользователь %s начал разговор», user.first_name) # Создаем `InlineKeyboard`, где каждая кнопка имеет # отображаемый текст и строку `callback_data` # Клавиатура — это список строк кнопок, где каждая строка, # в свою очередь, является списком `[[…]]` keyboard = [[InlineKeyboardButton(«1», callback_data=str(ONE)), InlineKeyboardButton(«2″, callback_data=str(TWO)),]] reply_markup = InlineKeyboardMarkup(keyboard) # Отправляем сообщение с текстом и добавленной клавиатурой `reply_markup`.reply_text(text=»Запустите обработчик, выберите маршрут», reply_markup=reply_markup) # Сообщаем `ConversationHandler`, что сейчас состояние `FIRST` return FIRST def start_over(update, _): «»»Тот же текст и клавиатура, что и при `/start`, но не как новое сообщение»»» # Получаем `CallbackQuery` из обновления `update` query = update.callback_query # На запросы обратного вызова необходимо ответить, # даже если уведомление для пользователя не требуется. # В противном случае у некоторых клиентов могут возникнуть проблемы. () keyboard = [[InlineKeyboardButton(«1», callback_data=str(ONE)), InlineKeyboardButton(«2″, callback_data=str(TWO)),]] reply_markup = InlineKeyboardMarkup(keyboard) # Отредактируем сообщение, вызвавшее обратный вызов. # Это создает ощущение интерактивного меню. query.edit_message_text(text=»Выберите маршрут», reply_markup=reply_markup) # Сообщаем `ConversationHandler`, что сейчас находимся в состоянии `FIRST` return FIRST def one(update, _): «»»Показ нового выбора кнопок»»» query = update.callback_query () keyboard = [[InlineKeyboardButton(«3», callback_data=str(THREE)), InlineKeyboardButton(«4″, callback_data=str(FOUR)),]] reply_markup = InlineKeyboardMarkup(keyboard) query.edit_message_text(text=»Вызов `CallbackQueryHandler`, выберите маршрут», reply_markup=reply_markup) return FIRST def two(update, _): «»»Показ нового выбора кнопок»»» query = update.callback_query () keyboard = [[InlineKeyboardButton(«1», callback_data=str(ONE)), InlineKeyboardButton(«3″, callback_data=str(THREE)),]] reply_markup = InlineKeyboardMarkup(keyboard) query.edit_message_text(text=»Второй CallbackQueryHandler», reply_markup=reply_markup) return FIRST def three(update, _): «»»Показ выбора кнопок»»» query = update.callback_query () keyboard = [[InlineKeyboardButton(«Да, сделаем это снова!», callback_data=str(ONE)), InlineKeyboardButton(«Нет, с меня хватит…», callback_data=str(TWO)),]] reply_markup = InlineKeyboardMarkup(keyboard) query.edit_message_text(text=»Третий CallbackQueryHandler. Начать сначала?», reply_markup=reply_markup) # Переход в состояние разговора `SECOND` return SECOND def four(update, _): «»»Показ выбора кнопок»»» query = update.callback_query () keyboard = [[InlineKeyboardButton(«2», callback_data=str(TWO)), InlineKeyboardButton(«4″, callback_data=str(FOUR)),]] reply_markup = InlineKeyboardMarkup(keyboard) query.edit_message_text(text=»Четвертый CallbackQueryHandler, выберите маршрут», reply_markup=reply_markup) return FIRST def end(update, _): «»»Возвращает «, который говорит `ConversationHandler` что разговор окончен»»» query = update.callback_query () query.edit_message_text(text=»See you next time!») return if __name__ == ‘__main__’: updater = Updater(«TOKEN») dispatcher = # Настройка обработчика разговоров с состояниями `FIRST` и `SECOND` # Используем параметр `pattern` для передачи `CallbackQueries` с # определенным шаблоном данных соответствующим обработчикам # ^ — означает «начало строки» # $ — означает «конец строки» # Таким образом, паттерн `^ABC$` будет ловить только ‘ABC’ conv_handler = ConversationHandler(entry_points=[CommandHandler(‘start’, start)], states={ # словарь состояний разговора, возвращаемых callback функциями FIRST: [CallbackQueryHandler(one, pattern=’^’ + str(ONE) + ‘$’), CallbackQueryHandler(two, pattern=’^’ + str(TWO) + ‘$’), CallbackQueryHandler(three, pattern=’^’ + str(THREE) + ‘$’), CallbackQueryHandler(four, pattern=’^’ + str(FOUR) + ‘$’),], SECOND: [CallbackQueryHandler(start_over, pattern=’^’ + str(ONE) + ‘$’), CallbackQueryHandler(end, pattern=’^’ + str(TWO) + ‘$’),], }, fallbacks=[CommandHandler(‘start’, start)],) # Добавляем `ConversationHandler` в диспетчер, который # будет использоваться для обработки обновлений dispatcher.add_handler(conv_handler) updater.start_polling() ()
Пример встроенной клавиатуры с 2-мя состояниями для версии 20.x.
from telegram import ReplyKeyboardMarkup, ReplyKeyboardRemove, Update from import (Application, CommandHandler, ContextTypes, ConversationHandler, MessageHandler, filters,) (format=»%(asctime)s — %(name)s — %(levelname)s — %(message)s», level=) logger = (__name__) CHOOSING, TYPING_REPLY, TYPING_CHOICE = range(3) reply_keyboard = [[«Age», «Favourite colour»], [«Number of siblings», «Something else…»], [«Done»],] markup = ReplyKeyboardMarkup(reply_keyboard, one_time_keyboard=True) def facts_to_str(user_data: Dict[str, str]) -> str: «»»Вспомогательная функция для форматирования собранной информации о пользователе.»»» facts = [f»{key} — {value}» for key, value in user_data.items()] return «\n».join(facts).join([«\n», «\n»]) async def start(update: Update, context: ContextTypes.DEFAULT_TYPE) -> int: «»»Начvало разговора, просьба ввести данные.»»» await.reply_text(«Hi! My name is Doctor Botter. I will hold a more complex conversation with you. » «Why don’t you tell me something about yourself?», reply_markup=markup,) return CHOOSING async def regular_choice(update: Update, context: ContextTypes.DEFAULT_TYPE) -> int: «»»Запрос информации о выбранном предопределенном выборе.»»» text = context.user_data[«choice»] = text await.reply_text(f»Your {()}? Yes, I would love to hear about that!») return TYPING_REPLY async def custom_choice(update: Update, context: ContextTypes.DEFAULT_TYPE) -> int: «»»Запрос описания пользовательской категории.»»» await.reply_text(‘Alright, please send me the category first, for example «Most impressive skill»‘) return TYPING_CHOICE async def received_information(update: Update, context: ContextTypes.DEFAULT_TYPE) -> int: «»»Store info provided by user and ask for the next category.»»» user_data = context.user_data text = category = user_data[«choice»] user_data[category] = text del user_data[«choice»] await.reply_text(«Neat! Just so you know, this is what you already told me:» f»{facts_to_str(user_data)}You can tell me more, or change your opinion» » on something.», reply_markup=markup,) return CHOOSING async def done(update: Update, context: ContextTypes.DEFAULT_TYPE) -> int: «»»Вывод собранной информации и завершение разговора.»»» user_data = context.user_data if «choice» in user_data: del user_data[«choice»] await.reply_text(f»I learned these facts about you: {facts_to_str(user_data)}Until next time!», reply_markup=ReplyKeyboardRemove(),) user_data.clear() return if __name__ == «__main__»: application = ().token(«TOKEN»).build() conv_handler = ConversationHandler(entry_points=[CommandHandler(«start», start)], states={ CHOOSING: [MessageHandler((«^(Age|Favourite colour|Number of siblings)$»), regular_choice), MessageHandler((«^Something else…$»), custom_choice),], TYPING_CHOICE: [MessageHandler(& ~(| («^Done$»)), regular_choice)], TYPING_REPLY: [MessageHandler(& ~(| («^Done$»)), received_information,)], }, fallbacks=[MessageHandler((«^Done$»), done)],) application.add_handler(conv_handler) # Запуск бота. application.run_polling()
Как работает обработчик разговора ConversationHandler().
Основная магия происходит в обработчике разговора ConversationHandler(). Обработчик ConversationHandler() имеет три основные точки, которые необходимо определить для ведения беседы:
- entry_points — точка входа в разговор, представляет собой список обработчиков, которые запускают разговор. Разговор можно запустить по команде, отправленной пользователем (в данном случае /start) и/или по каким то фразам, которые можно поймать при помощи обработчика MessageHandler() и фильтра (например: (‘(поговорим|скучно)’), callback_func)],
- states — состояния разговора. Представляет собой словарь, в котором ключ, это этап разговора, который явно возвращает функция обратного вызова, при этом высылает или отвечает на сообщение или передает кнопки для выбора и т.д. Так вот, реакция/ответ пользователя на это сообщение/нажатие кнопки будет обрабатываться обработчиками, находящихся в списке значений этого ключа — этапа/состояния разговора.
- fallbacks — точка выхода из разговора. Разговор заканчивается, если функция обработчик сообщения явно возвращает return
Переключение между этапами разговора происходит при помощи функций обратного вызова, которые при обработке/анализе ответа пользователя будут возвращать нужный этап/состояние разговора.
conv_handler = ConversationHandler(# точка входа в разговор entry_points=[CommandHandler(‘start’, start)], # словарь состояний разговора, возвращаемых callback функциями states={ # Этап `FIRST` — т.е. функция обработчик какого то сообщения явно # вернула константу FIRST (return `FIRST`), а так же послала/ответила # на сообщение. Ответ пользователя на это сообщение будет # обрабатываться обработчиками определенными в этом списке FIRST: [CallbackQueryHandler(one, pattern=’^’ + str(ONE) + ‘$’), CallbackQueryHandler(two, pattern=’^’ + str(TWO) + ‘$’), CallbackQueryHandler(three, pattern=’^’ + str(THREE) + ‘$’), CallbackQueryHandler(four, pattern=’^’ + str(FOUR) + ‘$’),], # Этап `SECOND` — происходит то же самое, что и в описании этапа `FIRST` SECOND: [CallbackQueryHandler(start_over, pattern=’^’ + str(ONE) + ‘$’), CallbackQueryHandler(end, pattern=’^’ + str(TWO) + ‘$’),], }, # точка выхода из разговора fallbacks=[CommandHandler(‘start’, start)],)
Обработка нажатий кнопок
После создания кнопок нам нужно обработать действия, которые пользователь совершает при нажатии на эти кнопки.
Пример кода для обработки нажатий кнопок
Этот код позволяет боту отправлять разные сообщения в зависимости от того, на какую кнопку нажал пользователь.
Добавление дополнительных функций
Вы можете расширить функциональность вашего бота, добавив множество различных команд и кнопок. Рассмотрим пример добавления команды помощи.
Пример добавления команды помощи
Этот код добавляет команду /help, которая отправит пользователю подробные инструкции.
Ссылки на дополнительные ресурсы
Используйте эти ресурсы для углубления знаний и совершенствования ваших навыков разработки Telegram-ботов.
Часто задаваемые вопросы по добавлению кнопок в Telegram бота на Python
Вопрос: Какой тип кнопок лучше использовать для меню?
Ответ: Для постоянного меню используйте ReplyKeyboardMarkup, для контекстных действий — InlineKeyboardMarkup.
Вопрос: Как передать данные при нажатии на inline-кнопку?
Ответ: Используйте параметр callback_data в InlineKeyboardButton, затем обработайте его в CallbackQueryHandler.
Вопрос: Можно ли сделать кнопки в несколько рядов?
Ответ: Да, используйте метод row() или передавайте список списков кнопок в markup.
Вопрос: Как удалить кнопки после нажатия?
Ответ: Отредактируйте сообщение, передав новую клавиатуру или None в reply_markup.
Вопрос: В чем разница между telebot и python-telegram-bot?
Ответ: Telebot (pyTelegramBotAPI) проще, python-telegram-bot мощнее и имеет больше встроенных функций.
Вопрос: Как сделать кнопку с URL?
Ответ: Используйте InlineKeyboardButton с параметром url вместо callback_data.
Вопрос: Почему мои кнопки не отображаются?
Ответ: Проверьте, что вы передаете markup в параметр reply_markup при отправке сообщения.
Вопрос: Как обработать нажатие на Reply-кнопку?
Ответ: Используйте MessageHandler с фильтром text, который соответствует тексту кнопки.
Вопрос: Можно ли менять кнопки динамически?
Ответ: Да, редактируйте сообщение с помощью bot.edit_message_reply_markup.
Вопрос: Как ограничить количество кнопок на строку?
Ответ: Используйте параметр row_width в ReplyKeyboardMarkup или InlineKeyboardMarkup.























