Шаг 1 — регистрируем бота у BotFather
1) В Telegram найдите пользователя @BotFather и начните диалог. 2) Отправьте команду /newbot. 3) Укажите имя бота и username (должен оканчиваться на bot). 4) Получите токен — строку вида 123456789:ABCDefGhIJKlmNoPQRsTUvWXyZ. Сохраните токен, он нужен для API-запросов.
Токен — секрет. Не публикуйте его в открытых репозиториях.
Шаг 2 — установка окружения
Создайте виртуальное окружение и установите библиотеки.
python -m venv venv source venv/bin/activate # macOS / Linux venv\Scripts\activate # Windows pip install --upgrade pip
Далее: примеры для двух популярных библиотек.
Пример A — простой бот на python-telegram-bot
python-telegram-bot — зрелая библиотека, синхронная и асинхронная версии. Ниже — базовый асинхронный пример (v20+ API).
from telegram import Update
from telegram.ext import ApplicationBuilder, CommandHandler, ContextTypes
TOKEN = "ВАШТОКЕНЗДЕСЬ"
async def start(update: Update, context: ContextTypes.DEFAULT_TYPE):
await update.message.reply_text("Привет! Я бот на python-telegram-bot.")
async def help_cmd(update: Update, context: ContextTypes.DEFAULT_TYPE):
await update.message.reply_text("Список команд: /start, /help, /echo")
async def echo(update: Update, context: ContextTypes.DEFAULT_TYPE):
text = update.message.text
await update.message.reply_text(text)
if _name_ == '_main_':
app = ApplicationBuilder().token(TOKEN).build()
app.add_handler(CommandHandler("start", start))
app.add_handler(CommandHandler("help", help_cmd))
app.add_handler(CommandHandler("echo", echo))
app.run_polling()
Запуск через polling подходит для разработки и небольших ботов.
Пример B — бот на aiogram (асинхронный)
aiogram — современная асинхронная библиотека, удобна для более масштабных ботов.
from aiogram import Bot, Dispatcher, types
from aiogram.utils import executor
import asyncio
import os
TOKEN = os.getenv("TELEGRAM_TOKEN", "ВАШТОКЕНЗДЕСЬ")
bot = Bot(token=TOKEN)
dp = Dispatcher(bot)
@dp.message_handler(commands=["start"])
async def cmd_start(message: types.Message):
await message.reply("Привет! Я бот на aiogram.")
@dp.message_handler()
async def echo(message: types.Message):
await message.answer(message.text)
if _name_ == "_main_":
executor.start_polling(dp, skip_updates=True)
В production лучше использовать webhook вместо polling.
Шаг 3 — переход на Webhook (рекомендуется для продакшна)
Webhook позволяет Telegram отправлять обновления вашему серверу по HTTPS. Плюсы: мгновенные обновления и меньшая нагрузка на polling.
- Нужен публичный HTTPS-адрес (сервер, облачный хостинг или ngrok для тестов).
- Настройка webhook через метод setWebhook: укажите URL и опционально сертификат.
- Примеры: для aiogram — метод start_webhook, для python-telegram-bot — set_webhook.
Шаг 4 — базовые функции и расширения
Типичные возможности бота: обработка команд, inline-кнопки, меню, обработка callback_query, хранение состояния (FSM), работа с БД и API.
- Inline-кнопки: используйте InlineKeyboardButton и InlineKeyboardMarkup.
- FSM (Finite State Machine): хранение шагов диалога (aiogram имеет встроенную FSM-систему).
- БД: SQLite для простых случаев, PostgreSQL / Redis для продакшна.
Безопасность и приватность
Сохраняйте токен в переменных окружения или менеджере секретов, не в коде. Ограничьте круг администраторов и используйте проверку входящих команд по user_id для привилегий.
Деплой — варианты
Популярные варианты: VPS (DigitalOcean, Hetzner), PaaS (Heroku, Render), serverless (AWS Lambda, Cloud Run) и специализированные платформы (Railway).
- Для webhook на VPS: настройте systemd-сервис, nginx как reverse-proxy и SSL (Let's Encrypt).
- Для Heroku/Render: используйте веб-процесс с командой запуска и переменные окружения.
- Для serverless: используйте адаптеры, которые конвертируют webhook в функцию (требует дополнительной настройки).
Советы по разработке и мониторингу
- Логи: собирайте логи (stderr/stdout), используйте Sentry для ошибок.
- Тестирование: используйте тестовые аккаунты и отдельные токены для staging.
- Ограничения API: учитывайте rate limits и обрабатывайте ошибки (429, 500).
Пример расширенной функции — inline-меню
# aiogram: отправка inline-кнопок
from aiogram.types import InlineKeyboardMarkup, InlineKeyboardButton
kb = InlineKeyboardMarkup(row_width=2)
kb.add(InlineKeyboardButton("Кнопка A", callback_data="A"),
InlineKeyboardButton("Кнопка B", callback_data="B"))
@dp.message_handler(commands=["menu"])
async def show_menu(message: types.Message):
await message.answer("Выберите:", reply_markup=kb)
@dp.callback_query_handler(lambda c: True)
async def process_callback(c):
await c.answer(f"Вы нажали: {c.data}")
Callback data ограничена по длине — храните большие payload отдельно (БД) и передавайте id.
Полезные ресурсы
Частые ошибки новичков
- Публикация токена в публичный репозиторий.
- Игнорирование skip_updates при деплое — бот обрабатывает весь backlog.
- Отсутствие обработчика ошибок и повторных попыток.