Как сделать кнопки в боте Telegram
7 декабря, 2020
GoodUser
При помощи кнопок в телеграме можно сделать пост полезнее, а главное, функциональное. Создаются кнопки при помощи специального бота. Но вначале его необходимо создать. Ниже будет полный процесс добавления кнопки в телеграме.

Создание бота
ВАЖНО! Для создания кнопки пользователю понадобится два бота ConyrollerBot и FatherBot.
Первый отвечает за публикацию постов в мессенджере. Второй используется именно для создания бота. Но начинать необходимо с первого бота.
- Запустить бота ControllerBot.
- Ввести или выбрать команду /addchannel, а затем указать канал.
- Выбрать команду, которая отвечает за создание нового бота.
- Перейти к боту FatherBot.
- Выбрать команду /newbot и следовать инструкции.
- Сообщение об успешном создании нового бота переслать в ControllerBot.
Данная инструкция поможет создать бота.
Настройка бота
После того, как бот будет создан, его необходимо настроить. Сделать это можно следующим образом:
- Добавить бота в администраторы канала через его настройки. Обязательно задать права на изображения.
- Переслать любое сообщение с канала боту ControllerBot.
- Последним шагом будет настройка часового пояса. Этот пункт необходимо для отложенного старта. Так, можно задавать время публикаций.
СОВЕТ! Как только настройка бота будет завершена, пользователь сможет через него публиковать посты. Здесь же можно добавлять кнопки и другие функции.
Создание кнопки при помощи бота в телеграм
При помощи созданного бота можно публиковать посты с различными вариациями. Так, есть возможность добавлять реакции, фото, комментарии и кнопки. Для начала необходимо перейти к созданному боту, открыть чат с ним. После этого достаточно следовать инструкции:
- Выбрать канал, на котором следует создать пост.
- Для начала необходимо отправить текст, который будет размещен в посте. Для этого достаточно написать его и переслать сообщением.
- После этого следует добавить изображение, если его необходимо прикреплять к посту.
- Следующим шагом будет реакция. Если реакция не нужна, можно сразу переходить к кнопке. В боте она носит название «Добавить URL-кнопки».

На экране отобразится инструкция, с помощью которой можно настроить работу кнопок. Пользователю остается только следовать ей. В самом конце можно указать время отправки поста. Также, есть функция автоматического удаления по истечению определенного времени.
Опубликовано в Полезное
Метки: telegram, бот, кнопки
Создание кнопок для телеграмм бота с использованием библиотеки pyTelegramBotAPI
Доброго времени суток. Телеграмм — божественный месседж скаченный у каждого на телефонах/компьютерах и не только. После прочтение этой статьи вы научитесь создавать кнопки для вашего телеграмм бота. Желаю удачи, в прочтении!)
Предупреждение
Забыл предупредить, в этой статье не будет сказано о создание бота, получение токена через BotFather. Для этого прочитайте документацию библиотеки или посмотрите ролики на эту тему в ютубе(Для удобство ссылку на документацию на русском языке библиотеки pyTelegramBotAPI оставлю в описании). И так, вернемся к теме.
Создание url кнопки
Url кнопки используются, когда хотим создать кнопку при клике которой, пользователь переходил на сайт. Пример:


нажима на «перейти», телеграмм перекинет его на сайт, который вы оставили при создание url кнопки, но как же собственно создать? Легко!
import telebot from telebot import types # для указание типов import config bot = telebot.TeleBot(config.token) # токен лежит в файле config.py @bot.message_handler(commands=['start']) #создаем команду def start(message): markup = types.InlineKeyboardMarkup() button1 = types.InlineKeyboardButton("Сайт Хабр", url='https://habr.com/ru/all/') markup.add(button1) bot.send_message(message.chat.id, "Привет, ! Нажми на кнопку и перейди на сайт)".format(message.from_user), reply_markup=markup)kup) bot.polling(none_stop=True)
при создание url-кнопки используется тип InlineKeyboardMarkup, в который мы добавляем кнопку и с помощью reply_markup=markup выводим это в чат(обязательно не забудьте указать это, иначе ваша кнопка просто не будете отображаться).
Создание Reply кнопки
Я не знаю как корректно называются кнопки использующие тип ReplyKeyboardMarkup, но я много практиковался в их создание и покажу вам, как это делается. Вот пример Reply кнопок:



Вот весь код самого бота:
import telebot from telebot import types # для указание типов import config bot = telebot.TeleBot(config.token) @bot.message_handler(commands=['start']) def start(message): markup = types.ReplyKeyboardMarkup(resize_keyboard=True) btn1 = types.KeyboardButton(" Поздороваться") btn2 = types.KeyboardButton("❓ Задать вопрос") markup.add(btn1, btn2) bot.send_message(message.chat.id, text="Привет, ! Я тестовый бот для твоей статьи для habr.com".format(message.from_user), reply_markup=markup) @bot.message_handler(content_types=['text']) def func(message): if(message.text == " Поздороваться"): bot.send_message(message.chat.id, text="Привеет.. Спасибо что читаешь статью!)") elif(message.text == "❓ Задать вопрос"): markup = types.ReplyKeyboardMarkup(resize_keyboard=True) btn1 = types.KeyboardButton("Как меня зовут?") btn2 = types.KeyboardButton("Что я могу?") back = types.KeyboardButton("Вернуться в главное меню") markup.add(btn1, btn2, back) bot.send_message(message.chat.id, text="Задай мне вопрос", reply_markup=markup) elif(message.text == "Как меня зовут?"): bot.send_message(message.chat.id, "У меня нет имени..") elif message.text == "Что я могу?": bot.send_message(message.chat.id, text="Поздороваться с читателями") elif (message.text == "Вернуться в главное меню"): markup = types.ReplyKeyboardMarkup(resize_keyboard=True) button1 = types.KeyboardButton(" Поздороваться") button2 = types.KeyboardButton("❓ Задать вопрос") markup.add(button1, button2) bot.send_message(message.chat.id, text="Вы вернулись в главное меню", reply_markup=markup) else: bot.send_message(message.chat.id, text="На такую комманду я не запрограммировал..") bot.polling(none_stop=True)
И так. Что бы создать Replay кнопку, нужно создать переменную, я назвал ее markup(9 строчка кода) в нее помещаем types.ReplyKeyboardMarkup(resize_keyboard=True). Resize_keybord=True выполняет функцию адаптации(я всегда указываю и вам советую тоже).После этого мы создаем переменную уже с самими кнопками и их текстом(10, 11 строчка) и затем добавляем эти переменные коммандой markup.add(__имя ваших переменных__). Коммандой bot.send_message(message.chat.id, text=»Привет, ! Я тестовый бот для твоей статьи для habr.com».format(message.from_user), reply_markup=markup) и обязательно не забывайте добавлять reply_markup=markup, иначе просто кнопки не будут отображаться.
Заключение
Большое спасибо вам за прочтение. Не судите строго, это моя первая статья, рассказал я скорее всего не очень, и только поверхностно. Если хотите углубиться в эту тему, почитайте документацию, кстати, вот документация по pyTelegramBotAPI на русском:
- https://github-com.translate.goog/eternnoir/pyTelegramBotAPI?_x_tr_sl=auto&_x_tr_tl=ru&_x_tr_hl=ru&_x_tr_pto=nui при переходе вниз скролите и вы увидите документацию. пишите комменты с отзывами, буду рад их прочитать.
- Мой телеграмм канал: https://t.me/it_diaryy
- pytelegrambotapi
- python
- telegrambot
Как сделать бота в Telegram: 12 популярных сервисов

Чат-бот может общаться с пользователями через мессенджеры или веб-сайты. Он помогает пользователям получать быстрые и точные ответы на свои вопросы в форме текста, необходимые инструкции или помощь в выборе товара или услуги. Чтобы использовать чат-бота, нужно обычно нажать кнопку «Начать» или «Написать», которая обычно находится на сайте или в мессенджере. После этого появляется меню, где можно выбрать нужную категорию или добавить вопрос или текст сообщения. Чат-бот также может предлагать готовые ответы на распространенные вопросы или позволяет выбрать ответы из готового списка. Для этого пользователь должен выбрать ответ из предложенных вариантов или ввести свой вариант ответа.
В статье разберем как быстро сделать сервис бота с инструкцией, где распишем что нажимать, расскажем как добавить функции и выбрать название (имя).
Что такое чат боты в Telegram
Чат-бот в Telegram – это отдельный аккаунт, который самостоятельно отвечает на сообщения пользователей.
Бизнесу, который продвигается в Telegram (даже если делает SMM в другой соцсети), он дает возможность оптимизировать коммуникацию с клиентами: чат-бот всегда онлайн и отвечает собеседнику в любое время суток, реагирует и дает фидбек мгновенно. Это программа, которой можно доверить рутинные задачи. Например, приём заявок от клиентов, подбор товара по запросу, сбор обратной связи и ответы на стандартные вопросы.
Всех ботов для мессенджеров можно разделить на две группы:
- Для внешнего общения — с клиентами, партнерами и другими людьми, которые не работают в компании. Сюда входят продающие и обучающие боты. Первые помогают клиенту выбрать и купить нужный товар, а вторые отвечают на вопросы или предлагают полезную информацию о компании.
- Для внутреннего общения — между сотрудниками или разными отделами. С их помощью чаще всего заполняют отчёты или проверяют работу сотрудников.
Бота можно написать для любого мессенджера, но в Telegram функций больше всего. Например, там можно создать мини-сайт или канал на основе вашего бота, поэтому он способен заменить даже странички в соцсетях. Допустим, у вас салон красоты — через бота можно делиться советами по уходу за окрашенными волосами. Продвижение ботов такое же, как и у обычных каналов: таргетированная реклама, SMM, реклама подписчикам ботов/каналов.

Для лучшего понимания чат-ботов следует указать несколько аспектов:
- Робот представляет собой интерфейс, подключенный к вашему сервису на удаленном сервере.
- Для создания нового аккаунта не требуется номер телефона.
- Управление роботом осуществляется посредством HTTPS-запросов к специальному API для ботов от Телеграмм.
- Каждый бот получает индивидуальный токен вида 123456:QWE-RTY1234UiopA-zyx57W2v1u321ew22. Он нужен для того, чтобы получать запросы с помощью Bot API.
- Все запросы осуществляются только через HTTPS и могут быть двух видов: GET и POST.
- У получившегося бота не появится статус «онлайн», только подпись «бот». Он не сможет сам начать общение с пользователем, только отвечать.
- Телеграм выделяет для роботов ограниченное пространство на своих серверах, поэтому вся переписка с людьми стирается через некоторое время после запроса. Поэтому, если вы хотите сделать бота, укажите это в инструкции к нему.
- Владелец может разрешить использовать его бота в чатах и каналах. Такая разновидность носит название «инлайн-бот». Активируется режим командой /setinline в BotFather.
Также стоит заметить ряд преимуществ. Например:
- доступен 24/7;
- для создания чат-бота не нужен новый номер телефона;
- все сообщения, создаваемые ботами, могут удаляться;
- может переадресовывать на иные каналы коммуникации;
- может отрабатывать возражения клиента;
- нет ограничений по сложности коммуникаций, запрограммировать можно даже сложные сценарии общения.
У чат-ботов есть и свои минусы, пусть незначительные. Две самые большие проблемы чат-ботов для потребителей — непонимание и неспособность решать сложные проблемы, и с этим придется считаться. Текущее положение дел — почти половина пользователей-клиентов считает, что чат-боты мешают им общаться с живыми сотрудниками бренда.
Важно, чтобы название чат-бота запоминалось и пользователи могли быстро найти его снова.
Зачем нужны
Чтобы автоматически обрабатывать сообщения. Пользователь через свой аккаунт может написать вашему боту в обычном чате или канале, и тот ему обязательно ответит по разработанному скрипту. Он имитирует живое общение и может выпытывать у юзеров полезную для бизнеса информацию: номера телефонов, э-мейлы, анкетные данные и переносить их в переменные. Его можно научить командам, рассылать уведомления, отвечать на вопросы клиентов и делать все то, что менеджер раньше делал вручную. Это можно использовать в бизнесе (таргетированная реклама, контент и т.д.):

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

Боту можно поручить любую функцию, которую в мессенджере может выполнить человек. Он не просто выполнит ее лучше, но и во много раз быстрее. Бота можно:
- Настроить для коммуникации с клиентами. Бот будет отвечать на сообщения, подбирать продукты, собирать контакты и заявки, давать инструкции, распределять между менеджерами, делать пересылки.
- Интегрировать с любыми сервисами. Например, его можно научить управлять умным домом в приложении, подбирать картинки и контент, видео или gif-анимации в Яндексе под ключевые слова или отвечать на комментарии пользователей в вашем канале.
- Использовать как утилиту. Например, бот может отображать юзерам погоду по запросу в конкретном городе, делать автоматический перевод текста, проводить опросы или сообщать о каком-то событии, например, появлении нового товара.
- Использовать как интерактив. Бот может играть в шахматы, проводить викторины, тестировать знания пользователей, присылать анекдоты или подбирать вид кофе по вашему знаку зодиака (смотреть на разные критерии)
- Применять для социальной коммуникации. Например, учитывать интересы и предпочтения людей при поиске собеседника, подбирать музыкальные проигрыватели для меломанов, анализировать покупки по маркетплейсам и находить товар.
При желании бота можно научить практически всему, что угодно. Преимущества чат-бота заключаются в том, что он может проверять большое количество запросов одновременно и предоставлять точную и полезную информацию в режиме реального времени. Кроме того, подключение чат-бота может очень сократить нагрузку на службу поддержки, что позволяет ей более эффективно решать более сложные задания.
Какие бывают телеграм-боты
Ботов можно разделить на несколько категорий. Разберемся подробнее:

- Классические чат-боты. Программы, которые ведут диалог с пользователем. Виртуальный собеседник обычно реагирует на заранее прописанные фразы, темы и команды, кнопку. Так можно, к примеру, оптимизировать штат людей-операторов. Другие пытаются имитировать человеческую беседу, но пользы от них не так много, нужна доработка.
- Помощники в администрировании. Пригодятся владельцам каналов и групповых чатов. Умеют собирать статистику, добавлять к постам реакции, файлы и URL кнопку добавить, создавать отложенные публикации, как ControllerBot. Или отслеживать активность в чате (например, нажатие на кнопку приветствия), выдавать команды, предупреждения и настраивать антиспам-фильтры — это умеет Combot.
- Магазины. Компании переносят свои каталоги в мессенджер — для тех, кому проще выбрать товар и оплатить его прямо в «Телеграме» по команде. Например, через Baggins можно купить чашку кофе, а через G Shop — женскую одежду. Главный минус таких магазинов — запутанный интерфейс: сложно просмотреть все товары и собрать корзину.
- Инструменты. Разнообразные боты, которые добавляют мессенджеру новые функции, команды. Они дают читать электронные письма, как Gmail Bot, отслеживать цены на билеты нажав кнопку, как Aviasales Bot, или проверить свой заказ в боте СДЭКа. Еще они напоминают о штрафах, скачивают файлы по URL и распознают музыку по аудиосообщению.
- Поисковики. В них можно бесплатно найти книги, музыку, фильмы и прочие файлы. Зачастую эти боты пиратские — и «Телеграм» их периодически блокирует, поэтому команде создать другой тип.
- Развлечения. Все, что поможет скрасить досуг: мемы, частушки, игры и не только. Так, бот KinomanBot по команде подбирает кино на вечер. Он ищет фильмы и сериалы и даёт ссылки, по которым их можно посмотреть. Кроме того, он следит за киноафишами и ищет кинотеатры, близкие к локации. Многие из таких ботов созданы для заработка на рекламе — но не все. Так, «Сбер» запустил бота, который генерирует по команде картинки на основе запросов пользователя. Бот работает на основе нейросети для генерации изображений ruDALL-E. Для пользователей такой бот — развлечение без рекламы, но для корпорации это реклама и продвижение их бренда, PR, и тестирование ИИ-системы.
- Боты обратной связи. Можно принимать заявки от пользователей, которые попадают в одно место — в чат вашего бота, а не засоряют личные сообщения.Такого бота также можно использовать в качестве чата поддержки клиентов, для проведения текстовых вебинаров — для сбора и генерирования обратной связи. Все что нужно — нажать одну из предложенных кнопок в диалоге.
- Боты-инструменты. Они для сложных функций. Один из таких ботов — Yandex.Translate. Он переводит слова и предложения на английский и русский в Telegram по команде, без перехода в браузер. Нужно ввести текст и нажать кнопку. Ещё один полезный бот — URL Uploader. Можно загружать файлы в Telegram. Чтобы загрузить файл, достаточно прислать боту URL документа и нажать кнопку. Есть и боты с более широкими возможностями. Andy English Bot, например, обучает новым английским словам, предлагает потренировать устную речь и даже поиграть в мини-игры на английском. Боты-инструменты позволяют зарабатывать на рекламе и переливать трафик внутри своих проектов, плюс полезный функциональный бот увеличивает узнаваемость бренда и лояльность к нему.
- Боты для заработка внутри Telegram. Некоторые боты предлагают платные функции. Частый сценарий — когда полезный бот с бесплатной версией с ограниченными возможностями и платной с расширенными. Один из таких — CrosserBot, бот для администраторов Telegram-каналов. Его бесплатная версия дает анализировать аудиторию Telegram-каналов и подбирать похожие по аудитории каналы и чаты по команде. В платной версии есть дополнительные инструменты: защита от атаки ботов, увеличенная скорость выгрузки данных, удаление подписчиков, присоединившихся к каналу в заданный период. Последняя функция — способ очистить канал после массовых подписок ботов. Иногда боты работают как полноценные онлайн-сервисы. Один из них — бот «Деньги за задания». Он продаёт услуги по накрутке Telegram-каналов. Бот выступает посредником между администраторами, которые хотят дешево привлечь подписчиков на канал, и людьми, готовыми нажать кнопку «Подписаться» за деньги.
Как сделать бота в Telegram без навыков программирования
Удобный способ создать бота с нуля — специальный телеграм бот или сервис. BotFather — это официальный бот Telegram для создания ботов. Давайте разберем на примере, чтобы было понятнее.

Запускаем бота, который будет приветствовать, задавать вопрос с вариантами ответов и реагировать на нажатие кнопок. Создать бесплатно можно так:
- Создайте свой аккаунт разработчика на платформе для создания бота. Зарегистрируйтесь с помощью электронной почты (на нее придет письмо с подтверждением) или войдите через Google.
- Нажмите кнопку команды «Создать нового бота» (справа внизу, будет надпись “создать”).
- Выберите команду, кнопку «Пустой бот». Перед вами откроется конструктор— это место, где можно разрабатывать бота и добавлять функции. Слева находится меню с разделами конструктора. Справа — вкладка с компонентами и экранами. По центру — рабочая зона для разработки. В левом нижнем углу — кнопка виджет обратной связи. Если возникнут трудности, пишите в поддержку, для этого нужно нажать на соответствующее меню. Логика бота создается с помощью экранов— это сообщения бота (шаги, этапы), внутри которых могут быть различные функции. Автоматически создается «Стартовый экран» — первое сообщение от бота. На каждый экран можно добавлять компоненты— это функции и действия бота (например, отправление текста, картинок, кнопок и т.д.). Все компоненты расположены на вкладке справа.
- Создайте приветствие: на вкладке «Компоненты» нажимаем на компонент «Сообщение», перетяните его на экран. Далее вводим любой текст и кликните зеленую кнопку «Сохранить» (справа внизу).
- Подключите бота к мессенджеру. В Telegram чат-боты создаются с помощью специального бота @BotFather. Через него можно управлять данными бота, добавить описание, добавить аватар и т.д.
Вот руководство по работе на BotFather:
- Откройте Telegram и найдите команду BotFather в поиске.
- Начните диалог с BotFather, нажмите кнопку «Start».
- Используйте команду «/newbot», чтобы создать нового бота, добавить еще одного. Следуйте инструкциям, чтобы задать и придумать имя и аватарку пользователя для вашего бота. BotFather выдаст вам токен для вашего бота, который нужен для подключения к API практически сразу.
- Настройте параметры вашего бота, используя команды BotFather, такие как «/setdescription» для описания бота, «/setabouttext» для информации о разработчике.
- Используйте команду «/setcommands», чтобы задать список команд для вашего бота. Это позволит пользователям узнавать, какие команды могут использоваться для взаимодействия с вашим ботом.
- Напишите код на любом языке программирования, используя Telegram Bot API, чтобы настроить работу вашего бота и добавить все необходимое (меню, кнопки и тд). Некоторые из популярных библиотек для работы — это python-telegram-bot для Python, Telegraf для Node.js, и BotMan для PHP.
- Загрузите свой код на хостинг, чтобы ваш бот мог отображаться и работать круглосуточно. Некоторые из популярных платформ для размещения кода — это Heroku, AWS и DigitalOcean.
- Настройте веб-хук для вашего бота, чтобы Telegram мог отправлять входящие сообщения на ваш сервер.
- Запустите свой бот и начните тестирование. Перейдите к редактированию, если нужно добавить что-то в меню, сделать замену текста или названия, внести поправки.Нажмите кнопку «Сохранить».
BotFather предоставляет дополнительные команды и функции, которые можно использовать для управления вашим ботом. Следуйте инструкциям BotFather, чтобы создать бота в Telegram. Если этот вариант вам не подходит, то можете воспользоваться одним из сервисов, о которых мы поговорим ниже в статье.
Самые важные команды для чат-бота
Эти команды помогут создать функционального и полезного для бизнеса чат-бота в Telegram, изменить его имя и аватарку.

Основные команды символов для управления:
- /start – первый шаг, приветственное сообщение, которое отправляется пользователю при первом взаимодействии с ботом;
- /help – служебное сообщение data, содержащее советы по использованию бота (список команд, краткое описание бота или алгоритм действий от первого до последнего);
- /settings – сообщение с настройками + возможности их изменения.
- /newbot – создать нового бота
- /mybots – редактировать своих ботов, edit bot [бета]. Если ботов несколько, нажимаем Edit Bot.
- /setname – изменить имя или название бота
- /setdescription – изменить описание бота
- /setabouttext – изменить информацию о боте
- /setuserpic – изменить фото профиля бота
- /setcommands – изменить список команд
- /deletebot – удалить бота
- /token – создать токен авторизации
- /revoke – отозвать токен доступа к боту
- /setinline – переключить встроенный режим
- /setinlinegeo — дать команду, чтобы включить встроенные запросы местоположения
- /setinlinefeedback – изменить встроенную обратную связь
- /setjoingroups – можно ли добавить вашего бота в группы?
- /setprivacy – переключить режим конфиденциальности
- /mygames – редактировать свои игры
- /newgame – создать новую игру
- /listgames – получить список ваших игр
- /editgame – редактировать игру
- /deletegame – удалить существующую игру
Дополнительных возможностей у бота в Telegram достаточно (например, если выбираем Location Data, бот видит локацию пользователя). Разбирать их все детально нет смысла, так как активно используется лишь небольшая часть. Чтобы проверить работу бота, следует найти его через поиск (перед этим сохраните все изменения) и протестировать, нажав нужные кнопки.
Как создавать ботов с помощью Python
Python — это отличный язык программирования для создания чат-ботов за счет множества библиотек и фреймворков для работы с API, текстом и машинного обучения. Его следует выбрать, если у вас есть опыт работы с программированием. Для написания Telegram-бота на Python, нужно установить сам язык. Если вы пользуетесь Windows, скачать Python можно с официального сайта. Версия важна. Подойдет Python не ниже версии 3.7. Вот пошаговая инструкция на Python:

- Первый шаг — подключение. Установите библиотеку python-telegram-bot, которая предоставляет API для работы с Telegram.
- Создайте нового бота в Telegram и получите его токен. Этот токен необходим для подключения вашего бота к Telegram Bot API.
- Напишите код на Python, который будет брать в работу входящие сообщения от пользователей и отвечать. Вы можете использовать библиотеку python-telegram-bot. Можно добавить любое меню, название, текста, сделать инструкции и т.д совершенно бесплатно.
- Загрузите свой код на хостинг, такой как Heroku или AWS, чтобы ваш бот мог работать круглосуточно.
- Настройте веб-хук, чтобы Telegram мог отправлять входящие сообщения на ваш сервер.
- Запустите свой бот и начните тестирование.
- Добавьте необходимый функционал, такой как работа с базой данных и другие возможности. Сохраните.
Если необходимо изменить текст, имя (название) бота, сделать дополнительно инструкции, описание или меню — следует выбрать редактирование.
Начать создание можно с изучения документации библиотеки python-telegram-bot и примеров кода
Пример создания простого бота: Hello, bot!
Теперь мы решили показать на примере создание бота.
-
Для начала следует импортировать библиотеки и создать экземпляры Телеграм бота и диспетчера, взять токен бота и имя (название) бота. Для этого нажать:
from aiogram import Bot, types from aiogram.dispatcher import Dispatcher from aiogram.utils import executor TOKEN = "ваш токен от бота здесь" bot = Bot(token=TOKEN) dp = Dispatcher(bot)
@dp.message_handler(commands=['start', 'help']) async def send_welcome(msg: types.Message): await msg.reply_to_message(f‘Я бот. Приятно познакомиться, ’)
@dp.message_handler(content_types=['text']) async def get_text_messages(msg: types.Message): if msg.text.lower() == 'привет': await msg.answer('Привет!') else: await msg.answer('Не понимаю, что это значит.')
if __name__ == '__main__': executor.start_polling(dp)
Так выглядит приветственное сообщение, оно будет отображаться в сообщении всем пользователям. Чтобы видеть как выглядит приветствие и пользовательские команды со стороны клиента, вводим имя бота в поиске, чтобы найти его, и начинаем диалог. Для этого нажать придется один из вариантов ответа., которые вы задали.
Ну вот и всё, так выглядит настройка, и она завершена! Как видите, чат-бот в Телеграме на языке Python готов, и должен сохранить все настройки.
Популярные платформы для телеграм-ботов
Хорошо, мы рассмотрели, как создать бота в Телеграме без необходимости знания программирования. Однако простые команды пока могут быть недостаточными для создания функционального бота. Для этого вам потребуется научиться программировать или поработать со специальными сервисами. Эти сервисы могут помочь создать и настроить бота, чтобы он мог выполнять определенные задачи.

Большинство из них доступны бесплатно. Рассмотрим самые популярные:
- Manybot. Можно добавлять различные функции в бота, такие как автоответчик, рассылка, опросы и другое. Manybot также предоставляет аналитические данные о действиях пользователей, функционал создавать меню для бота и интегрироваться. Сервис доступен как бесплатная и платная версии с расширенными функциями. Простая регистрация и выгодные пользовательские условия.
- Botobot — это пример платформы, чтобы создать онлайн-магазины на основе Телеграм-бота. Вы можете загружать свои товары в формате Excel, и пользователи могут просматривать их в виде каталога, меню в Телеграме (добавления разделов также осуществляется там). Бот также может принимать платежи, отправлять клиентские рассылки, интегрироваться с CRM и делать множество полезных функций (стать онлайн-помощником), которые могут упростить управление онлайн-магазином через Телеграм.
- Bottap — для диалоговых чат-ботов с набором стандартных функций и готовыми шаблонами для нескольких видов бизнеса, таких как кафе, интернет-магазины, доставка пиццы, маникюрные салоны, фитнес-тренеры, а также с возможностью создания своих собственных кастомных диалогов. У сервиса простой интерфейс с меню.
- Chatforma — для чат-ботов. Им можно создавать и настраивать ботов для различных мессенджеров, включая Telegram и Viber. С помощью Chatforma можно настроить автоответчик, создать форму для сбора контактов, настроить интеграцию и другое. Хотя Chatforma может показаться сложным для понимания, благодаря обучающим материалам и достаточному количеству времени вы сможете использовать все необходимые функции.
- Botmaker — для чат-ботов для различных мессенджеров, включая Telegram, Facebook Messenger и WhatsApp. Botmaker предоставляет большое количество готовых функций и интеграций (например, к маркетплейсам), таких как автоответчик, рассылка сообщений, опросы, меню, оповещения, и другое. Также простой интерфейс, можно создавать ботов без необходимости знания программирования.
- Info bot — это сервис, у которого простой внешний вид и функционал. Есть визуальный конструктор, в котором можно построить логическую цепочку диалога в виде блок-схемы. Однако, для того чтобы разобраться в нем, необходимо приложить некоторые усилия. Не существует подсказок и заголовков, и все необходимо понимать самостоятельно.
- Puzzlebot — это отличный сервис, чтобы организовать ботов любой сложности, который предоставляет мощный функционал. Создание бота с помощью Puzzlebot — это нетрудно, нужно всего лишь перемещать блоки и устанавливать связи между ними. В конструкторе есть как стандартные функции, так и множество оригинальных возможностей, несложно создавать уникальных ботов для различных задач.
- Flow XO — англоязычный сервис со стандартным набором функций для бизнеса и широкими возможностями для разработчиков. Есть много шаблонов диалогов для разных видов бизнеса, включая бронирование номера или столика, заказ услуги, еды или билетов, ответы на часто задаваемые вопросы, поиск на основании местоположения пользователя и т.д. Визуально интересный, но сложный и не всегда поддается логике.
- Botmother — сильный кроссплатформенный CMS для чат-ботов. Есть приложения для создания, редактирования и развертывания чат-ботов не только в Telegram, но и в Viber, WhatsApp, Facebook, ВКонтакте и Одноклассниках. Бота можно собрать из готовых блоков-модулей для разных типов сообщений, тут же наполнить их текстом и загрузить в мессенджер. При сборке можно использовать базовые и продвинутые компоненты, такие как логирование, группа кнопок с подсказками или нативный запрос.
- UniSender — это сервис для email-маркетинга и рекламы, который дает создавать и отправлять электронные письма, SMS-сообщения, push-уведомления и прочие виды сообщений. UniSender предоставляет широкий набор инструментов для настройки и автоматизации рассылок, включая сегментацию аудитории, A/B-тестирование, и другое. С помощью UniSender можно отслеживать статистику рассылок, такую как количество отправленных и доставленных сообщений, открытия и клики на ссылки, отписки и другие метрики, что позволяет оценить эффективность кампании и улучшить ее результативность.
- Bot Kits — это набор инструментов для создания чат-ботов в Telegram без необходимости знания программирования. Результат работы — боты графическим интерфейсом и предоставляет большое количество готовых шаблонов для разных типов бизнеса. Вы можете настроить своего бота для автоматической рассылки, приема заказов, сбора обратной связи и другое. Bot Kits также интегрируется с сервисами и платформами, такими как Google Sheets, Zapier и Integromat. Более того, сервис доступен бесплатно.
- Aimylogic — это платформа для создания и развертывания голосовых ассистентов и чат-ботов с использованием искусственного интеллекта. Этот сервис позволяет создавать голосовых ассистентов для различных задач, таких как заказ еды, бронирование билетов и многое другое. Вы можете интегрировать своего голосового ассистента с различными платформами, такими как Amazon Alexa, Google Home, Facebook. Aimylogic также обеспечивает аналитику и мониторинг работы голосового ассистента для улучшения эффективности и оптимизации работы бота.
Использование чат-бота сделает взаимодействие с сайтом или компанией более удобным и быстрым для пользователей, что может повысить их удовлетворенность и лояльность.
Часто задаваемые вопросы
Чтобы поделиться своим ботом внутри самого Telegram, достаточно отправить конкретному пользователю или в определенный чат @юзернейм бота, это выглядит, как пример, @botname.
Если необходимо дать ссылку на каком-либо внешнем ресурсе, она будет в следующем виде: t.me/юзернейм бота.
Боты являются своего рода программами, которые умеют выполнять разные функции — от предоставления информации до управления устройствами — и работают прямо в мессенджере. Взаимодействие осуществляется как с помощью заготовленного набора команд, так в виде живого общения под каждого человека. Бота можно добавить в канал или чат, а также подключить к платформам автоматизации и различным сервисам. Более сложные возможности реализуются с помощью программируемых скриптов, которые составляют разработчики.
Чтобы ваш робот начал функционировать, в него нужно добавить программную начинку: алгоритмы поведения и полезные функции. Для этого можно воспользоваться услугами профессионала или попробовать создать самостоятельно с конструкторами. Выбор будет зависеть от специфики бизнеса.
- Компании с необходимостью создать сервис для клиентов. Если вам нужно сделать небольшой каталог с продукцией hand-made или меню доставки еды, достаточно воспользоваться конструктором. Здесь будет довольно несложно продумать навигацию с кнопками и запустить все необходимые функции: форму заказа и доставки, связь с консультантом и пр. Им могут воспользоваться даже большие компании, если они хотят получить способ связи со своими клиентами. К работе с людьми будут оперативно подключаться сотрудники и отвечать на все вопросы. Организуйте несколько ответов кнопок.
- Крупный бизнес и производственные группы с необходимостью создать удобный корпоративный или развлекательный инструмент. Если нужен бот, который будет глубоко интегрирован с системой электронного документооборота, или программа с привязкой к искусственному интеллекту, потребуется помощь профессионала. Например, бот ruDALL-E Malevich от Сбера, который создает изображения по текстовому описанию в пару кнопок, написали опытные программисты.
Есть два способа создать бота в «Телеграме»: с помощью кода и ноукод-платформ. В первом случае вы пишете бота самостоятельно, во втором — пользуетесь конструкторами и собираете бота из уже готовых элементов, кликнув пару кнопок. Бота можно написать на любом языке программирования — от PHP и Node.js до Java и Go. Для создания ботов в конструкторе достаточно базовых знаний веб-приложений. Если вы владеете Figma, Miro, Asana или перетаскивали карточки в Trello, то сможете составить бота из наглядной цепочки блоков в конструкторе.
Заключение
В заключение можно сказать, что чат-боты — это мощный функционал на года, который может значительно упростить и улучшить коммуникацию между бизнесом и клиентами, и пришла пора их использовать. Разработка бота — это ключ к прибыли. Боты могут обрабатывать пользовательские команды и запросы, предоставлять информацию о продуктах и услугах, принимать заказы и даже проводить. Это можно организовать в пару кнопок для пользователя. Они могут быть полезны для любого бизнеса, включая рестораны, магазины, гостиницы, авиакомпании и многие другие. Создание чат-бота в Telegram не требует специальных знаний программирования, и существуют многочисленные платформы, которые предоставляют хороший интерфейс для создания и настройки бота. Боты в Telegram могут быть мощным инструментом для улучшения качества обслуживания клиентов и повышения эффективности бизнеса.
Кнопки¶
В этой главе мы познакомимся с такой замечательной фичей Telegram-ботов как кнопки. Прежде всего, чтобы избежать путаницы, определимся с названиями. То, что цепляется к низу экрана вашего устройства, будем называть обычными кнопками, а то, что цепляется непосредственно к сообщениям, назовём инлайн-кнопками. Ещё раз картинкой:

Обычные кнопки¶
Кнопки как шаблоны¶
Этот вид кнопок появился вместе с Bot API в далёком 2015 году и представляет собой не что иное, как шаблоны сообщений (за исключением нескольких особых случаев, но о них позже). Принцип простой: что написано на кнопке, то и будет отправлено в текущий чат. Соответственно, чтобы обработать нажатие такой кнопки, бот должен распознавать входящие текстовые сообщения.
Напишем хэндлер, который будет при нажатии на команду /start отправлять сообщение с двумя кнопками:
@dp.message(Command("start")) async def cmd_start(message: types.Message): kb = [ [types.KeyboardButton(text="С пюрешкой")], [types.KeyboardButton(text="Без пюрешки")] ] keyboard = types.ReplyKeyboardMarkup(keyboard=kb) await message.answer("Как подавать котлеты?", reply_markup=keyboard)
Несмотря на то, что Telegram Bot API допускает указывать просто строки вместо объектов KeyboardButton , при попытке использовать строку aiogram 3.x выкинет ошибку валидации и это не баг, а фича.
Живите теперь с этим ♂️
Что ж, запустим бота и обалдеем от громадных кнопок:

Как-то некрасиво. Во-первых, хочется сделать кнопки поменьше, а во-вторых, расположить их горизонтально.
Почему вообще они такие большие? Дело в том, что по умолчанию «кнопочная» клавиатура должна занимать на смартфонах столько же места, сколько и обычная буквенная. Для уменьшения кнопок к объекту клавиатуры надо указать дополнительный параметр resize_keyboard=True .
Но как заменить вертикальные кнопки на горизонтальные? С точки зрения Bot API, клавиатура — это массив массивов кнопок, а если говорить проще, массив рядов. Перепишем наш код, чтобы было красиво, а для пущей важности добавим параметр input_field_placeholder , который заменит текст в пустой строке ввода, когда активна обычная клавиатура:
@dp.message(Command("start")) async def cmd_start(message: types.Message): kb = [ [ types.KeyboardButton(text="С пюрешкой"), types.KeyboardButton(text="Без пюрешки") ], ] keyboard = types.ReplyKeyboardMarkup( keyboard=kb, resize_keyboard=True, input_field_placeholder="Выберите способ подачи" ) await message.answer("Как подавать котлеты?", reply_markup=keyboard)
Смотрим — действительно красиво:

Осталось научить бота реагировать на нажатие таких кнопок. Как уже было сказано выше, необходимо делать проверку на полное совпадение текста. Сделаем это при помощи магического фильтра F, подробнее о котором поговорим в другой главе:
# новый импорт! from aiogram import F @dp.message(F.text.lower() == "с пюрешкой") async def with_puree(message: types.Message): await message.reply("Отличный выбор!") @dp.message(F.text.lower() == "без пюрешки") async def without_puree(message: types.Message): await message.reply("Так невкусно!")

Чтобы удалить кнопки, необходимо отправить новое сообщение со специальной «удаляющей» клавиатурой типа ReplyKeyboardRemove . Например: await message.reply(«Отличный выбор!», reply_markup=types.ReplyKeyboardRemove())
Keyboard Builder¶
Для более динамической генерации кнопок можно воспользоваться сборщиком клавиатур. Нам пригодятся следующие методы:
- add() — добавляет кнопку в память сборщика;
- adjust(int1, int2, int3. ) — делает строки по int1, int2, int3. кнопок;
- as_markup() — возвращает готовый объект клавиатуры;
- button() — добавляет кнопку с заданными параметрами, тип кнопки (Reply или Inline) определяется автоматически.
Создадим пронумерованную клавиатуру размером 4×4:
# новый импорт! from aiogram.utils.keyboard import ReplyKeyboardBuilder @dp.message(Command("reply_builder")) async def reply_builder(message: types.Message): builder = ReplyKeyboardBuilder() for i in range(1, 17): builder.add(types.KeyboardButton(text=str(i))) builder.adjust(4) await message.answer( "Выберите число:", reply_markup=builder.as_markup(resize_keyboard=True), )

У объекта обычной клавиатуры есть ещё две полезных опции: one_time_keyboard для автоматического скрытия кнопок после нажатия и selective для показа клавиатуры лишь некоторым участникам группы. Их использование остаётся для самостоятельного изучения.
Специальные обычные кнопки¶
На момент написания этой главы в Telegram существует шесть специальных видов обычных кнопок, не являющихся обычными шаблонами сообщений. Они предназначены для:
- отправки текущей геолокации;
- отправки своего контакта с номером телефона;
- создания опроса/викторины;
- выбора и отправки боту данных пользователя с нужными критериями;
- выбора и отправки боту данных (супер)группы или канала с нужными критериями;
- запуска веб-приложения (WebApp).
Поговорим про них подробнее.
Отправка текущей геолокации. Здесь всё просто: где пользователь находится, те координаты и отправляет. Это будет статическое гео, а не Live Location, который обновляется автоматически. Разумеется, хитрые юзеры могут подменить своё местонахождение, иногда даже на уровне всей системы (Android).
Отправка своего контакта с номером телефона. При нажатии на кнопку (с предварительным подтверждением) пользователь отправляет свой контакт с номером телефона боту. Те же хитрые юзеры могут проигнорировать кнопку и отправить любой контакт, но в этом случае на них можно найти управу: достаточно проверить в хэндлере или в фильтре равенство message.contact.user_id == message.from_user.id .
Создание опроса/викторины. По нажатию на кнопку пользователю предлагается создать опрос или викторину, которые потом отправятся в текущий чат. Необходимо передать объект KeyboardButtonPollType, необязательный аргумент type служит для уточнения типа опроса (опрос или викторина).
Выбор и отправка боту данных пользователя с нужными критериями. Показывает окно выбора пользователя из списка чатов юзера, нажавшего на кнопку. Необходимо передать объект KeyboardButtonRequestUser, в котором надо указать сгенерированный любым способом айди запроса и критерии, например, «бот», «есть подписка Telegram Premium» и т.д. После выбора юзера бот получит сервисное сообщение с типом UserShared.
Выбор и отправка боту чата с нужными критериями. Показывает окно выбора пользователя из списка чатов юзера, нажавшего на кнопку. Необходимо передать объект KeyboardButtonRequestChat, в котором надо указать сгенерированный любым способом айди запроса и критерии, например, «группа или канал», «юзер — создатель чата» и т.д. После выбора юзера бот получит сервисное сообщение с типом ChatShared.
Запуск веб-приложения (WebApp). При нажатии на кнопку открывает WebApp. Необходимо передать объект WebAppInfo. В этой книге веб-аппы пока рассматриваться не будут.
Впрочем, проще один раз увидеть код:
@dp.message(Command("special_buttons")) async def cmd_special_buttons(message: types.Message): builder = ReplyKeyboardBuilder() # метод row позволяет явным образом сформировать ряд # из одной или нескольких кнопок. Например, первый ряд # будет состоять из двух кнопок. builder.row( types.KeyboardButton(text="Запросить геолокацию", request_location=True), types.KeyboardButton(text="Запросить контакт", request_contact=True) ) # . второй из одной . builder.row(types.KeyboardButton( text="Создать викторину", request_poll=types.KeyboardButtonPollType(type="quiz")) ) # . а третий снова из двух builder.row( types.KeyboardButton( text="Выбрать премиум пользователя", request_user=types.KeyboardButtonRequestUser( request_id=1, user_is_premium=True ) ), types.KeyboardButton( text="Выбрать супергруппу с форумами", request_chat=types.KeyboardButtonRequestChat( request_id=2, chat_is_channel=False, chat_is_forum=True ) ) ) # WebApp-ов пока нет, сорри :( await message.answer( "Выберите действие:", reply_markup=builder.as_markup(resize_keyboard=True), )

Напоследок, две заготовки хэндлеров на приём нажатий от нижних двух кнопок:
# новый импорт from aiogram import F @dp.message(F.user_shared) async def on_user_shared(message: types.Message): print( f"Request message.user_shared.request_id>. " f"User ID: message.user_shared.user_id>" ) @dp.message(F.chat_shared) async def on_user_shared(message: types.Message): print( f"Request message.chat_shared.request_id>. " f"User ID: message.chat_shared.chat_id>" )
Инлайн-кнопки¶
URL-кнопки¶
В отличие от обычных кнопок, инлайновые цепляются не к низу экрана, а к сообщению, с которым были отправлены. В этой главе мы рассмотрим два типа таких кнопок: URL и Callback. Ещё один — Switch — будет рассмотрен в главе про инлайн-режим.
Login- и Pay-кнопки в книге рассматриваться не будут вообще. Если у кого-то есть желание помочь хотя бы с рабочим кодом для авторизации или оплаты, пожалуйста, создайте Pull Request на GitHub. Спасибо!
Самые простые инлайн-кнопки относятся к типу URL, т.е. «ссылка». Поддерживаются только протоколы HTTP(S) и tg://
# новый импорт from aiogram.utils.keyboard import InlineKeyboardBuilder @dp.message(Command("inline_url")) async def cmd_inline_url(message: types.Message, bot: Bot): builder = InlineKeyboardBuilder() builder.row(types.InlineKeyboardButton( text="GitHub", url="https://github.com") ) builder.row(types.InlineKeyboardButton( text="Оф. канал Telegram", url="tg://resolve?domain=telegram") ) # Чтобы иметь возможность показать ID-кнопку, # У юзера должен быть False флаг has_private_forwards user_id = 1234567890 chat_info = await bot.get_chat(user_id) if not chat_info.has_private_forwards: builder.row(types.InlineKeyboardButton( text="Какой-то пользователь", url=f"tg://user?id=user_id>") ) await message.answer( 'Выберите ссылку', reply_markup=builder.as_markup(), )
Отдельно остановимся на среднем блоке кода. Дело в том, что в марте 2019 года разработчики Telegram добавили возможность отключать переход к профилю пользователя у пересланного сообщения. При попытке создать URL-кнопку с ID юзера, у которого отключен переход по форварду, бот получит ошибку Bad Request: BUTTON_USER_PRIVACY_RESTRICTED . Соответственно, прежде чем показывать такую кнопку, необходимо выяснить состояние упомянутой настройки. Для этого можно вызвать метод getChat и в ответе проверить состояние поля has_private_forwards . Если оно равно True , значит, попытка добавить URL-ID кнопку приведёт к ошибке.
Колбэки¶
С URL-кнопками больше обсуждать, по сути, нечего, поэтому перейдём к гвоздю сегодняшней программы — Callback-кнопкам. Это очень мощная штука, которую вы можете встретить практически везде. Кнопки-реакции у постов (лайки), меню у @BotFather и т.д. Суть в чём: у колбэк-кнопок есть специальное значение (data), по которому ваше приложение опознаёт, что нажато и что надо сделать. И выбор правильного data очень важен! Стоит также отметить, что, в отличие от обычных кнопок, нажатие на колбэк-кнопку позволяет сделать практически что угодно, от заказа пиццы до запуска вычислений на кластере суперкомпьютеров.
Напишем хэндлер, который по команде /random будет отправлять сообщение с колбэк-кнопкой:
@dp.message(Command("random")) async def cmd_random(message: types.Message): builder = InlineKeyboardBuilder() builder.add(types.InlineKeyboardButton( text="Нажми меня", callback_data="random_value") ) await message.answer( "Нажмите на кнопку, чтобы бот отправил число от 1 до 10", reply_markup=builder.as_markup() )
Но как же обработать нажатие? Если раньше мы использовали хэндлер на message для обработки входящих сообщений, то теперь будем использовать хэндлер на callback_query для обработки колбэков. Ориентироваться будем на «значение» кнопки, т.е. на её data:
@dp.callback_query(F.data == "random_value") async def send_random_value(callback: types.CallbackQuery): await callback.message.answer(str(randint(1, 10)))

Ой, а что это за часики? Оказывается, сервер Telegram ждёт от нас подтверждения о доставке колбэка, иначе в течение 30 секунд будет показывать специальную иконку. Чтобы скрыть часики, нужно вызвать метод answer() у колбэка (или использовать метод API answer_callback_query() ). В общем случае, в метод answer() можно ничего не передавать, но можно вызвать специальное окошко (всплывающее сверху или поверх экрана):
@dp.callback_query(F.data == "random_value") async def send_random_value(callback: types.CallbackQuery): await callback.message.answer(str(randint(1, 10))) await callback.answer( text="Спасибо, что воспользовались ботом!", show_alert=True ) # или просто await callback.answer()

У читателя может возникнуть вопрос: в какой момент обработки отвечать на колбэк методом answer() ? В общем случае, главное — просто не забыть сообщить Telegram о получении колбэк-запроса, но я рекомендую ставить вызов answer() в самом конце, и вот почему: если вдруг в процессе обработки колбэка случится какая-то ошибка и бот нарвётся на необработанное исключение, пользователь увидит неубирающиеся полминуты часики и поймёт, что что-то не так. В противном случае часики исчезнут, а пользователь останется в неведении, выполнился его запрос успешно или нет.
В функции send_random_value мы вызывали метод answer() не у message , а у callback.message . Это связано с тем, что колбэк-хэндлеры работают не с сообщениями (тип Message), а с колбэками (тип CallbackQuery), у которого другие поля, и само сообщение — всего лишь его часть. Учтите также, что message — это сообщение, к которому была прицеплена кнопка (т.е. отправитель такого сообщения — сам бот). Если хотите узнать, кто нажал на кнопку, смотрите поле from (в вашем коде это будет callback.from_user , т.к. слово from зарезервировано в Python)
Про объект message в колбэке
Если сообщение отправлено из инлайн-режима, то поле message у колбэка будет пустым. У вас не будет возможности получить содержимое такого сообщения, если только заранее где-то его не сохранить.
Перейдём к примеру посложнее. Пусть пользователю предлагается сообщение с числом 0, а внизу три кнопки: +1, -1 и Подтвердить. Первыми двумя он может редактировать число, а последняя удаляет всю клавиатуру, фиксируя изменения. Хранить значения будем в памяти в словаре (про конечные автоматы поговорим как-нибудь в другой раз).
# Здесь хранятся пользовательские данные. # Т.к. это словарь в памяти, то при перезапуске он очистится user_data = <> def get_keyboard(): buttons = [ [ types.InlineKeyboardButton(text="-1", callback_data="num_decr"), types.InlineKeyboardButton(text="+1", callback_data="num_incr") ], [types.InlineKeyboardButton(text="Подтвердить", callback_data="num_finish")] ] keyboard = types.InlineKeyboardMarkup(inline_keyboard=buttons) return keyboard async def update_num_text(message: types.Message, new_value: int): await message.edit_text( f"Укажите число: new_value>", reply_markup=get_keyboard() ) @dp.message(Command("numbers")) async def cmd_numbers(message: types.Message): user_data[message.from_user.id] = 0 await message.answer("Укажите число: 0", reply_markup=get_keyboard()) @dp.callback_query(F.data.startswith("num_")) async def callbacks_num(callback: types.CallbackQuery): user_value = user_data.get(callback.from_user.id, 0) action = callback.data.split("_")[1] if action == "incr": user_data[callback.from_user.id] = user_value+1 await update_num_text(callback.message, user_value+1) elif action == "decr": user_data[callback.from_user.id] = user_value-1 await update_num_text(callback.message, user_value-1) elif action == "finish": await callback.message.edit_text(f"Итого: user_value>") await callback.answer()
И, казалось бы, всё работает:

Но теперь представим, что ушлый пользователь сделал следующее: вызвал команду /numbers (значение 0), увеличил значение до 1, снова вызвал /numbers (значение сбросилось до 0) и отредактировал и нажал кнопку «+1» на первом сообщении. Что произойдёт? Бот по-честному отправит запрос на редактирование текста со значением 1, но т.к. на том сообщении уже стоит цифра 1, то Bot API вернёт ошибку, что старый и новый тексты совпадают, а бот словит исключение: Bad Request: 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 относится к категории Bad Request, поэтому у нас есть выбор: проигнорировать весь подобный класс ошибок, либо отловить весь класс BadRequest и попытаться по тексту ошибки опознать конкретную причину. Чтобы не слишком усложнять пример, обойдёмся первым способом и немного обновим функцию update_num_text() :
# Новые импорты! from contextlib import suppress from aiogram.exceptions import TelegramBadRequest async def update_num_text(message: types.Message, new_value: int): with suppress(TelegramBadRequest): await message.edit_text( f"Укажите число: new_value>", reply_markup=get_keyboard() )
Если теперь вы попробуете повторить пример выше, то указанное исключение в этом блоке кода бот просто-напросто проигнорирует.
Фабрика колбэков¶
Когда вы оперируете какими-то простыми колбэками с общим префиксом, типа order_1 , order_2 . вам может показаться, что довольно легко вызывать split() и делить строку по какому-то разделителю. А теперь представьте, что вам нужно хранить не одно значение, а три: order_1_1994_2731519 . Что здесь артикул, цена, количество? А может быть, тут вообще год выпуска? Да и разбиение строки начинает выглядеть страшно: .split(«_»)[2] . А почему не 1 или 3?
В какой-то момент возникает необходимость структурировать содержимое таких callback data, и в aiogram есть решение! Вы создаёте объекты типа CallbackData , указываете префикс, описываете структуру, а дальше фреймворк самостоятельно собирает строку с данными колбэка и, что важнее, корректно разбирает входящее значение. Снова разберёмся на конкретном примере; создадим класс NumbersCallbackFactory с префиксом fabnum и двумя полями action и value . Поле action определяет, что делать, менять значение (change) или зафиксировать (finish), а поле value показывает, на сколько изменять значение. По умолчанию оно будет None, т.к. для действия «finish» дельта изменения не требуется. Код:
# новые импорты! from typing import Optional from aiogram.filters.callback_data import CallbackData class NumbersCallbackFactory(CallbackData, prefix="fabnum"): action: str value: Optional[int] = None
Наш класс обязательно должен наследоваться от CallbackData и принимать значение префикса. Префикс — это общая подстрока в начале, по которой фреймворк будет определять, какая структура лежит в колбэке.
Теперь напишем функцию генерации клавиатуры. Здесь нам пригодится метод button() , который автоматически будет создавать кнопку с нужным типом, а от нас требуется только передать аргументы. В качестве аргумента callback_data вместо строки будем указывать экземпляр нашего класса NumbersCallbackFactory :
def get_keyboard_fab(): builder = InlineKeyboardBuilder() builder.button( text="-2", callback_data=NumbersCallbackFactory(action="change", value=-2) ) builder.button( text="-1", callback_data=NumbersCallbackFactory(action="change", value=-1) ) builder.button( text="+1", callback_data=NumbersCallbackFactory(action="change", value=1) ) builder.button( text="+2", callback_data=NumbersCallbackFactory(action="change", value=2) ) builder.button( text="Подтвердить", callback_data=NumbersCallbackFactory(action="finish") ) # Выравниваем кнопки по 4 в ряд, чтобы получилось 4 + 1 builder.adjust(4) return builder.as_markup()
Методы отправки сообщения и его редактирования оставляем теми же (в названиях и командах добавим суффикс _fab ):
async def update_num_text_fab(message: types.Message, new_value: int): with suppress(TelegramBadRequest): await message.edit_text( f"Укажите число: new_value>", reply_markup=get_keyboard_fab() ) @dp.message(Command("numbers_fab")) async def cmd_numbers_fab(message: types.Message): user_data[message.from_user.id] = 0 await message.answer("Укажите число: 0", reply_markup=get_keyboard_fab())
Наконец, переходим к главному — обработке колбэков. Для этого в декоратор надо передать класс, колбэки с которым мы ловим, с вызванным методом filter() . Также появляется дополнительный аргумент с названием callback_data (имя должно быть именно таким!), и имеющим тот же тип, что и фильтруемый класс:
@dp.callback_query(NumbersCallbackFactory.filter()) async def callbacks_num_change_fab( callback: types.CallbackQuery, callback_data: NumbersCallbackFactory ): # Текущее значение user_value = user_data.get(callback.from_user.id, 0) # Если число нужно изменить if callback_data.action == "change": user_data[callback.from_user.id] = user_value + callback_data.value await update_num_text_fab(callback.message, user_value + callback_data.value) # Если число нужно зафиксировать else: await callback.message.edit_text(f"Итого: user_value>") await callback.answer()
Ещё немного конкретизируем наши хэндлеры и сделаем отдельный обработчик для числовых кнопок и для кнопки «Подтвердить». Фильтровать будем по значению action и в этом нам помогут «магические фильтры» aiogram 3.x. Серьёзно, они так и называются: Magic Filter. Подробнее сие чародейство рассмотрим в другой главе, а сейчас просто воспользуемся «магией» и примем это на веру:
# новый импорт! from magic_filter import F # Нажатие на одну из кнопок: -2, -1, +1, +2 @dp.callback_query(NumbersCallbackFactory.filter(F.action == "change")) async def callbacks_num_change_fab( callback: types.CallbackQuery, callback_data: NumbersCallbackFactory ): # Текущее значение user_value = user_data.get(callback.from_user.id, 0) user_data[callback.from_user.id] = user_value + callback_data.value await update_num_text_fab(callback.message, user_value + callback_data.value) await callback.answer() # Нажатие на кнопку "подтвердить" @dp.callback_query(NumbersCallbackFactory.filter(F.action == "finish")) async def callbacks_num_finish_fab(callback: types.CallbackQuery): # Текущее значение user_value = user_data.get(callback.from_user.id, 0) await callback.message.edit_text(f"Итого: user_value>") await callback.answer()

На первый взгляд то, что мы сделали, может показаться сложным, но в действительности фабрика колбэков позволяет создавать продвинутые колбэк-кнопки и удобно дробить код на логические сущности. Увидеть применение фабрики на практике вы можете в боте для игры в «Сапёра», написанным вашим любимым автором 🙂
Автоответ на колбэки¶
Если у вас очень много колбэк-хэндлеров, на которые нужно либо просто отвечать, либо отвечать однотипно, можно немного упростить себе жизнь, воспользовавшись специальной мидлварью. В целом про такое мы поговорим отдельно, а сейчас просто познакомимся.
Итак, самый простой вариант — это добавить вот такую строчку после создания диспетчера:
# не забываем про новый импорт from aiogram.utils.callback_answer import CallbackAnswerMiddleware dp = Dispatcher() dp.callback_query.middleware(CallbackAnswerMiddleware())
В этом случае после выполнения хэндлера aiogram будет автоматически отвечать на колбэк. Можно переопределить стандартные настройки и указать свои, например:
dp.callback_query.middleware( CallbackAnswerMiddleware( pre=True, text="Готово!", show_alert=True ) )
Увы, ситуации, когда на все колбэк-хэндлеры одинаковый ответ, довольно редки. К счастью, переопределить поведение мидлвари в конкретном обработчике довольно просто: достаточно пробросить аргумент callback_answer и выставить ему новые значения:
# новый импорт! from aiogram.utils.callback_answer import CallbackAnswer @dp.callback_query() async def my_handler(callback: CallbackQuery, callback_answer: CallbackAnswer): . # тут какой-то код if everything is ok>: callback_answer.text = "Отлично!" else: callback_answer.text = "Что-то пошло не так. Попробуйте позже" callback_answer.cache_time = 10 . # тут какой-то код
Важно: этот способ не будет работать, если у мидлвари выставлен флаг pre=True . В этом случае надо полностью переопределять набор параметров мидлвари через флаги, с которыми мы подробнее познакомимся позже:
from aiogram import flags from aiogram.utils.callback_answer import CallbackAnswer @dp.callback_query() @flags.callback_answer(pre=False) # переопределяем флаг pre async def my_handler(callback: CallbackQuery, callback_answer: CallbackAnswer): . # тут какой-то код if everything is ok>: callback_answer.text = "Теперь этот текст будет видно!" . # тут какой-то код
На этом мы пока завершим знакомство с кнопками.
