Если в первой части мы дошли до момента, где бот уже работает, обрабатывает команды, взаимодействует с базой и в целом выполняет свою задачу, то здесь начинается этап, который на практике решает вообще всё.
Можно сделать технически правильного бота, с нормальной архитектурой, логикой и кодом — и при этом он будет бесполезен, потому что им неудобно пользоваться. Пользователь заходит, не понимает, что делать, делает ошибку, не получает понятного ответа и просто закрывает диалог.
Разница между «бот работает» и «ботом пользуются» — это UX (User Experience — пользовательский опыт).
И в Telegram это ощущается особенно сильно, потому что у вас нет интерфейса в привычном смысле. У вас нет экранов, анимаций, визуальных переходов. У вас есть только сообщения, кнопки и логика.
Как на самом деле выглядит UX в Telegram-боте
В классических приложениях UX часто воспринимается как визуал. Дизайнеры рисуют экраны, подбирают цвета, выравнивают отступы. В Telegram всё гораздо жёстче и примитивнее.
Здесь UX — это исключительно последовательность действий пользователя.
Путь пользователя:
Человек зашёл → увидел сообщение → принял решение → нажал кнопку → получил ответ → сделал следующий шаг.
Всё. На этом UX заканчивается. И одновременно — начинается.
Если на любом этапе возникает вопрос «что делать дальше» — вы теряете пользователя. Он не будет искать, пробовать, догадываться. Он просто уйдёт к другому боту или вообще забудет про вашу идею.
Хороший UX — это когда пользователь не думает. Он просто проходит сценарий как по рельсам: шаг за шагом, без пауз, без сомнений.
Плохой UX — это когда пользователь вынужден принимать решения. Какое решение? Нажать на эту кнопку или на ту? А что будет после этой? А можно вернуться назад?
Чем меньше решений принимает пользователь, тем лучше бот.
Первое сообщение — самый важный экран
Команда /start — это точка невозврата. Здесь пользователь за 3 секунды решает: остаться или уйти.
Очень частая ошибка — писать длинное приветствие, в котором рассказывается всё сразу: история создания бота, список всех команд, условия использования, контакты поддержки. Такой текст никто не читает. Пользователь видит "простыню" и сразу закрывает чат.
Нормальный подход — коротко объяснить суть и сразу дать действие.
Человек должен за 2–3 секунды понять три вещи:
Что делает этот бот?
Зачем он мне?
Куда нажать прямо сейчас?
Плохой пример:
"Привет! Это бот для создания постов. Я умею генерировать текст, добавлять картинки, настраивать кнопки, отправлять в канал, редактировать, удалять, смотреть статистику... Вот список моих команд: /start, /help, /create, /edit, /delete, /stats, /settings..."
Хороший пример:
"📝 Пост-бот
Отправь текст или фото — я сделаю из них готовый пост для канала.
🔘 Создать пост"
Хорошая структура стартового сообщения выглядит так:
Короткий заголовок (название бота или его суть)
Одна-две строки объяснения (максимум)
Одна основная кнопка (главное действие)
При необходимости — одна дополнительная (помощь или настройки)
Никаких списков команд. Никакой философии. Только действие.
Кнопки — это и есть интерфейс
В вебе или мобильном приложении у вас есть экраны, меню, табы, свип-жесты. В Telegram ничего этого нет. Кнопки полностью заменяют интерфейс.
И здесь важно не просто «добавить кнопки», а управлять поведением пользователя через них.
Два типа кнопок в Telegram:
Reply-кнопки (привязаны к клавиатуре) — появляются вместо обычной клавиатуры. Хорошо для ограниченного набора команд, но занимают много места и засоряют чат.
Inline-кнопки (внутри сообщения) — основной инструмент. Они не засоряют чат, остаются привязанными к конкретному сообщению и позволяют строить последовательные сценарии.
Ключевой момент — не тип кнопок, а их количество и смысл.
Исследования поведения пользователей в Telegram показывают простую закономерность:
1-2 кнопки → пользователь нажимает без раздумий
3-4 кнопки → пользователь задерживается на 2-3 секунды
5+ кнопок → пользователь испытывает стресс выбора и часто уходит
Если пользователь видит много вариантов, он начинает сомневаться. Если вариантов мало и они понятны — он действует.
Правила хороших кнопок:
Текст кнопки должен быть глаголом: «Создать», «Отправить», «Назад»
Избегайте «Да» и «Нет» — лучше «Подтвердить» и «Отмена»
Не делайте кнопки с одинаковым текстом в одном сообщении
Если кнопка ведёт к опасному действию (удаление), предупредите об этом в тексте
Цветные кнопки и премиум-эмодзи: официальная фича Bot API 9.4
Хорошие новости — всё, что мы говорили про «имитацию цветов», больше не нужно.
Telegram официально добавил цветные кнопки и поддержку кастомных эмодзи прямо в Bot API 9.4.
Теперь у инлайн-кнопок есть поле style, которое принимает три значения:
Значение | Цвет | Когда использовать |
|---|---|---|
| 🔵 Синий | Основное действие, переход, продолжение |
| 🟢 Зелёный | Подтверждение, согласие, "Готово" |
| 🔴 Красный | Удаление, отмена, опасное действие |
И поле icon_custom_emoji_id — чтобы поставить премиум-эмодзи прямо перед текстом кнопки.
⚠️ Важные ограничения
Что | Требование |
|---|---|
| Bot API 9.4+ и aiogram 3.20+ |
| У владельца бота есть Telegram Premium ИЛИ у бота куплен дополнительный юзернейм на Fragment |
То есть простой бот без премиума может использовать style (цвета), но не может использовать icon_custom_emoji_id.
Пример кода, как можно оформлять inline кнопки для aiogram 3.2+
from aiogram.types import InlineKeyboardMarkup, InlineKeyboardButton def get_colored_keyboard() -> InlineKeyboardMarkup: return InlineKeyboardMarkup(inline_keyboard=[ # 🔵 Синяя кнопка [InlineKeyboardButton( text="Подписаться на канал", url="https://t.me/example", icon_custom_emoji_id="6039422865189638057", # 📣 рупор style="primary", )], # 🟢 Зелёная кнопка [InlineKeyboardButton( text="Проверить подписку", callback_data="check_subscribe", icon_custom_emoji_id="5870633910337015697", # ✅ галочка style="success", )], # 🔴 Красная кнопка [InlineKeyboardButton( text="Удалить аккаунт", callback_data="delete_account", icon_custom_emoji_id="5870657884844462243", # ❌ крестик style="danger", )], # Две кнопки в ряд [ InlineKeyboardButton( text="Отмена", callback_data="cancel", icon_custom_emoji_id="5870657884844462243", style="danger", ), InlineKeyboardButton( text="Готово", callback_data="confirm", icon_custom_emoji_id="5870633910337015697", style="success", ), ], # Кнопка без style — цвет определяет Telegram [InlineKeyboardButton( text="Настройки", callback_data="settings", icon_custom_emoji_id="5870982283724328568", # ⚙️ )], ])
Что и куда вставить
Элемент | Куда вставить |
|---|---|
Весь блок про цветные кнопки | После раздела «Имитация цветов» (или вместо него) |
Код | В отдельный файл |
Вызов этой клавиатуры | В хендлере: |
ID кастомных эмодзи | Замените на свои — скопировать ID можно у бота @ShowJsonBot, отправив ему эмодзи |

Скопируйте custom_emoji_id вашего премиум-эмодзи и вставьте в код.
Telegram Premium и визуальное восприятие
Если у вас есть Telegram Premium, появляется возможность использовать кастомные эмодзи. И это заметно меняет восприятие.
Без оформления: бот выглядит как технический инструмент из 2018 года. Серые сообщения, стандартные эмодзи, всё одинаковое.
С аккуратным использованием кастомных эмодзи: бот выглядит как современный продукт. Он выделяется среди десятка других ботов в чате у пользователя.
Особенно хорошо это работает в:
Кнопках — кастомная галочка вместо стандартной ✅
Заголовках — уникальный эмодзи, который становится "брендом" бота
Подтверждениях — анимированный эмодзи при успешном действии
Поэтому, если вы хотите, чтобы ваш бот выглядел современно и зацеплял внимание, то используйте прем-эмодзи.
Главное правило — не перегружать.
Один-два акцента на экран работают лучше, чем «всё в эмодзи». Если каждая кнопка и каждое слово будут с кастомными эмодзи, интерфейс превратится в ёлочную гирлянду, но в некоторых моментах лучше использовать кастомные эмодзи там, где это очень необходимо и подчеркивает важность.
Важное замечание: если пользователь без Premium увидит кастомный эмодзи, он увидит обычный или квадратик. Это не ломает интерфейс, но "магия" теряется. Учитывайте аудиторию.
Сценарии вместо команд
Это, пожалуй, самый важный переход, который меняет всё.
Команды — это логика разработчика. Вы подумали: "Нужен функционал создания поста. Сделаю команду /create". Потом: "Нужно редактирование — /edit". И так далее.
Сценарии — это логика пользователя. Пользователь не хочет разбираться в командах. Он хочет: "хочу сделать пост → делаю пост → всё".
Когда вы делаете /generate, /create, /edit, /delete, вы заставляете человека разбираться в вашей системе. Запоминать команды. Понимать, в каком порядке их вызывать.
Когда вы строите сценарий — вы ведёте пользователя за руку.
Пример сценария вместо команд (создание поста)
Шаг | Действие пользователя | Ответ бота |
|---|---|---|
1 | Нажимает «Создать пост» | «Отправьте фото или GIF для поста» |
2 | Отправляет фото | «Отлично! Теперь напишите текст» |
3 | Отправляет текст | «Хотите добавить кнопку под постом?» |
4 | Нажимает «Добавить кнопку» | «Введите текст кнопки и ссылку через |
6 | Нажимает «Отправить» | «✅ Пост опубликован» |
Пользователь не думает. Он просто идёт по шагам. На каждом этапе он знает, что нужно сделать, потому что бот явно сказал об этом. |
Когда использовать команды, а когда сценарии?
Команды хороши для быстрых одноразовых действий: /start, /help, /cancel
Сценарии — для всего, что требует больше одного шага
Золотое правило: если пользователю нужно что-то ввести или выбрать — делайте сценарий.
FSM: почему без состояний всё ломается
Как только появляется последовательность из нескольких шагов, появляется необходимость отслеживать, на каком этапе находится пользователь.
Это называется Finite State Machine (FSM) — машина состояний.
Почему это важно?
Представьте сценарий создания поста из 3 шагов:
Бот ждёт фото
Бот ждёт текст
Бот показывает предпросмотр
Без FSM пользователь может:
Отправить текст, когда бот ждёт фото → бот не поймёт, что делать
Нажать кнопку «Назад» не в том состоянии → бот потеряется
Отправить два фото подряд → бот создаст два поста или ошибётся
С FSM: бот всегда знает, в каком состоянии находится каждый пользователь. "Сейчас user_123 находится в состоянии waiting_for_photo. Если он отправляет текст — это ошибка, нужно попросить фото."
Как это выглядит в коде (пример логики):
# Состояния пользователя class States: START = "start" # Начало, ничего не ждёт WAITING_PHOTO = "waiting_photo" WAITING_TEXT = "waiting_text" WAITING_BUTTON = "waiting_button" # Обработка сообщения с учётом состояния async def handle_message(message, state): current_state = await state.get_state() if current_state == States.WAITING_PHOTO: if message.photo: # Сохраняем фото, переходим к ожиданию текста await save_photo(message) await state.set_state(States.WAITING_TEXT) await message.answer("📝 Теперь отправьте текст поста") else: await message.answer("❌ Пожалуйста, отправьте фото") elif current_state == States.WAITING_TEXT: if message.text: await save_text(message) await show_preview(message) else: await message.answer("❌ Пожалуйста, отправьте текст")
Что даёт FSM на практике:
Бот никогда не путает, что ждёт от пользователя
Можно обрабатывать отмену и возврат на любой стадии
Легко добавлять новые шаги в сценарий
Пользователь может уйти и вернуться через час — бот запомнит, на чём остановились
Почти все популярные фреймворки для Telegram-ботов (aiogram, python-telegram-bot) имеют встроенную поддержку FSM. Используйте её с самого начала.
Текст — это тоже интерфейс
В Telegram текст — это не просто информация. Это часть UX, которая либо помогает пользователю, либо мешает.
Плохие формулировки (абстрактные):
«Введите данные»
«Произошла ошибка»
«Действие выполнено»
Хорошие формулировки (конкретные):
«Отправьте текст поста, который хотите опубликовать»
«Ошибка: я не смог загрузить фото. Попробуйте другое или отправьте заново»
«✅ Пост сохранён. Вот предпросмотр:»
Чем проще и понятнее текст, тем меньше ошибок и вопросов в поддержку.
Правила хорошего текста в Telegram-боте:
Говорите, что нужно сделать прямо сейчас. Не «Введите данные», а «Отправьте название товара».
Объясняйте формат, если он не очевиден. «Отправьте дату в формате ДД.ММ.ГГГГ, например 15.03.2025»
Не пугайте пользователя техническими деталями. Вместо «Timeout error» → «Что-то пошло не так, попробуйте через минуту»
Подтверждайте успех. Каждое действие должно заканчиваться понятным «Готово» или «✅»
Объясняйте ошибки. Не просто «Ошибка», а что именно пошло не так и что делать.
HTML-разметка: читаемость решает
Telegram поддерживает базовую HTML-разметку в сообщениях. И этим нужно пользоваться.
Доступные теги:
<b>жирный</b>или<strong>жирный</strong><i>курсив</i>или<em>курсив</em><u>подчёркнутый</u><s>зачёркнутый</s><code>моноширинный</code><code>блок кода</code><a href="https://...">ссылка</a><blockquote>Цитирование</blockquote>
Как это меняет восприятие:
Без разметки:
Привет! Я бот для создания постов. Отправь мне текст или фото, и я сделаю из них готовый пост. Вот что ты можешь сделать: создать пост, отредактировать пост, удалить пост, посмотреть статистику.
С разметкой:
<b>📝 Привет! Я бот для создания постов</b>
Отправь мне текст или фото — и я сделаю из них готовый пост.
<u>Что ты можешь сделать:</u>
• <b>Создать пост</b> — новый пост с нуля
• <i>Отредактировать</i> — изменить существующий
• <s>Удалить</s> — осторожно, действие необратимо<a href="https://example.com">📖 Подробная инструкция</a>
Разница очевидна. Второй вариант читается за секунду, первый — за десять, и то не факт, что пользователь дочитает.
Важно: не переусердствуйте. Жирный заголовок, пара акцентов — достаточно. Если всё сообщение будет разноцветным и разномастным, будет плохо.
Обратная связь: почему это критично
Любое действие пользователя должно давать мгновенный и понятный ответ.
Пользователь нажал кнопку → бот ответил.
Пользователь отправил сообщение → бот подтвердил получение.
Пользователь ошибся → бот объяснил ошибку.
Если пользователь нажал кнопку и ничего не понял — это ошибка UX.
Примеры хорошей обратной связи:
Действие | Ответ бота |
|---|---|
Нажал «Создать пост» | « Начинаем создание поста. Отправьте фото или текст» |
Отправил фото | «Фото получено! Теперь добавьте текст» |
Нажал «Отменить» | «Действие отменено. Возвращаемся в главное меню» |
Ошибка при загрузке | «Не удалось загрузить фото. Проверьте размер файла (максимум 10 МБ) и попробуйте снова» |
Успешная отправка | «✅ Пост опубликован! ID поста: #12345» |
Особенно важна обратная связь при долгих операциях.
Если бот что-то обрабатывает 3-5 секунд и молчит, пользователь думает, что он завис. Отправьте промежуточное сообщение: «⏳ Обрабатываю запрос, это займёт пару секунд...»
Даже простые сообщения вроде «Готово» или «Ошибка, попробуйте ещё раз» создают ощущение контроля. Пользователь понимает: бот его слышит, бот реагирует.
Реальные примеры: как UX ломается
Разберём две показательные ситуации из реальных ботов.
Пример 1: Перегруженный стартовый экран
Проблема: Пользователь заходит, видит длинное приветствие и 6 кнопок. Он не понимает, что выбрать, тратит время, читая каждую, испытывает стресс выбора и уходит.
Было (плохо):
"Добро пожаловать в СуперБот! Я умею: генерировать тексты, создавать картинки, переводить с 50 языков, проверять орфографию, считать символы, сохранять в PDF..."
Кнопки: [Генерация] [Картинки] [Перевод] [Орфография] [Счётчик] [PDF]
Стало (хорошо):
"📝 Что будем делать?"
Кнопки: [✏️ Создать текст] [🖼️ Создать картинку]
После упрощения до короткого сообщения и двух кнопок поведение кардинально меняется: пользователь сразу нажимает и идёт дальше. Остальные функции — в следующем меню.
Пример 2: Отсутствие сценария
Проблема: Бот ожидает, что пользователь сам знает порядок действий. "Сначала отправь фото, потом текст, потом настрой кнопку, потом подтверди."
Пользователь отправляет текст → бот отвечает "Я жду фото". Пользователь отправляет фото → бот "Теперь отправь текст". Пользователь запутывается, злится и уходит.
Было (плохо): Бот пассивен. Команды /setphoto, /settext, /sendpost. Пользователь должен разобраться в последовательности сам.
Стало (хорошо): Бот активен. Он ведёт пользователя:
"Отправьте фото"
"Отлично! Теперь текст"
"Хотите добавить кнопку?"
"Вот предпросмотр. Отправить?"
Когда бот ведёт пользователя — ошибок почти нет. Когда пользователь должен догадываться — ошибки гарантированы.
Как Claude помогает в UX
Claude полезен не только для генерации кода. Он может быть отличным инструментом для проектирования UX — если правильно его использовать.
Как Claude может помочь:
Генерация сценариев. Опишите задачу («бота для заказа пиццы»), и Claude предложит пошаговую структуру диалога.
Редактура текстов. Напишите черновик сообщения — Claude сделает его понятнее и короче.
Подбор кнопок. Claude может предложить оптимальные названия и группировку кнопок для конкретного сценария.
Анализ проблем. Опишите, на каком этапе пользователи путаются — Claude предложит решения.
Пример промпта для Claude:
"У меня Telegram-бот для создания постов. Пользователи часто ошибаются на этапе добавления кнопки — не понимают формат. Сейчас я прошу 'Введите текст и ссылку через |'. Как улучшить этот шаг? Предложи 3 варианта."
Но важно ограничивать Claude.
Без ограничений он может усложнить процесс: добавить лишние шаги, избыточные уточнения, перегрузить интерфейс. Всегда проверяйте предложения Claude на простоту.
Правило: если решение Claude кажется слишком сложным — оно слишком сложное. Упрощайте.
С ограничениями ("сделай максимально просто", "не больше 3 шагов", "одна кнопка") Claude даёт очень сильную основу, которую остаётся только доработать.
Итог
На этом этапе становится понятно, что основная сложность создания хорошего Telegram-бота — не в коде.
Код можно написать быстро. Claude сгенерирует обработчики, FSM, клавиатуры за пару промптов.
Сделать удобный продукт — сложнее. Это требует понимания пользователя, внимания к деталям, постоянного тестирования и доработок.
И именно здесь вайбкодинг даёт максимальную ценность.
Потому что вайбкодинг — это не про "написать код". Это про быстрые итерации: сделали → протестировали → увидели, что неудобно → переделали → снова тестируете.
Без вайбкодинга каждая правка UX — это часы работы. С вайбкодингом — минуты.
Ключевые выводы из статьи:
Что важно | Как проверить |
|---|---|
Первое сообщение | Понятно ли за 3 секунды, что делает бот? |
Кнопки | Понятны ли названия? Есть ли логическая группировка? |
Сценарий | Бот ведёт за руку или пользователь сам догадывается? |
FSM (состояния) | Бот помнит, где пользователь, даже после паузы? |
Текст | Конкретные инструкции или абстрактные фразы? |
Обратная связь | Есть понятный ответ на каждое действие? |
HTML-разметка | Сообщения читаются как структура или простыня? |
Проверьте своего бота по этому чеклисту. Скорее всего, найдётся хотя бы пара пунктов, которые можно улучшить прямо сейчас.
Если у вас ещё нет своего бота (или вы хотите лучшего)
Всего за 2 минуты вы можете создать своего полноценного Telegram-бота — с ИИ или без, с базой данных, аналитикой и логированием. Никакого кода писать не нужно. Просто выбираете параметры (язык бота, модель AI, нужна ли БД), нажимаете "Сгенерировать" — и через минуту получаете готового бота в ZIP-архиве или отдельными файлами с полной документацией.
10 моделей AI на выбор, поддержка SQLite, настройка под любые задачи, гибкая доставка и понятный гайд. Всё, чтобы ваш бот заработал сразу после установки.
👉 Переходите — создайте своего бота за 2 минуты: https://t.me/GenerateYourAIBot
Что дальше?
Это вторая часть.
Дальше логично перейти к более продвинутым вещам:
Автоматизация — как заставить бота работать без присмотра
Генерация ботов — как Claude помогает создавать целые системы, а не отдельных ботов
Масштабирование — когда один бот перестаёт справляться с нагрузкой
Построение систем — связка нескольких ботов, внешних API и баз данных
