BotHost Mini App — Полное руководство
Источник: https://manual.bothost.ru/Содержание
Что такое Mini App
Обзор технологии
Mini App (ранее известные как Web App) — это веб-приложения, которые запускаются прямо внутри Telegram и выглядят как нативная часть мессенджера. Они используют стандартные веб-технологии (HTML, CSS и JavaScript), но при этом имеют доступ к специальным API Telegram.
Ключевые особенности Mini App:
- Быстрый доступ: Открываются через кнопку меню в боте, прямые ссылки или через кнопки в сообщениях
- Адаптивный дизайн: Автоматически подстраиваются под светлую и темную тему Telegram
- Доступ к данным: Могут получать информацию о пользователе (с его согласия)
- Нативные элементы: Используют компоненты интерфейса Telegram, например MainButton
- Безопасность: Работают только по HTTPS и имеют ограничения для безопасности пользователей
Преимущества использования BotHost
BotHost — это специализированная платформа для хостинга ботов и мини-приложений Telegram, которая существенно упрощает процесс их создания и поддержки:- Комплексное решение: Одна платформа для размещения как бота, так и мини-приложения
- Автоматизация: Интеграция с GitHub для мгновенного обновления при изменении кода
- SSL из коробки: Все домены автоматически получают HTTPS-сертификаты (обязательны для Mini App)
- Домены: Возможность использовать поддомены bothost.ru или подключить свой домен
- Мониторинг и логи: Удобный доступ к логам и статистике использования
- Масштабирование: Простое увеличение ресурсов при росте нагрузки
Подготовка к работе
Необходимые инструменты
Перед началом создания Mini App на BotHost, вам понадобятся:- Аккаунт BotHost: Зарегистрируйтесь на bothost.ru и выберите подходящий тарифный план
- GitHub аккаунт: Репозиторий для хранения кода вашего приложения
- Telegram бот: Созданный через @BotFather с полученным токеном
- Базовые знания: HTML, CSS и JavaScript (минимальный уровень)
- Редактор кода: VS Code, Sublime Text или любой другой текстовый редактор
- Node.js: Версия 18.x или выше (рекомендуется LTS)
- Git: Для управления версиями кода
Создание бота в Telegram
Первым шагом будет создание Telegram бота, через который пользователи будут получать доступ к вашему мини-приложению:- Откройте @BotFather в Telegram
- Отправьте команду
/newbot - Введите название бота (может содержать любые символы)
- Введите username бота (должен заканчиваться на "bot" и быть уникальным)
- Получите и сохраните токен бота — он понадобится для настройки на BotHost
⚠️ Важно: Никогда не публикуйте токен вашего бота в открытом доступе. Храните его в безопасном месте, так как он предоставляет полный доступ к управлению ботом.
Создание файлов
Структура проекта
Для корректной работы Mini App на BotHost важно правильно организовать структуру файлов. Вот рекомендуемая структура:repository/
├── app.js # Серверный код Node.js
├── package.json # Настройки проекта
└── public/ # Папка с файлами мини-приложения
├── index.html # Основной HTML файл
├── style.css # Стили
├── script.js # Клиентский JavaScript
└── images/ # Папка для изображений⚠️ Расположение файлов критически важно! HTML/CSS/JS файлы обязательно должны находиться в папке public, а не в корне репозитория.
Серверная часть (app.js)
Файлapp.js в корне проекта отвечает за раздачу статических файлов из папки public. Вот готовый код сервера на Node.js:
// Сервер для раздачи статических файлов
const http = require('http');
const fs = require('fs');
const path = require('path');
// Порт из переменных окружения BotHost или 3000 по умолчанию
const PORT = process.env.PORT || 3000;
// MIME-типы для разных файлов
const mimeTypes = {
'.html': 'text/html',
'.css': 'text/css',
'.js': 'text/javascript',
'.json': 'application/json',
'.png': 'image/png',
'.jpg': 'image/jpeg',
'.gif': 'image/gif',
'.ico': 'image/x-icon'
};
// Создаем HTTP-сервер
const server = http.createServer((req, res) => {
console.log(Запрос: ${req.method} ${req.url});
// Нормализуем URL (убираем query string, убираем ведущие слэши для безопасного join)
let url = (req.url || '/').split('?')[0].replace(/^\/+/, '') || 'index.html';
// Определяем путь к файлу и проверяем, что он внутри public (защита от path traversal)
const publicDir = path.join(__dirname, 'public');
const filePath = path.join(publicDir, path.normalize(url));
const resolvedPath = path.resolve(filePath);
const resolvedPublic = path.resolve(publicDir);
if (!resolvedPath.startsWith(resolvedPublic + path.sep) && resolvedPath !== resolvedPublic) {
res.writeHead(403);
res.end('Доступ запрещён');
return;
}
const extname = path.extname(resolvedPath);
const contentType = mimeTypes[extname] || 'text/plain';
// Читаем файл
fs.readFile(resolvedPath, (error, content) => {
if (error) {
if (error.code === 'ENOENT') {
res.writeHead(404);
res.end('Файл не найден');
} else {
res.writeHead(500);
res.end(Ошибка сервера: ${error.code});
}
} else {
res.writeHead(200, { 'Content-Type': contentType });
res.end(content, 'utf-8');
}
});
});
server.listen(PORT, '0.0.0.0', () => {
console.log(✅ Сервер запущен на порту ${PORT});
});public, определяя правильный Content-Type для разных типов файлов.
Настройка проекта (package.json)
{
"name": "bothost-miniapp",
"version": "1.0.0",
"description": "Telegram Mini App на BotHost",
"main": "app.js",
"scripts": {
"start": "node app.js",
"dev": "nodemon app.js"
},
"dependencies": {},
"devDependencies": {
"nodemon": "^2.0.20"
}
}nodemon добавлен как dev-зависимость для удобства локальной разработки.
HTML-страница (public/index.html)
<!DOCTYPE html>
<html lang="ru">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no">
<title>Мое мини-приложение</title>
<!-- Обязательный скрипт Telegram Web App -->
<script src="https://telegram.org/js/telegram-web-app.js"></script>
<link rel="stylesheet" href="style.css">
</head>
<body>
<div class="container">
<header>
<h1>Мое Mini App</h1>
<p>Разработано на BotHost</p>
</header>
<main>
<div class="card">
<h2>Добро пожаловать!</h2>
<p>Это ваше первое мини-приложение в Telegram.</p>
<button id="mainButton" class="button">Нажмите меня</button>
</div>
</main>
</div>
<script src="script.js"></script>
</body>
</html>⚠️ Скрипт telegram-web-app.js обязательно должен быть подключен в head документа для корректной работы с Telegram!
Стили (public/style.css)
:root {
--bg-color: #ffffff;
--text-color: #222222;
--hint-color: #999999;
--button-color: #50a8eb;
--button-text-color: #ffffff;
--card-bg: #f5f5f7;
}
body {
background-color: var(--tg-theme-bg-color, var(--bg-color));
color: var(--tg-theme-text-color, var(--text-color));
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
margin: 0;
padding: 0;
font-size: 16px;
line-height: 1.6;
}
.container {
max-width: 450px;
margin: 0 auto;
padding: 20px 16px;
}
header h1 { font-size: 24px; font-weight: 700; }
.card {
background-color: var(--tg-theme-secondary-bg-color, var(--card-bg));
border-radius: 12px;
padding: 20px;
}
.button {
background-color: var(--tg-theme-button-color, var(--button-color));
color: var(--tg-theme-button-text-color, var(--button-text-color));
border: none;
border-radius: 8px;
padding: 12px 20px;
}--tg-theme-* автоматически адаптируют приложение под светлую и темную тему пользователя в Telegram.
JavaScript-логика (public/script.js)
const tg = window.Telegram.WebApp;
tg.ready();
tg.expand();
// Обработчик MainButton настраиваем один раз (иначе при каждом клике добавлялся бы новый)
tg.MainButton.onClick(function() {
const data = {
action: 'button_pressed',
timestamp: new Date().toISOString()
};
tg.sendData(JSON.stringify(data));
setTimeout(() => tg.close(), 1000);
});
document.addEventListener('DOMContentLoaded', function() {
const mainButton = document.getElementById('mainButton');
if (mainButton) {
mainButton.addEventListener('click', function() {
if (tg.HapticFeedback) {
tg.HapticFeedback.impactOccurred('medium');
}
tg.MainButton.setText('ГОТОВО');
tg.MainButton.show();
});
}
if (tg.initDataUnsafe.user) {
const user = tg.initDataUnsafe.user;
console.log('Пользователь:', user.first_name, user.last_name);
}
});Загрузка на GitHub
Создание репозитория
- Зайдите на GitHub и авторизуйтесь
- Нажмите кнопку "+" в правом верхнем углу и выберите "New repository"
- Введите имя для репозитория (например, "telegram-miniapp")
- Установите видимость "Public"
- Нажмите "Create repository"
Загрузка файлов
#### Способ 1: Через веб-интерфейс GitHub- В репозитории нажмите "Add file" → "Upload files"
- Создайте папку
public(введя "public/file.txt" в имени файла) - Загрузите все файлы в соответствующие папки
- Обязательно соблюдайте структуру: app.js и package.json в корне, остальные — в
public
#### Способ 2: Через Git (рекомендуется)
git clone https://github.com/username/telegram-miniapp.git
cd telegram-miniapp
mkdir -p public/images
touch app.js package.json public/index.html public/style.css public/script.js
git add .
git commit -m "Initial commit"
git push origin mainПроверка структуры
telegram-miniapp/
├── app.js
├── package.json
└── public/
├── index.html
├── style.css
└── script.jsНастройка на BotHost
Создание бота на платформе
- Войдите в аккаунт на BotHost
- Нажмите "Создать бота" или "Добавить бота"
- Заполните форму:
- Нажмите "Создать бота"
Настройка домена
#### Вариант 1: Поддомен bothost.ru- В панели найдите поле для ввода домена
- Введите имя (например,
myapp) - Получите адрес
https://myapp.bothost.ru
- Приобретите домен
- Настройте DNS (A-запись на IP BotHost)
- Введите домен в панели
- BotHost выпустит SSL-сертификат
⚠️ Telegram Mini App работает ТОЛЬКО по HTTPS!
Конфигурация и запуск
BotHost автоматически клонирует репозиторий и запускает приложение. Проверьте логи — должно быть сообщение✅ Сервер запущен на порту 3000.
#### Автообновление из GitHub
- В панели бота найдите раздел "Автообновление"
- Скопируйте Webhook URL
- В GitHub: Settings → Webhooks → Add webhook
- Вставьте URL, формат "application/json"
Интеграция с Telegram
Настройка кнопки Web App в меню бота
- Откройте @BotFather
- Отправьте
/mybotsи выберите бота - Bot Settings → Menu Button (или
/setmenubutton) - Введите текст кнопки (например, "Открыть приложение")
- Введите URL приложения (например,
https://myapp.bothost.ru)
Кнопка Web App в сообщениях
Вариант 1 — Inline-кнопка (быстрый запуск, без отправки данных из приложения):bot.sendMessage(chatId, 'Нажмите, чтобы открыть приложение:', {
reply_markup: {
inline_keyboard: [[{
text: 'Открыть приложение',
web_app: { url: 'https://myapp.bothost.ru' }
}]]
}
});sendData):
bot.sendMessage(chatId, 'Нажмите, чтобы открыть приложение:', {
reply_markup: {
keyboard: [[{
text: 'Открыть приложение',
web_app: { url: 'https://myapp.bothost.ru' }
}]],
resize_keyboard: true
}
});⚠️ Важно: методsendData()работает только при запуске Mini App с клавиатурной кнопки (keyboard), а не с inline-кнопки (inline_keyboard).
Получение данных из Mini App
Для приёма данных Mini App должна быть открыта с клавиатурной кнопки (см. выше). В Mini App (sendData):const data = {
name: document.getElementById('name').value,
email: document.getElementById('email').value
};
tg.sendData(JSON.stringify(data));
tg.close();bot.on('message', (msg) => {
if (msg.web_app_data) {
const data = JSON.parse(msg.web_app_data.data);
bot.sendMessage(msg.chat.id, Получено: ${data.name}, ${data.email});
}
});Продвинутые функции
Адаптация под темы Telegram
:root {
--my-background: var(--tg-theme-bg-color, #ffffff);
--my-text: var(--tg-theme-text-color, #222222);
--my-button: var(--tg-theme-button-color, #50a8eb);
}const isDarkTheme = tg.colorScheme === 'dark';Использование MainButton
tg.MainButton.setText('ОТПРАВИТЬ');
tg.MainButton.setParams({ color: '#2481cc', text_color: '#ffffff' });
tg.MainButton.show();
tg.MainButton.onClick(sendData);Получение данных о пользователе
const user = tg.initDataUnsafe.user;
if (user) {
console.log(user.id, user.first_name, user.username);
}⚠️ Безопасность: данные изinitDataUnsafeнельзя доверять на сервере — их можно подделать. Для проверки подлинности используйте полеinitDataи валидацию по документации Telegram.
Haptic Feedback
if (tg.HapticFeedback) {
tg.HapticFeedback.impactOccurred('medium');
tg.HapticFeedback.notificationOccurred('success');
}Решение проблем
Ошибка "The web app was not found"
- Проверьте URL в браузере
- Убедитесь в использовании HTTPS
- Проверьте логи сервера на BotHost
Ошибка "White screen"
- Проверьте консоль браузера
- Убедитесь, что подключен
telegram-web-app.js - Проверьте структуру HTML
Проблемы с автообновлением из GitHub
- Проверьте настройки webhook в GitHub
- Убедитесь, что репозиторий публичный
Отладка
- Chrome/Firefox: F12 или Ctrl+Shift+I
- Safari: Option+Command+I
- Логи сервера в панели BotHost
Примеры проектов
AI Support Bot
Бот технической поддержки с ИИ для ответов на вопросы.Mini App Manual
Интерактивное руководство по созданию Mini App.🤖 Нужна помощь? Написать в поддержку © 2025 BotHost.ru — Платформа для хостинга ботов и Mini App