Создание ботов Telegram на Python — подробное руководство

Пошаговое руководство: регистрация бота, настройка окружения, примеры на python-telegram-bot и aiogram, деплой и безопасность.

Кому это подходит

Страница рассчитана на разработчиков со знанием Python от начального до среднего уровня, которые хотят быстро создать, протестировать и задеплоить Telegram‑бота.

Шаг 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 для привилегий.

Совет: при использовании webhook — включите проверку заголовков и используйте TLS с корректным сертификатом; при использовании хостинга — следите за логами и автообновлениями зависимостей.

Деплой — варианты

Популярные варианты: 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.
  • Отсутствие обработчика ошибок и повторных попыток.