Mock Telegram Mini App environment with cryptographically valid init data signatures for development and testing
npm install telegram-mock-init-dataEnglish | Русский
Библиотека для мокирования окружения Telegram Mini Apps с криптографически валидной подписью init data в целях разработки и тестирования.
Оригинальная библиотека @tma.js/bridge предоставляет метод mockTelegramEnv, однако он не генерирует валидную HMAC-SHA256 подпись для init data. Это делает невозможным тестирование серверной части приложения, которая проверяет подлинность данных от Telegram.
telegram-mock-init-data решает эту проблему, предоставляя полностью валидные подписи с использованием Web Crypto API.
- 🔐 Правильная подпись Init Data - Криптографически корректные HMAC-SHA256 подписи с использованием Web Crypto API
- 🎨 Настройка темы - Включает тёмную тему по умолчанию с возможностью кастомизации
- 🔄 Перехват событий - Возможность перехватывать и обрабатывать события Telegram Mini Apps
- 💾 Работа со Storage - Автоматическое сохранение параметров в sessionStorage
- 🌐 Поддержка iframe - Работает как в iframe, так и в standalone окружении
- 🧪 Готовность к тестированию - Специально разработана для использования в тестах
- 📦 Без конфигурации - Работает из коробки с разумными значениями по умолчанию
- 🔧 TypeScript First - Полная поддержка TypeScript с определениями типов
- 🌐 Browser-First - Без зависимостей от Node.js, работает в любом современном браузере
``bash`
npm install telegram-mock-init-dataили
pnpm add telegram-mock-init-dataили
yarn add telegram-mock-init-data
Библиотека требует следующие peer dependencies:
`bash`
npm install @tma.js/sdk @tma.js/types @tma.js/toolkit @tma.js/transformers @tma.js/bridge
Простая генерация launch параметров без настройки окружения:
`typescript
import { mockTelegramEnvExtended } from 'telegram-mock-init-data'
// Генерируем только launch параметры
const launchParams = await mockTelegramEnvExtended({
user: {
id: 123456,
first_name: 'Иван',
last_name: 'Петров',
username: 'ivan_petrov',
language_code: 'ru',
is_premium: true,
},
botToken: 'YOUR_BOT_TOKEN',
})
console.log('Launch params:', launchParams)
// Теперь можно использовать эту строку для инициализации приложения
`
Генерация параметров + автоматическая настройка окружения (storage + TelegramWebviewProxy):
`typescript
import { mockTelegramEnvExtended } from 'telegram-mock-init-data'
// Генерация параметров + настройка окружения
await mockTelegramEnvExtended({
user: {
id: 123456,
first_name: 'Иван',
username: 'ivan_petrov',
},
botToken: 'YOUR_BOT_TOKEN',
setupEnvironment: true, // 👈 Автоматически сохраняет в storage и настраивает окружение
})
// Теперь можно использовать @tma.js/sdk
import { retrieveLaunchParams } from '@tma.js/sdk'
const params = retrieveLaunchParams() // Параметры будут доступны из storage!
`
`typescript
import { mockTelegramEnvExtended, DEFAULT_MOCK_USER } from '@bazaar/telegram-mock'
await mockTelegramEnvExtended({
user: {
id: 99281932,
first_name: 'Андрей',
last_name: 'Рогов',
username: 'rogue',
language_code: 'en',
is_premium: true,
allows_write_to_pm: true,
photo_url: 'https://telegram.org/img/t_logo.png',
},
botToken: process.env.TELEGRAM_BOT_TOKEN,
queryId: 'custom_query_id',
chatInstance: '1234567890',
chatType: 'private',
startParam: 'debug_mode',
platform: 'ios',
version: '7.2',
themeParams: {
bg_color: '#ffffff',
text_color: '#000000',
button_color: '#0088cc',
},
setupEnvironment: true,
})
`
Вы можете перехватывать события, которые отправляет ваше приложение в Telegram:
`typescript
import { mockTelegramEnvExtended } from 'telegram-mock-init-data'
await mockTelegramEnvExtended({
user: { id: 123456, first_name: 'Иван' },
botToken: 'YOUR_BOT_TOKEN',
setupEnvironment: true,
onEvent: (event, next) => {
console.log('📤 Событие:', event.name)
console.log('📦 Параметры:', event.params)
// Можно изменить поведение или добавить логирование
if (event.name === 'web_app_data_send') {
console.log('✉️ Отправка данных боту:', event.params)
}
if (event.name === 'web_app_close') {
console.log('❌ Приложение закрывается')
}
// Вызвать оригинальный обработчик
next()
},
})
// Теперь все вызовы postEvent будут перехватываться
`
`typescript
import { describe, it, expect, beforeEach } from 'vitest'
import { mockTelegramEnvExtended } from '@bazaar/telegram-mock'
import { retrieveLaunchParams } from '@tma.js/sdk'
describe('Telegram Mini App', () => {
beforeEach(async () => {
// Настройка мок-окружения перед каждым тестом
await mockTelegramEnvExtended({
user: {
id: 123456,
first_name: 'Тест',
username: 'test_user',
},
botToken: 'test_bot_token',
setupEnvironment: true,
})
})
it('должен получить launch параметры', () => {
const params = retrieveLaunchParams()
expect(params.tgWebAppPlatform).toBe('tdesktop')
expect(params.tgWebAppData?.user?.id).toBe(123456)
})
})
`
Генерирует launch параметры для Telegram Mini App с возможностью автоматической настройки окружения.
#### Параметры
Данные пользователя:
- config.user (опционально) - Данные пользователя для мок-окруженияid
- (number) - Telegram user IDfirst_name
- (string) - Имя пользователяlast_name
- (string, опционально) - Фамилия пользователяusername
- (string, опционально) - Username пользователяlanguage_code
- (string, опционально) - Код языка (IETF), например 'ru', 'en'is_premium
- (boolean, опционально) - Premium статус пользователяis_bot
- (boolean, опционально) - Является ли ботallows_write_to_pm
- (boolean, опционально) - Разрешение боту писать личные сообщенияphoto_url
- (string, опционально) - URL фото профиля
Конфигурация окружения:
- config.botToken (string, требуется) - Токен Telegram бота для подписи init dataconfig.queryId
- (string, опционально) - Query ID для мок-сессии'AAF4s85OAAAAALizzk7h'
- По умолчанию: config.chatInstance
- (string, опционально) - Chat instance ID'8428209589180549439'
- По умолчанию: config.chatType
- (string, опционально) - Тип чата'sender'
- По умолчанию: 'sender' | 'private' | 'group' | 'supergroup' | 'channel'
- Опции: config.startParam
- (string, опционально) - Start параметр из прямой ссылкиconfig.platform
- (string, опционально) - Идентификатор платформы'tdesktop'
- По умолчанию: 'tdesktop' | 'android' | 'ios' | 'macos' | 'web'
- Опции: config.version
- (string, опционально) - Версия Telegram Mini App'7.0'
- По умолчанию: config.themeParams
- (object, опционально) - Кастомные параметры темыbg_color
- - Цвет фонаtext_color
- - Цвет текстаhint_color
- - Цвет подсказокlink_color
- - Цвет ссылокbutton_color
- - Цвет кнопок
- И другие параметры темы Telegram
Расширенные опции:
- config.setupEnvironment (boolean, опционально) - Автоматически настроить окружениеfalse
- По умолчанию: sessionStorage
- Что делает:
- ✅ Сохраняет launch параметры в TelegramWebviewProxy.postEvent
- ✅ Настраивает (для non-iframe)window.parent.postMessage
- ✅ Перехватывает (для iframe)
- ✅ Валидирует launch параметры
- config.onEvent (function, опционально) - Callback для перехвата событий Telegram Mini Apps`
typescript`
onEvent: (event: { name: string, params: unknown }, next: () => void) => void
event.name
- - Имя события (например: 'web_app_data_send', 'web_app_close')event.params
- - Параметры событияnext()
- - Функция для вызова оригинального обработчика
- config.resetPostMessage (boolean, опционально) - Сбросить предыдущие модификации postMessagefalse
- По умолчанию:
#### Возвращает
Promise - URL-encoded строка с launch параметрами
Пример возвращаемого значения:
``
tgWebAppData=user%3D%7B%22id%22%3A123456...&tgWebAppThemeParams=%7B%22bg_color%22...&tgWebAppVersion=7.0&tgWebAppPlatform=tdesktop
#### DEFAULT_MOCK_USER
Дефолтный пользователь для быстрого старта:
`typescript`
{
id: 512345678,
is_bot: false,
first_name: 'Иван',
last_name: 'Петров',
username: 'ivan_petrov',
language_code: 'ru',
is_premium: true,
allows_write_to_pm: true,
photo_url: 'https://t.me/i/userpic/320/abc123.png',
}
#### DEFAULT_THEME_PARAMS
Параметры тёмной темы по умолчанию:
`typescript`
{
accent_text_color: '#6ab2f2',
bg_color: '#17212b',
button_color: '#5288c1',
button_text_color: '#ffffff',
destructive_text_color: '#ec3942',
header_bg_color: '#17212b',
hint_color: '#708499',
link_color: '#6ab3f3',
secondary_bg_color: '#232e3c',
section_bg_color: '#17212b',
section_header_text_color: '#6ab3f3',
subtitle_text_color: '#708499',
text_color: '#f5f5f5',
}
#### InvalidLaunchParamsError
Выбрасывается, когда сгенерированные launch параметры невалидны:
`typescript`
try {
await mockTelegramEnvExtended({
botToken: 'invalid_token',
setupEnvironment: true,
})
} catch (error) {
if (error instanceof InvalidLaunchParamsError) {
console.error('Невалидные launch параметры:', error.message)
console.error('Причина:', error.cause)
}
}
Пакет полностью написан на TypeScript и предоставляет все необходимые типы:
`typescript
import type {
MockUser,
MockTelegramConfig,
MockTelegramEnvExtendedOptions,
InvalidLaunchParamsError,
} from 'telegram-mock-init-data'
// Пример использования типов
const user: MockUser = {
id: 123456,
first_name: 'Иван',
username: 'ivan_petrov',
}
const config: MockTelegramEnvExtendedOptions = {
user,
botToken: 'token',
setupEnvironment: true,
onEvent: (event, next) => {
console.log(event.name)
next()
},
}
`
Библиотека полностью совместима с @tma.js:
✅ Использует те же библиотеки:
- @tma.js/toolkit - для работы со storage@tma.js/transformers
- - для парсинга и валидации@tma.js/bridge
- - для определения окружения
✅ Совместимость с функциями:
- retrieveLaunchParams() из @tma.js/sdk - работает из коробкиpostEvent()
- - перехватывается через onEventminiAppsMessage()
- - используется для валидации сообщений
✅ Поддержка окружений:
- iframe (с window.parent.postMessage)TelegramWebviewProxy
- standalone (с )
`typescript
// vitest.setup.ts
import { beforeAll } from 'vitest'
import { mockTelegramEnvExtended } from '@bazaar/telegram-mock'
beforeAll(async () => {
await mockTelegramEnvExtended({
user: {
id: 123456,
first_name: 'Test User',
username: 'test_user',
},
botToken: process.env.TEST_BOT_TOKEN || 'test_token',
setupEnvironment: true,
})
})
`
`typescript
// src/main.ts
import { mockTelegramEnvExtended } from '@bazaar/telegram-mock'
// В development режиме настраиваем мок-окружение
if (import.meta.env.DEV) {
await mockTelegramEnvExtended({
botToken: import.meta.env.VITE_BOT_TOKEN,
setupEnvironment: true,
onEvent: (event, next) => {
console.log('[Mock] Event:', event.name, event.params)
next()
},
})
}
// Далее обычная инициализация приложения
import { init } from '@tma.js/sdk'
init()
`
`bashУстановить зависимости
pnpm install
MIT
Contributions приветствуются! Пожалуйста, создавайте Pull Request или Issue.
- @tma.js Documentation
- Telegram Mini Apps Guide
- Web Crypto API