Бот дней рождений: напоминания и бюджет на подарки
собственный продукт: друзья и родные сами вносят даты, админу приходят напоминания
Telegram-бот, где друзья и родные сами вносят дни рождения, а администратор получает напоминания за 14, 7, 3 и 1 день, календарь и расчёт бюджета на подарки на 30, 90 и 365 дней. Python, aiogram 3, 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. Известные ограничения: напоминания получает только администратор; имя, дата и заметка после добавления не редактируются (только бюджет и удаление); список после удаления записи нужно вызвать заново; миграций схемы нет.
Вопросы по проекту
Как не забывать о днях рождения друзей и родных?
Как спланировать бюджет на подарки на год вперёд?
Нужно ли администратору вводить даты вручную?
Кто видит записи, а кто напоминания и бюджет?
Как отмечается день рождения 29 февраля?
На чём работает бот и где хранятся данные?
Ещё по этому направлению
Финансовый ассистент: учёт денег из PDF-выписок в Telegram
собственный продукт: бот и веб-дашборд, выписки четырёх банков, Gemini
Тикет-система для IT-отдела в Telegram
для музейного комплекса в Москве: заявки, учёт техники, база знаний и аналитика
Tech Poly VPN: биллинг VPN-подписок в Telegram
собственный продукт: оплата по СБП, выдача ключей в Marzban, резервный бот во ВКонтакте
Нужно похожее?
Расскажите о задаче — покажем, как решали такое, и прикинем объём работ.