46 lines
6.5 KiB
Markdown
46 lines
6.5 KiB
Markdown
# New-API fork autoreg: Turnstile + JWT + key reveal
|
||
|
||
Протокол авторега на New-API/One-API форках (miarouter.online, rsiai.net, GPT Pool AAR и т.п.) с Cloudflare Turnstile. Проверено end-to-end на miarouter.online (акк создан, ключ получен, 12 моделей в /v1/models).
|
||
|
||
## Порядок
|
||
|
||
1. **Recon через GET /api/status** (публичный, без auth). Ключевые поля:
|
||
- `turnstile_check` + `turnstile_site_key` — sitekey ПУБЛИЧНЫЙ, из бандла доставать не нужно
|
||
- `register_enabled`, `password_register_enabled`, `email_verification` (false = email не нужен)
|
||
- `checkin_enabled`, `telegram_mini_app_enabled`, `quota_per_unit`
|
||
2. **Payload регистрации** (стандарт New-API вилки):
|
||
```json
|
||
POST /api/user/register?turnstile=<TOKEN>
|
||
{"username":"...","password":"...","aff_code":"<AFF>","turnstile":"<TOKEN>","agreement_confirmed":true}
|
||
```
|
||
- `agreement_confirmed:true` = галка «I have read and agree» — без неё ошибка «You must read and agree to the Privacy Policy», даже если чекбокс кликали в UI
|
||
- `aff_code` — из URL `?aff=XXX` (фронт кладёт в localStorage['aff']); включить, чтобы зачислить рефералку
|
||
- `email`/`verification_code` — только если `email_verification:true`
|
||
- Если payload нестандартный: искать в бандле строку `/api/user/register` и читать surrounding код мутации (там точный набор полей). Чанки: `/static/js/index.<hash>.js` + lazy-чанки `/static/js/async/<id>.<hash>.js`; карту id→hash взять regex'ом из index.js; список загруженных чанков — `performance.getEntriesByType('resource')`.
|
||
3. **Turnstile solving — БЕСПЛАТНО локальным сайдкаром** (Camoufox-солвер):
|
||
```
|
||
POST http://127.0.0.1:8877/solve
|
||
{"type":"turnstile","url":"https://<site>/sign-up","sitekey":"<KEY>","real_page":true}
|
||
→ {"solved":true,"token":"..."} (~15-60с, $0)
|
||
```
|
||
Проверить живость: GET /health. Платные сервисы (YesCaptcha/2captcha) — только после проверки баланса (getBalance/createTask часто ERROR_ZERO_BALANCE).
|
||
4. **Register POST** — через urllib с ПОЛНЫМ набором браузерных заголовков: User-Agent Chrome, Origin, Referer, Content-Type, Accept, Accept-Language. Без Accept/Accept-Language Cloudflare отвечает 403 error code 1010. Token в query — через urllib.parse.quote.
|
||
5. **Login**: `POST /api/user/login?turnstile=<FRESH TOKEN>` {username,password,turnstile} → `data.access_token` (JWT) + Set-Cookie `new_api_refresh`. Для всех дальнейших API — заголовок `Authorization: Bearer <JWT>`; одной refresh-cookie НЕ достаточно (/api/user/self → 401).
|
||
6. **API-ключ**:
|
||
- `POST /api/token/` {"name":"main","remain_quota":500000,"expired_time":-1,"unlimited_quota":true,"model_limits":"","allowed_ips":""}
|
||
- `GET /api/token/?p=0&size=10` — список, key МАСКИРОВАН (cXh0**********dDM2)
|
||
- `POST /api/token/<id>/key` (пустое тело, JWT auth) → `{"data":{"key":"<full>"}}` — полный ключ, использовать как `sk-<key>`
|
||
7. **Check-in бонус**: `POST /api/user/checkin?turnstile=<FRESH TOKEN>` → quota_awarded.
|
||
8. **Проверка ключа**: GET /v1/models (работает без верификации) → POST /v1/chat/completions.
|
||
9. Сохранять акк в `C:/Users/User/Desktop/farm/<site>/accounts.jsonl`: username, password, user_id, aff, api_key, token_id, quota, models, статус гейтов.
|
||
|
||
## Питфолы
|
||
|
||
- **Turnstile-токен ОДНОРАЗОВЫЙ** — сгорает даже на неуспешном запросе (повтор с тем же токеном = «Turnstile verification failed»). Решать свежий токен непосредственно перед КАЖДЫМ POST (register, login, checkin — по токену на запрос).
|
||
- **Не водить SPA-форму руками**: hidden `cf-turnstile-response` input не входит в react-hook-form state — заполнение + клик submit молча не отправляет запрос (валидация блокирует). Обходить UI полностью: достать схему payload из бандла и дёргать JSON API напрямую. Виджет Turnstile в headless может вообще не рендерить iframe (0 iframes, пустой токен) — форс-render/execute не помогает, нужен внешний солвер.
|
||
- **Статик-JS через urllib = 403 (CF)**, но тот же файл через `fetch()` в контексте открытой страницы — 200. Анализ бандла делать in-page: `js("fetch('/static/js/...').then(r=>r.text())")` и искать indexOf по терминам ('/api/user/register', 'aff', 'agree', 'turnstile').
|
||
- **Rate limit на login**: повторные POST /api/user/login → 429 с ПУСТЫМ телом. В js() читать `.text()` и проверять status, а не `.json()` (иначе SyntaxError «Unexpected end of JSON input» маскирует 429). Между попытками выдерживать паузу; при живом JWT не перелогиниваться.
|
||
- **email bind может быть мёртв на стороне сайта**: GET /api/verification?email=... → «invalid SMTP account» = SMTP не настроен у них, не ретраить. PUT /api/user/self может вернуть success:true, но email не сохранить.
|
||
- **403 access_denied «Verify your account in website»** на /v1/chat/completions при валидном ключе и quota>0 — серверный гейт верификации аккаунта (не лечится checkin/email). Ключ при этом валиден для /v1/models и /api/pricing. Юзерских эндпоинтов telegram-verification может не быть (только admin/*) — гейт непроходим автономно, фиксировать в статусе аккаунта.
|
||
- **Полный ключ токена** отдаёт только `POST /api/token/<id>/key`; варианты /full, /reveal, /plaintext, GET /key — 404, не перебирать.
|