Telegram-бот, который следит за лимитами Claude (Max plan) и Codex (ChatGPT-подписка через CLIProxyAPI) и шлёт push-уведомления:
- 🔄 недельный лимит обнулился — ловится по факту (7d% резко упал или сменилось окно), не по расписанию;
- ⏳ скоро обнулится — предупреждение за
WEEKLY_WARN_HOURSдо сброса недельного окна; ⚠️ пороги утилизации — при пересечении 80% / 95% по 5h и 7d окнам (настраивается);- 💸 платный overflow (
extra_usage) — при достижении порога месячного лимита (значения приходят в центах:monthly_limit=16000= $160.00, бот делит на 100); - ⛔ полная блокировка (
quota.exceeded) и восстановление.
Мониторит Claude и Codex одновременно (🟣 Claude / 🟠 Codex), каждый со своим
источником. Постоянная клавиатура внизу + inline-меню /menu. Команды: /status
(лимиты по всем аккаунтам), /next (все окна обнуления), /models (модели прокси).
Команда /check проверяет настоящий короткий ответ модели Claude через AI Proxy,
официальный Claude Status и, если настроен Codex,
короткий ответ его модели. Она показывает время ответа и число успешных
автоматических проверок из последних шести. Список /models не считается
проверкой работоспособности авторизации.
Фоновая проверка идёт раз в HEALTH_POLL_INTERVAL_MIN минут: при проблеме и
после восстановления бот отправляет уведомление. Проблемы авторизации и открытые
инциденты Claude Status сообщаются сразу, прочие сбои — после двух опросов,
восстановление — после двух удачных опросов. История и флаги уведомлений лежат
в том же state.json и переживают перезапуск.
Проверяются три источника: rotate-proxy rodionov (Claude), zsp по внутреннему адресу
CODEX_API_URL и zsp по публичному ZSP_PUBLIC_URL. Публичная проверка ловит
поломку nginx/TLS/DNS, которую внутренний адрес не видит. /check дополнительно
шлёт короткий запрос к каждой чат-модели обоих прокси (модели *image* пропускаются)
и показывает статус и задержку по каждой.
Срок OAuth-токена Claude API прокси не отдаёт, поэтому дату последнего обновления
логина вводит владелец: кнопкой «🔑 Токен» (меню и клавиатура внизу) или командой /token.
Кнопки: «Обновил сегодня», «Вчера», «2 дн. назад», «3 дн.», «Неделю назад»,
«📅 Выбрать дату» (сетка последних 28 дней) и «✏️ Ввести вручную» (бот просит дату
ответным сообщением). Кнопки записи работают только для ALLOWED_USER_IDS.
Команда:
/token— показать дату и срок с кнопками выбора;/token 25.09.2026(также2026-09-25,25.09,сегодня,вчера) — записать дату обновления, можно задним числом; дата в будущем отклоняется.
Срок = дата + CLAUDE_LOGIN_PERIOD_DAYS (30). За CLAUDE_LOGIN_WARN_DAYS (2) дня бот
присылает напоминание в канал и админам, а при просрочке — ещё одно. Каждое
напоминание приходит один раз на срок; новая дата сбрасывает флаги. Дата хранится в
state.json (ключ login). Протухший логин виден и по первому отказу авторизации
(auth_unavailable, 401/403): бот сообщает о нём сразу. Токены бот не читает.
Раз в POLL_INTERVAL_MIN минут (по умолчанию 30) бот опрашивает limits API
(тот же rotate-proxy, что использует CCR), сравнивает ответ с прошлым снапшотом
на диске (/data/state.json) и шлёт события из разницы. Пороги и предупреждения —
edge-triggered: одно окно = одно уведомление, без спама.
На первом запуске снапшот сохраняется молча (baseline), события не шлются.
Все настройки — через окружение / .env (см. .env.example). Секреты в репозиторий
не коммитятся (.env в .gitignore).
| Переменная | Назначение | Дефолт |
|---|---|---|
BOT_TOKEN |
токен бота из BotFather | — |
CHAT_ID |
куда слать push | — |
ALLOWED_USER_IDS |
кому разрешены команды (опц.) | — |
LIMITS_API_URL |
эндпоинт лимитов | rotate-proxy |
LIMITS_TOKEN |
Bearer для API | — |
ACCOUNTS_FILTER |
мониторить только эти email (опц.) | все |
POLL_INTERVAL_MIN |
интервал опроса, мин | 30 |
WEEKLY_WARN_HOURS |
за сколько ч предупреждать | 2 |
THRESHOLDS |
пороги утилизации, % | 80,95 |
EXTRA_USAGE_WARN_PCT |
порог overflow, % | 80 |
STATE_PATH |
путь к снапшоту | /data/state.json |
CLAUDE_PROBE_MODEL |
модель для короткой проверки Claude | claude-sonnet-5-5 |
CODEX_PROBE_MODEL |
модель для короткой проверки Codex | gpt-6-luna |
HEALTH_POLL_INTERVAL_MIN |
период проверок, мин | 10 |
ZSP_PUBLIC_URL |
публичный адрес zsp-прокси для внешней проверки | rotate-proxy.zspzvs.ru |
CLAUDE_LOGIN_PERIOD_DAYS |
период жизни логина Claude, дни | 30 |
CLAUDE_LOGIN_WARN_DAYS |
за сколько дней напомнить | 2 |
cp .env.example .env # заполнить BOT_TOKEN, CHAT_ID, LIMITS_TOKEN
docker compose up -ddocker compose -f docker-compose.yml -f docker-compose.build.yml up -d --buildpython -m venv .venv && source .venv/bin/activate
pip install -e .
cp .env.example .env # заполнить
python -m app.mainPython 3.12, aiogram 3, APScheduler, httpx, pydantic-settings. Образ multi-arch
(amd64/arm64) собирается в GHCR через GitHub Actions на push в main.