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

Python остаётся самым популярным языком для их создания благодаря простому синтаксису и мощным библиотекам. Это руководство проведёт через весь путь: от регистрации бота в BotFather до развёртывания на сервере с реальными примерами кода.

800 млн+
активных пользователей Telegram ежемесячно
3 шага
от идеи до первого запущенного бота
0 ₽
стоимость старта — нужен только компьютер и интернет

Шаг 1. Регистрация бота в BotFather

Прежде чем писать код, боту нужно «удостоверение личности». Все боты Telegram регистрируются через официального бота @BotFather. Процесс занимает меньше двух минут:

1
Найдите @BotFather в поиске Telegram и нажмите «Запустить»
2
Отправьте команду /newbot и задайте имя бота (отображается в чатах)
3
Придумайте username — он должен заканчиваться на «bot», например my_super_bot
4
Сохраните токен — длинную строку вида 123456:ABC-DEF... Это ключ доступа к API. Никому его не показывайте!
⚠ Важно: токен — это пароль бота. Если он попал в чужие руки, мгновенно отзовите его командой /revoke в BotFather и получите новый.

Шаг 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 и повторит любое ваше сообщение.

Как это работает: декоратор @dp.message() — это фильтр. Хендлер cmd_start срабатывает только на команду /start, а хендлер без фильтров ловит все остальные сообщения. Метод start_polling запускает постоянный опрос серверов Telegram на предмет новых сообщений.

Интерактивность: кнопки и клавиатуры

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

Reply-клавиатура

Заменяет стандартную клавиатуру телефона. Кнопки отправляют обычный текст. Используется для выбора из постоянного меню.

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

Крепится прямо под сообщением. Нажатие отправляет 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 (конечный автомат состояний).

/start
запуск
→
waiting_name
спрашиваем имя
→
waiting_age
спрашиваем возраст
→
Готово
данные сохранены
Логика диалога: каждое состояние обрабатывается своим хендлером
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: как бот получает сообщения

Long Polling
  • Бот сам опрашивает серверы Telegram
  • Работает даже на домашнем компьютере
  • Не требует HTTPS и домена
  • Простая отладка
Лучше для: разработки и небольших ботов
Webhook
  • Telegram сам отправляет обновления на ваш сервер
  • Мгновенная реакция, меньше нагрузка
  • Требуется домен с SSL-сертификатом
  • Нужен веб-сервер (aiohttp, FastAPI)
Лучше для: продакшна с высокой нагрузкой

Запуск на сервере: бот работает 24/7

Чтобы бот не отключался вместе с вашим ноутбуком, его развёртывают на VPS. Классическая схема — Linux-сервер с systemd:

Systemd-сервис /etc/systemd/system/mybot.service:
[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:

Привет! Я демо-эхо-бот на Python 🐍 Напиши мне что-нибудь!

Итоговая дорожная карта проекта

✓
Регистрация в BotFather → токен получен
✓
Установка aiogram и проектирование структуры проекта
✓
Хендлеры команд, клавиатуры, FSM для диалогов
✓
База данных, логирование, обработка ошибок
→
Деплой на VPS, systemd, мониторинг — и бот работает 24/7

Разработка Telegram-бота на Python — один из самых быстрых способов собрать работающий продукт: первая версия пишется за вечер, а масштабируемая архитектура позволяет вырасти до сервиса с тысячами пользователей. Главное — начать с простого эхо-бота и прибавлять по одной функции за раз.