October 14, 2025

Будь smartом в написании ботов: пошаговое руководство

План

  1. Вступление
  2. Телеграм боты
  3. Библиотеки
  4. Темплейты
    1. tgbot_template_v3
    2. telegram-bot-template
    3. Темплейты?
  5. База данных + Redis
    1. Базы данных и ORM
    2. Redis
  6. Список материалов для дальнейшего изучения

Вступление

Привет!

Разработка Telegram-бота кажется простой - пока не начнешь.

Со временем понимаешь, что бот - это не просто пара команд и набор кнопок. Это приложение, у которого есть архитектура, пользователи, база данных, свои микросервисы.

Эта статья зародилась у меня в голове ещё задолго до того, как я начал вести свой канал. Когда я работал над своим первым серьёзным продуктом - hodlpass - я заметил, что многие концепты, технологии и приёмы, которые я использую, не так уж очевидны для внедрения. Так и появилась идея написать такую статью, в которой я бы ответил на пару базовых вопросов: на чём писать бота, как выстроить структуру проекта, как хранить данные и зачем вообще нужен Redis.

Но чтобы продвинуться дальше, выполни одно условие:

  • Подпишись на мой канал: там я стараюсь приоткрывать занавесы разработки своего продукта, делится своими мыслями, а также иногда веселить вас


Телеграм боты

Чат-бот - это дешевая обертка для теста гипотиз.
- Его легче сделать, чем сайт
- Значительная часть функционала уже реализована платформой
- Легкость разработки освобождает время для бизнес-моделирования, а не копания в коде

Второй по популярности мессенджер в России (после бабушкиного WhatsAppa'a) и пожалуй единственный, в котором есть функция создания чат-ботов - это Телеграм (про MAX будет отдельная серия статей). Именно тг-боты заимели широкую популярность в разных бизнес-решения. Убедиться в его популярности можно просто взглянув на цифры.

Исследователи tidio собрали фидбеки от 1015 респондентов в 2024 году, задав им с десяток вопросов, и выяснили:
- 82% пользователей готовы использовать чат бота вместо общения с человеком
- 16% компаний уже внедрили чат ботов, а 55% планируют это делать
- 24% компаний, уже использующих чат ботов, заявили, что они отлично окупают инвестиции (ROI)

Насколько этот рынок перспективен - циферки роста телеги говорят сами за себя:
- MAU: 35m -> 1b+ за 10 лет
- DAU: 450m
- 12b сообщений каждый день

Есть ещё множество других показателей, но я думаю, что и этих метрик достаточно, чтобы свидетельствовать о заинтересованности бизнеса во внедрении чат-ботов в свою работу. Это безусловно увеличивает перспективы тех, кто умеет их разрабатывать.

Для особо пытливых умов есть несколько интересных статеек на тему:

У читателя возникнет закономерный запрос (иначе зачем вы читаете эту статью?): а на чем же разрабатывают эти инструменты? Приложив немного усилий, а именно сделав запрос в ФСБ Github , я выяснил такие данные по репозиториям:

  • Python: 92.1k
  • JavaScript: 20.8k
  • Java: 9.5k
  • Go: 6k
  • PHP: 4.5k
  • Ruby: 1.1k
  • C++: 1.1k

Думаю, очевиден лидер - Python. Ну и на JS я писать пока что не собираюсь, поэтому будем обсуждать разработку тг-ботов именно на Python.


Библиотеки

Чтобы написать телеграм бота голого Python, конечно, не хватит. Поэтому быстро пройдемся по популярным библиотекам под это дело и обсудим, почему я отдаю свое предпочтение aiogram.

Библиотек под телеграм десятки, если не сотни, все они отвечают на разные запросы, поэтому важно их явно разделять. Сегодня нам нужны библиотеки, реализующие фукции Telegram API

Вот парочку самых популярных, что я нашел:
- python-telegram-bot
- pyTelegramBotAPI
- aiogram

К сожалению, на них не напишешь шлюхо бота...

И почему из этого скудного списка я выбираю aiogram?

Как минимум, потому что мне нравится эта библиотека, и на ней я написал большинство своих ботов. Но есть ли объективные причины?

  • Routers: иерархия роутеров - это одна из киллер фич aiogram, потому как позволяет явно разделить логику хендлеров, так еще и можно привязывать свои мидлвари к каждому хендлеру
  • Встроенная FSM: удобно реализованная стейт машина, которая в таком красивом виде отсутствует в других библиотеках
  • Кастомные фильтры: позволяет разделять логику для разных пользователей, чатов, и вообще что только хочешь
  • И еще кипа фич, которые, по правде говоря, реализованы почти везде

Некоторые конкурентные преимущества aiogram частично реализованы в других обертках, но лично для меня их реализация в aiogram удобнее, поэтому я выбираю его.


Темплейты

Говоря о библиотеках, их плюсах и минусах, мы часто не учитываем главного - реальную сложность разработки, особенно для новичков.

Это:

  • хаос в файлах
  • боль с деплоем
  • отсутствие миграций, логов
  • отсутствие понятной структуры.

Зачем это терпеть? Не будь терпилой - используй темплейты - готовые архитектурные решения, которые организуют твой проект и многократно ускоряют твою работу.

Но не обольщайся: это не “чтобы меньше печатать”, а чтобы не изобретать велосипед и не тратить силы на базовые вещи вроде структуры, окружения и докер кампозов.

Прежде чем выбирать темплейт, стоит задать себе (или своему ChatGPT) несколько простых вопросов:

  • Насколько мой бот будет сложным?
  • Нужна ли мне статистика и аналитика?
  • Будет ли автодеплой и CI/CD?
  • Хочу ли я поддерживать бота в долгую, или это пет-проект на выходные?

С ответами на эти вопросы, можно продолжать.



tgbot_template_v3

Начнём с самого лёгкого и понятного старта - шаблона tgbot_template_v3 от Latand. Это базовый темплейт под aiogram3.0, где уже есть готовые хендлеры, пример структуры проекта, минимальный docker-compose.yml и настройка миграций через Alembic.

Почему я выбираю именно его (и почему, например, мой бот hodlpass тоже построен на нём):

  • Простая, но продуманная архитектура. Есть моки для БД, работа с ORM-моделями через SQLAlchemy, чёткое разделение на хендлеры, клавиатуры, миддлвари и фильтры.
  • Без лишнего перегруза. В шаблоне нет тяжёлых интеграций вроде Prometheus, Grafana и прочих DevOps-штук. С ним можно научится писать действительно хороших ботов

Он не напугает тебя сложностью, но даст возможность создать стабильно работающего и расширяемого бота.


telegram-bot-template

Если хочется не просто «базового» бота, а полноценный продакшн-стек, стоит обратить внимание на telegram-bot-template от donBarbos.

В процессе подготовки этой статьи, я просмотрел множество других темплейтов, но именно этот показался мне самым интересным, и именно его я бы использовал в своем следующем проекте.

Что выделяет его среди десятков других темплейтов — это не просто код, а продуманная архитектура и куча внедренных фишек, о которых ниже.

Из коробки здесь уже есть всё, что обычно подключают вручную:

  • Админ-панель на Flask-Admin
  • Продуктовая аналитика (Amplitude, Posthog или Google Analytics - что угодно)
  • Мониторинг и метрики через Prometheus и Grafana
  • Отслеживание ошибок через Sentry
  • Настроенный docker-compose
  • и вагон с большой тележкой других интеграций

Это темплейт уровня production-ready, где всё уже собрано и протестировано: инфраструктура, аналитика, мониторинг, CI/CD.

Сядь я сейчас разрабатывать нового бота - выбрал бы именно его. Это тот случай, когда шаблон не ограничивает, а наоборот, задаёт правильные рамки и экономит недели настройки.


Темплейты?

Да, темплейтов существует множество, но список, который я предложил, на мой взгляд, самый достаточный для разработки бота в 2025 году.

Если ты новичок и только постигаешь это искуство "написание тг-ботов", то советую тебе выбрать первый темплейт.

Если же ты уже ржавая крыса, готовая убить за свои три строчки кода, смело бери второй темплейт.


База данных + Redis

Ни один большой бот, который хочет давать крутой функционал пользователям, не обойдется без базы данных. Бот, который хочет собирать метрики, использовать прокаченный FSM - должен иметь у себя Redis.

Тепеь разберемся, какие базы данных можно нужно использовать, и как внедрить Redis к себе в бота.


Базы данных и ORM

Существуют разные реализации Structured Query Language или же SQL, они же его диалекты. Каждая из них реализует свою систему управления (СУБД):

  • добавляют собственные функции;
  • синтаксис;
  • типы данных;
  • расширения.

Но у СУБД есть два главных недостатка (для кого это преимущества):

  • большое количество СУБД, миграция между ними дается порой тяжко;
  • конфликт двух миров: ООП и реляционными базами данных (SQL).

Эти проблемы решила одна технология: ORM (Object-Relational Mapping) - она буквально "отображает" SQL таблицы в классы, что позволяет:

  • писать меньше кода;
  • сделать код кросс-СУБД (захотел сегодня на PostgreSQL, завтра - на MySQL);
  • сделать работу с базой нативной, не используя "голый SQL".

Под Python реализовано несколько таких решений, в частности SQLAlchemy, с которым мы сегодня познакомися. Начнем с структуры фреймворка, он состоит из двух частей:

  • Core (SQL Expression Language) : низкоуровневый, больше походит на SQL, только на python синтаксисе;
  • ORM (Object Relational Mapper): высокоуровневый, работа через классы и объекты (модели).

Я предпочитаю использовать их так:

  • Core: для написания запросов;
  • ORM: для создания таблиц.

Вы же можете использовать только Core, только ORM или и то, и другое.

Но взгляните на работу без ORM и с ORM:

# Запрос
# чистый SQL
cursor.execute("SELECT * FROM users WHERE id = 1")
user = cursor.fetchone()

# ORM (SQLAlchemy)
user = session.query(User).get(1)

# Создание базы
# чистый SQL
cur.execute("""
		CREATE TABLE IF NOT EXISTS users (
		  id INTEGER PRIMARY KEY AUTOINCREMENT,
		  name TEXT NOT NULL,
		  created_at TEXT NOT NULL DEFAULT (datetime('now'))
		)
		""") 
		
# ORM (SQLAlchemy)
class User(Base):
    __tablename__ = "users"
    id = Column(Integer, primary_key=True, autoincrement=True)
    name = Column(String(100))
    created_at = Column(DateTime, server_default=func.

Base.metadata.create_all(engine)
Session = sessionmaker(bind=engine)
session = Session()

Логично, что удобнее и практичнее - SQLAlchemy. В этой статье мы не затронем подробно, как работает эта библиотека, поэтому в конце вас ждет список материалов для изучения. Здесь же разберем, как этим пользоваться в темплейте, который я предложил.

Итак, для того, чтобы SQLAlchemy "работала", нужно подключится к СУБД, а к чему подключаться, если она не поднята? Поэтому в docker-compose.yml автор темплейта прописывает:

pg_database:
image: postgres:13-alpine
ports:
- "5439:5432" # Change if you like! 5439 is external to container
restart: always
volumes:
- pgdata:/var/lib/postgresql/data
command: "postgres -c max_connections=150
	   -c shared_buffers=512MB -c effective_cache_size=1536MB
	   -c maintenance_work_mem=128MB -c checkpoint_completion_target=0.9 -c wal_buffers=16MB
	   -c default_statistics_target=100 -c random_page_cost=1.1 -c effective_io_concurrency=200
	   -c work_mem=3495kB -c min_wal_size=1GB -c max_wal_size=4GB -c max_worker_processes=2
	   -c max_parallel_workers_per_gather=1 -c max_parallel_workers=2 -c max_parallel_maintenance_workers=1"
env_file:
- '.env'
logging:
driver: "json-file"
options:
  max-size: "200k"
  max-file: "10"
  
volumes:
    pgdata: { }

Отдельно вы можете покрутить эти настройки, прикрутить бэкапы и сделать все красивее, но этой конфигурации хватает для старта.

Далее в папке infrastructure/database/models по примеру из infrastructure/database/models/users.py вы можете создать свои таблички.

В папке infrastructure/database/repo мы можете создавать классы для взаимодействия с бд, а точнее - запросы. Для референса возьмите infrastructure/database/repo/users.py, и сделайте свой класс в другом файле.

Темплейт делали умные люди, поэтому они вынесли взаимодействие с этими классами в отдельный dataclass:

# импортируйте свой класс
from infrastructure.database.table import TableRepo

@dataclass
class RequestsRepo:
    """
    Repository for handling database operations. This class holds all the repositories for the database models.
    
    You can add more repositories as properties to this class, so they will be easily accessible.
    """
    session: AsyncSession
    
    @property
    def users(self) -> UserRepo:
        """
        The User repository sessions are required to manage user operations.
        """
        return UserRepo(self.session)
	
	# пример
	@property
	def tables(self) -> TableRepo: 
		return TableRepo(self.session)

Сюда вы добавляете свои классы по аналогии с UsersRepo, а потом подключаетесь к базе:

async with session_pool() as session:
    repo = RequestsRepo(session)

через repo.users.some_function() обращаетесь к своим запросам.

Как мы можем увидеть, это максимально удобный способ работы:

  • чтобы работать с базой эффективно;
  • чтобы ваш код не разрастался почем зря;
  • чтобы все было доступно через один класс.

Redis

Reids (Remote DIctionary Server) - база данных в оперативной памяти (in-memory database), которая хранит все значения в виде key-value. Она относится к типу NoSQL, нерелиационных баз данных, главное их отличие - в способе хранения данных

По факту, Redis представляет из себя сверхбыстрый кеш или питоновский словарик, лежащем на вашем сервере.

За счет своей скорости и структуре данных Redis является приоритетным выбором в решении некоторых проблем:

  • кеширование;
  • сессии пользователей;
  • очереди задач;
  • сбор метрик;
  • pub/sub система для обмена сообщений между сервисами.

Redis является идеальным выбором для телеграм ботов: aiogram позволяет использовать его в FSM storage. Это делает ваш бот более отказоустойчивым, потому как даже если сервер крашнется, состояния и данные пользователей в FSM никуда не пропадут.

Телеграм имеет проблему с сбором статистики в телеграм ботах. Эту проблему также помогает решить Redis:

  • собрать количество переходов;
  • собрать активность юзеров;
  • собрать их retention;
  • и какие только метрики вы не придумаете.

Поэтому Redis - это must-have для любого крутого бота. Глянем же, как с ним работать:

# docker-compose.yml
redis_cache:
  image: redis:6.2-alpine
  restart: always
  command: redis-server --port $REDIS_PORT --save 20 1 --loglevel warning --requirepass $REDIS_PASSWORD
  env_file:
	  - ".env"
  volumes:
	  - cache:/data

Для того, чтобы перевести FSM storage на Redis сделайте:

bot = Bot(token=config.tg_bot.token, parse_mode="HTML")
dp = Dispatcher(storage=(
	RedisStorage.from_url(
		redis_link, # настройте ссылку для подключения
		key_builder=DefaultKeyBuilder(with_bot_id=True, with_destiny=True),
	)
)

Но если используете темплейт, просто поставьте USE_REDIS=TRUE в .env.

Redis имеет удобный SDK для Python, который позволяет воплатить в жизнь все ваши заветные желания:

# подключение
import redis
r = redis.Redis(host="localhost", port=6379, db=0) 
# для тех, кто пользуется темплейтом:
# r = Redis.from_url(self.config.redis.dsn())

# положить какое-то значение
r.set("profile:42", '{"name":"Alice"}', ex=60) # ex = expiration, когда удалится запись, можно без этого аргумента

# реализация счетчиков
r.incr("metrics:messages")        # +1
r.incrby("metrics:bytes", 1024)   # +1024
r.incrbyfloat("metrics:money", 9.99)

# очередь задач
r.lpush("queue:emails", "user42@example.com")

# pub/sub
r.publish("news", "hello subscribers") # pub

pubsub = r.pubsub()
pubsub.subscribe("news") # sub
for message in pubsub.listen():
    if message["type"] == "message":
        print("got:", message["data"])

Надеюсь, я смог убедить использовать вас redis в своих ботах, а я рассказал только о части того, что в нем есть, внизу будут также материалы для изучения по теме Redis.


Список материалов для дальнейшего изучения

Небольшой хендбук по разработке ботов на aiogram

Туториал: тг бот-магазин

Как не совершить очевидных ошибок при разработке бота

Серия статьей про SQLAlchemy: 1 2 3 4

Redis:

Канал, где все рассказывают про разработку тг ботов