Как убрать клавиатуру ответа без отправки сообщения в Telegram?
В боте Telegram вы можете отправить сообщение с помощью клавиатуры ответа с помощью sendMessage.
Клавиатура отображается вместо обычной qwerty.
Мы можем удалить отображаемую клавиатуру, отправив другое сообщение и передав вместе с ним объект ReplyKeyboardRemove. Однако для этого необходимо отправить какое-то постороннее сообщение.
Можно ли удалить клавиатуру без отправки реального сообщения?
Мне известна опция one_time_keyboard , но она только скроет клавиатуру, не удаляя ее.
2 ответа
Вы можете отредактировать сообщение с помощью editMessageText или editMessageReplyMarkup и просто не передавайте reply_markup , чтобы он исчез.
Я использовал node-telegram-bot-api и смог сделать это с помощью remove_keyboard .
Убрать keyboard после клика telegram bot
но после нажатия на одну из кнопок, символ клавиатуры остается возле поля ввода:
Как ее все-таки убрать? Пока пользуюсь способом отправки нового сообщения с
но это не удобно для пользователя.
![]()
Истинное значение поля one_time_keyboard объекта ReplyKeyboardMarkup всего лишь инструктирует программу-клиент скрыть клавиатуру, но она всё равно будет доступна по нажатию на специальную кнопку.
Если в ответ на нажатие кнопки бот отправляет пользователю сообщение, можно убрать клавиатуру. Для этого в при вызове sendMessage нужно дополнительно в параметре reply_markup передать объект ReplyKeyboardRemove.
А метод editMessageReplyMarkup предназначен для редактирования полупрозрачных inline-клавиатур, которые прикрепляются к сообщению. Этот тип клавиатур был введён в апреле прошлого года.
Всё ещё ищете ответ? Посмотрите другие вопросы с метками php telegram-api или задайте свой вопрос.
Site design / logo © 2022 Stack Exchange Inc; user contributions licensed under CC BY-SA . rev 2022.8.30.42948
Нажимая «Принять все файлы cookie» вы соглашаетесь, что Stack Exchange может хранить файлы cookie на вашем устройстве и раскрывать информацию в соответствии с нашей Политикой в отношении файлов cookie.
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 ).
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.
User will not be able to summon this keyboard; if you want to hide the keyboard from sight but keep it accessible, use telegram.ReplyKeyboardMarkup.one_time_keyboard .
selective ( bool , optional) –
Use this parameter if you want to remove the keyboard for specific users only. Targets:
Users that are @mentioned in the text of the telegram.Message object.
If the bot’s message is a reply (has reply_to_message_id ), sender of the original message.
**kwargs ( dict ) – Arbitrary keyword arguments.
Requests clients to remove the custom keyboard.
Optional. Use this parameter if you want to remove the keyboard for specific users only.
Меню из кнопок, модуль python-telegram-bot в Python.
Создание на Telegram меню из кнопок (встроенные клавиатуры).
Всякий раз, когда бот отправляет сообщение, он может передать специальную клавиатуру с предопределенными параметрами ответа. Приложения Telegram, которые получают сообщение, будут отображать эту клавиатуру для пользователя. Нажатие любой из кнопок немедленно отправит соответствующую команду. Таким образом можно значительно упростить взаимодействие пользователя с ботом.
Содержание.
Встроенные клавиатуры Telegramm в сообщения бота.
Бывают случаи, когда нужно что-либо сделать, не отправляя никаких сообщений в чат. Например, когда пользователь меняет настройки или просматривает результаты поиска. В таких случаях можно использовать встроенные InlineKeyboardButton клавиатуры, которые интегрированы непосредственно в сообщения, которым они принадлежат.
В отличие от настраиваемых клавиатур KeyboardButtons , которые посылают текст кнопки в качестве ответа, нажатие кнопок на встроенных клавиатурах InlineKeyboardButton не приводит к отправке сообщений в чат. Вместо этого встроенные клавиатуры поддерживают кнопки, которые работают за кулисами: кнопки обратного вызова, кнопки с URL и переключение на встроенные кнопки.
Когда используются кнопки обратного вызова (с аргументом callback_data ), бот может обновлять свои существующие сообщения или клавиатуры. При нажатии на такую кнопку, бот просто получает соответствующий запрос. Получив запрос, бот может отображать результат в уведомлении в верхней части экрана чата или в предупреждении.
Классы KeyboardButton и InlineKeyboardButton .
Данные классы определяют атрибуты и методы, одноименные с названиями аргументов.
KeyboardButton(text, request_contact=None, request_location=None, request_poll=None, **_kwargs) :
Объект KeyboardButton представляет собой одну кнопку клавиатуры для ответа текстом text , который отображается на кнопке. Необязательные аргументы исключают друг друга. Импортируется из основного модуля telegram.KeyboardButton .
Значение и поведение аргументов KeyboardButton :
- 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.InlineKeyboardButton .
Значение и поведение аргументов InlineKeyboardButton :
- text (str) — текст кнопки. Если ни одно из дополнительных полей не используется, оно будет отправлено боту в виде сообщения при нажатии кнопки.
- url (str) — HTTP или tg://url, который открывается при нажатии кнопки.
- login_url (telegram.LoginUrl, необязательно) — URL-адрес HTTP, используемый для автоматической авторизации пользователя. Может использоваться как замена виджета входа в Telegram.
- callback_data (str, необязательно) — данные, которые будут отправлены в запросе обратного вызова боту при нажатии кнопки, UTF-8 1-64 байта.
- switch_inline_query (str, необязательно) — если установлено, то нажатие кнопки предложит пользователю выбрать один из своих чатов, открыть этот чат и вставить логин бота и указанный встроенный запрос в поле ввода. Может быть пустым, и в этом случае будет вставлено только логин бота. Это дает пользователям простой способ начать использовать вашего бота во встроенном режиме, в то время как они находятся с ним в приватном чате. Особенно полезно в сочетании с действиями switch_pm* — в этом случае пользователь автоматически вернется в чат, из которого он переключился, пропуская экран выбора чата.
- switch_inline_query_current_chat (str, необязательно) — если установлено, то нажатие кнопки вставит логин бота и указанный встроенный запрос в поле ввода текущего чата. Может быть пустым, и в этом случае будет вставлено только логин бота. Это предлагает пользователю быстрый способ открыть вашего бота во встроенном режиме в том же чате — удобно для выбора чего-либо из нескольких вариантов.
- callback_game (telegram.CallbackGame, необязательно) — описание игры, которая будет запускаться при нажатии кнопки пользователем. Кнопка этого типа всегда должна быть первой кнопкой в первом ряду.
- pay (bool, необязательно) — укажите True , чтобы отправить кнопку Pay. Кнопка этого типа всегда должна быть первой кнопкой в первом ряду.
- **_kwargs (dict) — произвольные ключевые аргументы.
Алгоритм построения и отправки кнопок в Telegram чат.
Для создания макета кнопок со столбцами n_cols из списка кнопок необходимо создать функцию build_menu() , которая будет шаблоном для построения кнопок:
В коде выше определены списки header_buttons и footer_buttons , их можно использовать чтобы поместить кнопки в первую или последнюю строку соответственно.
В приведенном ниже фрагменте кода нужно заменить . соответствующим значением аргумента callback_data — это строка (UTF-8 1-64 байта) с данными, отправляемые боту в ответном запросе при нажатии кнопки. Если будете использовать кнопки KeyboardButtons для создания списка кнопок button_list , то для построения передаваемой в чат клавиатуры из кнопок используйте ReplyKeyboardMarkup вместо InlineKeyboardMarkup .
Или, если нужна динамическая версия, используйте генератор списка для динамического создания button_list из списка строк:
Это особенно полезно, если поместить внутрь вспомогательного метода, такого как get_data_buttons , для работы с динамическими данными и обновления меню в соответствии с вводом пользователя.
Чтобы обработать callback_data , необходимо подключить обработчик CallbackQueryHandler .
Обработчик сообщений CallbackQueryHandler .
Обработчик сообщений CallbackQueryHandler определяет атрибуты и методы, одноименные с названиями аргументов. Обработчик CallbackQueryHandler импортируется из модуля расширения telegram.ext .
CallbackQueryHandler(callback, pattern=None, run_async=False) :
Объект CallbackQueryHandler представляет собой обработчик запросов обратного вызова Telegram. Может использовать дополнительную фильтрацию на основе регулярных выражений модуля re .
Значение и поведение аргументов InlineKeyboardButton :
- callback — Функция обратного вызова для этого обработчика. Будет вызываться, когда сообщение должно быть обработано этим обработчиком.
- pattern=None ( str , необязательно) — шаблон регулярного выражения. Если не None , то для поиска совпадений в telegram.CallbackQuery.data (должно ли сообщение обрабатываться этим обработчиком) будет использоваться функция re.match() .
- run_async=False ( bool ) — определяет, будет ли обратный вызов выполняться асинхронно.
Остальные аргументы устарели. Такие параметры, как update_queue , job_queue , groups , groupdict , user_data , chat_data функциях обратного вызова можно получить объект контекста context
Базовый пример, использующий встроенную клавиатуру.
Пример встроенной клавиатуры с 2-мя состояниями.
Данный пример снабжен комментариями, так что понять как и что работает не составит труда. Он так же демонстрирует использование обработчиков CallbackQueryHandler и ConversationHandler .
Как работает обработчик разговора ConversationHandler() .
Основная магия происходит в обработчике разговора ConversationHandler() . Обработчик ConversationHandler() имеет три основные точки, которые необходимо определить для ведения беседы:
- entry_points — точка входа в разговор, представляет собой список обработчиков, которые запускают разговор. Разговор можно запустить по команде, отправленной пользователем (в данном случае /start ) и/или по каким то фразам, которые можно поймать при помощи обработчика MessageHandler() и фильтра Filters.regex (например: Filters.regex('(поговорим|скучно)'), callback_func)],
- states — состояния разговора. Представляет собой словарь, в котором ключ, это этап разговора, который явно возвращает функция обратного вызова, при этом высылает или отвечает на сообщение или передает кнопки для выбора и т.д. Так вот, реакция/ответ пользователя на это сообщение/нажатие кнопки будет обрабатываться обработчиками, находящихся в списке значений этого ключа — этапа/состояния разговора.
- fallbacks — точка выхода из разговора. Разговор заканчивается, если функция обработчик сообщения явно возвращает return ConversationHandler.END
Переключение между этапами разговора происходит при помощи функций обратного вызова, которые при обработке/анализе ответа пользователя будут возвращать нужный этап/состояние разговора.