Написать в Telegram@Odilient

TELEGRAM-БОТ

Мини-приложение BiliMind в Telegram

Мини-приложение BiliMind в Telegram: открывает сгенерированные ИИ курсы прямо из чата, незаметно авторизует учащихся по подписанным initData от Telegram и обходится без формы регистрации.

Собственный продукт
Клиент
Образование
Отрасль
В развитии
Срок
2026
Год
С чего всё началось

Задача

В Узбекистане и странах СНГ Telegram — зачастую тот самый аккаунт, который у человека уже есть, а каждая форма регистрации стоит части учащихся. Мини-приложение должно было авторизовывать людей без пароля и email, отклонять поддельные и повторно отправленные данные, не терять контекст, когда стартовые данные Telegram исчезают после первого перехода внутри приложения, и ничего не добавлять к весу сайта для тех, кто никогда не открывает его в Telegram.

Что мы сделали

Решение

Мы сделали бесшовный вход на стороне и бэкенда, и фронтенда. Эндпоинт на Laravel проверяет HMAC-подпись initData по токену бота за константное время, по умолчанию отклоняет данные старше 24 часов и находит или создаёт учащегося по Telegram ID вставкой, защищённой от гонок, — с персональной организацией и токеном Sanctum. Клиент на Nuxt распознаёт запуск мини-приложения по стартовому хэшу, сохраняет этот контекст, загружает SDK Telegram только при необходимости и сразу открывает учащемуся экран «Сегодня».

Технологии
Telegram Mini AppsLaravelLaravel SanctumNuxt 4Vue 3TypeScriptPostgreSQL
За кулисами

Как всё создавалось

Мини-приложение в Telegram, которое открывает ИИ-курсы без регистрации

BiliMind работает в вебе, в сборках для Android и iOS и внутри Telegram. Этот кейс — о входе через Telegram: мини-приложение для генератора ИИ-курсов BiliMind, которое открывается из чата, незаметно авторизует учащегося и сразу показывает ему экран «Сегодня» с уроками и повторениями на день. Формы регистрации нет. Аккаунт в Telegram и становится аккаунтом в BiliMind.

Это сознательно не чат-бот. Это разработка Telegram Mini App в строгом смысле: идентификация, работа с сессиями и полноценное веб-приложение на Nuxt внутри webview Telegram.

Ключевые возможности

  • Бесшовный вход — при запуске подписанные initData от Telegram обмениваются на сессию BiliMind, поэтому учащийся вообще не видит формы входа.
  • Проверка подписи и защита от повторов — проверка HMAC-SHA256 по спецификации Telegram, сравнение хэшей за константное время и окно свежести auth_date — по умолчанию 24 часа.
  • Аккаунты без гонок — пользователи находятся или создаются по Telegram ID через createOrFirst, поэтому два одновременных запуска никогда не создадут дубликат аккаунта.
  • Единая модель аккаунтов — новый пользователь из Telegram получает персональную «организацию из одного человека» и токен Sanctum, а ответ повторяет формат входа по email, поэтому фронтенд обрабатывает оба пути одинаково.
  • Диплинки работают как надо — запуск, который попадает на главную, страницу входа или регистрации, сразу ведёт на «Сегодня», а ссылки на расшаренный курс или конкретный урок открываются там, куда указывают.
  • Никакой нагрузки для веб-посетителей — SDK Telegram подгружается только после того, как обнаружен запуск мини-приложения, а не блокирующим скриптом на каждой странице.

Как это работает

Бэкенд на Laravel

POST /api/auth/telegram обязан быть публичным — именно этот эндпоинт выпускает токен, — поэтому он использует тот же ограничитель частоты запросов, что вход и регистрация. TelegramService сортирует поля данных в строку для проверки, выводит секретный ключ из токена бота, сравнивает хэши через hash_equals и считает данные без auth_date устаревшими. Если пользователь уже существует, обновляется сохранённое имя пользователя в Telegram, а недостающая персональная организация восстанавливается. Обход проверки только для разработки позволяет прогонять сценарий локально без настоящего бота и в продакшене выключен. Схема «найти или создать по Telegram ID» — та же, что мы используем в Bronjoy.

Фронтенд на Nuxt

Сигналы запуска от Telegram ненадёжны. Хэш #tgWebAppData исчезает при первой навигации на клиенте, а window.Telegram.WebApp.initData появляется только после выполнения SDK. Мы сохраняем контекст мини-приложения в момент, когда появляется любой из этих сигналов, — в долгоживущую cookie, которая переживает 30-дневную cookie авторизации. Поэтому повторно открытый webview с устаревшим токеном заново авторизуется через initData, а не выкидывается на форму входа. У webview Telegram собственное хранилище cookie, так что этот флаг никогда не попадает в обычный браузер.

Клиентский плагин выполняется раньше глобального guard авторизации, одновременные вызовы делят один выполняющийся запрос на вход, а приложение вызывает ready() и expand(), чтобы занять всю высоту экрана. В обычном браузере или в нативной мобильной оболочке всё это тихо превращается в пустые вызовы.

Наша роль

Мы спроектировали и сделали вход в мини-приложение целиком — эндпоинт и сервис проверки на Laravel, а также логику распознавания запуска и сессий на Nuxt — как часть нашего собственного продукта BiliMind.

Смежные работы

Сам генератор курсов описан в основном кейсе BiliMind. Эта работа входит в наши услуги по разработке Telegram-ботов и разработке веб-приложений, а Telegram-бот для записи Bronjoy показывает бота и мини-приложение, созданные для записи клиентов.

Создадим вместе

Хотите что-то вроде Мини-приложение BiliMind в Telegram?

Расскажите, что должен делать ваш продукт. Мы определим объём работ, распишем сроки и пришлём фиксированную цену — бесплатно и без обязательств продолжать.

Бесплатная консультация Без обязательств Быстрый ответ