Чат-боты перестали быть игрушкой энтузиастов. Сегодня они отвечают клиентам, принимают заказы, записывают на услуги и закрывают до 80% типовых обращений без участия оператора.
Python — главный язык для создания ботов: простой синтаксис, тысячи готовых библиотек, огромное сообщество. Этот лонгрид проведёт через весь путь: от выбора библиотеки и регистрации бота до написания кода, подключения кнопок и развёртывания на сервере.
Шаг 1. Выбираем библиотеку
Для Telegram — самой популярной площадки для ботов в рунете — есть три ключевые библиотеки. Сравните их, прежде чем начинать:
| Библиотека | Сложность | Асинхронность | Кому подходит |
|---|---|---|---|
| aiogram 3 | Средняя | ✔ Нативная | Серьёзные проекты, высокие нагрузки |
| python-telegram-bot | Средняя | ✔ Через asyncio | Универсальный выбор, много документации |
| pyTelegramBotAPI | Низкая | ✖ Синхронная | Первый бот, прототипы, учебные задачи |
Шаг 2. Регистрируем бота и получаем токен
- Откройте Telegram и найдите @BotFather.
- Отправьте команду
/newbot. - Придумайте имя бота и username (обязательно заканчивается на bot).
- Скопируйте токен — строку вида
123456:ABC-DEF...
.env-файл).
Шаг 3. Устанавливаем окружение
python -m venv venv
source venv/bin/activate # Windows: venv\Scripts\activate
pip install aiogram python-dotenv
Шаг 4. Пишем первого бота
Минимальный рабочий бот, который отвечает на команду /start и эхом повторяет сообщения:
import asyncio
from aiogram import Bot, Dispatcher, F
from aiogram.filters import CommandStart
from aiogram.types import Message
bot = Bot(token="ВАШ_ТОКЕН")
dp = Dispatcher()
@dp.message(CommandStart())
async def cmd_start(message: Message):
await message.answer("Привет! Я ваш первый бот 🚀")
@dp.message(F.text)
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.
Шаг 5. Добавляем кнопки
Кнопки — то, что превращает чат в удобный интерфейс. Нажмите на вариант ниже, чтобы увидеть пример кода:
from aiogram.utils.keyboard import ReplyKeyboardBuilder
builder = ReplyKeyboardBuilder()
builder.button(text="📦 Каталог")
builder.button(text="📞 Поддержка")
await message.answer("Выберите раздел:",
reply_markup=builder.as_markup(resize_keyboard=True))
Как бот общается с сервером
Telegram
очередь сообщений
aiogram
SQLite / PostgreSQL
Шаг 6. Сценарии диалога: конечные автоматы (FSM)
Чтобы бот задавал вопросы по очереди (имя → телефон → заказ), используйте FSM — механизм состояний в aiogram:
from aiogram.fsm.context import FSMContext
from aiogram.fsm.state import State, StatesGroup
class OrderForm(StatesGroup):
name = State()
phone = State()
@dp.message(Command("order"))
async def start_order(m: Message, state: FSMContext):
await state.set_state(OrderForm.name)
await m.answer("Как вас зовут?")
@dp.message(OrderForm.name)
async def get_name(m: Message, state: FSMContext):
await state.update_data(name=m.text)
await state.set_state(OrderForm.phone)
await m.answer("Оставьте номер телефона")
Частые ошибки новичков
Загрузили бота на GitHub вместе с токеном — через час его уже угнали. Решение: .env + python-dotenv.
time.sleep() или тяжёлый запрос внутри хэндлера «вешает» бота для всех пользователей. Используйте await и асинхронные библиотеки.
Один непойманный exception роняет polling. Оберните запуск в try/except и настройте логирование.
Шаг 7. Запуск на сервере
Бот на домашнем компьютере работает, только пока открыт ноутбук. Для продакшена арендуйте недорогой VPS и запустите бота через systemd или Docker. Проверочный список:
- ✅ Токен в переменных окружения, а не в коде
- ✅ Логирование в файл для разбора ошибок
- ✅ Автоперезапуск при падении (Restart=always в systemd)
- ✅ База данных с регулярным бэкапом
Первый бот — это один вечер работы
Установите aiogram, скопируйте пример из шага 4 — и через 30 минут ваш бот уже отвечает на сообщения
Вернуться к коду ↑