uni-notify: Outlook + Teams → Telegram с LLM-фильтром

- Playwright держит открытыми веб-версии Outlook и Teams (постоянный профиль, Xvfb)
- watcher.js перехватывает уведомления клиента и изменения карточек в реальном времени
- pipeline: дедуп, baseline, VIP/MUTE, оценка важности через Haiku (OpenRouter)
- aiogram-бот: уведомления, дайджест, вопросы по журналу, /login с 2FA-кодом, ручное управление браузером
- Docker/compose, systemd-юнит, e2e-тест на поддельных страницах

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0194buWJjpDjU52JPX7PjsMs
This commit is contained in:
Claude
2026-11-13 14:20:14 +01:00
commit da28d0ac1c
22 changed files with 1844 additions and 0 deletions

43
.env.example Normal file
View File

@@ -0,0 +1,43 @@
# --- Telegram ---
# токен бота от @BotFather
TG_TOKEN=123456:ABC...
# твой Telegram ID (узнать: @userinfobot); бот отвечает только тебе
OWNER_ID=123456789
# --- LLM (OpenRouter) ---
OPENROUTER_API_KEY=sk-or-...
# всегда последняя Haiku; можно зафиксировать, напр. anthropic/claude-haiku-4.5
LLM_MODEL=~anthropic/claude-haiku-latest
# --- Универ ---
UNI_EMAIL=s123456@uni.edu
# можно оставить пустым — бот спросит пароль в Telegram и удалит сообщение
UNI_PASSWORD=
# чтобы LLM не считала важными твои собственные сообщения
MY_NAME=Имя Фамилия
MAIL_URL=https://outlook.office.com/mail/
TEAMS_URL=https://teams.microsoft.com/v2/
# --- Фильтры ---
# 3 = только срочное, 2 = важное и срочное
NOTIFY_MIN_LEVEL=2
# через запятую: фамилии преподов, предметы — всегда срочно
VIP=
# через запятую: никогда не присылать
MUTE=newsletter,noreply
# в эти часы «важное» приходит без звука, «срочное» — со звуком
QUIET_HOURS=23-8
# ежедневный дайджест неважного (пусто = выключен)
DIGEST_TIME=20:00
TZ=Europe/Warsaw
# --- Технические ---
# в Docker работает под xvfb, оставь false
HEADLESS=false
# плановая перезагрузка вкладок (утечки памяти Teams)
RELOAD_HOURS=6
# страховочный пересмотр списков, сек
SCAN_INTERVAL=120
# сколько секунд копить события перед вызовом LLM
BATCH_WINDOW=4
# CHROMIUM_PATH=/usr/bin/google-chrome # только для запуска без Docker со своим Chrome