Чтобы написать бота в телеграм на Python, в 2026 году я почти всегда беру Aiogram 3 - это асинхронный фреймворк, на котором удобно собрать что угодно: от простого автоответчика до магазина с оплатой через T‑Bank и расчётом доставки СДЭК. В этой статье разберу весь путь на практике: получим токен, поставим окружение, напишем первый рабочий код, добавим кнопки и диалоги через FSM, а в конце выкатим бота на сервер. Никакой теории ради теории - только то, что реально нужно, чтобы бот заработал.
Что нужно, чтобы создать бота в телеграм
Прежде чем писать код, нужны две вещи: сам бот в Telegram и рабочее окружение на Python. Регистрация бота занимает минуты две.
- Откройте в Telegram чат с @BotFather.
- Отправьте команду
/newbot. - Задайте имя (то, что видят пользователи) и username - он обязан заканчиваться на
bot, напримерmy_shop_bot. - BotFather пришлёт токен вида
123456789:AAH...- это ключ доступа к API. Храните его как пароль и не выкладывайте в публичный репозиторий.
Из софта понадобится Python 3.10 или новее (Aiogram 3 требует минимум 3.8, но на свежих версиях меньше сюрпризов) и любой редактор - я работаю в VS Code. Проверить версию Python можно так:
python --version
Если Python не установлен, скачайте его с python.org и при установке на Windows обязательно поставьте галочку «Add Python to PATH» - без неё команды из терминала работать не будут.
Устанавливаем окружение и Aiogram 3
Под каждый проект я завожу отдельное виртуальное окружение - так зависимости одного бота не конфликтуют с другим. Создаём папку проекта и внутри неё:
python -m venv venv
# Windows:
venvScriptsactivate
# macOS / Linux:
source venv/bin/activate
pip install aiogram
После активации в начале строки терминала появится (venv) - значит окружение включилось. Установленную версию удобно зафиксировать в файл, чтобы позже развернуть проект на сервере один в один:
pip freeze > requirements.txt
На момент написания статьи актуальна ветка Aiogram 3.x. Важный момент: код с примерами из старых гайдов под версию 2.x здесь не заведётся - синтаксис диспетчера, роутеров и фильтров полностью переписан. Если гуглите решение и видите from aiogram import executor - это устаревший код 2.x, пролистывайте дальше.
Первый бот: минимальный рабочий код
Создаём файл bot.py и пишем самый простой вариант - бот, который отвечает на команду /start:
import asyncio
from aiogram import Bot, Dispatcher
from aiogram.filters import CommandStart
from aiogram.types import Message
bot = Bot(token="123456789:AAH-ВАШ-ТОКЕН")
dp = Dispatcher()
@dp.message(CommandStart())
async def start_handler(message: Message):
await message.answer("Привет! Я бот на aiogram 3.")
async def main():
await dp.start_polling(bot)
if __name__ == "__main__":
asyncio.run(main())
Запускаем командой python bot.py, открываем бота в Telegram, жмём «Запустить» - и получаем ответ. Разберём, что здесь происходит:
Bot- объект для отправки запросов к Telegram Bot API.Dispatcher- маршрутизатор: принимает входящие апдейты и раздаёт их по хендлерам.- Декоратор
@dp.message(CommandStart())вешает функцию на команду/start. start_pollingзапускает long polling - бот сам опрашивает Telegram на предмет новых сообщений. Для старта и разработки это проще, чем поднимать вебхуки.
Токен прямо в коде оставлять нельзя. На проде я выношу его в переменные окружения или в .env и читаю через os.getenv, а сам файл добавляю в .gitignore. Утёкший токен = чужой полный контроль над ботом.
Бесплатный материал
🎁 Полезный скрипт в подарок
Подпишитесь на Telegram - пришлю готовый скрипт по этой теме.
Без спама. Отписка в 1 клик.
Хендлеры, кнопки и состояния FSM
Одним автоответом дело не ограничивается. Дальше нужны кнопки и диалоги - то, ради чего вообще затевается разработка телеграм-бота.
Обычная и inline-клавиатура
Reply-клавиатура заменяет системную клавиатуру снизу, inline-кнопки прикрепляются прямо к сообщению. Простое меню магазина выглядит так:
from aiogram.filters import Command
from aiogram.types import ReplyKeyboardMarkup, KeyboardButton
@dp.message(Command("menu"))
async def menu_handler(message: Message):
kb = ReplyKeyboardMarkup(
keyboard=[
[KeyboardButton(text="Каталог"), KeyboardButton(text="Корзина")],
[KeyboardButton(text="Оформить заказ")],
],
resize_keyboard=True,
)
await message.answer("Выберите раздел:", reply_markup=kb)
Диалоги через машину состояний
Когда нужно собрать у пользователя несколько полей по шагам - имя, телефон, адрес - на помощь приходит FSM (finite state machine). Бот запоминает, на каком шаге находится собеседник, и обрабатывает ответ по контексту. Пример оформления заказа в два шага:
from aiogram.filters import Command
from aiogram.fsm.context import FSMContext
from aiogram.fsm.state import State, StatesGroup
class Order(StatesGroup):
name = State()
phone = State()
@dp.message(Command("order"))
async def order_start(message: Message, state: FSMContext):
await state.set_state(Order.name)
await message.answer("Как вас зовут?")
@dp.message(Order.name)
async def order_name(message: Message, state: FSMContext):
await state.update_data(name=message.text)
await state.set_state(Order.phone)
await message.answer("Оставьте номер телефона:")
@dp.message(Order.phone)
async def order_phone(message: Message, state: FSMContext):
data = await state.update_data(phone=message.text)
await message.answer(f"Спасибо, {data['name']}! Заказ принят.")
await state.clear()
По умолчанию состояния хранятся в оперативной памяти, и при перезапуске бота они обнулятся. Для боевого проекта я подключаю Redis через RedisStorage - тогда диалоги переживают рестарты и деплои.
Когда хендлеров становится много, весь код в одном файле превращается в кашу. Я разношу их по роутерам (Router) и модулям: отдельно каталог, отдельно оплата, отдельно админка. Диспетчер потом просто подключает эти роутеры через dp.include_router().
Разработка бота в телеграм под реальные задачи
Простой эхо-бот - это разминка. На заказах бот почти всегда становится связующим звеном между Telegram и внешними сервисами. Из того, что делал на практике:
- Приём оплаты. Через эквайринг T‑Bank или встроенные платежи Telegram - пользователь оплачивает заказ, не выходя из чата.
- Расчёт доставки. Обращение к API СДЭК: бот считает стоимость и сроки по городу получателя.
- Связка с CRM и таблицами. Каждая заявка улетает в amoCRM, Google Sheets или в базу PostgreSQL.
- Автоматизация сценариев. Часть логики я выношу в n8n: бот дёргает вебхук, а дальше сценарий сам рассылает уведомления, ставит задачи и пишет в мессенджеры.
Любой такой обмен строится на HTTP-запросах к внешнему API. Асинхронность Aiogram здесь как раз кстати - пока идёт запрос к СДЭК, бот не подвисает и продолжает отвечать остальным. Для запросов беру aiohttp, он ставится в зависимости фреймворка автоматически. Если не хочется собирать типовые вещи с нуля, можно взять готовые скрипты и заготовки для ботов и допилить их под свой проект.
По срокам ориентир такой: рабочий MVP с меню и приёмом заявок я собираю за 1-2 дня. Бот с оплатой, доставкой и админкой - это уже неделя-полторы аккуратной работы с тестами. Для сравнения ниже - типовые связки под разные задачи.
| Задача | Что подключаю | Хранилище |
|---|---|---|
| Заявки и обратная связь | Aiogram + Google Sheets / CRM | Sheets или БД |
| Магазин с оплатой | Aiogram + T‑Bank + СДЭК | PostgreSQL + Redis |
| Уведомления и рассылки | Aiogram + n8n (вебхуки) | Redis |
| Бот с базой знаний | Aiogram + Claude API / RAG | векторная БД |
Деплой: как запустить бота на сервере
На своём компьютере бот живёт ровно до того момента, пока не выключишь ноутбук. Чтобы он работал круглосуточно, нужен сервер - я беру обычный VPS за 200-400 ₽ в месяц (это рыночный ориентир на хостинг, а не моя услуга). Схема выката такая:
- Заливаю код на сервер (через git или по SFTP).
- Создаю виртуальное окружение и ставлю зависимости из
requirements.txt. - Оформляю бота как сервис
systemd, чтобы он сам поднимался после перезагрузки и падений.
Минимальный unit-файл для systemd выглядит так:
[Unit]
Description=Telegram Bot
After=network.target
[Service]
WorkingDirectory=/home/user/mybot
ExecStart=/home/user/mybot/venv/bin/python bot.py
Restart=always
[Install]
WantedBy=multi-user.target
После этого systemctl enable --now mybot запускает бота и ставит его в автозагрузку. Полинг на VPS работает стабильно; переходить на вебхуки я советую, только когда нагрузка реально высокая или нужен HTTPS-эндпоинт под платёжные уведомления. Для теста без своего сервера сгодится бесплатный тариф какого-нибудь PaaS, но для боевого проекта с оплатами я так делать не рекомендую - контроля меньше, а простои дороже.
Если собирать бота с интеграциями самому некогда, я делаю это под ключ: разработка Telegram-бота у меня начинается от 30 000 ₽, сложные связки с CRM, эквайрингом и доставкой считаю отдельно, но всегда от этой базовой суммы и выше - вилок «до» не даю.
Автоматизация в мессенджере
Telegram-бот / Mini App
от 30 000 ₽
Подробнее →Частые вопросы
Сколько времени занимает написать бота с нуля?
Простой бот с командами и меню собирается за пару часов, если Python уже знаком. Рабочий MVP с приёмом заявок - 1-2 дня. Бот с оплатой, расчётом доставки и админкой занимает у меня неделю-полторы вместе с тестированием на реальных сценариях.
Aiogram 3 или python-telegram-bot и pyTelegramBotAPI?
Беру Aiogram 3, когда важна асинхронность и много внешних интеграций - он быстрый и хорошо масштабируется. pyTelegramBotAPI (telebot) проще для совсем маленьких ботов и новичков. python-telegram-bot - добротная альтернатива Aiogram, но лично мне на нём менее удобно разносить логику по роутерам.
Нужен ли сервер и где хостить бота?
Да, для круглосуточной работы нужен сервер, который не выключается. Подойдёт недорогой VPS от любого хостера. На время разработки бот спокойно живёт на вашем компьютере, но для боевого запуска с оплатами я всегда переношу его на VPS и оформляю через systemd, чтобы он поднимался сам.
Можно ли подключить к боту оплату и доставку?
Можно. Оплату подключаю через эквайринг T‑Bank или встроенные платежи Telegram, расчёт и оформление доставки - через API СДЭК. Всё это работает прямо внутри чата: пользователь выбирает товар, оплачивает и получает трек-номер, не переходя на сторонние сайты.