autoreg-skills-max: initial public release (restored, redacted, hardened)
This commit is contained in:
88
skills/newapi-gh-oauth-farm/SKILL.md
Normal file
88
skills/newapi-gh-oauth-farm/SKILL.md
Normal file
@@ -0,0 +1,88 @@
|
||||
---
|
||||
name: newapi-gh-oauth-farm
|
||||
description: Use when mass-registering New-API panels via GitHub OAuth.
|
||||
version: 2
|
||||
author: ENI
|
||||
license: private
|
||||
metadata:
|
||||
hermes:
|
||||
tags: [automation, oauth, new-api, bug-bounty-adjacent]
|
||||
related_skills: [github-oauth-automation, provider-account-farming]
|
||||
---
|
||||
|
||||
# New-API GitHub-OAuth Farm
|
||||
|
||||
## When to Use
|
||||
Массовая регистрация аккаунтов на New-API relay/router панелях (дающих бонусную квоту) через GitHub OAuth из пула аккаунтов с TOTP; поиск новых панелей через GitHub-навигатор-репо; прокси-ротация волн; агрегация/экспорт банка ключей.
|
||||
|
||||
## Рабочий стек (проверено 2026-10-08)
|
||||
- Раннеры: `C:/Users/User/tmp/regfarm/github_oauth/`
|
||||
- `reg_free_newapi.py` — панели factory/vsllm/chengmo/agentrouter/chuan/flushapi (обёртка над `reg_http.py`)
|
||||
- `reg_welfare.py` — vip7891/careke/budsin/nikoapi (repo posstos/ai-relay-welfare)
|
||||
- `gh_master.py` + `_gh_master_run.py` — последовательная волна по 24+ панелям, PER=50, cooldown 90s, pre-check `alive()` (мёртвые панели сжигали по 50 GH-акков)
|
||||
- `reg_proxy100.py` — прокси-раннер (import `proxy_patch`; панели + aount0172-collab: bluesminds/futureppo/xinjianya/wyy22/orcarouter)
|
||||
- `proxy_patch.py` — monkeypatch: `L.Panel` = БЕЗ прокси (напрямую), `gh_http.GHSession` = прокси + авто-ротация при сетевой ошибке
|
||||
- Аргументы: `python reg_free_newapi.py <panel> <start_idx> <count> [idx_list_csv]`; env `OUTNAME=<имя>` задаёт отдельный OUT-файл.
|
||||
|
||||
## Прокси-режим (проверено 2026-10-09)
|
||||
Полный рецепт (код, диагностика, kill зомби, per-panel индексы): `references/proxy-rotation-recipe.md`.
|
||||
- Источник: `C:/Users/User/Desktop/proxy_bot/proxies.db` (таблица `pool`, `alive=1`) → ПЕРЕД каждой волной re-verify на САМОМ github.com (`GET https://github.com` → 200) → `_gh_proxies.json`. Из 152 alive в БД живыми для GitHub оказались 11.
|
||||
- Схема: **панель напрямую, только GitHub через прокси.** GitHub 429/таймауты — IP-based; панели банят датацентровые прокси-IP (403) и домашний IP при флуде (429) — поэтому панельный HTTP без прокси, GH-логин через ротацию.
|
||||
- Авто-ротация: обёртка `GHSession._req` — при `st == -1` (таймаут/conn error) до 3 ретраев, каждый с `next(cycle)` прокси и ПЕРЕСБОРКОЙ opener (ProxyHandler+NoRedirect+CookieJar той же сессии). Без пересборки opener держит мёртвый прокси и волна валится 0/150.
|
||||
- Результаты: `C:/Users/User/tmp/regfarm/out/*.json`, экспорт `C:/Users/User/tmp/free_newapi_reg/USABLE_KEYS.csv` (panel,base,uid,quota,models,gh_login,api_key).
|
||||
- Пул GH: `C:/Users/User/tmp/gh_accounts.json` (672, влит hoplite-pool 172; бэкап .bak-20261008). Свежие = логины без `api_key`/`user_id` ни в одном out/*.json → `_fresh_idx100.txt`.
|
||||
|
||||
## Питфолы (все пережиты)
|
||||
1. **GitHub 429 (E45002 global)** при 2+ параллельных волнах → ~40-80% фейлов. ТОЛЬКО сериализация + пауза 120-180с между волнами.
|
||||
2. **OUT race**: два процесса в один JSON = PermissionError/потеря записей. Всегда `OUTNAME` per-run.
|
||||
3. `taskkill /F /IM python.exe` убивает все волны — никогда не использовать, пока крутятся.
|
||||
4. bind=False обязателен (локальный bind/модем недоступен): monkeypatch `L.Panel` и `gh_http.GHSession`.
|
||||
5. Chengmo-паттерн: токен создаётся без группы → models_count=0. Фикс в `reg_http.py`: перебор групп (free,gpt,claud,grok,auto,default,国产模型) PUT /api/token/ + re-smoke.
|
||||
6. Часть GH-акков упирается в `/settings/two_factor_checkup` на authorize — нерешаемо, просто следующий акк.
|
||||
7. vsllm/agentrouter требуют СТАРЫЕ GH-акки («too new to register») — пул 2026-05..08 не проходит.
|
||||
8. **Stale proxy-лист убивает волну целиком** (0/150 с `state fail: POST 429` / URLError 10060): `alive=1` в proxy_bot БД протухает за дни. Всегда re-verify пула на github.com непосредственно перед запуском и писать свежий `_gh_proxies.json`.
|
||||
9. **Витрина панели врёт — прожаривать live smoke-тестом ПЕРЕД масштабированием**: `/v1/models` + реальный `/v1/chat/completions` (max_tokens=10, ждать `pong`). flushapi: 7.5M квоты и opus/sonnet в витрине, но каждый чат = 403 «insufficient Super balance» — панель мусор, акки сжигать не надо. Пустой `content` при 200 (deepseek-v4-flash, gpt-oss) и апстрим-ошибки в тексте (glm «Z.ai returned 403») = модель фактически не отвечает, несмотря на PASS-статус.
|
||||
10. **Зомби-волны после gateway interruption**: процессы накапливаются и дают ложные 429. Не `taskkill /F /IM python.exe` (убьёт всё) — точечный kill через `subprocess.run(['powershell','-NoProfile','-Command', script])` со скрипт-блоком: `Get-CimInstance Win32_Process | Where-Object { $_.CommandLine -match 'reg_proxy100' } | Stop-Process -Force`. Питфолы: wmic отсутствует в hermes-python; `$_`/`$var` внутри двойных кавычек git-bash съедает — только отдельный python-heredoc с powershell-скриптом в одинарных кавычках; CIM-фильтр по CommandLine матчит сам проб-процесс (его аргументы содержат искомую строку) — проверять что найденный pid не текущий.
|
||||
11. **Индексы GH-акков считать per-panel, не глобально**: OAuth-приложения панелей независимы, один акк регабельен на каждой панели по разу. `_idx2_<panel>.txt` = индексы пула минус логины с `api_key` в out/*.json ИМЕННО этой панели.
|
||||
12. **write_file может соврать про таймаут**: при нестабильном гейтвее write_file возвращает `bytes_written: 0 / Failed to write file: [Command timed out]`, но файл ФАКТИЧЕСКИ落地 на диск. ПЕРЕД повторной записью проверить `wc -c <file>` + `python -m py_compile` — повторный write_file упадёт в `stale_write_blocked` (файл существует, но «не прочитан в этой задаче»). Если файл на месте и компилируется — он готов, не перезаписывать.
|
||||
13. **py_compile/нативный python НЕ понимает MSYS-путь** `/c/Users/...` (No such file), хотя `wc`/`ls` его видят. Нативным инструментам (python, git, node) передавать `C:/Users/...` forward-slash путь.
|
||||
|
||||
## Панели: живые vs мёртвые
|
||||
- ТОП (реальная квота, smoke-проверено): chengmo (5M/акк, 25 free-моделей, DeepSeek-R1 PASS), careke (5M, grok-4.5/4.6/composer-2.5 ВСЕ PASS), budsin (2.5M, 660 моделей: claude-opus-5/sonnet-5/fable-5.1/gpt-6-luna PASS; glm-5.3-flash апстрим-403, deepseek-v4-flash пустой), factory (125K/акк, все 9 PASS: grok-4.7/4.6, gpt-6-luna, gpt-5.6-terra, gpt-image-2 — генерит PNG), chuan БЫЛ 500M но **регистрация закрыта админом** (2026-10-08).
|
||||
- Новые из aount0172-collab (2026-10-09), прожарены live-smoke: **api.bluesminds.com = ЛУЧШАЯ по квоте** — 100M/акк (= $200, New-API: 500K quota = $1; soft_limit=hard_limit=100M в /v1/dashboard/billing/subscription), model_ratio 0.5 (модели вдвое дешевле → фактически $400 экв.), 13 моделей: nemotron-3-ultra-550b ✅, llama-3.2-11b-vision ✅, kimi-k3 ⚠️(504 — медленный, timeout≥120), gpt-oss-20b ⚠️(пустой content). futureppo = 0 ключей (мёртв), xinjianya = CF 1010 + quota=1 (мусор), wyy22 = quota=0, live 403 «额度不足 $0» (витрина gpt-6-sol/astra), orcarouter = quota=0, live 402 «out of credits» (витрина 206 моделей opus/fable).
|
||||
- **xkiro.com НЕ New-API** (свой flow, xkiro_reg.py в github_oauth/): OAuth стартует с `GET api.xkiro.com/api/v1/auth/github` → 302, но Location в ТЕЛЕ (`Redirecting to https://github.com/...`, express-стиль) — парсить state из body. CF 1010 лечится полным набором браузерных заголовков (Chrome/131 UA + Sec-Fetch-* + Sec-Ch-Ua + Upgrade-Insecure-Requests). Callback с code возвращает 403/токены в JS-рендеринге → нужен браузерный путь (camoufox), HTTP-only не завершается. client_id Ov23li0EyjNfkXUSKZel.
|
||||
- **GitHub 429 — лимит OAuth-приложения, НЕ панели**: `state fail: POST 429` режет волну до 1-5% выхода (bluesminds 7/550), при этом панель жива даже direct. Прокси-ротация НЕ снимает 429 (лимит на app+аккаунты, не IP). **Увеличение sleep тоже не помогает** (50с/акк дало тот же 7/550) — лимит суточный/часовой на приложение, лечение только пауза несколько часов и повторный заход. Акки при 429 НЕ сгорают (фейл на state-шаге, до authorize) — индексы переиспользуемы. Выход 10-25% — норма при активной кампании; chengmo (329 индексов) дал 50 ключей — лучшие результаты у панелей, которые меньше пользуют.
|
||||
- Мусор (не тратить акки): flushapi (7.5M квота, но ВСЕ модели 403 «insufficient Super balance»), kiosapi, augmentproxy, vveai, gptge, makerend, gogotoken, nikoapi, 9527code, aaawinn, sheapi, tokeness («Unknown OAuth provider»), motomoto (dead), cnapi.onemini.top (токены протухают → 401).
|
||||
- **Nav2-скан (2026-10-09, batch 2)**: 8 свежих nav-репо → 191 новый хост → 58 New-API панелей, 6 новых GH-OAuth: api.justwoker.icu, downstream.jbbtoken.cn, jianzhile.vip, moyuu.cc, nova.vcrauo.com, aaawinn.xyz (CIDs в reg_proxy100.py, probe — nav2_probe.json). otterl.com и api.ikuncode.cc — pwd-рег БЕЗ email-верификации, но под Cloudflare Turnstile («Turnstile token 为空» на /api/user/register) — годны только через локальный cs_sidecar-солвер.
|
||||
- Email-путь МЁРТВ без qq.com/163.com: gmail+/dot режутся почти везде; исключения wisech/anticode/wxctf принимают base gmail, но wisech SMTP мёртв (verif 200, письмо не приходит). Remote captcha балансы отрицательные; локальный cs_sidecar :8877 только для Turnstile.
|
||||
|
||||
## Custom-OAuth панели (github_oauth=false, но custom-провайдер жив)
|
||||
Полный рецепт (flow_token, meta-refresh code, dashboard token API, CF-1010 UA, -free модели на нуль-квоте, лимитер-волны): `references/custom-oauth-panels.md`. Кейс: beatapi.io — E2E авторег через GH OAuth c verified gmail, банк `C:/Users/User/tmp/beat_autoreg/accounts.jsonl`, скрипт `beat_gh_reg.py N` + `beat_repair.py` (дозабор ключей/re-OAuth).
|
||||
|
||||
## Поиск новых панелей
|
||||
- Навигатор-репо на GitHub: kirito8/free-newapi, posstos/ai-relay-welfare, panxunying/ai-coding-welfare, justjavac/free-models, aount0172-collab/Free-api-keys-for-* и т.п. → качать README (main, fallback master), regex URL, фильтр хостов (github/badge/telegram/...), probe `/api/status` ThreadPool → флаги github_oauth/github_client_id/register_enabled/email_verification. Скрипт-паттерн в `C:/Users/User/tmp/free_newapi_reg/` (nav_bases.json, nav_probe.json, aount_probe.json).
|
||||
- Полный CID берется из probe-файла, НЕ из обрезанного вывода терминала — truncated client_id даёт молчаливый OAuth-фейл.
|
||||
- **Дамп станций (крупнейший источник, 2026-10-12)**: `C:/Users/User/tmp/relay-pool/howtok_stations_full.json` = 603 станции с доменами. Дедуп доменов → probe `GET https://<dom>/api/status` ThreadPool(40) → `data.github_client_id` непустой = GH-OAuth панель. Из 588 доменов → **133 GH-OAuth панели** за 32с, результат `tmp/stations_gh_oauth.json` (dict dom→{base,cid,github_oauth,register_enabled,version,name}). Скрипт `tmp/stations_probe.py`. Это на порядок больше, чем nav-репо.
|
||||
|
||||
## Универсальный драйвер по многим панелям (in-process, 2026-10-12)
|
||||
Вместо subprocess-вызова `reg_proxy100.py <panel>` на каждую панель (медленно, плодит зомби, OUT-race), гонять цикл ВНУТРИ одного процесса поверх `reg_http`:
|
||||
```python
|
||||
sys.path.insert(0,'.../regfarm'); sys.path.insert(0,'.../regfarm/github_oauth')
|
||||
import proxy_patch; proxy_patch.apply() # ОДИН раз, до reg_http
|
||||
import reg_http as R
|
||||
R.OUT = 'stations_wave' # один общий OUT-файл (merge_into дедупит по (panel,gh_login))
|
||||
for dom, info in stations.items():
|
||||
name = dom.replace('.','_').replace(':','_')
|
||||
R.PANELS[name]=info['base'].rstrip('/'); R.CID_CACHE[name]=info['cid']
|
||||
R.PNAME=name; R.START=1; R.COUNT=3; R.IDXLIST=None
|
||||
try: R.main()
|
||||
except Exception: pass # мёртвая панель → следующая
|
||||
time.sleep(15) # пэйсинг от GH 429
|
||||
```
|
||||
`R.main()` читает PNAME/START/COUNT/PANELS/CID_CACHE/OUT как модульные глобалы В МОМЕНТ ВЫЗОВА — reload НЕ нужен, просто переприсвоить перед каждой итерацией. `proxy_patch.apply()` патчит opener один раз; не делать reload(R) — он сотрёт monkeypatch. Скрипт `tmp/regfarm/github_oauth/stations_wave.py <per_panel> <sleep>`.
|
||||
|
||||
## Итог кампании
|
||||
- 2026-10-08: 720+ ключей, ~316 годных (quota>1000), 1.385B квоты.
|
||||
- 2026-10-09: банк **1076 ключей** (после мега-волн), экспорт `tmp/free_newapi_reg/POOL_FINAL2.csv`. Топ по квоте: chengmo 335×5M, bluesminds 17×100M (= $200/акк), flushapi 577M (мусор), chuan 500M (рег закрыта), careke 39×5M, budsin 35×2.5M, factory 100×125K. Мега-волны по ВСЕМ свободным индексам (_idx3_<panel>.txt): bluesminds 550 (выход 7 из-за GH 429), chengmo 329→50, factory 400→3, careke 272→10, budsin 175→6.
|
||||
- Реально живые прокси для GitHub: 44 из 152 alive в proxy_bot БД (re-verify обязателен перед каждой волной).
|
||||
- Агрегация банка: glob `out/*.json` → дедуп `(panel, api_key)` → CSV + per-panel сводка (keys, quota/acc, quota_sum); zero-quota панели выводить отдельно как мусор.
|
||||
@@ -0,0 +1,28 @@
|
||||
# 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.
|
||||
@@ -0,0 +1,49 @@
|
||||
# Прокси-ротация для GH-OAuth волн (recipe)
|
||||
|
||||
Рабочий `proxy_patch.py`: `C:/Users/User/tmp/regfarm/github_oauth/proxy_patch.py` (import + `apply()` в начале раннера, ДО `import reg_http`).
|
||||
|
||||
## Архитектура (проверено)
|
||||
1. **Панельный HTTP (`newapi_lib.Panel`) — БЕЗ прокси, bind=False.** Прокси-IP банятся панелями 403; панель сама держит только свой rate-limit.
|
||||
2. **GitHub (`gh_http.GHSession`) — через прокси.** GitHub 429 привязан к IP.
|
||||
3. **Авто-ротация в GHSession**: обёртка `_req` — при `st == -1` (URLError/таймаут) до 3 ретраев; на каждом ретрае `next(itertools.cycle(live))` и ПОЛНАЯ пересборка opener:
|
||||
```
|
||||
[ProxyHandler({http:p, https:p}), HTTPSHandler(context=ctx), HTTPHandler(), NoRedirect, HTTPCookieProcessor(self.jar)]
|
||||
```
|
||||
CookieJar сохраняется (сессия GitHub продолжается), меняются только ProxyHandler+addheaders. Без пересборки opener молча держит мёртвый прокси → волна 0/150.
|
||||
|
||||
## Подготовка пула перед КАЖДОЙ волной
|
||||
```python
|
||||
# 1) alive-строки из БД бота
|
||||
con = sqlite3.connect('C:/Users/User/Desktop/proxy_bot/proxies.db')
|
||||
allp = [r[0] for r in con.execute("select proxy from pool where alive=1")]
|
||||
# 2) re-verify ИМЕННО на github.com (не ip-api!) — ThreadPoolExecutor(40)
|
||||
# GET https://github.com через прокси, timeout 12 → status 200 = good
|
||||
# 3) json.dump(good, '_gh_proxies.json')
|
||||
```
|
||||
Порядок величин: БД 152 alive → ~11 живых для GitHub. `alive=1` протухает за дни.
|
||||
|
||||
## Диагностика мёртвой волны (0 ключей)
|
||||
- `grep -E "!" _run_X.log | sort | uniq -c` — массовый `state fail: POST 429` = GitHub rate-limit; `URLError ... 10060` = мёртвый прокси без ротации.
|
||||
- Ручной зонд панели: POST `/api/user/register` direct vs через 3-4 прокси — 403 = панель банит прокси-IP, 429 = панель банит домашний IP, 200 = путь свободен.
|
||||
|
||||
## Убийство зомби-волн (без taskkill /IM python.exe)
|
||||
```python
|
||||
import subprocess
|
||||
ps = r'''
|
||||
Get-CimInstance Win32_Process | Where-Object { $_.CommandLine -match 'reg_proxy100' } |
|
||||
ForEach-Object { Stop-Process -Id $_.ProcessId -Force; "killed $($_.ProcessId)" }
|
||||
'''
|
||||
subprocess.run(['powershell','-NoProfile','-Command',ps], capture_output=True, text=True)
|
||||
```
|
||||
Питфолы: wmic отсутствует в hermes-python; `$_`/`$(...)` внутри двойных кавычек из git-bash съедаются — powershell-скрипт только в python-heredoc с r''' строкой.
|
||||
|
||||
## Per-panel индексы акков
|
||||
```python
|
||||
used = {} # panel -> set(gh_login) из всех out/*.json где есть api_key
|
||||
# idx = [i for i,a in enumerate(pool) if a['login'] not in used.get(panel,set())][:150]
|
||||
# → _idx2_<panel>.txt
|
||||
```
|
||||
GitHub OAuth-приложения панелей независимы — один акк годен на каждой панели по разу. Глобальный «fresh» индекс занижает доступный пул.
|
||||
|
||||
## Очередь волн (сериализация обязательна)
|
||||
`run(){ OUTNAME=out_${P}_big2 python reg_proxy100.py $P 0 0 $(cat _idx2_$P.txt) > _run_${P}_big2.log 2>&1; sleep 90-120; }` — фоновый background=true, persist_on_release. 2+ параллельные волны = глобальный GitHub 429 (E45002).
|
||||
Reference in New Issue
Block a user