Кнопки¶
В этой главе мы познакомимся с такой замечательной фичей 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 , поэтому смогли легко запихнуть все обработчики в один хэндлер. Но можно логически разнести обработку инкремента и декремента от обработки нажатия на кнопку «Подтвердить». Для этого в фильтре фабрики можно указать желаемые значения какого-либо параметра. Давайте перепишем наш пример с использоваанием фабрики:
На этом глава про кнопки окончена, но про некоторые других их виды мы поговорим в следующих главах.
Кнопки в телеграм-ботах
Это статья из серии о телеграм-ботах. Я по частям расскажу о важных моментах в pytelegrambotapi. Сразу полезная информация: я начал учиться делать ботов по этой статье и всем ее рекомендую.
Кнопки в телеграм бывают двух видов — inline и обычные (reply).
Обычные вы видите вместо клавиатуры, все, что они делают, как правило, — отправляют текстовое сообщение боту.
Но, перед тем, как сделать кнопку, нужно создать клавиатуру. Для обычных кнопок она одна, для inline другая, вот обычная:
resize_keyboard: bool — необязательный | будет ли клавиатура растягиваться (по умолчанию: без значения)
one_time_keyboard: bool — необязательный \ разовая ли клавиатура (по умолчанию: без значения)
selective: bool — необязательный | кому показывать (по умолчанию: без значения)
row_width: int — обязательный | количество столбцов кнопок (по умолчанию: 3)
input_field_placeholder: str — необязательный | заменяет текст-заглушку в поле ввода (по умолчанию: без значения)
Создав клавиатуру, создадим к ней кнопку:
text: str — обязательный | текст кнопки. Если указан только он, то кнопка будет просто отправлять текст при нажатии.
request_contact: bool — необязательный | если указан как true то пользователь при нажатии отправит свой контакт. Доступен только в приватных чатах.
request_location: bool — необязательный | если указан как true, то пользователь при нажатии отправит свою локацию. Доступен только в приватных чатах.
request_poll: bool — необязательный | если указан как true, то пользователь при нажатии отправит свою локацию. Доступен только в приватных чатах.
web_app: WebAppInfo — необязательный | если указан как true, то при нажатии откроется страница указанного веб-приложения — про это есть отдельная статья. Доступен только в приватных чатах.
Controllerbot: полная инструкция по работе с ботом
Controllerbot — один из самых полезных инструментов для администраторов каналов в Telegram. С его помощью можно смотреть отчеты, планировать записи, форматировать текст, добавлять inline-кнопки и реакции в сообщения.
Мы написали подробную инструкцию, как подключить бот к каналу и пользоваться всеми его возможностями.
Подключение и настройка бота
В первую очередь нам понадобиться создать своего собственного бота. Не пугайтесь, в этом нет ничего сложного и займет всего пару минут.
Заходим в бот @BotFather, нажимаем Старт и отправляем команду /newbot.
Далее вам потребуется придумать и ввести имя, а затем @username бота.
Вот и все, ваш бот готов. Скопируйте себе Токен бота, он понадобиться для подальшего подключения к ControllerBot. Также можете сразу добавить созданного бота в администраторы вашего канала.
Теперь можно приступать к настройкам Контроллер бота. Для этого перейдите по ссылке или найдите в поиске @ControllerBot и нажмите Старт.
Далее введите команду /add, чтобы добавить новый канал и нажмте кнопку “Подключить новый бот”.
Скопируйте Токен вашего бота (о котором писали выше) и отправтьте его в контроллербот. Затем отправьте ему @username вашего канала и город, для правильной настройки отложенного постинга.
Как делать отложенный постинг
Чтобы создать новое сообщение, зайдите в Controllerbot, выберите из списка канал и нажмите кнопку «Создать Пост». После этого вы перейдете на созданный вами бот. Нажмите “Старт” и напишите сообщение, которое хотите опубликовать. Затем в меню нажмите “Далее” и выберите пункт “Отложить”.
Далее введите время и дату, когда хотите отправить сообщение. Например, если вы хотите опубликовать пост 16 марта в 4 часа дня, то вам нужно ввести время и дату просто через пробел «16 00 20 03».
Кроме того, можно еще и настроить отложенное удаление сообщения. Это особенно удобно при публикации рекламных постов. Для этого нажмите кнопку «Задать таймер для удаления»
Затем установите количество часов, через которое вы хотите удалить пост. Можно выбрать из перечисленных вариантов или написать на клавиатуре нужно количество часов.
Как добавить URL-кнопки
URL-кнопки — это специальные кнопки в Telegram, в которые можно красиво спрятать ссылки. Вот так это выглядит:
Написав сообщение, выберите пункт «Добавить URL-кнопки» и введите название кнопки и ссылку в фомате «Название — ссылка». Таким образом можно добавить несколько кнопок.
Как добавить реакции
Реакции в Telegram — это аналог лайков в соцсетях. К каждому посту вы можете прикреплять разные эмодзи, чтобы следить за тем, что интересно вашим подписчикам.
Чтобы установить такие кнопки, выберите пункт «Добавить реакции» и отправьте боту любые эмодзи, доступные в Телеграм. К одному сообщению можно прикрепить от 1 до 6 смайлов.
После публикации вы сможете увидеть, сколько раз подписчики нажали на те или иные смайлы.
Также, вы можете создать рекции, которые автоматически будут прикрепляться ко всем вашим сообщениям. Для этого нажмите нопку «Реакции по умолчанию» и пришлите боту эмоджи.
Как установить картинку под текстом сообщения
Часто задают вопрос о том, как разместить картинку под текстом, а не обычным способом — фотография, а затем подпись.
Controllerbot сможет помочь и в этом. Нажмите кнопку «Прикрепить фото», отправьте фотографию или ссылку на картинку и бот установит ее в сообщении.
Таким обрзом вы можете прикрепить гифку, видео или другие медиафайлы весом не больше 5мб.
Как сделать гиперссылку
Установить красивую ссылку в слове достаточно просто. В боте выберите «Форматирование: Markdown» и вставьте в текст такую конструкцию:
Например, [Вам Телеграм](https://t.me/vamtlgrm).
Если выбрать «Форматирование: HTML» , то нужно создать следующую конструкцию:
Например, <a href=»https://t.me/vamtlgrm»>Вам Телеграм</a>
Как форматировать текст
Слова можно выделять жирным, курсивом и моноширным шрифтами. Для этого убедитесь в том, что выбрано Markdown форматирование и оберните нужные слова в такие конструкции:
Для HTML:
<code>код в виде строки</code>
Также текст можно форматировать и без помощи бота. Подробнее читайте в статье.
Как отслеживать статистику
Чтобы посмотреть статистику, вызовите меню ControllerBot и нажмите кнопку “Статистика”. Далее нажмите «Посмотреть» и выберите период (неделя или месяц), за который хотите получить отчет. В статистике вы увидите данные по приросту подписчиков за каждый день и получите график роста вашего канала.
Как управлять опубликованными постами
Чтобы редактировать опубликованные сообщения, зайдите в меню бота и выберите «Управление постами», а затем «Редактировать отправленные». Также вы сможете изменить отложенный пост, выбрав пункт «Управление отложенными».
Другие возможности Controller Bot
С помощью кнопки «Форматирование» вы можете менять формат разметки Markdown или HTML.
Если вы хотите отправлять сообщения без звука, нажмите кнопку «Звуковое уведомление».
Также вы вручную можете включать или отключать подгрузку ссылок в Телеграм с помощью кнопки «Предпросмотр ссылок».
Подписывайтесь на канал Вам Телеграм — актуальные новости, полезные статьи и советы по работе с Telegram.
Пошаговая инструкция удаления ботов в Телеграме
Роботы-помощники в Telegram стали надежным подспорьем. С их поддержкой пользователи не только могут быстро найти необходимую информацию, создать коллекции стикеров, выучить иностранные языки, но и использовать их для продвижения своего канала. Но когда бот выполнил свою функцию, он становится лишним, и даже начинает мешать общению. Поэтому периодически встает вопрос, как его отключить и удалить из списка контактов.
Что такое бот в Телеграме и зачем он нужен
Разработчики приложения добавили в него множество удобных фичей, который нет больше ни в одном мессенджере. И одна из таких функций — наличие аккаунтов, принадлежащих не реальным людям, а роботам. Телеграм-бот — по сути, программа, которая выполняет за пользователя набор действий в автоматическом режиме. Функции роботов-помощников чрезвычайно разнообразны. Они способны:
- находить тематические каналы, книги, фильмы и музыку;
- самостоятельно скачивать текстовые и медиа-файлы ;
- обучать иностранным языкам;
- отвечать на сообщения;
- создавать и добавлять стикеры, гифки, смайлы в коллекцию.
Робот может самостоятельно размещать посты, оставлять реакции и отправлять комментарии, взаимодействовать с подписчиками. Если владельцу канала в «Телеге» не хватает автопомощников, уже имеющихся на сервере, он может создать своего. В этом им поможет еще одна встроенная программа-конструктор.
Внимание!
Главное преимущество Telegram-bot — отсутствие необходимости установки программы на устройство. Они встроены в мессенджер и работают напрямую с серверов приложения.
Пошаговая инструкция удаления ботов
Как бы ни были удобны автоматические помощники, иногда возникает необходимость от них избавиться. Дело в том, что не все роботы настроены на выполнение своих задач только по запросу пользователей . В некоторые встроены рекламные функции, поэтому периодически авто-аккаунт будет отправлять сообщения, отвлекающие от работы. Или случается, что при добавлении программы в группу или на канал, возникает сбой, от чего тормозится работа месенджера.
В этом случае возникает необходимость отключить бота и отписаться от него. Сделать это несложно. Существует два варианта действий — напрямую из чата с автопомощником или из списка контактов.
Первый способ, как удалить бота в Телеграме без блокировки:
- Открывают диалог. Тапают на иконку в виде вертикальных точек в верхней части экрана.
- Выбирают во всплывшем окошке «Очистить историю». Это нужно для того, чтобы удалить с сервера прошлые взаимодействия с ботом, и, если потребуется снова воспользоваться его помощью, начать с «чистого листа».
- Далее нажимают «Удалить».
Задача выполнена. Чат с ботом исчезнет из списка контактов. При желании вновь обратиться к программе, достаточно найти ее с помощью функции поиска.
Второй способ позволяет убрать бота навсегда, заблокировав его:
- Находят чат в своих контактах Телеграм. Долгим тапом выделяют диалог, чтобы возле имени появился зеленый кружок с галочкой внутри.
- Сначала нажимают на значок в виде урны в строке контекстного меню. После этого подтверждают, что действительно хотят удалить чат и заблокировать автоматический аккаунт.
Внимание!
При блокировке бот не сможет самостоятельно выйти на связь и отправлять уведомления, даже если такая функция прописана в его программе. Контакт будет отправлен в «черный список».
Оба способа подходят для удаления чата с роботом-помощником в мобильном приложении на Айфон и Андроид. При работе в десктопной версии на ПК алгоритм действий так же будет аналогичным.
Как убрать бота из группы
В Telegram можно не только самому пользоваться помощью робота или делиться чатом с ним с друзьями, но и встраивать программу на канал или в общий диалог. Когда необходимость отпадет, можно легко очистить группу и исключить бота из беседы:
- Открывают мульти-чат и, нажав на название, переходят в меню. Тапают на значок карандаша, чтобы изменить настройки.
- Открывают вкладку «Участники».
- Нажимают на три точки справа от имени бота.
- Выбирают «Удалить».
После этих действий бот больше не будет участником группы. Но пользователи смогут продолжать пользоваться программой, через индивидуальный чат.
Возможные проблемы при отключении
Чаще всего, сложностей с удалением робота не возникает. Но иногда, из-за сбоев в приложении, могут появиться некоторые проблемы:
- Приходят уведомления от уже удаленного бота. Это может случиться, если при отключении не воспользовались блокировкой и предварительно не очистили историю чата. Решение — найти автоматический аккаунт через поиск и отправить в «черный список» контактов.
- При очистке списка участников в группе, бот не удаляется. Это может быть связано с внутренней ошибкой мессенджера. Исправить сбой не сложно, требуется только выйти из приложения, перегрузить устройство и запустить Телеграм заново.
Внимание!
Если самостоятельно решить проблему не получилось, необходимо обратиться в службу поддержки Telegram. Сделать это можно из меню «Настройки», воспользовавшись вкладкой «Помощь».
Можно ли восстановить после удаления
Если бот был убран из списка контактов без блокировки, вновь восстановить работу с ним предельно просто. Нужно заново найти аккаунт помощника в поисковой строке и запустить диалог. Можно так же восстановить контакт из «черного списка». Доступ к заблокированным профилям находится в меню Телеграм в разделе «Настройки».
Использование ботов в Telegram необычайно облегчает работу по поиску информации или продвижению аккаунтов. Находить и удалять автоматических помощников несложно, поэтому всегда можно очистить мессенджер от лишних роботов, оставив только необходимых в данный момент.