🎂

Бот дней рождений: напоминания и бюджет на подарки

собственный продукт: друзья и родные сами вносят даты, админу приходят напоминания

Telegram-бот, где друзья и родные сами вносят дни рождения, а администратор получает напоминания за 14, 7, 3 и 1 день, календарь и расчёт бюджета на подарки на 30, 90 и 365 дней. Python, aiogram 3, SQLite.

В продакшене · собственный продукт
14 / 7 / 3 / 1
дней до даты и в сам день: напоминания приходят заранее, набор дней настраивается
30 / 90 / 365
дней вперёд: сколько отложить на подарки, с разбивкой по месяцам на год
1 файл
вся база в одном файле SQLite: резервная копия — это копия файла

Задача

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

Нужен общий список, который пополняют сами друзья и родные, и понятный расчёт для одного человека, который этим занимается. Администратору нужны напоминания заранее, а не в день события, и цифра: сколько отложить на ближайшие месяцы.

Решение

Бот дней рождений — собственный продукт студии: Telegram-бот, который собирает даты от любых пользователей, присылает администратору напоминания и считает бюджет на подарки. Что реализовано:

  • пошаговое добавление записи командой /add: имя, дата в формате «ДД.ММ» или «ДД.ММ.ГГГГ» (год необязателен), бюджет в рублях, заметка;
  • проверка существования даты, включая число дней в месяце;
  • /list: все записи по близости даты с возрастом (если указан год), бюджетом и заметкой, с кнопками «Бюджет» и «Удалить» под каждой;
  • /calendar: интерактивный календарь месяца с отметкой дней рождения и переключением месяцев;
  • /budget только для администратора: суммы за 30, 90 и 365 дней, разбивка по месяцам на год вперёд и общая сумма;
  • ежедневная проверка по расписанию и напоминания администратору за настраиваемое число дней;
  • /cancel для отмены диалога и скрытая команда /version для администратора;
  • запуск в Docker с хранением базы на диске хоста.

Как это устроено

Пошаговое добавление на FSM в aiogram

Запись создаётся диалогом из четырёх шагов. Для этого используется FSM (конечный автомат: бот помнит, на каком шаге находится диалог с конкретным человеком). Бот принимает дату с годом и без него, проверяет, что такая дата существует, а бюджет и заметку можно пропустить символом «-». Состояния диалогов хранятся в памяти, поэтому при перезапуске бота незаконченный диалог начинается заново.

Ежедневные напоминания: APScheduler и cron-расписание

APScheduler — библиотека планировщика задач. Раз в сутки в заданное время (по умолчанию 9:00 по Москве) она запускает проверку: если до чьей-то даты осталось 14, 7, 3, 1 день или сегодня сам день, администратору уходит напоминание. Список дней задаётся переменной окружения, 0 означает «в сам день». Часовой пояс расписания настраивается отдельно.

Бюджет на подарки по месяцам

У каждой записи может быть свой бюджет. Команда /budget складывает бюджеты дат, которые попадают в окно 30, 90 или 365 дней (окно переключается кнопками), и раскладывает сумму по месяцам на год вперёд. Из такой разбивки сразу видно «дорогие» месяцы, когда на подарки уйдёт больше всего.

Календарь на inline-кнопках

Календарь строится из inline-кнопок прямо в сообщении. Дни с днями рождения помечены значком торта, по месяцам можно листать, а нажатие на число показывает, чей это день рождения. День рождения 29 февраля в невисокосный год отмечается 1 марта.

SQLite в Docker: данные переживают пересборку

SQLite — база данных в одном файле без отдельного сервера. В Docker файл базы вынесен на диск хоста (volume), поэтому он переживает пересборку контейнера. Контейнер не публикует портов, потому что бот сам опрашивает Telegram (long polling), имеет лимит памяти 256 МБ и ротацию логов. Резервная копия — копия файла, лучше при остановленном контейнере.

Права: кто что может

Записи может добавлять любой пользователь бота. Изменить бюджет или удалить запись может администратор или тот, кто её добавил. Напоминания и /budget видит только администратор, определяемый по ID из настроек.

Результат

  • Даты рождения собирают друзья и родные, а не один человек.
  • Администратор получает напоминания заранее, а не в день события.
  • Бюджет на подарки виден в цифрах на 30, 90 и 365 дней с разбивкой по месяцам.
  • Данные хранятся в одном файле и сохраняются при перезапуске контейнера.
  • Автотестов в репозитории нет, приёмка ручная.

Технологии: что и зачем

  • Python и aiogram 3 — асинхронный Telegram-бот: команды, диалоги, inline-кнопки.
  • SQLite и aiosqlite — хранение записей в одном файле, асинхронный доступ без блокировки бота.
  • APScheduler — ежедневная проверка и рассылка напоминаний по расписанию.
  • python-dotenv — токен бота, ID администратора и настройки напоминаний из окружения.
  • Docker Compose — запуск на сервере с базой на диске хоста и московским часовым поясом контейнера.

Статус

Версия 1.0.0 от 30 сентября 2026 года. Версия выводится в лог при каждом старте, есть скрытая команда /version. Известные ограничения: напоминания получает только администратор; имя, дата и заметка после добавления не редактируются (только бюджет и удаление); список после удаления записи нужно вызвать заново; миграций схемы нет.

Вопросы по проекту

Как не забывать о днях рождения друзей и родных?
Друзья и родные добавляют даты сами по ссылке на бота, а администратор получает напоминания заранее. По умолчанию бот пишет за 14, 7, 3 и 1 день до даты и в сам день, в 9 утра по московскому времени. Набор дней и время настраиваются.
Как спланировать бюджет на подарки на год вперёд?
При добавлении записи можно указать бюджет на подарок. Команда /budget, доступная администратору, суммирует бюджеты на ближайшие 30, 90 или 365 дней и показывает разбивку по месяцам на год вперёд. Так видно, в какие месяцы расходов будет больше.
Нужно ли администратору вводить даты вручную?
Нет. Записи вносят все, кому администратор дал ссылку на бота. Добавление идёт пошагово: имя, дата (год необязателен), бюджет и заметка. Бот проверяет, что такая дата существует, например отклоняет 31.02.
Кто видит записи, а кто напоминания и бюджет?
Все записи видны всем пользователям бота. Напоминания и команда /budget доступны только администратору. Удалить запись или изменить её бюджет может администратор или тот, кто эту запись добавил.
Как отмечается день рождения 29 февраля?
В невисокосный год бот отмечает такую дату 1 марта. Есть и календарь месяца: дни с днями рождения отмечены значком торта, а нажатие на число показывает, чей это день.
На чём работает бот и где хранятся данные?
Бот написан на Python с aiogram 3, данные лежат в файле SQLite, расписание напоминаний ведёт APScheduler. Для сервера предусмотрен запуск в Docker: база хранится на диске хоста и переживает пересборку контейнера.

Нужно похожее?

Расскажите о задаче — покажем, как решали такое, и прикинем объём работ.