🐍 Python • Пошаговый гайд • 2025

Как сделать Telegram бота на Python: пошаговое руководство для начинающих

Научитесь создавать Telegram-ботов на Python с нуля. От простого echo-бота до полноценного приложения с базой данных и деплоем.

18 мин чтения ~4500 слов 27 июля 2025 г. Дмитрий Малышев

Почему Python — лучший язык для Telegram-ботов

Python — самый популярный язык для разработки Telegram-ботов, и на это есть веские причины.

Во-первых, простота синтаксиса. Python читается почти как английский текст. Даже если вы новичок в программировании, вы сможете написать работающего бота за несколько часов.

Во-вторых, богатая экосистема. Для Telegram есть несколько成熟 фреймворков: aiogram, python-telegram-bot, telebot (pyTelegramBotAPI). Каждый решает разные задачи — от простых ботов до сложных систем с middleware и FSM.

В-третьих, огромное сообщество. Тысячи готовых примеров, туториалов и библиотек. Если у вас возникнет проблема — ответ уже есть на Stack Overflow или в Telegram-каналах разработчиков.

В-четвёртых, интеграции. Python легко интегрируется с базами данных (PostgreSQL, MongoDB, SQLite), платёжными системами, CRM, API внешних сервисов. Это позволяет создавать не просто ботов, а полноценные бизнес-инструменты.

По данным GitHub, более 60% всех Telegram-ботов написаны на Python. Это значит, что вам доступны готовые решения для практически любой задачи.

Полезные материалы по теме
Не хотите разбираться сами?заказать разработку бота на Python
Хотите добавить искусственный интеллект?создать AI бота в Telegram
Полный цикл от идеи до запускаразработка бота под ключ

Подготовка рабочего окружения

Прежде чем писать код, нужно подготовить инструменты. Вот что вам понадобится.

Установка Python

Скачайте Python 3.10+ с официального сайта python.org. При установке на Windows обязательно поставьте галочку «Add Python to PATH». Проверьте установку: откройте терминал и введите python --version. Должно показать версию 3.10 или выше.

Создание виртуального окружения

Виртуальное окружение изолирует зависимости проекта. Создайте его командой: python -m venv venv. Активируйте: на Windows — venv\Scripts\activate, на Mac/Linux — source venv/bin/activate. После активации в терминале появится префикс (venv).

Установка библиотек

Установите aiogram — самый популярный асинхронный фреймворк для Telegram-ботов: pip install aiogram. Для работы с базой данных: pip install sqlalchemy asyncpg (PostgreSQL) или aiosqlite (SQLite). Для переменных окружения: pip install python-dotenv.

Структура проекта

Создайте следующую структуру каталогов:

bot/ ├── main.py — точка входа ├── config.py — конфигурация ├── handlers/ — обработчики команд │ ├── __init__.py │ └── start.py ├── keyboards/ — клавиатуры │ ├── __init__.py │ └── inline.py ├── database/ — работа с БД │ ├── __init__.py │ └── models.py └── .env — переменные окружения

Такая структура позволяет масштабировать проект без хаоса в коде.

Регистрация бота в BotFather: получение токена

Каждый Telegram-бот проходит через BotFather — официальный бот Telegram для создания и управления ботами.

Шаг 1: Откройте Telegram и найдите @BotFather. Нажмите «Start».

Шаг 2: Отправьте команду /newbot. BotFather спросит имя бота — это отображаемое имя, которое увидят пользователи. Например: «Мой Магазин Бот».

Шаг 3: BotFather спросит username бота — это уникальный идентификатор, который заканчивается на «bot». Например: my_shop_2025_bot.

Шаг 4: BotFather выдаст токен — длинную строку вида 123456789:ABCdefGHIjklMNOpqrsTUVwxyz. Это ключ доступа к вашему боту. НИКОМУ его не показывайте и не публикуйте в открытом доступе.

Шаг 5: Сохраните токен в файл .env в корне проекта: BOT_TOKEN=123456789:ABCdefGHIjklMNOpqrsTUVwxyz

Через BotFather также можно: установить аватар (/setuserpic), описание (/setdescription), команды бота (/setcommands), включить inline-режим (/setinline).

Ваш первый Telegram-бот на Python: Hello World

Начнём с самого простого бота, который отвечает на команду /start. Создайте файл main.py.

Минимальный код бота

import asyncio from aiogram import Bot, Dispatcher, Router, F from aiogram.types import Message

BOT_TOKEN = "ВАШ_ТОКЕН"

bot = Bot(token=BOT_TOKEN) dp = Dispatcher() router = Router()

@router.message(F.text == "/start") async def cmd_start(message: Message): await message.answer("Привет! Я ваш первый бот! 🤖")

dp.include_router(router)

async def main(): await dp.start_polling(bot)

if __name__ == "__main__": asyncio.run(main())

Запустите: python main.py. Откройте Telegram, найдите своего бота и отправьте /start. Бот ответит!

Разбор кода

Bot — объект, представляющий вашего бота. Принимает токен от BotFather.

Dispatcher — диспетчер, который маршрутизирует входящие сообщения к нужным обработчикам.

Router — группирует хендлеры. Можно создать несколько роутеров для разных модулей (start, help, admin).

@router.message — декоратор, который регистрирует функцию-обработчик для текстовых сообщений.

F.text == "/start" — фильтр. Хендлер сработает только если текст сообщения равен "/start".

start_polling — запускает бота в режиме polling (постоянно опрашивает сервер Telegram на наличие новых сообщений).

Обзор фреймворков: какой выбрать для Telegram-бота

В экосистеме Python для Telegram есть три основных фреймворка. Каждый имеет свои сильные стороны.

Aiogram 3 (рекомендуемый)

Асинхронный фреймворк, самый популярный в 2025 году. Поддерживает FSM (машину состояний), middleware, роутеры, inline-кнопки, медиа-группы. Быстрый, хорошо документированный, активное сообщество. Идеален для ботов любой сложности — от простых до enterprise-уровня. Работает на asyncio.

python-telegram-bot

Один из старейших фреймворков. С версии 20+ стал полностью асинхронным. Хорошая документация, стабильный API. Подходит для тех, кто предпочитает классический ООП-подход. Менее популярен в русскоязычном сообществе, чем aiogram.

Telebot (pyTelegramBotAPI)

Самый простой фреймворк для начинающих. Синхронный, декоративный API. Минимум boilerplate кода. Но не подходит для сложных проектов: нет FSM, слабая поддержка middleware, медленнее асинхронных аналогов. Хорош для прототипов и учебных проектов.

Полноценный бот на Aiogram 3: пошаговая разработка

Теперь создадим бота с реальной функциональностью: приветствие, меню, обработка команд, работа с базой данных. Используем Aiogram 3 — самый мощный и гибкий фреймворк.

Структура проекта:

bot/ ├── main.py — запуск бота ├── config.py — настройки из .env ├── handlers/ │ ├── __init__.py │ ├── start.py — команда /start │ ├── help.py — команда /help │ └── echo.py — эхо-ответ ├── keyboards/ │ ├── __init__.py │ └── main_menu.py — главное меню ├── database/ │ ├── __init__.py │ ├── engine.py — подключение к БД │ └── models.py — модели таблиц ├── middlewares/ │ └── db.py — middleware для сессий ├── .env — токен и настройки └── requirements.txt — зависимости

Такая структура позволяет разрабатывать бота в команде и легко добавлять новые функции.

Хендлеры: обработка команд и сообщений

Хендлеры — это функции, которые реагируют на действия пользователя. В Aiogram 3 хендлеры регистрируются через роутеры.

Обработка команд

Команды — это сообщения, начинающиеся с /. Примеры: /start, /help, /menu, /order. Обработчик команды:

@router.message(Command("start")) async def cmd_start(message: Message): await message.answer("Добро пожаловать!", reply_markup=main_menu_kb())

@router.message(Command("help")) async def cmd_help(message: Message): await message.answer("Доступные команды:\n/start — начать\n/menu — меню\n/help — помощь")

Обработка текстовых сообщений

Для обработки обычного текста используйте фильтры:

@router.message(F.text == "📋 Меню") async def show_menu(message: Message): await message.answer("Выберите категорию:", reply_markup=categories_kb())

@router.message(F.text) async def echo(message: Message): await message.answer(f"Вы написали: {message.text}")

Важно: хендлеры обрабатываются сверху вниз. Ставьте более специфичные фильтры выше общих, иначе общий хендлер «съест» все сообщения.

Callback-хендлеры (кнопки)

Когда пользователь нажимает инлайн-кнопку, генерируется callback_query:

@router.callback_query(F.data.startswith("category_")) async def show_category(callback: CallbackQuery): category_id = callback.data.split("_")[1] # Получаем товары из БД products = await get_products_by_category(category_id) await callback.message.answer(f"Товары категории {category_id}:") await callback.answer() # Обязательно! Убирает «часики» на кнопке

Клавиатуры и кнопки в Telegram-боте

Клавиатуры — основной способ взаимодействия с пользователем. В Telegram есть два типа клавиатур.

Reply-клавиатуры (обычные кнопки)

Reply-клавиатура появляется вместо стандартной клавиатуры ввода. Кнопки отправляют текст как обычное сообщение.

from aiogram.types import ReplyKeyboardMarkup, KeyboardButton

main_menu_kb = ReplyKeyboardMarkup( keyboard=[ [KeyboardButton(text="📋 Меню"), KeyboardButton(text="📞 Контакты")], [KeyboardButton(text="🛒 Корзина"), KeyboardButton(text="❓ Помощь")], ], resize_keyboard=True, # Автоматический размер )

await message.answer("Выберите действие:", reply_markup=main_menu_kb)

Inline-клавиатуры

Inline-клавиатура прикрепляется к сообщению. Кнопки не отправляют текст, а генерируют callback-запрос.

from aiogram.types import InlineKeyboardMarkup, InlineKeyboardButton

products_kb = InlineKeyboardMarkup( inline_keyboard=[ [InlineKeyboardButton(text="Товар 1 — 1000₽", callback_data="product_1")], [InlineKeyboardButton(text="Товар 2 — 2000₽", callback_data="product_2")], [InlineKeyboardButton(text="🛒 В корзину", callback_data="add_to_cart")], ] )

await message.answer("Выберите товар:", reply_markup=products_kb)

Подключение базы данных: SQLAlchemy + PostgreSQL

Любой серьёзный бот работает с базой данных. Без неё вы не сможете хранить пользователей, заказы, товары и настройки.

Для работы с БД используем SQLAlchemy — самый популярный ORM для Python. Он позволяет работать с таблицами через Python-объекты, без написания SQL-запросов.

Установка: pip install sqlalchemy asyncpg

Модель пользователя:

from sqlalchemy import Column, Integer, BigInteger, String, DateTime from sqlalchemy.ext.declarative import declarative_base from datetime import datetime

Base = declarative_base()

class User(Base): __tablename__ = "users" id = Column(Integer, primary_key=True) telegram_id = Column(BigInteger, unique=True, nullable=False) username = Column(String, nullable=True) full_name = Column(String, nullable=True) created_at = Column(DateTime, default=datetime.utcnow)

Подключение к базе:

from sqlalchemy.ext.asyncio import create_async_engine, AsyncSession from sqlalchemy.orm import sessionmaker

DATABASE_URL = "postgresql+asyncpg://user:password@localhost:5432/bot_db"

engine = create_async_engine(DATABASE_URL) async_session = sessionmaker(engine, class_=AsyncSession, expire_on_commit=False)

В middleware создаём сессию для каждого сообщения и передаём её в хендлер.这样 хендлер может обращаться к базе данных без глобальных переменных.

Машина состояний (FSM): сбор данных пошагово

FSM (Finite State Machine) — это механизм, который позволяет собирать данные от пользователя пошагово. Например: «Введите имя» → «Введите телефон» → «Выберите услугу» → «Подтвердите заказ».

В Aiogram 3 FSM реализован через классы состояний:

from aiogram.fsm.state import State, StatesGroup

class OrderStates(StatesGroup): waiting_for_name = State() waiting_for_phone = State() waiting_for_address = State() confirmation = State()

Хендлер, запускающий FSM:

@router.message(F.text == "🛒 Оформить заказ") async def start_order(message: Message, state: FSMContext): await state.set_state(OrderStates.waiting_for_name) await message.answer("Как вас зовут?")

Хендлер для следующего шага:

@router.message(OrderStates.waiting_for_name) async def process_name(message: Message, state: FSMContext): await state.update_data(name=message.text) await state.set_state(OrderStates.waiting_for_phone) await message.answer("Введите номер телефона:")

Получение данных:

@router.message(OrderStates.waiting_for_phone) async def process_phone(message: Message, state: FSMContext): data = await state.get_data() name = data["name"] phone = message.text await state.clear() # Очищаем состояние await message.answer(f"Заказ оформлен!\nИмя: {name}\nТелефон: {phone}")

Webhook vs Polling: какой режим запуска выбрать

Telegram-бот может работать в двух режимах: polling и webhook. Выбор зависит от задач.

Polling (опрос)

Бот периодически опрашивает сервер Telegram: «Есть новые сообщения?». Прост в настройке, не требует сервера с публичным IP. Идеален для разработки и небольших ботов. Минус: небольшая задержка (1-2 секунды), нагрузка на сервер при большом количестве пользователей.

Запуск: await dp.start_polling(bot)

Webhook (вебхук)

Telegram отправляет сообщения на ваш сервер сразу при их поступлении. Мгновенная реакция, меньше нагрузки. Требует сервер с публичным IP и HTTPS-сертификатом. Идеален для продакшена и ботов с большой нагрузкой.

Настройка webhook в Aiogram 3:

from aiogram.webhook.aiohttp_server import setup_application from aiohttp import web

app = web.Application() dp.startup.register(on_startup) setup_application(app, dp, path="/webhook") web.run_app(app, host="0.0.0.0", port=8443)

Telegram отправит POST-запрос на https://your-server.com/webhook при каждом сообщении.

Деплой Telegram-бота на сервер

После разработки бота нужно разместить его на сервере, чтобы он работал 24/7.

VPS (рекомендуемый способ)

Арендуйте VPS: Timeweb от 149₽/мес, Selectel от 200₽/мес, Hetzner от 4€/мес. Установите Ubuntu 22.04, Python 3.10+, создайте systemd-сервис для автозапуска бота при перезагрузке сервера.

Пример systemd-сервиса: [Unit] Description=Telegram Bot After=network.target

[Service] User=botuser WorkingDirectory=/home/botuser/bot ExecStart=/home/botuser/bot/venv/bin/python main.py Restart=always

[Install] WantedBy=multi-user.target

Команды: sudo systemctl enable bot && sudo systemctl start bot

Railway / Render

Бесплатные платформы для деплоя. Подключаете GitHub-репозиторий — бот деплоится автоматически. Не нужно настраивать сервер вручную. Ограничения: бесплатный тариф имеет лимит часов работы (500 часов/мес на Railway). Хорошо для прототипов и учебных проектов.

Docker

Docker контейнеризирует приложение: бот работает одинаково на любом сервере. Создайте Dockerfile:

FROM python:3.11-slim WORKDIR /app COPY requirements.txt . RUN pip install -r requirements.txt COPY . . CMD ["python", "main.py"]

Соберите образ: docker build -t mybot . Запустите: docker run -d --name mybot mybot

Обработка ошибок и логирование

Продакшен-бот должен gracefully обрабатывать ошибки. Вот основные практики.

Логирование: используйте модуль logging вместо print(). Логи записываются в файл и помогают отладить проблемы в продакшене.

import logging logging.basicConfig(level=logging.INFO, filename="bot.log") logger = logging.getLogger(__name__)

@router.message() async def handle_all(message: Message): try: # Логика обработки pass except Exception as e: logger.error(f"Ошибка: {e}", exc_info=True) await message.answer("Произошла ошибка. Попробуйте позже.")

Глобальный обработчик ошибок:

@dp.error() async def error_handler(event: ErrorEvent): logger.critical(f"Критическая ошибка: {event.exception}") return True # Подавить ошибку

Retry при сетевых ошибках: используйте aiohttp с автоматическим retry для запросов к внешним API. Не позволяйте временному сбою сети сломать весь диалог.

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

Ответы на самые популярные вопросы о как сделать telegram бота на python

Нужен профессиональный Telegram-бот?

Создам бота на Python с базой данных, CRM-интеграцией и деплоем на сервер. Бесплатная оценка проекта.

Или посмотрите наши услуги по разработке ботов

Примеры реализованных проектов

Посмотрите мои работы: Telegram-боты, сервисы, CRM и автоматизация для бизнеса

Похожие статьи

Telegram бот для приёма заявок

Как создать Telegram бот для приёма заявок: пошаговое руководство, примеры, стоимость, интеграция с CRM. Автоматизируйте...

Читать далее

Telegram бот для интернет-магазина

Telegram-бот как интернет-магазин: каталог товаров, корзина, оплата, доставка, уведомления. Полное руководство по создан...

Читать далее