Кнопки¶
В этой главе мы познакомимся с такой замечательной фичей 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 Bot API — pyTelegramBotAPI
Добрый день уважаемые читатели, давайте рассмотрим, какие основные типы встроенных кнопок предлагают чат-боты telegram и в чем их особенности. Статья будет полезна всем, кто хочет разобраться в возможностях взаимодействия с пользователями telegram в версии bot API 2.0.
Для обзора возможностей нам понадобится установить 3 целых 2 десятых Python`a и пару ложек pyTelegramBotAPI. Особенности настройки и регистрации чат-бота мы рассматривать не будем, т.к. есть множество статей на эту тему.
И так, что же такое встроенные кнопки(клавиатура) в мессенджере Telegram? Это кнопки которые выводятся во внутренней области чата и привязываются к конкретному сообщению. Они жестко связаны с сообщением(если удалить сообщение, внутренние кнопки так же удаляются вместе с ним.). Они дают возможность динамически видоизменять его.
В данный момент есть три типа встроенных кнопок:
URL-кнопки
Для создания кнопки используется тип InlineKeyboardMarkup, давайте создадим кнопку «Наш сайт»:
Тут название говорит само за себя, это тип кнопок предназначен для перенаправления пользователя по ссылке, с соответствующим предупреждением. Кнопка имеет соответствующий ярлычок в правом верхнем углу, чтобы дать понять пользователю, что это ссылка.
Switch-кнопки
Этот тип кнопок предназначен для перенаправления пользователя в какой либо чат, с последующей активацией (встроенного) inline-режима общения с ботом. Данный режим можно активировать вручную: в чате, вводим: «@название бота», но switch-кнопки позволяют это сделать автоматически (помогая знакомиться с inline-режимом новичкам).
Для того что-бы создать подобный переключатель, необходимо указать аргумент switch_inline_query либо пустой, либо с каким-либо текстом.
Теперь, если мы нажмем на кнопку и выберем чат, вот что получится:
Шаг 1:
Нажимаем на кнопку.
Шаг 2:
Выбираем чат.
Шаг 3:
Активировался встроенный inline-режим.
Callback-кнопки
Ну и наконец самое интересное — это кнопки с обратной связью: позволяют динамически обновлять сообщение/встроенные кнопки (не засоряя при этом ленту), а так же отображать уведомление в верху чат-бота или модальном окне.
Например, их можно использовать для просмотра длинного сообщения, аналогично пагинации страниц на сайтах, или например сделать календарь. Я не стану изобретать велосипед, а через поиск по GitHub, найду готовую библиотеку calendar-telegram. Выполнив указанные инструкции, получаем готовый календарь, который можно динамически изменять по нажатию на соответствующие кнопки: 
Так же можно добавить уведомление по нажатию на дату, для этого достаточно указать сообщение в ответе:
(Пример в десктопной версии)
(Пример в мобильной версии)
Если изменить show_alert на True, то мы получим модальное окно:

Заключение
По последним данным, в нашумевшем мессенджере Telegram регистрируются больше 600к пользователей ежедневно. Именно поэтому важно подхватить тренд и разобраться с его основными особенностями, т.к. различные методы взаимодействия с ботами существенно облегчает жизнь разработчиков и пользователей.
Ставим URL-кнопки в сообщениях на Telegram-канале
Недавно мы узнали как создать канал в меседжере Telegram. Вы наверное замечали что на некоторых каналах к сообщениям добавлены кнопки с ссылками, а так же смайлики, на которые можно нажать и выразить свое отношение к записи. И скорее всего задумывались как же это сделать. Ведь в стандартном наборе отправки сообщений таких функций нет. Так вот все это делается благодаря одному боту. Сейчас я расскажу как подключить такого бота к себе на канал.
Создаем бота и подключаем его к своему Telegram-каналу.
Первым делом нужно создать бота, но не пугайтесь сложного тут ничего нет.
Добавляем себе в контакты бота который называется @ControllerBot Для этого в поиск вставляем название бота и Telegram находит его. Затем выбираем его и нажимаем кнопку «начать».
Далее вам нужно подключить к боту свой канал. Для этого нажимаем кнопку «Каналы» потом кнопку «Добавить новый канал». После чего вам нужно нажать кнопку «подключить новый бот»
После чего вам выдается инструкция в которой написано что нужно перейти в бот под названием @BotFather , просто нажимаете на название бота и вас перекидывает куда нужно. Снова нажимаете кнопку «Начать», затем в выпавшем списке нажимаете /newbot .
В поле ввода текста пишите название бота (можно писать на любом языке, в моем примере это testovik ) и нажимаете кнопку «отправить». Затем вам нужно придумать логин вашему боту и в конце, через нижнее подчеркивание, пишем слово bot ( testovik_bot ). Вот тут нужно писать на латинице. И снова нажимаем «отправить». Если вам выдаст сообщение, как на скриншоте, значит данное имя уже занято и нужно придумать другое (я просто дописал цифры testovik123_bot ). И снова жмем кнопку «отправить». Если данное имя не занято вам выйдет поздравление.
Часть задачи пройдена. Идем дальше
Теперь вам нужно сообщение, которое вам написал @BotFather , переслать в @ControllerBot , для этого нажимаем на сообщении правой кнопкой мыши и выбираем пункт «Переслать сообщение», в меню слева выбираем ControllerBot нажимаем на него и затем просто жмем отправить сообщение.
Смотрим что написано в сообщении. Вам нужно добавить вашего бота в администраторы вашего канала. Для этого на имени бота жмем правой кнопкой мыши и выбираем пункт «Копировать имя пользователя». Затем переходим на ваш канал, жмем на название канала и выбираем ссылку «Администраторов: 1» и нажимаем на неё.
В открывшемся окне вам нужно нажать кнопку «Добавить администратора», затем в поле ввода жмем правой кнопкой мыши и выбираем пункт «вставить». В поле поиска появится ваш созданный бот. Жмем на бота. В следующем диалоговом окне нажимаем кнопку «Да». Затем ничего не меняя нажимаем «Сохранить». Ну вот вы добавили бота в администраторы вашего канала.
Далее пишем любое сообщение на своем канале, и пересылаем его в ControllerBot . Для этого жмем правой кнопкой мыши на сообщении и выбираем пункт «переслать сообщение», выбираем в левом меню ControllerBot и нажимаем «отправить сообщение».
Ну вот и все вам выходит сообщение, что канал успешно подключен. Теперь нужно выбрать часовой пояс. для этого в поле ввода теста пишем ваш город. И нажимаем «отправить сообщение». В следующем сообщение смотрим и если все правильно жмем кнопку «Верно».
Ну вот, я могу вас поздравить, вы подключили бот к своему Telegram каналу.
Как же пользоваться созданным ботом:
На самом деле все гораздо проще чем кажется на первый взгляд. Нажимаем на кнопку с названием вашего канала,. вас перебросит прямиком в ваш бот. Нажимаем кнопку «Начать». Первым делом отправляем боту текстовое сообщение, которое вы хотите опубликовать. Для этого в поле ввода текста пишем ваше сообщение и нажимаем кнопку «отправить».
Далее прикрепляем картинку. Для этого жмем кнопку «Прикрепить фото». Нажимаем кнопочку в виде скрепки и у вас откроется проводник компьютера, ищем нужную картинку и нажимаем кнопку «Открыть», затем нажимаем «Отправить 1 фото». Ну вот мы видим что картинка прикрепилась к тексту.


Так теперь прикрепим к посту смайлики. что бы люди могли нажать на них и выразить свое мнение о посте. Для этого жмем кнопку «Добавить реакции». Выбираем какие смайлики хотим прикрепить, их должно быть не больше 6 штук . Как только выбрали смайлы жмем кнопку «Отправить». И как видим смайлы прикрепились к нашему сообщению.

Ну и осталось прикрепить кнопочки с ссылками к нашему посту. Для этого жмем кнопку «Добавить URL-кнопки». Вам тут же выходит подсказка, как нужно писать что бы появилась кнопка. В поле ввода текста пишем текст в таком формате «Название кнопки — ссылка» . (пример Мой блог — http://www.blog-maksa.ru ). Если вы хотите прикрепить несколько ссылок то вам нужно каждую ссылку делать с новой строки. Для того, чтобы курсор переместился на строку ниже жмем на клавиатуре Shift+Enter и в таком же формате вставляем еще одну ссылку. Как только вы вставили все ссылки жмем «Отправить сообщение». И сразу же видим что ссылка прикрепилась к посту.

Ну вот мы полностью составили наш пост. Осталось его опубликовать. Для этого жмем кнопку «Далее», а затем кнопку «Опубликовать». Бот у вас спрашивает «вы уверены что хотите опубликовать 1 сообщение» . Так как мы в этом уверены жмем «Опубликовать». Переходим на свой канал и видим что наше сообщение опубликовано.

Ну что вот мы и научились красиво оформлять свои сообщения в Telegram-канале.
Если вам понравилась статья поделитесь ею в своих соц. сетях (кнопки слева) и напишите комментарий, для вас мелочь, а мне приятно .
Как в Телеграме можно сделать кнопку для бота на канале, пошаговая инструкция
Мессенджер Telegram дает пользователям массу возможностей для общения и получения информации. Также человек может создать собственный Телеграм-канал. После этого наверняка встанет вопрос о наращивании аудитории. Чтобы осуществить задуманное, необходимо внимательно подойти к оформлению канала и подумать над тем, как сделать кнопку со ссылкой в Телеграме. Это поможет привлечь новых подписчиков и повысить лояльность старой базы.
Типы встроенных кнопок
Функционал Telegram позволяет интегрировать разные виды кнопок, для каждого из которых характерно определенное назначение. Знания о типах подобных интерфейсов дают возможность эффективнее наращивать и монетизировать трафик.
На заметку. При оформлении публикации кнопки отображаются в нижней части текста и являются кликабельными.

URL-кнопки
Простой, но, в то же время, очень популярный тип, повсеместно используемый в Телеграме. Особенностью подобных кнопок является наличие гиперссылок, которые отображаются рядом с иконкой. Читатель, вместе с URL, видит предупреждение о том, что при нажатии он перейдет на сторонний ресурс.

Switch-кнопки
Более сложный тип, представленный в виде кликабельной иконки для перехода в другой чат с автоматической активацией общения с программой или оформлением подписки. Особенность данного вида заключается в автоматической настройке кнопок, благодаря чему владелец канала может сэкономить время на оформлении публикаций.

Callback-кнопки
Самый продвинутый инструмент взаимодействия читателя с бот-программой для Телеграм-канала. Такие кнопки позволяют совершать произвольные действия, которые происходят после нажатия на них.
Владелец канала может отредактировать интерфейс по собственному усмотрению, назначив для него определенные функции. На практике реализация Callback-кнопок выглядит так: читатель кликает по сообщению, а в ответ получает пост с информацией.

Как добавлять кнопки в Телеграм-канале
Чтобы создать кнопку для своего канала в Телеграме, пользователю необходимо набраться терпения.
Ведь встроенный функционал Telegram не позволяет самостоятельно добавить интерфейс, который отвечает за перенаправление пользователей.
Первым делом необходимо подключить бота для своего аккаунта. Для этого можно воспользоваться @Controllerbot, который активируется через @BotFather путем нажатия на «Старт» и обозначением команды /newbot.

Далее хозяин канала должен действовать в соответствии с алгоритмом:
- Пропишите название бота и нажмите «Отправить».
- Придумайте логин через нижнее подчеркивание (например, newschool_bot). Важно подобрать такое имя, чтобы оно не было занято другими пользователями. Поэтому придется перебрать несколько вариантов.
- Тапните по иконке «Отправить».

- Перенаправьте сообщение от @BotFather роботу @Controllerbot. Для этого кликните на пост ПКМ и выберете значение «Переслать сообщение».
- Добавьте полученного бота в администраторы канала, нажав ПКМ по имени робота и выбрав заголовок «Копировать имя пользователя». Далее его название указывается в ссылке «Администраторов:X».
- Нажмите «Добавить администратора», а в поле для ввода текста выберете пункт «Вставить».

- Сохраните изменения.
- Откройте канал и напишите любое сообщение.
- Перешлите его в @Controllerbot.

Если все сделано верно, на экране высветится сообщение об успешной активации бота. Далее пользоваться интерфейсом можно с выбора пункта «Начать» и указания общедоступного текста. Робот сам предложит нужный вид кнопки среди рассмотренных ранее.