29 lines
4.2 KiB
Markdown
29 lines
4.2 KiB
Markdown
# Custom-OAuth New-API панели (native github_oauth=false, но custom-провайдер жив)
|
||
|
||
Некоторые New-API форки выставляют в `/api/status` `github_oauth: false`, НО регистрируют через `custom_oauth_providers` — отдельный flow с flow_token. Не списывать панель как «OAuth dead» по флагу github_oauth; проверять custom-провайдеры в status и пробовать flow.
|
||
|
||
## Flow (проверено на beatapi.io, 2026-10-13)
|
||
1. `POST /api/oauth/state {provider:'github', intent:'login', aff:'<code>'}` → `data.flow_token` (МОЖЕТ быть вложен в `data` как dict ИЛИ как строка — парсить оба варианта).
|
||
2. GH authorize с `state=<flow_token>`; если GH-акк УЖЕ авторизовал это OAuth-приложение, страница не редиректит, а отдаёт HTML `OAuth application authorized` с meta-refresh — code+state лежат В ТЕЛЕ, regex `oauth/github\?code=([a-f0-9]{16,})[^"']*state=([A-Za-z0-9_\-]+)`.
|
||
3. `GET /api/oauth/github?code=..&state=..` → `data.access_token` + `data.session.sid` (sid тоже может быть вложен: `d.session_id or d.session.sid`).
|
||
4. Email-whitelist панели применяется И к OAuth: GH-акк обязан иметь VERIFIED primary email whitelist-домена (gmail/163/qq/icloud/yahoo/foxmail у BeatAPI). Сортировать пул gmail-first; hotmail/outlook-когорта = гарантированный FAIL, не жечь на них крит-запросы.
|
||
5. Flagged/suspended GH-акки на authorize редиректят на /dashboard без code («redir no code») — следующий акк.
|
||
|
||
## Dashboard API (new-api-общее)
|
||
- `POST /api/token/` — trailing slash ОБЯЗАТЕЛЕН (без него 307 с пустым телом).
|
||
- Header `New-Api-User: <uid>` обязателен на token-эндпоинтах.
|
||
- Полный ключ: `POST /api/token/{tid}/key` (GET = 404); в списках ключ маскирован звёздочками — если в ответе `*`, ключ не получен.
|
||
- При 429 на /key акк не теряет токен — сохранить PARTIAL (access_token без api_key) и дозабрать позже отдельным repair-прогоном.
|
||
|
||
## Relay /v1
|
||
- Cloudflare 1010 на дефолтном urllib UA — на ВСЕ /v1-запросы ставить браузерный User-Agent.
|
||
- Диагноз нулевой квоты: 402 «Insufficient balance» на платных моделях; `-free`-суффикс модели при quota=0 даёт 200, а 429 «Rate limit exceeded: this model» = free-модель ДОСТУПНА, просто 1 req/min. Нуль-квота ≠ мусорный акк, если есть free-модели.
|
||
|
||
## Лимитер и волны
|
||
- Крит-эндпоинты (oauth/state, exchange, token) под лимитером ~20 запросов/20мин на IP → реально ~4 акка/окно. Обработка: на 429 sleep 600 и продолжать (не падать), pacing 75-110с между акками.
|
||
- Большую волну НЕ запускать параллельно с текущей (общий лимитер + race на used-файл). Паттерн chain: скрипт ждёт `WAVE_EXIT` в логе предыдущей волны, затем стартует следующую + repair. Запускать background + persist_on_release.
|
||
- Signup-бонус ($/квота) может выдаваться только ПЕРВОМУ акку с IP (антифрод) — не закладывать бонус в ценность волны; ценность = free-модели + aff.
|
||
|
||
## Windows-питфол диагностики
|
||
- CIM-запрос `CommandLine -match '<script>'` матчит САМ ПРОБЕ-ПРОЦЕСС, если строка поиска есть в его командной строке (ложный «волна жива»). Искать только `python.exe` с ОТНОСИТЕЛЬНЫМ путём скрипта или исключать собственный pid.
|