Как скрыть inline клавиатуру telegram
Кнопки можно перемещать между собой в строке и между строк с помощью зажатия левой кнопкой мыши или долгим зажатием на мобильном.
Текстовая кнопка - отправляет определенный текст, указанный на кнопке;
Местоположение - отправляет карту с текущим местоположением подписчика;
Оплата - позволяет оплатить платную подписку через VK Pay;
Приложение - позволяет открыть любое приложение из Vk Mini Apps;
Текстовые кнопки не работают в качестве ключевых слов.
Открытие приложений и ссылок по кнопками никак не отслеживается.
По умолчанию, клавиатура показывается под полем ввода в диалоге с пользователем.
Внимание! Максимальный размер стандартной клавиатуры — 5 столбцов × 10 строк. При этом максимальное количество кнопок: 40.
Если установить опцию Скрыть клавиатуру после нажатия , то стандартная клавиатура будет скрываться после нажатия на кнопку.
Клавиатура с кнопками может быть скрыта. Чтобы ее показать, нужно нажать на кнопку с четырьмя точками.
Скрывается под иконкой с четырьмя точками (можно не заметить эту иконку и потерять клавиатуру)
Внимание! Максимальный размер встроенной клавиатуры — 5 столбцов × 6 строк. При этом максимальное количество кнопок: 10.
Не скрывается (с одной стороны это плюс - ее нельзя не заметить, с другой стороны - на эти кнопки можно нажимать бесконечное количество раз и их никак не удалить)
Внимание! Эта опция касается только стандартной клавиатуры. Inline кнопки не скрываются.
В тексте кнопок можно использовать глобальные или пользовательские переменные.
Внимание! Если переменная не будет найдена или будет иметь пустое значение, кнопка не будет показываться.
Внимание! При повторном включении возможностей ботов кнопки не появятся.
Если бот не реагирует на нажатие кнопок, выполните автоматическую настройку в разделе Настройки. Это должно решить проблему, так как в редких случаях Callback API вк перестает работать (причины пока не выявлены), из-за этого сервис не получает информации о нажатии на кнопки.
К сожалению автоматическая настройка никак не позволит учесть предыдущие нажатия кнопок, поэтому если у вас были пользователи, которые нажимали на кнопки и не перешли на следующий шаг, их нужно будет перенести вручную.
Сегодняшняя статья будет посвящена тому, каким образом можно создать для бота пользовательскую клавиатуру, что это даёт и как со всем этим работать. Все приводимые в статье примеры кода будут на php.
Пользовательские клавиатуры в Telegram бывают двух видов: Inline и Reply.
Описывающие клавиатуры объекты представляют собой многомерные массивы, содержащие наборы записей о каждой из кнопок (подпись, данные колбэка, открываемый при нажатии url и так далее).
Таким образом, для генерирования клавиатуры нам нужно сформировать в коде соответствующего типа объект, описывающий создаваемую клавиатуру (назовём этот объект, например, $keyboard), закодировать этот объект в виде json-строки и добавить эту json-строку в качестве параметра reply_markup при отправке запроса (GET или POST) telegram-боту.
// создаём $keyboard - объект, описывающий клавиатуру
$keyboard = [
"inline_keyboard" =>
[ /* первый ряд кнопок - массив из наборов */
[ /* первые две кнопки вызывают колбэк, а третья - открытие url-а */
[ "text" => "button 1",
"callback_data" => "data 1"
],
[ "text" => "button 2",
"callback_data" => "data 2"
],
[ "text" => "button 3",
"url" => $any_url
]
]
/* здесь мог бы быть второй массив для второго ряда кнопок и так далее */
]
];
.
.
// далее нужно просто добавить этот параметр в запрос (GET или POST) в качестве параметра reply_markup
// например, при использовании в GET-запросе:
$keyboard_json = json_encode($keyboard); // перекодируем в json
// формируем url для get-запроса и добавляем к этому url-у параметр reply_markup с описанием нашей клавиатуры
$url=$telegram_api_url.$bot_token.'/sendMessage?chat_id='.$chat_id.'&text='.urlencode($text_message).'&parse_mode=HTML'.'&reply_markup='.$keyboard_json;
// осталось только выполнить GET-запрос, например с помощью file_get_contents (ну или curl :))
file_get_contents($url); // отправляем get-запрос на сформированный url
Для удаления reply-клавиатуры нужно в параметре reply_markup послать объект, типа ReplyKeyboardRemove.
// создаём $remove_keyboard - объект, описывающий удаление reply-клавиатуры
$remove_keyboard = [
"remove_keyboard" => true
];
.
.
// далее нужно просто добавить этот объект в запрос (GET или POST) в качестве параметра reply_markup
// например, при использовании в GET-запросе:
$remove_keyboard_json = json_encode($remove_keyboard); // перекодируем в json
// формируем url для get-запроса и добавляем к этому url-у параметр reply_markup с описывающим удаление клавиатуры объектом
$url=$telegram_api_url.$bot_token.'/sendMessage?chat_id='.$chat_id.'&text='.urlencode($text_message).'&parse_mode=HTML'.'&reply_markup='.$remove_keyboard_json;
// осталось только выполнить GET-запрос, например с помощью file_get_contents (ну или curl :))
file_get_contents($url); // отправляем get-запрос на сформированный url
" [
"update_id":xxxxxxxxxx,
"callback_query":
"id":"xxxxxxxxxxx",
"from":
"id":xxxxxxxxx,
"first_name":"xxxxxxx",
"last_name":"xxxxxxx",
"username":"xxxxxxxxx",
"language_code":"ru"
>,
"message":
"message_id":xxxx,
"from":
"id":xxxxxxxxx,
"first_name":"xxxxxxxx",
"username":"xxxxxxx"
>,
"chat":
"id":xxxxxxxx,
"first_name":"xxxxxxx",
"last_name":"xxxxxxxx",
"username":"xxxxxxx",
"type":"private"
>,
"date":1499854111,
"text":"test"
>,
"chat_instance":"xxxxxxxxxxxx",
"data":"1"
>
>
]
>"
Вот и всё. Как видите, всё достаточно просто и понятно. В telegram вообще всегда всё просто, понятно и подробно описано. Вообще не понимаю, зачем нужны всякие библиотеки и фреймворки. Все они выглядят гораздо страшнее и монструознее, чем исходные описания из API. Это при том, что все эти фреймворки добавляют коду веса, ошибок и нестабильности. Уф, надо вступить в какое-нибудь движение за чистоту кода. Ну ладно, это я уже отвлёкся. Пока!
Взаимодействие пользователя с ботом должно быть интуитивным. Пользователь должен понимать, как общаться с ботом чтобы получить необходимый результат. Давайте рассмотрим какие есть способы взаимодействия с ботом.
При открытии бота по умолчанию сразу доступна кнопка Старт, при нажатии, на которую будет начат диалог и в бот будет отправлена команда /start . Уже здесь мы можем поймать эту команду, обработать и выполнить какие-то действия. Вместе с этой командой в бот отправляется минимальная информация о пользователе:
- id - уникальный идентификатор пользователя в Telegram
- last_name - значение поля фамилия, может быть пустым
- first_name - значение поля имя, может быть пустым
- username - уникальное значение текстовый идентификатор, может быть пустым
- language_code - кодовое обозначение выбранного языка интерфейса приложения (en, ru . )
- is_bot - флаг, определяющий пользователя как бота, в случае с ботом равен 1, в случае с пользователем пустое значение
Полезный инструмент
Telegram Bot API рекомендует использовать base64url для кодирования параметров с двоичным и другими типами контента.
По ссылке с параметром start будет открыт диалог с ботом, с кнопкой Старт в месте поля ввода. Если используется параметр startgroup, пользователю будет предложено выбрать группу для добавления бота.
Клавиатуры и их возможности
KeyboardButton
Помимо набора кнопок в объект ReplyKeyboardMarkup можно передать еще ряд параметров:
- keyboard - массив кнопок (объекты KeyboardButton)
- resize_keyboard - если предать true, то клавиатура подгонится по высоте до возможного минимума.
- one_time_keyboard - возможность скрывать клавиатуру после ее использования
- selective - если надо показать клавиатуру только определенным пользователям
При необходимости удалить клавиатуру используйте объект ReplyKeyboardRemove.
InlineKeyboardButton
- text - текст который будет на отображен на кнопке, обязательный параметр, поддерживает текст и смайлики (эмодзи)
- url - адрес на который будет направлен пользователь
- callback_data - строка 1-64 символа будет передан боту через объект CallbackQuery
- switch_inline_query - после нажатия будет предложен выбор чата где будет использован бот во встроенном режиме, пример @gif dog
- switch_inline_query_current_chat - после нажатия вставит команду для использования бота во встроенном режиме в текущем чате
- callback_game - описание игры, которая будет запущена при нажатии пользователем кнопки.
- pay - кнопка будет использована как кнопка оплаты
Теперь немного практики
Предлагаю рассмотреть поближе возможности клавиатур. Для примера я сделаю 4 кнопки: 2 KeyboardButton и 2 InlineKeyboardButton. Для этого будем работать с теми же инструментами, которые были в предыдущей статье. Добавим только несколько новых методов.
Кнопки будем отправлять в параметре reply_markup в методе sendMessage. Набор кнопок идет в таком формате:
Создадим два метода для разных клавиатур, на входе принимают массив строк кнопок, на выходе строку в формате JSON.
Сам набор кнопок будет выглядеть вот так.
Во встроенных кнопках (inlineKeyboardButton) в качестве значения параметра callback_data будем передавать служебную информацию в виде action_type_count1_count2 , где
- action - действие, в нашем случае это vote
- type - тип кнопки: 1 - левая, 0 - правая
- count1 - текущее значение левой кнопки
- count2 - текущее состояние правой кнопки
В значении параметра text передаем бинарный код эмодзи в кодировке UTF-8 (список эмодзи), которые преобразуются из шестнадцатеричных данных в двоичные данные функцией hex2bin, и еще выведем текущее числовое значение счетчика кнопки.
Теперь нам остается только описать механизм определения команды и механизм ее обработки. Поэтому в методе init() создадим конструкцию оператора switch
Для создания новой клавиатуры мы используем метод setParams(), а для отправки изменений мы используем метод changeVote(). Здесь остановим внимание на методах Bot API
Подводим итоги
Мы рассмотрели некоторые способы взаимодействия между пользователем и ботом, в основном это элементы интерфейса бота. Исходный код можно скачать по этой ссылке. Далее нас ждет знакомство с медиа-файлами.
Комментарии
Внимание!
Убедитесь, что эта страница открыта в браузере, а не в приложении Telegram. В противном случае авторизация пройдет только в приложении Telegram.
мне нужно 30 шт вывести из базы
30 in лучше выводить с постраничной навигацией по 10 шт например, у Телеграм если не ошибаюсь установлено ограничение. У меня была ситуация, когда на 32 строке кнопок был косяк, но постраничка решила проблему.
А вывести не сложно если из базы получить массив то стандартными функциями (foreach, for, do while . ) php можно спокойно это сделать.
что нужно дописать этому боту сюда-
чтобы он вел лог отдельно для кажлого чайт айди в папке log ?
Здравствуйте а как кнопкам меню задать стиль ширину и длину? К сожалению Телеграм это не позволяет регулировать. жалко что вам скрин нельзя прислать, может я не правильно спросил, а как их перенести по принципу <br> что б они в столбик были? Если я правильно понял ваш вопрос, то это можно сделать просто - разбить массив на вложенность кратное необходимому кол-во строк. Откройте ветку на форуме, там удобнее. Только вопрос по больше разверните, что именно вам нужно узнать.Значение будет лежать:
1. Если приводить к объекту json_decode(file_get_contents('php://input'))->message->text
2. Если приводить к ассоциативному массиву json_decode(file_get_contents('php://input'), true)['message']['text']
Это значение будет /start 123456789
ТАК я формирую ссылку
но когда я перехожу по ссылке мне выдает ошибку
Старт выглядит также как у вас
1. Просьба оформить топик на форуме все еще актуальна.
2. У вас нет необходимого case поэтому условие проваливается в default, обратите внимание я вам выше писал, какое значение вам будет прилетать /start 123456789, где 123456789 в вашем случае это подставленный $chat_id
Обычные кнопки¶
Кнопки как шаблоны¶
Как-то некрасиво. Во-первых, хочется сделать кнопки поменьше, а во-вторых, расположить их горизонтально.
Почему вообще они такие большие? Дело в том, что по умолчанию «кнопочная» клавиатура должна занимать на смартфонах столько же места, сколько и обычная буквенная. Для уменьшения кнопок к объекту клавиатуры надо указать дополнительный параметр resize_keyboard=True .
Но как заменить вертикальные кнопки на горизонтальные? С точки зрения Bot API, клавиатура — это массив массивов кнопок, а если говорить проще, массив строк. Метод add() при каждом вызове создаёт новую строку (ряд) и принимает произвольное число аргументов по количеству желаемых кнопок в строке. Перепишем наш код, чтобы было красиво:
Обратите внимание на конструкцию *buttons . Здесь вам не C++ и звёздочка используется для распаковки списка. Подробнее об операторах * и ** можно прочитать здесь.
Смотрим — действительно красиво:
Осталось научить бота реагировать на нажатие таких кнопок. Как уже было сказано выше, необходимо делать проверку на полное совпадение текста. Сделаем это двумя способами: через специальный фильтр Text и обычной лямбдой:
У объекта обычной клавиатуры есть ещё две полезных опции: one_time_keyboard для скрытия кнопок после нажатия и selective для показа клавиатуры лишь некоторым участникам группы. Их использование остаётся для самостоятельного изучения.
Помимо стандартных опций, описанных выше, aiogram немного расширяет функциональность клавиатур параметром row_width . При его использовании, фреймворк автоматически разобьёт массив кнопок на строки по N элементов в каждой, где N — значение row_width , например, row_width=2 . Попробуйте!
Специальные обычные кнопки¶
По состоянию на конец ужасного 2020 года в Telegram существует три специальных вида обычных кнопок, не являющихся шаблонами: для отправки текущей геолокации, для отправки своего номера телефона и ярлык для создания опроса/викторины. Для первых двух типов достаточно установить булевый флаг, а для опросов и викторин нужно передать специальный тип KeyboardButtonPollType и, по желанию, указать тип создаваемого объекта.
Впрочем, проще один раз увидеть код:
Инлайн-кнопки¶
URL-кнопки и колбэки¶
Login- и Pay-кнопки в книге рассматриваться не будут вообще. Если у кого-то есть желание помочь хотя бы с рабочим кодом для авторизации или оплаты, пожалуйста, создайте Pull Request на GitHub. Спасибо!
А если хотите обе кнопки в ряд, то уберите row_width=1 (тогда будет использоваться значение по умолчанию 3).
С URL-кнопками больше обсуждать, по сути, нечего, поэтому перейдём к гвоздю сегодняшней программы — Callback-кнопкам. Это очень мощная штука, которую вы можете встретить практически везде. Кнопки-реакции у постов (лайки), меню у @BotFather и т.д. Суть в чём: у колбэк-кнопок есть специальное значение (data), по которому ваше приложение опознаёт, что нажато и что надо сделать. И выбор правильного data очень важен! Стоит также отметить, что, в отличие от обычных кнопок, нажатие на колбэк-кнопку позволяет сделать практически что угодно, от заказа пиццы до перезагрузки сервера.
Несмотря на то, что параметр кнопки callback_data , а значение data лежит в одноимённом поле data объекта CallbackQuery, собственный фильтр aiogram называется text .
Ой, а что это за часики? Оказывается, сервер Telegram ждёт от нас подтверждения о доставке колбэка, иначе в течение 30 секунд будет показывать специальную иконку. Чтобы скрыть часики, нужно вызвать метод answer() у колбэка (или использовать метод API answer_callback_query() ). В общем случае, в метод answer() можно ничего не передавать, но можно вызвать специальное окошко (всплывающее сверху или поверх экрана):
Когда вызывать answer() ?
В общем случае, главное — просто не забыть сообщить Telegram о получении колбэк-запроса, но я рекомендую ставить вызов answer() в самом конце, и вот почему: если вдруг в процессе обработки колбэка случится какая-то ошибка и бот нарвётся на необработанное исключение, пользователь увидит неубирающиеся полминуты часики и поймёт, что что-то не так. В противном случае, часики исчезнут, а пользователь останется в неведении, выполнился его запрос успешно или нет.
И, казалось бы, всё работает:
Если теперь вы попробуете повторить пример выше, то указанное исключение в этом блоке кода бот просто-напросто проигнорирует.
Фабрика колбэков¶
В aiogram существует т.н. фабрика колбэков. Вы создаёте объект CallbackData , указываете ему префикс и произвольное количество доп. аргументов, которые в дальнейшем указываете при создании колбэка для кнопки.
Например, рассмотрим следующий объект:
В примере выше в кнопку запишется callback_data , равный post:5:like , а хэндлер на префикс post будет выглядеть так:
В предыдущем примере с числами мы грамотно выбрали callback_data , поэтому смогли легко запихнуть все обработчики в один хэндлер. Но можно логически разнести обработку инкремента и декремента от обработки нажатия на кнопку "Подтвердить". Для этого в фильтре фабрики можно указать желаемые значения какого-либо параметра. Давайте перепишем наш пример с использоваанием фабрики:
На этом глава про кнопки окончена, но про некоторые других их виды мы поговорим в следующих главах.
❖ Что такое Инлайн Кнопки (клавиатура)
На данный момент в @MenuBuilderBot есть 3 типа инлайн кнопок:
● URLs (ссылки)
● Всплывающее окно
● Команды
❖ Как добавить инлайн кнопки
3. Нажмите одну из "➕ Инлайн Кнопка"
Разница между «➕ Инлайн Кнопка ➡️» и «➕ Инлайн Кнопка ⬇️» будет описана ниже.
Из ДВУХ строк!
Первая строка всегда будет заголовком кнопки.
Вторая строка может иметь разные значения в зависимости от режима в котором создается инлайн кнопка.
Используйте кнопку с названием режима для переключения между режимами:
Режимы инлайн кнопок
Режим 1: URL или Share кнопка.
Вторая строка должна содержать корректный адрес (URL). Например:
Когда пользователь нажимает такую кнопку будет открыт указанный в кнопке URL:
Режим 2: Всплывающее окно.
Вторая и остальные строки дложны содержать текст (не более 200 символов) который будет показан во всплывающем окне. Например:
Когда пользователь нажимает такую кнопку, указанный в ней текст будет показан в таком всплывающем окне.
Режим 3: Команда.
Вторая строка должна содержать действующую команду назначенную какой-либо кнопке меню вашего бота (подробное руководство по командам по ссылке).
Кроме команд назначенных кнопкам, вы можете использовать команды:
/home
для обращения к Главному Меню вашего бота.
/start
будет работать как обычная команда /start отправленная боту.
Теперь у вас есть инлайн кнопка!
❖ Как удалить инлайн кнопку
Если вы уже находитесь в редакторе инлайн кнопок и все кнопки помечены крестиком, то можно просто нажать на кнопку которую нужно удалить.
❖ Расположение инлайн кнопок
В данном редакторе, инлайн кнопки создаются последовательно - сверху вниз и слева направо. Размещать новые кнопки произвольной части меню или перемещать - нельзя.
Новая инлайн кнопка может быть помещена в один ряд с последней созданной или на новой строке.
Когда создаёте вторую и последующие кнопки нажатие:
«➕ Инлайн Кнопка ➡️» (вправо) поместит новую кнопку в том же ряду, справа от последней.
«➕ Инлайн Кнопка ⬇️» (вниз) поместит новую кнопку на новую строку снизу.
Вы можете комбинировать кнопки чтобы создать нечто подобное:
После нажатия «Стоп редактор» вы увидите результат (таким, каким его увидит пользователь):
В некоторых случаях результат удаления бывает не предсказуемым, поэтому нужный вам режим чаще всего подбирается опытным путём.
Для настройки Удаления инлайн меню перейдите в вашем боте:
☞ 🔐Админ | ⚙️Настройки Бота
❖ Ошибки при работе с инлайн кнопками
ОШИБКА: Вы не пользовались ботом некоторое время и при нажатии на инлайн кнопку (или обычную нижнего меню) бот переносит вас в "Главное Меню".
ПРИЧИНА: Рабочая сессия бота завершается после 30 минут бездействия. При этом, в целях безопасности любые "закрытые" разделы бота (условием, капчей и д.р.) становятся недоступны. Попасть в них можно только снова пройдя весь путь через кнопку закрывающую вход. При этом если инлайн кнопка (или обычная кнопка нижнего меню) находится или ведет в такой "закрытый" раздел бот не позволит ей сработать пока вход в этот раздел юзером не будет снова осуществлен через кнопку фактически закрывающую вход.
РЕШЕНИЕ: Такое поведение бота является наиболее безопасным и изменение данной механики в ближайшее время не планируется. Решения как такового - нету.
ПРИЧИНА: Кнопка нижнего меню к которой обращается команда инлайн кнопки находится внутри "закрытой" зоны бота. Обращение к закрытой зоне извне не возможно. Это обеспечивает безопасность закрытых зон.
РЕШЕНИЕ: "Вынуть" (или продублировать) кнопку адресат из закрытой зоны бота, например в "Главное Меню" поставив на неё нужное условие. Саму кнопку нужно сделать скрытой от юзера - либо Админской, либо Невидимой.
Читайте также: