Telegram-бот с возможностью получения напоминаний про события, а также создания своих. Сделано для ИТ-Раунда. Автор: Степанов Тимур
- Перейти в корень проекта:
...\Downloads> cd .\ScheduleBot\- Активировать venv:
...\ScheduleBot> .\Scripts\Activate- Установить зависимости:
(ScheduleBot) ...\ScheduleBot> pip install -r .\requirements.txt- Указать токен:
#./=BOT=/config.py
from aiogram import Bot
bot = Bot(token="ТОКЕН")Important
Тестовый токен уже указан, шаг 4 РЕКОМЕНДУЕТСЯ пропустить. Токен будет доступен в рамках конкурса, после окончания проверки проектного этапа токен перестанет действовать
- Запуск:
(ScheduleBot) ...\ScheduleBot> python ".\=BOT=\main.py"- Бот запущен!
Important
При стандартном токене, бот доступен по ссылке: https://t.me/SiriusUniversitySchedule_Bot (@SiriusUniversitySchedule_Bot)
Используется асинхронная библиотека для мессенджера Telegram. Выбор обусловлен популярностью библиотеки, широким функционалом, большим количеством документации/обучающих материалов, а также: возможностью улучшения быстродействия программы в будущем. Имеется ввиду полный переход на асинхронные библиотеки, функции, а также распараллеливание задач.
Простота формата и его абсолютная универсальность повиляла на выбор именно этого типа данных для их хранения, записи и чтения.
global.json:
{
"2025-07-15":
[
{
"time": "09:00",
"name": "Доброе утро, Сириус!",
"group": ".ALL"
},
{
"time": "13:00",
"name": "Вебинар",
"group": ".ALL"
}
]
}Note
В данных уже существуют группы пользователей, но их обработка не производится. Если реализовать проверку на принадлежность к группе, то появиться возможность создавать события для отдельных классов учеников, групп студентов и т.п.
{uid}.json:
{
"2025-07-14":
[
{
"time": "10:00",
"name": "Дедлайн по ИТ-Раунду!"
}
]
}Note
Можно значительно ускорить работу с данными, заменив массив словарей на словарь (день, ключ - дата) со словарями (события, ключ - время). Сейчас для получения доступа к определённому событию необходимо получить доступ ко дню (за O(1)) и к самому событию (за O(n), где n - максимальное количество событий в одном дне). При изменении структуры доступ будет осуществляться за O(1)
Для отправления сообщений в определённое время (напоминания), используется библиотека APScheduler, которая хранит все запланированные задачи в БД SQLite, доступ к которой осуществляется через SQLAlchemy. Такой выбор обусловлен надёжностью и автономностью APScheduler, а также тем, что хранение запланированных задач уже полностью реализовано в библиотеке.
-
main.py - Запуск бота, APScheduler Реализовано базовое логирование состояния бота
-
handlers.py - Обработка сообщений и команд. Реализована работа с FSM, валидация аргументов команд с помощью регулярных выражений. Доступные функции см. в блоке "## Функционал"
-
data.py - Работа с JSON. Реализовано хранение, запись, изменение и чтение данных.
-
keyboards.py - Клавиатуры для удобного ввода Добавляет возможность подтверждения рискованных операций (удаление данных).
-
reminders.py - Планирование выполнения функций с помощью APScheduler. Позволяет боту присылать сообщения самостоятельно в заданное время.
-
config.py - Доступ к токену и к корню проекта.
global.json - События {uid}.json - Напоминания notifications.sqlite - БД для APScheduler
Реализованы все обязательные функции из ТЗ. Полный список команд:
- /start
- /today
- /tomorrow
- /add {Название из нескольких слов} {ГГГГ-ММ-ДД} {чч:мм}
- /del (/delete) {ГГГГ-ММ-ДД} {чч:мм} 1
- /help
- /schedule
Исходя из разработанного функционала, считаю разработку MVP успешной.
Footnotes
-
Удалить напоминание из списка (/today и /tomorrow) ↩