6.5 KiB
6.5 KiB
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).
Порядок
- 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
- Payload регистрации (стандарт New-API вилки):
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», даже если чекбокс кликали в UIaff_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').
- Turnstile solving — БЕСПЛАТНО локальным сайдкаром (Camoufox-солвер):
Проверить живость: GET /health. Платные сервисы (YesCaptcha/2captcha) — только после проверки баланса (getBalance/createTask часто ERROR_ZERO_BALANCE).
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) - 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.
- Login:
POST /api/user/login?turnstile=<FRESH TOKEN>{username,password,turnstile} →data.access_token(JWT) + Set-Cookienew_api_refresh. Для всех дальнейших API — заголовокAuthorization: Bearer <JWT>; одной refresh-cookie НЕ достаточно (/api/user/self → 401). - 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>
- Check-in бонус:
POST /api/user/checkin?turnstile=<FRESH TOKEN>→ quota_awarded. - Проверка ключа: GET /v1/models (работает без верификации) → POST /v1/chat/completions.
- Сохранять акк в
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-responseinput не входит в 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, не перебирать.