Aiogram как удалить replykeyboardmarkup
Встала задача, чтобы при нажатии обычной кнопки передачи геопозиции бот отвечал сообщением с инлайн-кнопками, но при этом пропадала кнопка передачи геопозиции. В await message.answer я могу либо указывать инлайн-клавиатуру, либо удаление обычной клавиатуры:
Как я могу это объединить?
![]()
Вот Вам вариант решения, возможно он не самый оптимальный, но, все же, является действенным и полностью соответствует Вашему запросу.
Код выполняет следующий алгоритм: 1) Пользователь инициирует /start и получает обычную кнопку "Отправить геопозицию"; 2) Пользователь решается на это не самое безопасное действие и отправляет свою геопозицию; 3) Ваш добропорядочный бот оправляет пользователю сообщенние с его геопозицией (в этом тестовом примере); 4) К этому сообщению бот прикрепляет 2 инлайн кнопки; 5) В тоже время бот выполняет процедуру удаления обычной кнопки "Отправить геопозицию".
Aiogram как удалить replykeyboardmarkup
![]()
Всё ещё ищете ответ? Посмотрите другие вопросы с метками python telegram-bot или задайте свой вопрос.
Site design / logo © 2022 Stack Exchange Inc; user contributions licensed under cc by-sa. rev 2022.6.10.42345
Как удалить клавиатуру telegram bot python
Как скрыть клавиатуру telebot


Всё ещё ищете ответ? Посмотрите другие вопросы с метками python python-3.x telebot клавиатура или задайте свой вопрос.
- id — уникальный идентификатор пользователя в Telegram
- last_name — значение поля фамилия, может быть пустым
- first_name — значение поля имя, может быть пустым
- username — уникальное значение текстовый идентификатор, может быть пустым
- language_code — кодовое обозначение выбранного языка интерфейса приложения (en, ru . )
- is_bot — флаг, определяющий пользователя как бота, в случае с ботом равен 1, в случае с пользователем пустое значение
KeyboardButton
- text — текст который будет на отображен на кнопке, обязательный параметр, поддерживает текст и смайлики (эмодзи)
- request_contact — если параметр установлен в true, пользователь отправит в бот свой номер телефона на который зарегистрирован аккаунт
- request_location — если параметр установлен в true, пользователь отправит в бот свое текущее местоположение
- keyboard — массив кнопок (объекты KeyboardButton)
- resize_keyboard — если предать true, то клавиатура подгонится по высоте до возможного минимума.
- one_time_keyboard — возможность скрывать клавиатуру после ее использования
- selective — если надо показать клавиатуру только определенным пользователям
InlineKeyboardButton
- text — текст который будет на отображен на кнопке, обязательный параметр, поддерживает текст и смайлики (эмодзи)
- url — адрес на который будет направлен пользователь
- callback_data — строка 1-64 символа будет передан боту через объект CallbackQuery
- switch_inline_query — после нажатия будет предложен выбор чата где будет использован бот во встроенном режиме, пример @gif dog
- switch_inline_query_current_chat — после нажатия вставит команду для использования бота во встроенном режиме в текущем чате
- callback_game — описание игры, которая будет запущена при нажатии пользователем кнопки.
- pay — кнопка будет использована как кнопка оплаты

- action — действие, в нашем случае это vote
- type — тип кнопки: 1 — левая, 0 — правая
- count1 — текущее значение левой кнопки
- count2 — текущее состояние правой кнопки
- При получении команды /start — мы выводим приветственное слово и набор кнопок: Голосовать, Помощь.
- При получении команды Помощь, выводим простое текстовое сообщение.
- При получении команды Голосовать, выводим текстовое сообщение и набор встроенных кнопок с параметром callback_data.
- При получении не запланированного значения, выводим текстовое сообщение.
- И самое интересное это когда принимаем значение в начале которого стоит action , в нашем случае это vote. Мы формируем новую клавиатуру изменяем в ней текстовое значение, увеличиваем счетчик у нажатой кнопки и подставляем новую служебную информацию в параметрах callback_data.
-
— меняем клавиатуру у заданного сообщения — позволяет выводить уведомление о проделанной работе CallbackQuery, мы его используем, уведомляя пользователя что он удачно проголосовал.
Как сделать кнопки в боте Телеграм на Python?
То, что цепляется к низу экрана вашего устройства, будем называть обычными кнопками , а то, что цепляется непосредственно к сообщениям, назовём инлайн-кнопками. 

Как-то некрасиво.
Во-первых, хочется сделать кнопки поменьше, а во-вторых, расположить их горизонтально.
Почему вообще они такие большие? Дело в том, что по умолчанию «кнопочная» клавиатура должна занимать на смартфонах столько же места, сколько и обычная буквенная. Для уменьшения кнопок к объекту клавиатуры надо указать дополнительный параметр resize_keyboard=True.
Но как заменить вертикальные кнопки на горизонтальные? С точки зрения Bot API, клавиатура — это массив массивов
кнопок, а если говорить проще, массив строк.
Метод add() при каждом вызове создаёт новую строку (ряд) и принимает произвольное число аргументов по количеству желаемых кнопок в строке. Перепишем наш код, чтобы было красиво:
Обратите внимание на конструкцию *buttons. Здесь вам не C++ и звёздочка используется для распаковки списка. Подробнее об операторах * и ** можно прочитать ТУТ ![]()
Как удалить клавиатуру telegram bot python
В этой главе мы познакомимся с такой замечательной фичей Telegram-ботов как кнопки. Прежде всего, чтобы избежать путаницы, определимся с названиями. То, что цепляется к низу экрана вашего устройства, будем называть обычными кнопками, а то, что цепляется непосредственно к сообщениям, назовём инлайн-кнопками. Ещё раз картинкой:
Обычные кнопки¶
Кнопки как шаблоны¶
Этот вид кнопок появился вместе с Bot API в далёком 2015 году и представляет собой не что иное, как шаблоны сообщений (за исключением нескольких особых случаев, но о них позже). Принцип простой: что написано на кнопке, то и будет отправлено в текущий чат. Соответственно, чтобы обработать нажатие такой кнопки, бот должен распознавать входящие текстовые сообщения.
Напишем хэндлер, который будет при нажатии на команду /start отправлять сообщение с двумя кнопками:
Обратите внимание, что т.к. обычные кнопки суть шаблоны сообщений, то их можно создавать не только как объекты KeyboardButton , но и как обычные строки.
Что ж, запустим бота и обалдеем от громадных кнопок:
Как-то некрасиво. Во-первых, хочется сделать кнопки поменьше, а во-вторых, расположить их горизонтально.
Почему вообще они такие большие? Дело в том, что по умолчанию «кнопочная» клавиатура должна занимать на смартфонах столько же места, сколько и обычная буквенная. Для уменьшения кнопок к объекту клавиатуры надо указать дополнительный параметр resize_keyboard=True .
Но как заменить вертикальные кнопки на горизонтальные? С точки зрения Bot API, клавиатура — это массив массивов кнопок, а если говорить проще, массив строк. Метод add() при каждом вызове создаёт новую строку (ряд) и принимает произвольное число аргументов по количеству желаемых кнопок в строке. Перепишем наш код, чтобы было красиво:
Обратите внимание на конструкцию *buttons . Здесь вам не C++ и звёздочка используется для распаковки списка. Подробнее об операторах * и ** можно прочитать здесь.
Смотрим — действительно красиво:
Осталось научить бота реагировать на нажатие таких кнопок. Как уже было сказано выше, необходимо делать проверку на полное совпадение текста. Сделаем это двумя способами: через специальный фильтр Text и обычной лямбдой:
Чтобы удалить кнопки, необходимо отправить новое сообщение со специальной «удаляющей» клавиатурой типа ReplyKeyboardRemove . Например: await message.reply(«Отличный выбор!», reply_markup=types.ReplyKeyboardRemove())
У объекта обычной клавиатуры есть ещё две полезных опции: one_time_keyboard для скрытия кнопок после нажатия и selective для показа клавиатуры лишь некоторым участникам группы. Их использование остаётся для самостоятельного изучения.
Помимо стандартных опций, описанных выше, aiogram немного расширяет функциональность клавиатур параметром row_width . При его использовании, фреймворк автоматически разобьёт массив кнопок на строки по N элементов в каждой, где N — значение row_width , например, row_width=2 . Попробуйте!
Специальные обычные кнопки¶
По состоянию на конец ужасного 2020 года в Telegram существует три специальных вида обычных кнопок, не являющихся шаблонами: для отправки текущей геолокации, для отправки своего номера телефона и ярлык для создания опроса/викторины. Для первых двух типов достаточно установить булевый флаг, а для опросов и викторин нужно передать специальный тип KeyboardButtonPollType и, по желанию, указать тип создаваемого объекта.
Впрочем, проще один раз увидеть код:
Инлайн-кнопки¶
URL-кнопки и колбэки¶
В отличие от обычных кнопок, инлайновые цепляются не к низу экрана, а к сообщению, с которым были отправлены. В этой главе мы рассмотрим два типа таких кнопок: URL и Callback. Ещё один — Switch — будет рассмотрен в главе про инлайн-режим.
Login- и Pay-кнопки в книге рассматриваться не будут вообще. Если у кого-то есть желание помочь хотя бы с рабочим кодом для авторизации или оплаты, пожалуйста, создайте Pull Request на GitHub. Спасибо!
Самые простые инлайн-кнопки относятся к типу URL, т.е. «ссылка». Поддерживаются только протоколы HTTP(S) и tg://
А если хотите обе кнопки в ряд, то уберите row_width=1 (тогда будет использоваться значение по умолчанию 3).
С URL-кнопками больше обсуждать, по сути, нечего, поэтому перейдём к гвоздю сегодняшней программы — Callback-кнопкам. Это очень мощная штука, которую вы можете встретить практически везде. Кнопки-реакции у постов (лайки), меню у @BotFather и т.д. Суть в чём: у колбэк-кнопок есть специальное значение (data), по которому ваше приложение опознаёт, что нажато и что надо сделать. И выбор правильного data очень важен! Стоит также отметить, что, в отличие от обычных кнопок, нажатие на колбэк-кнопку позволяет сделать практически что угодно, от заказа пиццы до перезагрузки сервера.
Напишем хэндлер, который по команде /random будет отправлять сообщение с колбэк-кнопкой:
Но как же обработать нажатие? Если раньше мы использовали message_handler для обработки входящих сообщений, то теперь будем использовать callback_query_handler для обработки колбэков. Ориентироваться будем на «значение» кнопки, т.е. на её data:
Несмотря на то, что параметр кнопки callback_data , а значение data лежит в одноимённом поле data объекта CallbackQuery, собственный фильтр aiogram называется text .
Ой, а что это за часики? Оказывается, сервер Telegram ждёт от нас подтверждения о доставке колбэка, иначе в течение 30 секунд будет показывать специальную иконку. Чтобы скрыть часики, нужно вызвать метод answer() у колбэка (или использовать метод API answer_callback_query() ). В общем случае, в метод answer() можно ничего не передавать, но можно вызвать специальное окошко (всплывающее сверху или поверх экрана):
В функции send_random_value мы вызывали метод answer() не у message , а у call.message . Это связано с тем, что колбэк-хэндлеры работают не с сообщениями (тип Message), а с колбэками (тип CallbackQuery), у которого другие поля, и само сообщение — всего лишь его часть. Учтите также, что message — это сообщение, к которому была прицеплена кнопка (т.е. отправитель такого сообщения — сам бот). Если хотите узнать, кто нажал на кнопку, смотрите поле from (в вашем коде это будет call.from_user , т.к. слово from зарезервировано в Python)
Когда вызывать answer() ?
В общем случае, главное — просто не забыть сообщить Telegram о получении колбэк-запроса, но я рекомендую ставить вызов answer() в самом конце, и вот почему: если вдруг в процессе обработки колбэка случится какая-то ошибка и бот нарвётся на необработанное исключение, пользователь увидит неубирающиеся полминуты часики и поймёт, что что-то не так. В противном случае, часики исчезнут, а пользователь останется в неведении, выполнился его запрос успешно или нет.
Перейдём к примеру посложнее. Пусть пользователю предлагается сообщение с числом 0, а внизу три кнопки: +1, -1 и Подтвердить. Первыми двумя он может редактировать число, а последняя удаляет всю клавиатуру, фиксируя изменения. Хранить значения будем в памяти в словаре (про конечные автоматы поговорим как-нибудь в другой раз).
И, казалось бы, всё работает:
Но теперь представим, что ушлый пользователь сделал следующее: вызвал команду /numbers (значение 0), увеличил значение до 1, снова вызвал /numbers (значение сбросилось до 0) и отредактировал нажал кнопку «+1» на первом сообщении. Что произойдёт? Бот по-честному отправит запрос на редактирование текста со значением 1, но т.к. на том сообщении уже стоит цифра 1, то Bot API вернёт ошибку, что старый и новый тексты совпадают, а бот словит исключение: aiogram.utils.exceptions.MessageNotModified: Message is not modified: specified new message content and reply markup are exactly the same as a current content and reply markup of the message
С этой ошибкой вы, скорее всего, будете поначалу часто сталкиваться, пытаясь редактировать сообщения. Но, в действительности, решается проблема очень просто: мы проигнорируем исключение MessageNotModified . Из первой главы вы уже знаете о такой прекрасной штуке, как errors_handler , но в этот раз мы поступим чуть иначе и перепишем функцию update_num_text() следующим образом:
Если теперь вы попробуете повторить пример выше, то указанное исключение в этом блоке кода бот просто-напросто проигнорирует.
Фабрика колбэков¶
В aiogram существует т.н. фабрика колбэков. Вы создаёте объект CallbackData , указываете ему префикс и произвольное количество доп. аргументов, которые в дальнейшем указываете при создании колбэка для кнопки.
Например, рассмотрим следующий объект:
В примере выше в кнопку запишется callback_data , равный post:5:like , а хэндлер на префикс post будет выглядеть так:
В предыдущем примере с числами мы грамотно выбрали callback_data , поэтому смогли легко запихнуть все обработчики в один хэндлер. Но можно логически разнести обработку инкремента и декремента от обработки нажатия на кнопку «Подтвердить». Для этого в фильтре фабрики можно указать желаемые значения какого-либо параметра. Давайте перепишем наш пример с использоваанием фабрики:
На этом глава про кнопки окончена, но про некоторые других их виды мы поговорим в следующих главах.
telegram.ReplyKeyboardRemove¶
Upon receiving a message with this object, Telegram clients will remove the current custom keyboard and display the default letter-keyboard. By default, custom keyboards are displayed until a new keyboard is sent by a bot. An exception is made for one-time keyboards that are hidden immediately after the user presses a button (see telegram.ReplyKeyboardMarkup ).
True – Requests clients to remove the custom keyboard.
bool – Optional. Use this parameter if you want to remove the keyboard for specific users only.
A user votes in a poll, bot returns confirmation message in reply to the vote and removes the keyboard for that user, while still showing the keyboard with poll options to users who haven’t voted yet.
-
selective ( bool , optional) –
Use this parameter if you want to remove the keyboard for specific users only. Targets:
Как удалить клавиатуру?(Python telegram bot, keyboard_remove)
Когда получаете следующее сообщение, добавьте строку:
await message.answer("Клавиатура скрыта", reply_markup=types.ReplyKeyboardRemove())
Т.к. удалить кнопки так и не вышло, нашел другой подход:
отправляем запрос контакта.
После полученного номера, отправляем другую клавиатуру
а вот такую клавиатуру уже можно и удалить
Дизайн сайта / логотип © 2023 Stack Exchange Inc; пользовательские материалы лицензированы в соответствии с CC BY-SA . rev 2023.3.16.43319
Нажимая «Принять все файлы cookie» вы соглашаетесь, что Stack Exchange может хранить файлы cookie на вашем устройстве и раскрывать информацию в соответствии с нашей Политикой в отношении файлов cookie.
Привет. Как удалить Inline клавиатуру при нажати на Inline кнопку?
Удаляет только клавиатуру, но не сообщение. Можно ли и сообщение тоже удалить?
Похожие вопросы

народ а для бота с аудиторией 0-5000 какой примерно сервачок брать?

максимально глуппый вопрос наверное. но почему у мя бот на админку реагирует только со 2 раза? каждый раз а на другие сообщение с 1
Всем привет Вопрос, скорее к самому Telegram bot api, но вдруг кто знает Столкнулся со следующим Средствами бота отправляю сообщение в канал await bot.send_photo( c.
а ещё что думаешь?
Вечер добрый, aiogram совместим с schedule?
здравствуйте. Подскажите пожалуйста , как эта реализовать ? Вот эта Меню синяя кнопка.
Можно ли спарсить всех подписчиков канала с помощью бота?
вопрос про прокидывание sqlalchemy сессий через мидлвари. Считаю что это не правильно. Для хайлоад проекта такой вариант не особо проходит, может есть у кого какие то другие и.
Ребят, написал бота. Запустил на сервак. Происходит постоянный рост потребления оперативной памяти. С некоторым интервалом. И причина не в пользователях, которые нагружают бот.
Как удалить клавиатуру telegram bot python
Привет. Как удалить Inline клавиатуру при нажати на Inline кнопку?
Удаляет только клавиатуру, но не сообщение. Можно ли и сообщение тоже удалить?
Похожие вопросы

народ а для бота с аудиторией 0-5000 какой примерно сервачок брать?

максимально глуппый вопрос наверное. но почему у мя бот на админку реагирует только со 2 раза? каждый раз а на другие сообщение с 1
Всем привет Вопрос, скорее к самому Telegram bot api, но вдруг кто знает Столкнулся со следующим Средствами бота отправляю сообщение в канал await bot.send_photo( c.
а ещё что думаешь?
Вечер добрый, aiogram совместим с schedule?
здравствуйте. Подскажите пожалуйста , как эта реализовать ? Вот эта Меню синяя кнопка.
Можно ли спарсить всех подписчиков канала с помощью бота?
вопрос про прокидывание sqlalchemy сессий через мидлвари. Считаю что это не правильно. Для хайлоад проекта такой вариант не особо проходит, может есть у кого какие то другие и.
Ребят, написал бота. Запустил на сервак. Происходит постоянный рост потребления оперативной памяти. С некоторым интервалом. И причина не в пользователях, которые нагружают бот.
Блог дяди Freemanа
Telegram bot (library pyTelegramBotAPI) / Бот Телеграма (библиотека pyTelegramBotAPI)
Для домашних нужд решил я завести себе бота Telegram, дабы получать оповещения и статусы от домашних устройств и автоматики. Сделать все это я решил на Python, поскольку не хотел слишком углубляться в детали, уровня абстракции этого языка вполне достаточно для этой работы.
Итак, для начала Вам нужно себе бота завести. Писать мануал тут будет излишним, их в интернете полно. Приведу тут ссылку на официальный мануал Телеграма по ботам. Получили token бота? Теперь читаем дальше.
1. Подготовка окружения
Как уже сказал выше, для работы бота я использовал готовую библиотеку pyTelegramBotAPI, а значит нам потребуется python, я писал на версии 3.6 под систему ubuntu 18.04 LTS. Все, что надо установить при такой конфигурации это сам python3, pip3 и, конечно, библиотеку.
Теперь все готово для того, чтобы кодить самого бота.
2. Код бота
Самое главное в коде это обработчики событий, то есть обработка того контента, который будет получать бот в ходе своей работы.
Так как бота мы уже создали, у нас есть токен авторизации.
Важное примечание. Запуская бота, имейте ввиду, что есть определенные нюансы, например, вдруг если он упадет, но сообщения боту будут продолжать поступать от пользователей, они накопятся в серверах Телеграма в течении 24 часов и при выходе бота в сеть, прилетят все разом. Поэтому эту ситуацию в коде не забудьте продумать. Слить все сообщения или обработать, Вам решать.
Итак, начало файла telebot_handler.py выглядит так:
Тут я указываю, что использую кодировку utf8 — всегда так делаю в python скриптах, а также ссылаюсь на библиотеку telebot и модуль из нее же, там хранятся типы нужных объектов для бота.
Это инициализация объекта бота как потомка от типа TeleBot, с указанием токена Вашего бота. после этого этим объектом можно манипулировать, отсылать и принимать сообщения.
2.1 Обработчики событий
Мы перешли к самой сути — обработке команд. Можно обрабатывать так называемые специализированные типы данных в Телеграме — команды, это строки с символом / в начале, также можно и обрабатывать простые сообщения, написать, к примеру чат-бота. Ну тут на Вашу фантазию так сказать.
Ниже пример, как обрабатывать команду /start , которая, к слову, обязательна по соглашению политики ботов Телеграма:
Вот так вроде бы нехитро, благодаря высокоуровневой обертке из библиотеки. Понятно, что тут можно написать все что угодно, нет каких-то стандартов, какой должен быть ответ на эту команду. Предполагается, что с нее начинается Ваш чат с ботом.
Теперь, если в голове все хорошо улеглось, можно попробовать написать обработчик для текстовых сообщений. Тоже внешне очень просто:
2.2 Плюшечки
Очень удобны на мой взгляд так называемые в жаргоне Телеграма «клавиатуры», которые позволяют избавить пользователей от необходимости знать команды Вашего бота, а просто дают на выбор кнопочки с вариантами. Это упрощает общение с ботом, а также очень его ускоряет. Поэтому, пользуемся:
Это мы подготовили клавиатуру для главного меню, теперь мы это прикрутим к нашему первому общению с ботом, то бишь к команде /start :
Это мы просто добавили reply_markup параметр, который и содержит объект клавиатуры. Кстати, если после очередного сообщения надо удалить клавиатуру, (которая может кстати выставлять флаг, и исчезать после выбора пользователя самостоятельно), то вместо объкта клавиатуры надо отправить объект пустой клавиатуры, а именно:
Теперь после отправки пользователю
клавиатура будет удалена.
3. Последние штрихи
Ну, а у нам же задача, чтобы бот не только после запуска обработал все доступные ему сообщения и помер, а жил и служил, поэтому мы ему включим поллинг, чтобы процесс не завершался пока мы не позволим, либо он не отвалится из-за нашего кривого кода
Это позволит закрыть наш вопрос.
4. Как его запускать то. :))
Да, если вдруг кому то python в новинку, то запускать наш скрипт надо так:
Да, и не забудьте выставить права на запуск Вашему скрипту,
Тут важное примечание. НЕЛЬЗЯ называть файл .py со скриптом именем, используемым в вызове библиотек, а именно тут, после слов import:
поскольку python тогда будет линковать сам файл рекурсивно, а не библиотеку, такая вот вещь.
После запуска таким образом, поскольку жизнь скрипта будет условно вечной, он не вернет вам консоль, пока вы его принудительно не убьете, CTRL+С, это удобно лишь на этапе разработки бота.
5. Ладно, расскажу, как запустить его по человечески.
При условии, что у Вас стоит debian-like система под этим ботом, у меня к слову это lxc контейнер, о которых я еще напишу позже, то ниже я опишу способ сделать из Вашего бота демона), то есть службу, которая будет стартовать при запуске системы автоматически и не занимать консоль.
Я для этого задействовал возможности systemd, достаточно создать файл в директории /lib/systemd/system
Чат-боты в Telegram на Python. Часть 2. Создаём и настраиваем меню
Продолжаем писать чат-бота для Telegram — добавляем кнопки и интерактив.


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

В первой части урока по чат-ботам для Telegram мы создали на Python эхо-бота с помощью библиотеки aiogram. Сам эхо-бот работает просто, а его функция очевидна из названия: в ответ на сообщение пользователя он присылает тот же текст. Если вы ещё не читали первую часть, начните с неё.
Во второй части урока поработаем над меню: добавим для пользователей клавиатуру с быстрыми ответами и инлайн-кнопки для перехода на сайт Skillbox. Начнём с создания меню, но сначала разберёмся с видами возможных клавиатур.
Виды клавиатур
Библиотека aiogram позволяет создать на Python клавиатуры двух видов, отличающиеся друг от друга расположением кнопок:
- Reply-кнопки для шаблонных ответов, которые закрепляются вместо основной клавиатуры на экране. Часто используются в чат-ботах как меню. Создаются с помощью метода ReplyKeyboardMarkup.
- Инлайн-кнопки, связанные с сообщениями в чате. При этом пользователь видит и основную клавиатуру. Создаются с помощью метода InlineKeyboardMarkup.
Создание меню
Наш эхо-бот для Telegram сейчас позволяет только отправлять текстовые сообщения и получать их обратно. Давайте проапгрейдим его и добавим кнопки с готовыми сообщениями, которые не надо вводить самому. Это будут reply-кнопки.
Нам понадобится класс ReplyKeyboardMarkup — для начала импортируем его и дополнительные необходимые классы:
ReplyKeybordRemove и ReplyKeyboardMarkup позволяют создавать и удалять клавиатуру, а класс KeyboardButton используется для добавления кнопок.
Теперь создадим кнопки с готовыми фразами. Напишем код и разберёмся в нём:
Сначала создадим в нашем первом декораторе список kb, который будет хранить кнопки. Кнопка в aiogram создаётся с помощью types.KeyboardButton(text=» «), где в параметре text мы передаём отображаемое название кнопки.
После этого необходимо создать клавиатуру и рассказать ей про наши кнопки. Делается это с помощью метода types.ReplyKeyboardMarkup(keyboard=list), где вместо list записывается название списка с кнопками — в нашем случае это список kb.
Теперь остаётся показать клавиатуру в Telegram-чате. Для этого добавляем в ответ строку reply_markup=keyboard, которая отображает клавиатуру после команды /start. Теперь при запуске бота мы видим, что в чате появились обе кнопки из списка kb:

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

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

Создадим на Python для нашего бота инлайн-кнопки со ссылками на Skillbox Media и курсы по программированию. Для этого вернёмся к разделу с импортами в коде и добавим ещё одну строку, чтобы можно было использовать необходимые классы:
InlineKeyboardMarkup пригодится для инициализации инлайн-кнопок, а InlineKeyboardButton — для их создания.
Теперь создадим сами кнопки:
Разберёмся в коде построчно. Сначала мы инициализируем клавиатуру с помощью InlineKeyboardMarkup, передав в качестве аргумента row_width число 1. Оно определяет, сколько кнопок будет находиться в одном ряду. Так как у нас надписи на кнопках длинные, лучше поместить их друг под другом.
После этого создаём для каждой кнопки отдельную переменную и инициализируем класс Button. В параметрах указываем:
- text — текст, который будет показан на кнопке в мессенджере;
- url — URL страницы, на которую пользователь будет переходить при нажатии на кнопку.
С помощью метода add добавляем две кнопки к уже созданной клавиатуре. Теперь необходимо написать message_handler, который будет вызывать в Telegram эти инлайн-кнопки. Делаем это по аналогии с обычными кнопками — с той лишь разницей, что в качестве команды вызова укажем ссылки, а в параметре reply_markup передадим название нашей клавиатуры — urlkb.
Повторно запустим нашего бота и посмотрим на результат:

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

Как-то некрасиво.
Во-первых, хочется сделать кнопки поменьше, а во-вторых, расположить их горизонтально.
Почему вообще они такие большие? Дело в том, что по умолчанию «кнопочная» клавиатура должна занимать на смартфонах столько же места, сколько и обычная буквенная. Для уменьшения кнопок к объекту клавиатуры надо указать дополнительный параметр resize_keyboard=True.
Но как заменить вертикальные кнопки на горизонтальные? С точки зрения Bot API, клавиатура — это массив массивов
кнопок, а если говорить проще, массив строк.
Метод add() при каждом вызове создаёт новую строку (ряд) и принимает произвольное число аргументов по количеству желаемых кнопок в строке. Перепишем наш код, чтобы было красиво:
Обратите внимание на конструкцию *buttons. Здесь вам не C++ и звёздочка используется для распаковки списка. Подробнее об операторах * и ** можно прочитать ТУТ ![]()
Смотрим — действительно красиво:

Осталось научить бота реагировать на нажатие таких кнопок.
Как уже было сказано выше, необходимо делать проверку на полное совпадение текста.
Сделаем это двумя способами: через специальный фильтр Text и обычной лямбдой:

Чтобы удалить кнопки, необходимо отправить новое сообщение со специальной «удаляющей» клавиатурой типа ReplyKeyboardRemove.
У объекта обычной клавиатуры
есть ещё две полезных опции: one_time_keyboard для скрытия кнопок после нажатия и selective для показа клавиатуры лишь некоторым участникам группы.
Помимо стандартных опций, описанных выше, aiogram немного расширяет функциональность клавиатур параметром row_width.
При его использовании, фреймворк автоматически разобьёт массив кнопок на строки по N элементов в каждой, где N — значение row_width , например, row_width=2. Попробуйте!
Специальные обычные кнопки
В Telegram существует три специальных вида обычных кнопок, не являющихся шаблонами: для отправки текущей геолокации, для отправки своего номера телефона и ярлык для создания опроса/викторины. Для первых двух типов достаточно установить булевый флаг, а для опросов и викторин нужно передать специальный тип KeyboardButtonPollType и, по желанию, указать тип создаваемого объекта.
Впрочем, проще один раз увидеть код:
Теперь поговорим про Инлайн-кнопки
URL-кнопки и колбэки
В отличие от обычных кнопок, инлайновые цепляются не к низу экрана, а к сообщению, с которым были отправлены.
Мы рассмотрим два типа таких кнопок: URL и Callback.
Самые простые инлайн-кнопки относятся к типу URL, т.е. «ссылка». Поддерживаются только протоколы HTTP(S) и tg://
А если хотите обе кнопки в ряд, то уберите row_width=1 (тогда будет использоваться значение по умолчанию 3).
С URL-кнопками больше обсуждать, по сути, нечего, поэтому перейдём к гвоздю сегодняшней программы — Callback-кнопкам .
Это очень мощная штука, которую вы можете встретить практически везде.
Кнопки-реакции у постов (лайки), меню у @BotFather и т.д.
Суть в чём: у колбэк-кнопок есть специальное значение (data) , по которому ваше приложение опознаёт, что нажато и что надо сделать. И выбор правильного data очень важен! Стоит также отметить, что, в отличие от обычных кнопок, нажатие на колбэк-кнопку позволяет сделать практически что угодно, от заказа пиццы до перезагрузки сервера.
Напишем хэндлер, который по команде /random будет отправлять сообщение с колбэк-кнопкой:
Но как же обработать нажатие? Если раньше мы использовали message_handler для обработки входящих сообщений, то теперь будем использовать callback_query_handler для обработки колбэков.
Ориентироваться будем на «значение» кнопки, т.е. на её data:
Несмотря на то, что параметр кнопки callback_data , а значение data лежит в одноимённом поле data объекта CallbackQuery
, собственный фильтр aiogram называется text. 
Ой, а что это за часики? Оказывается, сервер Telegram ждёт от нас подтверждения о доставке колбэка, иначе в течение 30 секунд будет показывать специальную иконку.
Чтобы скрыть часики, нужно вызвать метод answer() у колбэка (или использовать метод API answer_callback_query() ).
В общем случае, в метод answer() можно ничего не передавать, но можно вызвать специальное окошко (всплывающее сверху или поверх экрана):

В функции send_random_value мы вызывали метод answer() не у message , а у call.message .
Это связано с тем, что колбэк-хэндлеры работают не с сообщениями (тип Message alt=»» />), а с колбэками (тип CallbackQuery alt=»» />), у которого другие поля, и само сообщение — всего лишь его часть.
Учтите также, что message — это сообщение, к которому была прицеплена кнопка (т.е. отправитель такого сообщения — сам бот).
Если хотите узнать, кто нажал на кнопку, смотрите поле from (в вашем коде это будет call.from_user , т.к. слово from зарезервировано в Python)
Перейдём к примеру посложнее.
Пусть пользователю предлагается сообщение с числом 0, а внизу три кнопки: +1, -1 и Подтвердить.
Первыми двумя он может редактировать число, а последняя удаляет всю клавиатуру, фиксируя изменения.
Хранить значения будем в памяти в словаре.
И, казалось бы, всё работает: 
Но теперь представим, что ушлый пользователь сделал следующее: вызвал команду /numbers (значение 0), увеличил значение до 1, снова вызвал /numbers (значение сбросилось до 0) и отредактировал нажал кнопку "+1" на первом сообщении.
Что произойдёт?
Бот по-честному отправит запрос на редактирование текста со значением 1, но т.к. на том сообщении уже стоит цифра 1, то Bot API вернёт ошибку, что старый и новый тексты совпадают, а бот словит исключение: aiogram.utils.exceptions.MessageNotModified: Message is not modified: specified new message content and reply markup are exactly the same as a current content and reply markup of the message

С этой ошибкой вы, скорее всего, будете поначалу часто сталкиваться, пытаясь редактировать сообщения.
Но, в действительности, решается проблема очень просто: мы проигнорируем исключение MessageNotModified.
Если теперь вы попробуете повторить пример выше, то указанное исключение в этом блоке кода бот просто-напросто проигнорирует.
Фабрика колбэков
В aiogram существует т.н. фабрика колбэков. Вы создаёте объект CallbackData , указываете ему префикс и произвольное количество доп. аргументов, которые в дальнейшем указываете при создании колбэка для кнопки.
Например, рассмотрим следующий объект:
Тогда при создании кнопки вам надо указать её параметры так:
В примере выше в кнопку запишется callback_data , равный post:5:like, а хэндлер на префикс post будет выглядеть так:
В предыдущем примере с числами мы грамотно выбрали callback_data , поэтому смогли легко запихнуть все обработчики в один хэндлер.
Но можно логически разнести обработку инкремента и декремента от обработки нажатия на кнопку "Подтвердить" .
Для этого в фильтре фабрики можно указать желаемые значения какого-либо параметра. Давайте перепишем наш пример с использованием фабрики:
На этом глава про кнопки окончена![]()
Как удалить клавиатуру telegram bot python
#python #python-3.x #telegram #telegram-bot #python-telegram-bot
#python #python-3.x #телеграмма #telegram-бот #python-telegram-бот #telegram
Вопрос:
Я создаю оболочку для /commands на python
Я создал InlineKeyboardButton с URL-адресом для приватного общения с ботом. Я хочу, чтобы кнопка удалялась или исчезала, просто не отображалась после того, как пользователь нажимает кнопку url.
Я использовал универсальную оболочку из руководств по telegram.
Тем не менее, я «новичок» Всегда пытаюсь узнать что-то новое, чем я могу поделиться.
В этом случае я застрял.
В отличие от callback_data, где данные могут быть отправлены на другую кнопку для редактирования сообщения. URL-адрес ничего не отправляет. Я просто хочу, чтобы кнопка исчезла или лучшая альтернатива скрыта или что-то в этом роде.
в каком направлении двигаться
Я просмотрел ReplyKeyboardRemove и OneTimeKeyboard, но либо мой синтаксис отключен, либо это невозможно с помощью кнопки URL
Ответ №1:
К сожалению, вы не можете.
InlineKeyboardButton с помощью a URL отображается только кнопка для пользователей, чтобы открыть ссылку. Насколько я знаю, в API Telegram нет события, которое может быть запущено, когда пользователь фактически открывает ссылку (или даже нажимает на кнопку!)
Комментарии:
1. Спасибо, чувак! Ценю ваш вклад! Я пробовал и пробовал, и то, что вы сказали, имеет смысл. Обратно боту ничего не отправляется, поэтому удалить невозможно. Я перестану биться головой! Большая благодарность.
2. @TheVoice Рад помочь