TRIBLY
Документация Tribly → Мини-приложения

Мини-приложения

Мини-приложение — веб-страница вашего сервиса, которая открывается внутри мессенджера из чата с ботом. Модель совместима с Telegram Mini Apps, поэтому готовые мини-аппы обычно заводятся без переделки.

Настраивает мини-приложения пользователь с правом «Мини-приложения». Мини-приложение заводится у своего бота — системные боты (botmother, botai, bothr, botsupport) работают без них.


Кому открыто приложение

Круг допущенных задаётся в настройках самого приложения, списком ролей.

Роль не выбрана — приложение видят двое: тот, кто завёл бота, и владелец системы. Каждая отмеченная роль добавляет к ним своих носителей. Гость мини-приложения не открывает.

Решение принимает мессенджер, а не страница: страница видит подписанный init_data и считает вошедшего допущенным, поэтому проверять права она обычно и не умеет. Отсюда и значение по умолчанию — новое приложение открыто тому, кто его завёл.

Круг действует на всё, что делает приложение: запуск, облачное хранилище и отправку данных владельцу. Меняется он на лету — у того, кто потерял доступ, кнопка запуска пропадает без переоткрытия чата.


Настройка бота

Метод Путь Назначение
GET /api/v1/miniapps Список ботов, которым можно включить мини-приложение
GET/PUT /api/v1/miniapps/:id Настройки: адрес страницы, включено/выключено, название, разрешённые домены, роли с доступом
GET /api/v1/miniapp/:botId/launch Запуск: отдаёт адрес страницы и подписанный init_data

SDK и демо

Вместе с сервером поставляются SDK и рабочее демо. Подключите SDK к своей странице:

<script src="https://<сервер>/web/sdk/messenger-app.js"></script>
<script>
  MessengerApp.ready();
  const user = MessengerApp.initDataUnsafe.user;
</script>

Демо лежит по адресу /web/miniapp-demo/: укажите его адресом страницы в настройках бота и посмотрите, как это работает. В SDK доступны window.MessengerApp и его алиас window.Telegram.WebApp.


Хранилище на стороне мессенджера

Мини-приложение может хранить у мессенджера небольшие данные пользователя — настройки и черновики:

Метод Путь Действие
POST /api/v1/miniapp/:botId/storage Записать пару {key, value}
GET /api/v1/miniapp/:botId/storage?keys=a,b Прочитать (без keys — список ключей)
DELETE /api/v1/miniapp/:botId/storage Удалить {keys:[...]}
POST /api/v1/miniapp/:botId/send-data Отправить данные владельцу бота

Ограничения хранилища: ключ до 128 символов, значение до 4096 байт, до 1024 ключей на пару «пользователь + бот»; разовая передача через send-data — до 4096 байт.


Проверка личности пользователя (обязательно)

Личность пользователя подтверждается подписью init_data. Проверяйте её на своём сервере: секрет есть только у него, страница подпись лишь передаёт:

secret = HMAC_SHA256(key="WebAppData", msg=токен_бота)
hash   = HMAC_SHA256(key=secret, msg=строка_проверки)

где строка проверки — это отсортированные по алфавиту пары ключ=значение, соединённые переводом строки (без самого hash). Токен бота выдаёт botmother командой /token; храните его как секрет сервера. Схема совпадает с Telegram Mini Apps — подходит любая библиотека проверки Telegram-initData.

Подписанные поля:

Поле Содержимое
user id, username, display_name, avatar, is_server_owner, is_bot_owner
bot_id номер бота на этом сервере
server_url публичный адрес сервера мессенджера
license_number номер лицензии сервера — тот же, что называют в поддержке
auth_date момент выдачи, unix-секунды
query_id случайное значение на каждое открытие
start_param параметр запуска

После подписи проверяются три вещи: auth_date укладывается в ваше окно (для входа — 5–15 минут; мессенджер принимает init_data обратно в течение 24 часов), bot_id — бот, чьим токеном проверяли, личность — user.id.

Бэкенд, обслуживающий несколько серверов, хранит токен бота по license_number и проверяет подпись токеном того сервера, чей номер пришёл. Метка лежит внутри подписи: сходится подпись только у токена того сервера, чей номер указан.

Готовые примеры проверки на Go и Node.js — в docs/MINIAPP_INIT_DATA.md репозитория.


Доверенные origin

Поле в настройках бота действует в веб-версии мессенджера, где страница живёт во фрейме и общается с приложением через postMessage. Сообщения принимаются с origin самой страницы и с перечисленных в поле — так страница, ушедшая своим потоком входа на соседний домен владельца, продолжает говорить с приложением. Подписанные данные запуска уходят только на origin страницы.

Для страницы на адресе самого мессенджера поле остаётся пустым.


Требования к странице мини-приложения

  • Разрешите встраивание страницы во фрейм политикой Content-Security-Policy: frame-ancestors — так она открывается в веб-версии.
  • Работайте по HTTPS, если мессенджер работает по HTTPS; куки сессии — SameSite=None; Secure.
  • Сделайте адаптивную вёрстку (<meta name="viewport" ...>): страница открывается в узком окне.
  • Перечислите домены своей страницы в списке разрешённых доменов в настройках бота.

Мини-приложению доступны подписанные данные пользователя и методы хранилища из SDK.

Смежные страницы: «Боты и Bot API».