Skip to content

Конструктор меню ​

Меню бота собирается в кабинете, экран «Конструктор меню»: слева дерево экранов, в центре редактор кнопки, справа живое превью чата. Сохранили — бот уже отвечает новым меню: дерево читается из БД при каждом рендере, рестарты не нужны.

Конструктор меню в кабинете

Дерево экранов ​

Меню — дерево. Кнопки верхнего уровня — главное меню; кнопка типа «экран» открывает подменю со своим текстом сообщения, картинкой и собственными кнопками. Вложенность не ограничена, удаление узла убирает всё его поддерево. Порядок кнопок меняется стрелками ↑/↓ в редакторе. Рендер поддерживает ряды: кнопки с одинаковым row_index встают рядом, а не столбиком — так, например, свёрстано дефолтное меню.

Типы кнопок ​

ТипЧто делаетPayload
Экран (screen)Открывает подменю со своим текстом (до 4096 символов) и опциональной картинкойТекст экрана
Действие (action)Вызывает встроенный экран ботаКод действия
Ссылка (link)Открывает URLhttps://…
Мини-аппа (miniapp)Открывает Mini App нативной web_app-кнопкой— (URL берётся из настройки SUBSCRIPTION_MINI_APP_URL)
Назад (back)Поднимает на уровень вверх—

Коды действий бот отдаёт кабинету сам (GET /api/admin/bot-menu/actions), выбирать можно из полного каталога: buy, subscription, connect, devices, balance, history, promocode, referral, trial, cabinet, nodes, proxy, support. Часть действий (подписка, подключение, устройства) требует активной подписки — бот сам разберётся, что показать юзеру без неё.

Экранам можно загрузить картинку или анимацию (jpg/png/webp, а также gif/mp4) — она показывается над текстом экрана. Анимация отправляется как animation (живой GIF), а не застывшим кадром. Подпись к медиа Telegram ограничивает 1024 символами; если файл недоступен, бот покажет экран текстом.

Цвета кнопок ​

Telegram Bot API поддерживает три фиксированных стиля кнопок, поэтому любой выбранный HEX-цвет мапится на ближайший стиль:

ЦветСтиль Bot API
Преобладает зелёныйsuccess
Преобладает красныйdanger
Остальныеprimary
Пустостандартная кнопка

В редакторе — палитра пресетов (#31A24C, #2E63E7, #E53935, #F59E0B, #7C5CFF, #111111) плюс поле для произвольного HEX (#RGB / #RRGGBB / #RRGGBBAA). Цвет всем кнопкам сразу задаёт настройка BUTTON_COLOR_DEFAULT; цвет конкретной кнопки её перекрывает.

Превью ≠ клиент Telegram

Превью в кабинете красит кнопку ровно в выбранный HEX. В самом Telegram кнопка получит один из трёх стилей выше — точный оттенок клиент не отобразит.

Эмодзи и стикеры на кнопках ​

Telegram не разрешает ставить стикеры или премиум-эмодзи внутрь inline-кнопок — в подписи кнопки только текст и обычные эмодзи (это ограничение платформы, обойти его нельзя). Обычный эмодзи ставится прямо в подпись кнопки — вставь любой в поле «Текст кнопки». Для «живого» брендинга над кнопками используй GIF/MP4-баннер (см. «Картинка / GIF экрана» выше и баннер главного меню через /setbanner ответом на GIF).

Живое превью и сохранение ​

Правая колонка — превью чата: текст выбранного экрана, его картинка и кнопки в заданных цветах. Клик по кнопке в превью выбирает её для редактирования. Кнопка «Сохранить» отправляет всё дерево целиком; сервер валидирует ссылки на родителей и отсутствие циклов, после чего меню сразу живое.

Дефолтное меню ​

Свежий магазин стартует не с пустого экрана: при первом запуске в конструктор сеется встроенное меню из трёх кнопок — «🛒 Купить VPN» (зелёная), «👤 Личный кабинет» и «🔌 Подключить» во втором ряду. Оно полностью редактируемое. Если владелец удалил все кнопки, бот показывает то же дефолтное меню как fallback. Вернуть исходный вариант можно в любой момент — действие «сбросить к дефолту» (POST /api/admin/bot-menu/reset-default) заменяет текущее дерево стартовым.

Кастомное меню не перетирается

При обновлениях платформа апгрейдит только нетронутый дефолт прежних версий. Меню, которое владелец менял, ни один деплой не трогает.

Кнопки «Личного кабинета» ​

Экран «Личный кабинет» (открывается кнопкой cabinet) — отдельный встроенный экран: сверху живой профиль (имя, подписка, баланс, дни, трафик), ниже — кнопки аккаунта. Раньше этот набор был фиксированным; теперь он редактируется прямо под конструктором меню, в блоке «Кнопки Личного кабинета»: выключи лишние тумблером, поменяй порядок стрелками, сохрани. Каталог: subscription, balance, history, referral, promocode, support.

Хранится в настройке CABINET_BUTTONS (список через запятую — как CONNECTION_APPS), так что то же самое можно править и в настройках текстом. Кнопки balance и referral дополнительно скрываются, если фича выключена (BALANCE_ENABLED / REFERRAL_ENABLED) — так отключённая функция не оставляет «мёртвую» кнопку. «Открыть приложение» и «‹ Меню» бот добавляет к экрану сам.

API: GET /api/admin/bot-menu/cabinet (каталог + включённые), PUT /api/admin/bot-menu/cabinet ({"order": [...]}).

Умные кнопки ​

Часть кнопок бот добавляет сам, только когда они применимы — их не нужно (и не получится) держать в дереве постоянно:

  • 🎁 Попробовать бесплатно — если триал включён и ещё доступен юзеру, а кнопки trial нет в дереве;
  • 🔌 MTProto-прокси — если включены MTPROTO_PROXY_ENABLED и задан MTPROTO_PROXY_URL;
  • 🌍 Статус серверов — если включён NODE_STATUS_ENABLED;
  • 📱 Открыть приложение — заметная кнопка мини-аппы сверху меню, если задан SUBSCRIPTION_MINI_APP_URL и владелец не поставил свою miniapp-кнопку;
  • 🛠 Админка — только персоналу.

Inline или reply ​

Настройка MAIN_MENU_MODE переключает главное меню между двумя режимами:

ЗначениеПоведение
inline (дефолт)Кнопки под сообщением-баннером
replyПостоянная клавиатура-панель под полем ввода: кнопки верхнего уровня + умные кнопки + кнопка мини-аппы. Вложенные экраны остаются inline. Кнопки-ссылки в reply-клавиатуре становятся обычными текстовыми

Связанные настройки ​

КлючДефолтЧто делает
MAIN_MENU_MODEinlineРежим главного меню: inline / reply
BUTTON_COLOR_DEFAULTпустоЦвет всех кнопок по умолчанию (#HEX)
SUBSCRIPTION_MINI_APP_URLпустоURL мини-аппы для web_app-кнопок
CABINET_BUTTONSвсеКнопки экрана «Личный кабинет» (порядок + какие показывать)
WELCOME_STICKERпустоСтикер над /start (задаётся из бота командой /setsticker ответом на стикер)
START_MESSAGE«👋 Это твой личный VPN…»Текст главного экрана (/start)

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

MIT License · сделано для тех, кто продаёт VPN, а не настраивает ботов