Разработка мобильного чат-бота для Telegram
Telegram-бот для мобильного пользователя — это несколько сценариев: простой command-bot с меню, conversational-бот с NLP или полноценный Mini App с React/Vue интерфейсом внутри Telegram. Выбор архитектуры определяет весь стек.
Telegram Bot API: webhooks vs polling
Два способа получать обновления от Telegram: long polling (getUpdates) и webhooks. Для продакшена — только webhooks: Telegram шлёт POST на ваш HTTPS-эндпоинт при каждом сообщении, бот отвечает немедленно. Long polling — для разработки и тестирования на локальной машине через ngrok.
Webhook требует валидного TLS-сертификата (Let's Encrypt) и порта 443, 80, 88 или 8443. Telegram проверяет сертификат — self-signed не пройдёт без явной загрузки через setWebhook с параметром certificate.
# aiogram 3.x: регистрация webhook
from aiogram import Bot, Dispatcher
from aiogram.webhook.aiohttp_server import SimpleRequestHandler
bot = Bot(token=BOT_TOKEN)
dp = Dispatcher()
async def on_startup():
await bot.set_webhook(
url=f"https://yourserver.com/webhook/{BOT_TOKEN}",
drop_pending_updates=True # Игнорировать накопившиеся сообщения при рестарте
)
drop_pending_updates=True — важная деталь при рестарте бота: без неё он обработает все накопившиеся сообщения, что создаёт flood при деплое.
Inline keyboards и состояние диалога
Кнопки под сообщением (InlineKeyboardMarkup) — основной UI Telegram-бота. Каждая кнопка несёт callback_data до 64 байт. При сложных состояниях эти 64 байта быстро становятся ограничением.
Решение: хранить состояние в Redis с коротким callback_id:
import uuid, redis
r = redis.Redis()
async def create_callback(data: dict) -> str:
callback_id = str(uuid.uuid4())[:8]
r.setex(f"cb:{callback_id}", 3600, json.dumps(data)) # TTL 1 час
return callback_id
async def resolve_callback(callback_id: str) -> dict | None:
raw = r.get(f"cb:{callback_id}")
return json.loads(raw) if raw else None
FSM (Finite State Machine) — стандарт для многошаговых диалогов: регистрация, заполнение формы, мастер настройки. В aiogram — StatesGroup, в python-telegram-bot — ConversationHandler.
Mini App: полноценный Web UI в Telegram
Telegram Mini App — это веб-приложение в WebView внутри Telegram. window.Telegram.WebApp объект предоставляет:
-
initDataиinitDataUnsafe— данные о пользователе (id, username) -
MainButton— большая кнопка внизу экрана -
sendData()— отправка данных боту -
openLink(),openTelegramLink()
Для мобильного UX Mini App должен следовать colorScheme Telegram (тёмная/светлая тема), использовать CSS переменные --tg-theme-bg-color, --tg-theme-text-color и т.д.
const tg = window.Telegram.WebApp;
tg.ready();
tg.expand(); // Растянуть на весь экран
// Кнопка действия
tg.MainButton.setText("Подтвердить заказ");
tg.MainButton.show();
tg.MainButton.onClick(() => {
tg.sendData(JSON.stringify({ action: "confirm", orderId: currentOrderId }));
});
// Цвета из темы Telegram
document.documentElement.style.setProperty(
'--bg', tg.themeParams.bg_color || '#ffffff'
);
Деплой Mini App — статика на CDN или SSR на вашем сервере. HTTPS обязателен.
Авторизация и верификация initData
initData — строка с HMAC-подписью от Telegram. На сервере нужно проверять подпись перед доверием данным о пользователе:
import hmac, hashlib
def verify_telegram_init_data(init_data: str, bot_token: str) -> bool:
secret_key = hmac.new(b"WebAppData", bot_token.encode(), hashlib.sha256).digest()
data_check_string = "\n".join(
f"{k}={v}" for k, v in sorted(parse_qs(init_data).items()) if k != "hash"
)
computed_hash = hmac.new(secret_key, data_check_string.encode(), hashlib.sha256).hexdigest()
provided_hash = parse_qs(init_data).get("hash", [""])[0]
return hmac.compare_digest(computed_hash, provided_hash)
Без этой проверки любой может подделать Telegram user ID в запросе к вашему API.
Процесс работы
Определение сценариев: command-bot, FSM-диалог или Mini App. Выбор серверного фреймворка (aiogram, grammy, python-telegram-bot). Настройка webhook с TLS. Реализация диалоговых сценариев. Для Mini App: разработка Web-интерфейса с поддержкой тем Telegram. Верификация initData на бэкенде. Деплой и мониторинг.
Ориентиры по срокам
Command-bot с меню и базовым FSM — 1–2 недели. Mini App с полноценным UI, авторизацией и серверным API — 4–8 недель.







