telegram

@twa-dev/sdk: Как создавать Telegram Web Apps, которые реально работают

@twa-dev/sdk значительно упрощает разработку Telegram Web Apps. Рассказываем, что это такое, как настроить и на что обратить внимание.

Продвигайте ваш бизнес в Telegram

CRM, рассылки и поиск лидов. 1 неделя бесплатно.

Продвигайте ваш бизнес в Telegram

CRM, рассылки и поиск лидов. 1 неделя бесплатно.

Продвигайте ваш бизнес в Telegram

CRM, рассылки и поиск лидов. 1 неделя бесплатно.

Если вы пробовали создавать Telegram Web App (TWA) без какого-либо слоя абстракции, вы знаете, как это больно. Работать напрямую с window.Telegram.WebApp можно — но код получается многословным, поведение отличается на разных платформах, и никакой типобезопасности. Именно это и решает @twa-dev/sdk.

В этой статье мы разберём, что делает SDK, как его установить, какие у него ключевые возможности и с какими проблемами чаще всего сталкиваются разработчики. Без воды — только то, что нужно для запуска проекта.

Что такое @twa-dev/sdk?

@twa-dev/sdk — это open-source пакет для TypeScript/JavaScript, который оборачивает JavaScript API Telegram Web App. Он поддерживается сообществом и доступен на GitHub.

Нативный API Telegram Web App представлен глобальным объектом, который Telegram внедряет в ваш webview. Он работает, но создавался под браузерные среды, а не под современные TypeScript-фронтенды. @twa-dev/sdk даёт вам:

  • Полную типизацию TypeScript (больше не нужно гадать, какие поля существуют)

  • Реактивные обёртки вокруг событий Telegram

  • Единообразное поведение на iOS, Android и Telegram Desktop

  • Удобный опыт разработки с нормальными импортами модулей

Коротко: вы пишете меньше шаблонного кода и ловите больше ошибок на этапе компиляции, а не в два часа ночи, когда пользователь сообщает о краше.

Установка и настройка @twa-dev/sdk

Начать работу просто. Установите пакет через npm или yarn:

npm install @twa-dev/sdk
# или
yarn add @twa-dev/sdk
npm install @twa-dev/sdk
# или
yarn add @twa-dev/sdk
npm install @twa-dev/sdk
# или
yarn add @twa-dev/sdk

Затем импортируйте его в своё приложение. SDK экспортирует объект WebApp по умолчанию — он повторяет API Telegram Web App, но с типами и рядом приятных улучшений:

import WebApp from '@twa-dev/sdk';

WebApp.ready(); // Сообщаем Telegram, что приложение загружено
console.log(WebApp.initDataUnsafe.user); // Типизированный объект пользователя
import WebApp from '@twa-dev/sdk';

WebApp.ready(); // Сообщаем Telegram, что приложение загружено
console.log(WebApp.initDataUnsafe.user); // Типизированный объект пользователя
import WebApp from '@twa-dev/sdk';

WebApp.ready(); // Сообщаем Telegram, что приложение загружено
console.log(WebApp.initDataUnsafe.user); // Типизированный объект пользователя

Вот и всё для базовой настройки. Никаких конфигурационных файлов, никаких ритуалов. Если вы используете React, Vue или Svelte — просто подключается и работает.

На что обратить внимание

SDK предназначен для работы внутри среды Telegram WebView. Если вы попытаетесь запустить приложение в обычном браузере (например, при локальной разработке), window.Telegram.WebApp не будет существовать, и вы получите ошибки. Обычное решение — замокать объект локально или использовать среду тестирования Telegram Мини-приложений.

Используйте WebApp.isExpanded, WebApp.platform и проверки окружения, чтобы защитить платформозависимую логику во время разработки.

Ключевые возможности, которые вы будете использовать постоянно

Главная кнопка и кнопка «Назад»

В Telegram Web Apps есть нативные элементы интерфейса — Главная кнопка (большая кнопка внизу) и Кнопка «Назад» (в заголовке). Управлять ими через сырой API неудобно. С @twa-dev/sdk:

WebApp.MainButton.setText('Подтвердить заказ');
WebApp.MainButton.show();
WebApp.MainButton.onClick(() => handleConfirm());

WebApp.BackButton.show();
WebApp.BackButton.onClick(() => router.back());
WebApp.MainButton.setText('Подтвердить заказ');
WebApp.MainButton.show();
WebApp.MainButton.onClick(() => handleConfirm());

WebApp.BackButton.show();
WebApp.BackButton.onClick(() => router.back());
WebApp.MainButton.setText('Подтвердить заказ');
WebApp.MainButton.show();
WebApp.MainButton.onClick(() => handleConfirm());

WebApp.BackButton.show();
WebApp.BackButton.onClick(() => router.back());

Чисто, типизировано и предсказуемо. Вы будете использовать это постоянно в любом сколько-нибудь серьёзном мини-приложении.

Init Data и аутентификация пользователей

Когда пользователь открывает ваше TWA, Telegram внедряет initData — строку, содержащую информацию о пользователе, контекст чата и хэш, который можно проверить на сервере. SDK парсит это за вас:

const user = WebApp.initDataUnsafe.user;
// { id: 123456789, first_name: 'Alex', username: 'alex_dev', ... }
const user = WebApp.initDataUnsafe.user;
// { id: 123456789, first_name: 'Alex', username: 'alex_dev', ... }
const user = WebApp.initDataUnsafe.user;
// { id: 123456789, first_name: 'Alex', username: 'alex_dev', ... }

Всегда проверяйте initData на сервере — никогда не доверяйте только клиенту. Хэш подписан токеном вашего бота, поэтому его можно верифицировать через HMAC-SHA256. Именно так можно аутентифицировать пользователей без паролей и OAuth-потоков.

Haptic Feedback

Мелочь, а UX меняется кардинально. SDK предоставляет WebApp.HapticFeedback с тремя методами:

  • impactOccurred('light' | 'medium' | 'heavy' | 'rigid' | 'soft')

  • notificationOccurred('error' | 'success' | 'warning')

  • selectionChanged()

Используйте тактильный отклик, когда пользователи подтверждают действия, сталкиваются с ошибками или прокручивают списки. Это делает приложение ощущением нативным, а не обёрнутым сайтом.

Переменные темы и цветов

Telegram внедряет CSS-переменные для текущей темы пользователя (светлая/тёмная, кастомные цвета). SDK предоставляет к ним удобный доступ через WebApp.themeParams, поэтому вы можете строить интерфейс, который выглядит нативно вне зависимости от настроек темы Telegram у пользователя.

@twa-dev/sdk vs. сырой Telegram Web App API: в чём реальная разница?

Честно? Для небольших проектов можно обойтись и сырым API. Глобальный объект Telegram.WebApp хорошо задокументирован и не требует зависимостей.

Но как только проект вырастает за рамки одного файла, сырой API становится обузой:

  • Без типов TypeScript — постоянные каст-приведения к any и сюрпризы в рантайме

  • Обработка событий — ручная, и легко допустить утечку (забыть удалить слушатели)

  • Кросс-платформенные особенности (iOS vs. Android vs. Desktop) проявляются как баги в продакшне, а не как ошибки компиляции

@twa-dev/sdk — правильный выбор по умолчанию для любого серьёзного проекта. Цена зависимости минимальна. Улучшение опыта разработки — реальное.

Типичные ошибки при создании Telegram Web Apps

Даже с хорошим SDK люди наступают на одни и те же грабли. Вот на что обращать внимание:

  • Вызывать WebApp.ready() слишком поздно. Вызывайте как можно раньше — это сообщает Telegram, что приложение загружено, и убирает спиннер загрузки. Задержитесь — и пользователь дольше видит пустой экран.

  • Не обрабатывать изменения viewport. Появляется клавиатура — viewport уменьшается. Если вы не слушаете WebApp.onEvent('viewportChanged', ...), на мобильных устройствах вёрстка поедет.

  • Считать initDataUnsafe безопасным. Название говорит само за себя. Всегда верифицируйте строку initData на сервере, прежде чем доверять любым данным о пользователе.

  • Хардкодить цвета вместо использования переменных темы. Приложение будет выглядеть сломанным в тёмном режиме или у пользователей с кастомными темами Telegram.

  • Игнорировать WebApp.expand(). По умолчанию мини-приложение открывается в частичном виде. Вызовите WebApp.expand(), если хотите полноэкранный режим — большинству приложений это пойдёт на пользу.

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

Когда Telegram Web Apps имеют смысл для продаж и CRM-процессов

Вот где это становится интересным с деловой точки зрения. Telegram Web Apps — не только для игр и утилит. Их всё чаще используют для встраивания CRM-интерфейсов, форм захвата лидов, онбординг-потоков и дашбордов прямо внутри чатов Telegram.

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

Это принципиально другая воронка конверсии. Если вы строите кастомные Telegram-рабочие процессы поверх существующей CRM, стоит обратить внимание на CRMChat API — он создан специально для построения интеграций между Telegram и пайплайнами продаж, что отлично сочетается с фронтендами мини-приложений.

Для более широкого обзора возможностей Telegram Mini App API этот обзор Telegram Mini App API охватывает всё, что доступно за пределами SDK.

Итог

Используйте @twa-dev/sdk, если строите что-то серьёзнее прототипа за выходные. Он даёт типы, более чистую обработку событий и кросс-платформенное единообразие — и всё это бесплатно.

Ваш стартовый чеклист:

  1. Установите @twa-dev/sdk и замените сырые вызовы window.Telegram.WebApp

  2. Вызывайте WebApp.ready() как можно раньше

  3. Вызовите WebApp.expand(), если нужен полноэкранный режим

  4. Всегда верифицируйте initData на сервере

  5. Используйте переменные темы, чтобы интерфейс не ломался в тёмном режиме

  6. Тестируйте на реальных устройствах (iOS и Android), а не только в браузере

Вот фундамент. Стройте на нём.

Читать далее

Последние отобранные посты для вас