Проект: бот-напоминалка для Telegram на Python.
Цели проекта:
1. Личный инструмент. Хотел ставить напоминания фразами вроде «через 30 минут позвонить другу» или «завтра в 19:00 проверить почту», не тыкая клавиатуру выбора даты.
2. Живой портфолио-кейс. Открытый, развёрнутый в проде, с публичным репозиторием. Любой потенциальный клиент может зайти, попробовать и оценить качество без риска и предоплаты.
3. Полигон для отработки полного цикла разработки: проектирование, FSM-диалоги, парсинг текста на русском, БД, фоновые задачи, логирование и деплой.
Требования к результату:
- Принимать минимум 5 форматов времени на естественном русском («сегодня в 23», «через 2 часа», «11.05 19:00», «в пятницу в 18:00», «через 30 минут»).
- Корректно работать с часовым поясом Москвы.
- Хранить напоминания между перезапусками, не терять их.
- Доставлять сообщение точно в момент срабатывания.
- Простой UX без громоздких клавиатур: только пошаговый диалог /add → время → текст.
Стек и архитектура:
- Python 3.11, aiogram 3 (асинхронный фреймворк для Telegram Bot API).
- SQLite через стандартный sqlite3 (без ORM — для задачи такого объёма это избыточно).
- FSM (Finite State Machine) на встроенной MemoryStorage aiogram для пошагового диалога /add.
- Фоновый scheduler - отдельный asyncio-таск, опрашивает БД раз в 15 секунд и отправляет созревшие напоминания.
Реализованные модули:
1. Парсер времени на русском - самая нетривиальная часть. Понимает:
- относительное время: «через 30 минут», «через 2 часа»
- относительные дни: «сегодня в 23:30», «завтра в 19:00»
- дни недели: «в пятницу в 18:00», «в понедельник в 9»
- абсолютные даты: «11.05 19:00», «12.05.2026 09:30»
- короткий формат часа: «в 10», «сегодня в 23» - без минут
Все часы интерпретируются по Москве (UTC+3).
2. Слой БД (SQLite). Таблица reminders с полями user_id, chat_id, text, fire_at (хранится в UTC), is_sent. Конвертация в МСК - только на границе UI. Все CRUD-операции покрыты smoke-тестами.
3. Команды: /start, /help, /add (диалог), /list, /delete N, /about, /cancel.
4. Scheduler с обработкой ошибок: если пользователь заблокировал бота или удалил чат, напоминание помечается как отправленное, и цикл продолжается без падения.
5. Логирование с ротацией: RotatingFileHandler 1 МБ × 3 backup. Чтобы файл лога не разрастался при долгой работе в проде.
6. HTML parse_mode по умолчанию через DefaultBotProperties - чистый код без повторения parse_mode="HTML" в каждом вызове send_message.
7. Конфигурация через .env (python-dotenv): BOT_TOKEN и опциональные переменные для /about (ссылки на профиль, GitHub, канал, контакты).
Бот живой и доступен по адресу https://t.me/EAReminderBot. Любой пользователь может прямо сейчас написать «напомни через 5 минут что-то проверить» - и убедиться, что всё работает.
Технические характеристики:
- Парсит 5+ форматов времени на русском.
- Среднее время отклика на команду - меньше 500 мс.
- Точность срабатывания напоминания - в пределах 15 секунд от назначенного времени.