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

6.5 KiB
Raw Blame History

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 вилки):
    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, не перебирать.