Files
autoreg-skills-max/skills/ai-provider-autoreg/references/newapi-turnstile-register.md

46 lines
6.5 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 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, не перебирать.