Telegram api удалить клавиатуру

Обновлено: 19.05.2024

Обычные кнопки¶

Кнопки как шаблоны¶

Как-то некрасиво. Во-первых, хочется сделать кнопки поменьше, а во-вторых, расположить их горизонтально.
Почему вообще они такие большие? Дело в том, что по умолчанию «кнопочная» клавиатура должна занимать на смартфонах столько же места, сколько и обычная буквенная. Для уменьшения кнопок к объекту клавиатуры надо указать дополнительный параметр 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 , поэтому смогли легко запихнуть все обработчики в один хэндлер. Но можно логически разнести обработку инкремента и декремента от обработки нажатия на кнопку "Подтвердить". Для этого в фильтре фабрики можно указать желаемые значения какого-либо параметра. Давайте перепишем наш пример с использоваанием фабрики:

На этом глава про кнопки окончена, но про некоторые других их виды мы поговорим в следующих главах.

Взаимодействие пользователя с ботом должно быть интуитивным. Пользователь должен понимать, как общаться с ботом чтобы получить необходимый результат. Давайте рассмотрим какие есть способы взаимодействия с ботом.

При открытии бота по умолчанию сразу доступна кнопка Старт, при нажатии, на которую будет начат диалог и в бот будет отправлена команда /start . Уже здесь мы можем поймать эту команду, обработать и выполнить какие-то действия. Вместе с этой командой в бот отправляется минимальная информация о пользователе:

  1. id - уникальный идентификатор пользователя в Telegram
  2. last_name - значение поля фамилия, может быть пустым
  3. first_name - значение поля имя, может быть пустым
  4. username - уникальное значение текстовый идентификатор, может быть пустым
  5. language_code - кодовое обозначение выбранного языка интерфейса приложения (en, ru . )
  6. is_bot - флаг, определяющий пользователя как бота, в случае с ботом равен 1, в случае с пользователем пустое значение

Полезный инструмент

Telegram Bot API рекомендует использовать base64url для кодирования параметров с двоичным и другими типами контента.

По ссылке с параметром start будет открыт диалог с ботом, с кнопкой Старт в месте поля ввода. Если используется параметр startgroup, пользователю будет предложено выбрать группу для добавления бота.

Клавиатуры и их возможности


KeyboardButton

Помимо набора кнопок в объект ReplyKeyboardMarkup можно передать еще ряд параметров:

  1. keyboard - массив кнопок (объекты KeyboardButton)
  2. resize_keyboard - если предать true, то клавиатура подгонится по высоте до возможного минимума.
  3. one_time_keyboard - возможность скрывать клавиатуру после ее использования
  4. selective - если надо показать клавиатуру только определенным пользователям

При необходимости удалить клавиатуру используйте объект ReplyKeyboardRemove.

InlineKeyboardButton

  1. text - текст который будет на отображен на кнопке, обязательный параметр, поддерживает текст и смайлики (эмодзи)
  2. url - адрес на который будет направлен пользователь
  3. callback_data - строка 1-64 символа будет передан боту через объект CallbackQuery
  4. switch_inline_query - после нажатия будет предложен выбор чата где будет использован бот во встроенном режиме, пример @gif dog
  5. switch_inline_query_current_chat - после нажатия вставит команду для использования бота во встроенном режиме в текущем чате
  6. callback_game - описание игры, которая будет запущена при нажатии пользователем кнопки.
  7. pay - кнопка будет использована как кнопка оплаты

Теперь немного практики

Предлагаю рассмотреть поближе возможности клавиатур. Для примера я сделаю 4 кнопки: 2 KeyboardButton и 2 InlineKeyboardButton. Для этого будем работать с теми же инструментами, которые были в предыдущей статье. Добавим только несколько новых методов.



Кнопки будем отправлять в параметре reply_markup в методе sendMessage. Набор кнопок идет в таком формате:


Создадим два метода для разных клавиатур, на входе принимают массив строк кнопок, на выходе строку в формате JSON.


Сам набор кнопок будет выглядеть вот так.

Во встроенных кнопках (inlineKeyboardButton) в качестве значения параметра callback_data будем передавать служебную информацию в виде action_type_count1_count2 , где

  1. action - действие, в нашем случае это vote
  2. type - тип кнопки: 1 - левая, 0 - правая
  3. count1 - текущее значение левой кнопки
  4. 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

Я столкнулся с очень странной проблемой, которая, вероятно, связана с кэшем.

Так вот оно что . Я разработал бота в nodejs для telegram.

Этот бот HAD в прошлом был пользовательской клавиатурой, которая не была "inline_keyboard" Я решил изменить это поведение и внедрил inline_keyboard.

текущий код-это что-то вроде этого :

Inline_keyboard работает нормально, но мой старый код (который был удален) все еще появляется у моих пользователей и очень раздражает.

anoying keyboard

Вот он; он продолжает появляться, когда мои пользователи заходят в мой чат.

У меня были следующие ресурсы :

Но я не вижу, как это реализовать, чтобы удалить этот раздражающий чат для моих пользователей.

Есть предложения ? Спасибо за Вашу поддержку

1 ответ

/python-telegram-bot/examples$python echobot.py /usr/local/lib/python2.7/dist-packages/python_telegram_bot-8.0- py2.7.egg/telegram/utils/request.py:38: UserWarning: python-telegram- bot.

Есть ли способ настроить положение кнопок на клавиатуре? Пример: у нас есть import telegram def start(bot, update): kb = [[telegram.KeyboardButton('/command1')], [telegram.KeyboardButton('/command2')], [telegram.KeyboardButton('/command3')]] kb_markup = telegram.ReplyKeyboardMarkup(kb.

для этого могут быть разные решения, мое предложение:

вы можете использовать самый первый ответ каждого пользователя, чтобы удалить клавиатуру, сначала используйте editMessageText, чтобы удалить клавиатуру, а затем отправьте ему соответствующий ответ.(обратите внимание, что chatIDs, что вы удалили их клавиатуру, поэтому вы сделаете это для каждого пользователя только один раз)

обратите внимание, что вам может потребоваться некоторая модификация этого кода на основе используемого вами node_module.

Похожие вопросы:

Есть ли способ настроить положение кнопок на клавиатуре? Пример: у нас есть import telegram def start(bot, update): kb = [[telegram.KeyboardButton('/command1')].

Здравствуйте, я новичок @ learning python.I'm пытаюсь сделать чат-бота в Telegram , но постоянно получаю ошибку и не знаю, как решить проблему .I проверил python в команде promp и он установлен.

Я развернул telegram-бота (с Django) на Heroku с python версией 3.6.9 Он работал хорошо, без каких-либо проблем. Через несколько месяцев я сделал некоторые изменения, и при попытке развернуть его.

Хоть и с большим запозданием, публикую шпаргалку по telegram bot api, может, будет полезна.

Прикладываю официальную документацию, и готовый набор методов для работы с telegram. Обработку тестировал на 8.3.15.1747.

В тексте я буду давать ссылки на вторую документацию т.к. для ее просмотра не нужны премудрости для обхода блокировок.


В клиенте telegram ищем бота BotFather

Далее отправляем ему команды

/start
/newbot
Представление имени моего бота
unikalnoe_imya_bot
После этого бот выдаст нам данные для подключения, а именно токен вида 123456:ABC-DEF1234ghIkl-zyx57W2v1u123ew11


Скринами




Соединение

В документации написано:

Код создания соединения :

Прокси

Есть огромное количество сайтов предоставляющий список таких бесплатных прокси, я использую getMe

Я специально буду повторять блоки кода, дабы Вы копировали сразу рабочий вариант, конечно это все нужно обернуть в функции и процедуры

Метод getMe вернет в теле ответа JSON структуру

"ok":true - Означает, что авторизация прошла успешно и Ваш токен валидный.

Short polling - это классическая схема, когда отправляя запрос мы сразу получаем результат его выполнения.

т.е. вы заводите РС с обработанными update_id и каждый раз анализируете - обработан полученный id или нет. Можно завести константу с последним обработанным update_id и сравнивать ее на < или > с полученным

Для работы в такой схеме необходимо договориться с сервером - какой таймаут считать допустимым, для этого у метода

Для переключения режима обмена на вебхуки существует метод InlineKeyboardMarkup

Загрузка полученных файлов

Для этого существует GET-метод

Ответ сервиса getFile

При этом запросе сервер ответит, что все Ок


Показ привью отправленной ссылки можно отключить с помощью параметра disable_web_page_preview

Для этого нужно к запросу добавить строку &disable_web_page_preview=true

Кнопки (клавиатуры)

У метода sendMessage есть еще один очень интересный параметр - reply_markup, который отвечает за быстрые ответы.

Кнопка - это объект InlineKeyboardButton, у которого только одно обязательное поле - text

Есть еще ряд полей, основное из которых - callback_data. Это данные, которые будут отправлены после нажатия кнопки пользователем. Сюда можно записывать идентификаторы из 1С (документа или справочника), числа и т.д. для последующей обработки.

Второй полезный параметр - url, в котором указывается ссылка, которая будет открыта при нажатии на кнопку

Пример JSON-описания клавиатуры


KeyboardButton с основным полем text, данный объект можно не использовать и сразу формировать массив строк.

Еще один важный параметр клавиатуры, но не обязательным, является resize_keyboard, который отвечает за "авто высоту" кнопок.

По умолчанию данный параметр установлен в false и клавиатура растягивается на высоту основной клавиатуры, что выглядит громоздко (см. скрин в примере).

Еще один опциональный параметр - one_time_keyboard, который при установке в true скрывает клавиатуру после нажатия кнопки.


ReplyKeyboardHide - Своего рода команда управления видимостью для клавиатуры

Отправка контактов

Метод похож на sendMessage за исключением нескольких обязательных полей:

phone_number - строковое представление телефонного номера

first_name - Имя контакта


Отправка документов (файлов)

За отправку файлов отвечает POST-метод

Со строковыми значениями вопросов не возникает - делаем СтрЗаменить и все, но есть еще и содержимое файла, которое нужно в итоговый запрос подсунуть.

Для решения этой проблемы у 1С есть метод ОбъединитьФайлы, который объединяет переданный в него массив файлов в один.

Разделим шаблон на части - певая это текст до %СодержимоеФайла%, а вторая это текст после %СодержимоеФайла%. Запишем эти 2 текста в файлы и используем ОбъединитьФайлы подсунув между текстовиками отправляемый файл.

Читайте также: