Telegram Bot API
🌐 Русский

Тестирование Telegram Mini App: от браузера до отладки на телефоне

· 9 мин чтения

Тестирование Mini App удобно строить в три слоя: сначала вёрстка и логика в обычном браузере с эмуляцией Telegram.WebApp, затем запуск внутри Telegram через HTTPS-туннель с DevTools на устройстве и, наконец, проверка initData на сервере. Ниже — пошаговый план с командами и кодом, а в конце чек-лист, который закрывает классическое «в браузере работает, а в Telegram — нет».

Шаг 1. Тест Mini App в обычном браузере

Mini App — это обычная веб-страница с подключённым скриптом telegram-web-app.js. В браузере объект window.Telegram.WebApp тоже появится, но без данных: initData — пустая строка, пользователя и цветов темы нет. Поэтому сразу закладывайте запасные значения:

<!DOCTYPE html>
<html lang="ru">
<head>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <script src="https://telegram.org/js/telegram-web-app.js"></script>
</head>
<body>
  <h1 id="hello">Загрузка…</h1>
  <script>
    const tg = window.Telegram.WebApp;
    // вне Telegram initData пустой, а initDataUnsafe.user отсутствует
    const user = tg.initDataUnsafe.user ?? { first_name: 'Тестовый пользователь' };
    document.getElementById('hello').textContent = `Привет, ${user.first_name}!`;
    document.body.style.background = tg.themeParams.bg_color || '#ffffff';
    tg.ready();
  </script>
</body>
</html>

Чтобы не писать моки вручную, откройте Mini App Tester. В обычном браузере он работает в mock-режиме: эмулирует Telegram.WebApp, показывает живую панель свойств (version, platform, colorScheme, initData, themeParams, safe areas) и лог более чем 45 событий. Так можно разобраться, как ведут себя кнопки, попапы, CloudStorage и другие API, ещё до деплоя.

Шаг 2. Как сделать Mini App в Telegram и привязать к боту

Чтобы мини-апп открывался внутри Telegram, нужны бот (как его создать — в гайде как создать бота в Telegram) и HTTPS-адрес страницы. Способы запуска:

Для отладки удобнее всего кнопка меню: её можно перенастроить одним запросом, не заходя в @BotFather.

curl -s -X POST "https://api.telegram.org/bot$TOKEN/setChatMenuButton" \
  -H "Content-Type: application/json" \
  -d '{
    "chat_id": 123456789,
    "menu_button": {
      "type": "web_app",
      "text": "Открыть приложение",
      "web_app": {"url": "https://example.trycloudflare.com"}
    }
  }'

Если передать chat_id своего личного чата с ботом, кнопка изменится только у вас — остальные пользователи продолжат видеть рабочую версию. Готовый тестер тоже можно сразу указать как URL Mini App: https://telegram-bot-api.info/telegram-mini-app-tester.html — внутри Telegram он покажет реальные данные клиента.

Шаг 3. Telegram Mini App на localhost: HTTPS-туннель

Telegram открывает Mini App только по HTTPS, а localhost вашего компьютера с телефона недоступен. Решение — туннель, который выдаёт публичный HTTPS-адрес и проксирует запросы на локальный порт:

# dev-сервер уже запущен, например Vite на порту 5173

# вариант 1: Cloudflare Quick Tunnel
cloudflared tunnel --url http://localhost:5173

# вариант 2: ngrok
ngrok http 5173

Скопируйте выданный адрес https://… и пропишите его в @BotFather или через setChatMenuButton. Несколько граблей:

Шаг 4. Тестовая среда Telegram

У Telegram есть отдельная тестовая среда со своими аккаунтами и ботами. Главный плюс для Mini Apps — там разрешены HTTP-ссылки без TLS. Как войти:

Среда полностью отдельная: понадобятся новый аккаунт и новый бот, созданный через @BotFather уже внутри неё. Запросы к API такого бота отправляются на https://api.telegram.org/bot<token>/test/METHOD_NAME.

Шаг 5. Отладка Mini App внутри Telegram

ПлатформаКак включить DevTools
iOS10 нажатий на иконку настроек → Allow Web View Inspection; подключите iPhone к Mac по USB и откройте в Safari меню Develop → ваше устройство
AndroidВключите отладку по USB; в настройках Telegram пролистайте вниз и дважды нажмите и удерживайте номер версии → Enable WebView Debug; откройте chrome://inspect/#devices в Chrome
Telegram Desktop (Windows, Linux)Бета-версия: Settings → Advanced → Experimental settings → Enable webview inspection; правый клик в Mini App → Inspect
Telegram для macOSБета-версия: 5 быстрых кликов по иконке настроек → Debug Mini Apps; правый клик → Inspect Element

Пункты меню иногда меняются, поэтому сверяйтесь с официальным разделом Debug Mode for Mini Apps. Если подключить DevTools не получается, откройте на устройстве Mini App Tester: он покажет version, platform, тему, safe areas и все события, которые присылает клиент.

Шаг 6. Проверка initData на сервере

Данным из initDataUnsafe доверять нельзя: их легко подменить. Передавайте на бэкенд сырую строку Telegram.WebApp.initData (например, в заголовке Authorization) и проверяйте подпись:

  1. разберите строку как query string и извлеките hash;
  2. соберите data_check_string: все остальные поля в виде key=value, отсортированные по ключу и соединённые символом \n (убирается только hash);
  3. вычислите secret_key = HMAC_SHA256(key="WebAppData", message=bot_token);
  4. данные подлинные, если hex(HMAC_SHA256(key=secret_key, message=data_check_string)) совпадает с hash;
  5. проверьте свежесть auth_date, чтобы не принимать старые данные повторно.

Node.js:

import crypto from 'node:crypto';

export function validateInitData(initData, botToken, maxAgeSec = 3600) {
  const params = new URLSearchParams(initData);
  const hash = params.get('hash');
  if (!hash) return null;
  params.delete('hash');

  const dataCheckString = [...params.entries()]
    .map(([key, value]) => `${key}=${value}`)
    .sort()
    .join('\n');

  const secretKey = crypto.createHmac('sha256', 'WebAppData').update(botToken).digest();
  const expected = crypto.createHmac('sha256', secretKey).update(dataCheckString).digest();
  const received = Buffer.from(hash, 'hex');
  if (received.length !== expected.length || !crypto.timingSafeEqual(received, expected)) return null;

  const authDate = Number(params.get('auth_date'));
  if (!authDate || Date.now() / 1000 - authDate > maxAgeSec) return null;

  return { ...Object.fromEntries(params), user: JSON.parse(params.get('user') ?? 'null') };
}

Python:

import hashlib, hmac, json, time
from urllib.parse import parse_qsl

def validate_init_data(init_data: str, bot_token: str, max_age: int = 3600):
    data = dict(parse_qsl(init_data, keep_blank_values=True))
    received_hash = data.pop("hash", "")
    check_string = "\n".join(f"{k}={v}" for k, v in sorted(data.items()))
    secret_key = hmac.new(b"WebAppData", bot_token.encode(), hashlib.sha256).digest()
    expected = hmac.new(secret_key, check_string.encode(), hashlib.sha256).hexdigest()
    if not hmac.compare_digest(expected, received_hash):
        return None
    if time.time() - int(data.get("auth_date", 0)) > max_age:
        return None
    data["user"] = json.loads(data.get("user", "null"))
    return data

Две частые ошибки: считать подпись от строки, не декодированной из URL (значения сначала нужно раскодировать, как это делают URLSearchParams и parse_qsl), и перепутать аргументы первого HMAC — строка WebAppData служит ключом, а токен бота — сообщением.

Bot API 10.2: защита методов Mini App

Начиная с Bot API 10.2 Telegram блокирует вызовы методов Mini App со страниц, origin которых отличается от домена самого приложения. Для всех Mini Apps защита включилась автоматически 20 июля 2026 года. Отключить её можно в Mini App @BotFather, но тогда вы сами отвечаете за то, чтобы в приложении не было ссылок на недоверенные сайты. Что это значит для тестов:

Чек-лист тестирования Mini App перед релизом

Дальше пригодятся гайды как получить токен бота (он нужен для проверки initData) и что нового в Bot API 10.3. Кнопку меню с адресом вашего Mini App можно настроить прямо в браузере: setChatMenuButton в Bot API Tester.

Частые вопросы

Можно ли открыть Telegram Mini App в обычном браузере?

Да, но Telegram.WebApp там будет без данных: initData пустой, нет пользователя и цветов темы. Вёрстку и логику проверяйте в mock-режиме, например в Mini App Tester, а нативные функции — уже внутри Telegram.

Как протестировать Mini App на localhost?

Поднимите HTTPS-туннель к локальному порту (например, cloudflared или ngrok) и укажите выданный адрес в @BotFather или через setChatMenuButton. Telegram требует HTTPS; HTTP-ссылки разрешены только в тестовой среде.

Как сделать мини апп в телеграм и подключить к боту?

Разместите веб-страницу с подключённым telegram-web-app.js на HTTPS и привяжите её к боту: командой /newapp в @BotFather (прямая ссылка t.me/<bot>/<app>), через кнопку меню бота или кнопку web_app в клавиатуре.

Как открыть DevTools для Mini App на телефоне?

На iOS включите Allow Web View Inspection в отладочном меню Telegram и подключитесь через Safari на Mac. На Android включите Enable WebView Debug в настройках Telegram и откройте chrome://inspect/#devices в Chrome на компьютере.

Как проверить initData на сервере?

Вычислите secret_key = HMAC_SHA256(key="WebAppData", message=bot_token), затем HMAC-SHA256 этим ключом от отсортированной строки key=value всех полей, кроме hash. Результат в hex должен совпасть с hash, а auth_date — быть свежим.

Почему методы Mini App не работают после перехода на другой сайт?

С Bot API 10.2 Telegram блокирует вызовы методов Mini App со страниц, origin которых отличается от домена приложения. Для всех Mini Apps защита включена с 20 июля 2026 года; отключить её можно в Mini App @BotFather.

Как создать бота в Телеграм: от @BotFather до первого сообщения

Как создать бота в Телеграм: регистрация в @BotFather, токен, проверка через getMe, первое сообщение на curl и Python, команды и описание бота.

Что нового в Telegram Bot API 10.0–10.3: rich-сообщения, эфемерные сообщения и гостевой режим

Что нового в Telegram Bot API 10.0–10.3: rich-сообщения, эфемерные сообщения, гостевой режим, заявки на вступление — с примерами и чек-листом миграции.

Лимиты Telegram Bot API: сообщения в секунду, ошибка 429 и размеры файлов

Все лимиты Telegram Bot API в одном месте: сообщения в секунду, ошибка 429 и retry_after, платные рассылки, размеры файлов, длина текста и подписи.

Как отправить сообщение через бота Telegram: sendMessage, разметка и кнопки

Как отправить сообщение через бота Telegram: sendMessage на curl, Python и JavaScript, parse_mode HTML и MarkdownV2, кнопки и ошибки 400, 403, 429.

Токен бота Telegram: как получить, где найти, как проверить и отозвать

Как получить токен бота Телеграм в @BotFather, где взять токен уже созданного бота, как проверить его через getMe и что делать, если токен утёк.

Вебхук для Telegram-бота: настройка setWebhook, проверка и удаление

Как настроить вебхук Телеграм-бота: требования к HTTPS и портам, setWebhook с secret_token, проверка через getWebhookInfo, удаление и частые ошибки.

Как узнать chat id в Telegram: пользователь, группа, канал и тема форума

Как узнать chat id в Telegram через getUpdates: личный чат, группа, супергруппа, канал и тема форума. Форматы id с -100 и что делать с пустым result.