5.1 KiB
Я.Календаркин
Русский · English
Telegram-бот, который присылает уведомления о событиях из Яндекс.Календаря: утреннюю сводку на день, два напоминания перед событием и сообщение в момент начала. Достаточно прислать ссылку экспорта календаря.
Статус: личный проект, поддерживается · бот @calendarkin_ybot
Стек: Python 3.12 · aiogram 3 · aiohttp · icalendar · python-dateutil · pytz · SQLite · Docker
Возможности
- Подписка по ссылке экспорта iCal; часовой пояс берётся из ссылки
- Повторяющиеся события (
RRULE) разворачиваются на сегодняшний день - Сводка на день в 8:00 по часовому поясу календаря (
/daily) - Два напоминания перед событием: по умолчанию за 15 и 5 минут, меняются в
/edit_alarm - Сообщение в момент начала события (
/moment) - Календарь обновляется раз в 13 минут; если обновление не удалось, остаётся прошлая версия
Пример уведомления:
Напоминаю!
Через 15 минут будет событие:
Созвон по проекту
Организатор: boss@example.com
10:00 — 11:00
Команды
| Команда | Что делает |
|---|---|
/link |
как получить ссылку на календарь |
/list |
события на сегодня |
/daily |
включить или выключить утреннюю сводку |
/moment |
включить или выключить сообщение в момент начала |
/get_alarm, /edit_alarm |
посмотреть и изменить время напоминаний |
/stop_alarm |
включить или выключить второе напоминание |
/notif |
приостановить или возобновить все уведомления |
/unsubscribe |
удалить подписку на календарь |
Запуск
git clone https://github.com/EDeev/y.calendarkin.git && cd y.calendarkin
cp .env.example .env # BOT_TOKEN от @BotFather
docker compose up -d
Готовый образ: docker pull ghcr.io/edeev/y.calendarkin или docker pull dcr.deev.su/edeev/y.calendarkin.
Базы SQLite создаются при первом запуске.
Без Docker: Python 3.12, pip install -r requirements.txt, затем cd code && BOT_TOKEN=… python bot.py.
Как устроено
code/bot.py запуск и два фоновых цикла: проверка событий раз в минуту, обновление календарей
code/handlers.py команды и приём ссылки
code/script.py проверка ссылки, скачивание, разбор iCal и повторений, текст уведомления
code/sql.py пользователи, подписки и настройки напоминаний (SQLite)
Принимаются только ссылки https://calendar.yandex.*: бот не скачивает файлы по произвольным адресам.
Ошибка у одного пользователя — битый календарь или заблокированный бот — не останавливает рассылку
остальным.
Разработка
pip install -r requirements-dev.txt
ruff check --select E9,F code tests && pytest
Тесты проверяют разбор календаря: события на сегодня, повторения, UNTIL в разных форматах, проверку
ссылки и текст уведомления. Docker-образ собирается по тегу v* и публикуется в GitHub Packages и
dcr.deev.su.
Лицензия
MIT — см. LICENSE.
Автор
Деев Егор Викторович — GitHub · Telegram · egor@deev.space
Сделано с ❤️ — deev.space