Telegram-боты — это инструменты, которые автоматизируют общение, продажи и сервисы для миллионов пользователей
Python остаётся самым популярным языком для их создания благодаря простому синтаксису и мощным библиотекам. Это руководство проведёт через весь путь: от регистрации бота в BotFather до развёртывания на сервере с реальными примерами кода.
Шаг 1. Регистрация бота в BotFather
Прежде чем писать код, боту нужно «удостоверение личности». Все боты Telegram регистрируются через официального бота @BotFather. Процесс занимает меньше двух минут:
123456:ABC-DEF... Это ключ доступа к API. Никому его не показывайте!Шаг 2. Выбор библиотеки: aiogram или python-telegram-bot
Для работы с Telegram Bot API на Python существует несколько библиотек. Две из них доминируют в сообществе — и выбор между ними влияет на весь дальнейший код.
| Критерий | aiogram 3.x | python-telegram-bot |
|---|---|---|
| Подход | Полностью асинхронный (asyncio) | Асинхронный с v20, синхронные обёртки |
| Скорость разработки | Высокая — готовые FSM, фильтры, роутеры | Средняя — больше ручной настройки |
| Документация | Хорошая + активное русскоязычное сообщество | Исчерпывающая, англоязычная |
| Машина состояний (FSM) | Встроена из коробки | ConversationHandler (своя реализация) |
| Идеально подходит для | Ботов быстрого запуска, MVP, хакатонов | Enterprise-проектов, сложных интеграций |
Для этого руководства используется aiogram 3.x — самая популярная библиотека в русскоязычном сообществе с современной асинхронной архитектурой.
pip install aiogram
Шаг 3. Первый бот: эхо и базовые команды
Минимальный рабочий бот на aiogram занимает менее 20 строк кода. Создайте файл bot.py:
# bot.py import asyncio from aiogram import Bot, Dispatcher from aiogram.filters import CommandStart from aiogram.types import Message BOT_TOKEN = "ВАШ_ТОКЕН_ОТ_BOTFATHER" bot = Bot(token=BOT_TOKEN) dp = Dispatcher() @dp.message(CommandStart()) async def cmd_start(message: Message): await message.answer( "Привет! Я ваш первый бот на Python 🐍" ) @dp.message() async def echo(message: Message): await message.answer(message.text) async def main(): await dp.start_polling(bot) if __name__ == "__main__": asyncio.run(main())
Запустите его командой python bot.py — и напишите боту в Telegram. Он ответит на /start и повторит любое ваше сообщение.
Интерактивность: кнопки и клавиатуры
Удобный бот не заставляет пользователя печатать команды — он предлагает кнопки. В Telegram два типа клавиатур:
Заменяет стандартную клавиатуру телефона. Кнопки отправляют обычный текст. Используется для выбора из постоянного меню.
Крепится прямо под сообщением. Нажатие отправляет callback-запрос, не добавляя текст в чат. Идеальна для интерактивных диалогов.
from aiogram.types import InlineKeyboardMarkup, InlineKeyboardButton from aiogram import F from aiogram.types import CallbackQuery @dp.message(CommandStart()) async def cmd_start(message: Message): kb = InlineKeyboardMarkup(inline_keyboard=[ [InlineKeyboardButton(text="Узнать новости", callback_data="news")], [InlineKeyboardButton(text="О нас", callback_data="about")] ]) await message.answer("Выберите действие:", reply_markup=kb) @dp.callback_query(F.data == "news") async def show_news(callback: CallbackQuery): await callback.answer() # убирает "часики" на кнопке await callback.message.answer("Здесь будут новости!")
Диалоги с состояниями: конечный автомат (FSM)
Опросы, анкеты и заказы требуют, чтобы бот «помнил», на каком шаге находится разговор. Для этого в aiogram встроен механизм FSM — Finite State Machine (конечный автомат состояний).
запуск
спрашиваем имя
спрашиваем возраст
данные сохранены
from aiogram.fsm.context import FSMContext from aiogram.fsm.state import State, StatesGroup class Form(StatesGroup): waiting_name = State() waiting_age = State() @dp.message(CommandStart()) async def start_form(message: Message, state: FSMContext): await state.set_state(Form.waiting_name) await message.answer("Как вас зовут?") @dp.message(Form.waiting_name) async def get_name(message: Message, state: FSMContext): await state.update_data(name=message.text) await state.set_state(Form.waiting_age) await message.answer("Сколько вам лет?") @dp.message(Form.waiting_age) async def get_age(message: Message, state: FSMContext): data = await state.get_data() await message.answer( f"Приятно познакомиться, {data['name']}! Вам {message.text} лет." ) await state.clear()
Polling или webhook: как бот получает сообщения
- Бот сам опрашивает серверы Telegram
- Работает даже на домашнем компьютере
- Не требует HTTPS и домена
- Простая отладка
- Telegram сам отправляет обновления на ваш сервер
- Мгновенная реакция, меньше нагрузка
- Требуется домен с SSL-сертификатом
- Нужен веб-сервер (aiohttp, FastAPI)
Запуск на сервере: бот работает 24/7
Чтобы бот не отключался вместе с вашим ноутбуком, его развёртывают на VPS. Классическая схема — Linux-сервер с systemd:
[Unit] Description=My Telegram Bot After=network.target [Service] User=ubuntu WorkingDirectory=/home/ubuntu/mybot ExecStart=/home/ubuntu/mybot/venv/bin/python bot.py Restart=always RestartSec=5 [Install] WantedBy=multi-user.target
sudo systemctl start mybot
sudo systemctl enable mybot
sudo systemctl status mybot
Директива Restart=always гарантирует, что бот автоматически перезапустится после сбоя или перезагрузки сервера.
7 типичных ошибок новичков и как их избежать
1. Токен хранится прямо в коде
Публикуя код на GitHub с токеном внутри, вы отдаёте бота злоумышленникам. Решение: переменные окружения или файл .env с библиотекой python-dotenv.
2. Синхронные операции внутри async-хендлеров
time.sleep() или requests.get() блокируют весь бот. Решение: аналоги asyncio.sleep() и aiohttp.
3. Отсутствие обработки ошибок и логирования
Бот падает молча, а причина неизвестна. Решение: модуль logging и middleware с try/except.
4. Хранение данных только в памяти
После перезапуска всё теряется. Решение: SQLite/PostgreSQL (SQLAlchemy) и Redis для FSM.
5. Нет защиты от флуда
Telegram забанит бота за превышение лимитов API (~30 сообщений/сек). Решение: механизм антиспама (throttling middleware).
6. Весь код в одном файле
500 строк в bot.py — путь к хаосу. Решение: роутеры aiogram, разделение на handlers/, keyboards/, database/.
7. Игнорирование callback.answer()
Пользователь нажимает inline-кнопку и видит бесконечные «часики». Решение: всегда вызывать await callback.answer().
Интерактивная демонстрация: как выглядит работа бота
Введите любое сообщение в поле ниже — демо-эхо-бот ответит точно так, как работает код из раздела 4:
Итоговая дорожная карта проекта
Разработка Telegram-бота на Python — один из самых быстрых способов собрать работающий продукт: первая версия пишется за вечер, а масштабируемая архитектура позволяет вырасти до сервиса с тысячами пользователей. Главное — начать с простого эхо-бота и прибавлять по одной функции за раз.