395 lines
34 KiB
Markdown
395 lines
34 KiB
Markdown
---
|
||
name: github-autoreg
|
||
description: Mass GitHub account registration without captcha. Persistent Chrome profile bypasses Arkose FunCaptcha. Two backends — mail.tm (no email list) and .de emails (IMAP). 2captcha/AntiCaptcha/CapSolver ALL fail on GitHub Arkose.
|
||
category: automation
|
||
---
|
||
|
||
# GitHub AutoReg — No Captcha
|
||
|
||
Создание GitHub аккаунтов **без капчи**. Прогретый Chrome-профиль обходит Arkose Labs FunCaptcha полностью.
|
||
|
||
## Почему это работает
|
||
|
||
GitHub использует Arkose Labs FunCaptcha (public key: `0651BCE4-8F66-4F8B-9C6D-5F5411DD9158`). **Ни один captcha-сервис её не решает:**
|
||
|
||
| Сервис | Результат | Пруф |
|
||
|--------|-----------|------|
|
||
| 2captcha (old API) | `ERROR_CAPTCHA_UNSOLVABLE` | 2026-07-09 |
|
||
| AntiCaptcha | Таймаут 3+ мин → таск истекает | 2026-07-27 (taskId: 464294112) |
|
||
| CapSolver | `ERROR_INVALID_TASK_DATA` | 2026-07-09 |
|
||
| YesCaptcha | `ERROR_ZERO_BALANCE` (мин. $10) | 2026-07-27 |
|
||
|
||
**Решение**: прогретый Chrome-профиль (с куками/историей GitHub) → GitHub видит «своего» и **не показывает капчу**.
|
||
|
||
## Быстрый старт
|
||
|
||
**Основной способ (с 2026-08-11): дашборд ENI AUTOREG v3.0** — см. раздел ниже.
|
||
|
||
**Standalone (legacy):**
|
||
```bash
|
||
git clone https://github.com/nikita4a/gh-autoreg
|
||
cd gh-autoreg
|
||
pip install -r requirements.txt
|
||
playwright install chromium
|
||
python reg.py --count 10
|
||
```
|
||
|
||
## Полный флоу
|
||
|
||
```
|
||
1. Загружаем .de почты из файла (email:password)
|
||
2. Открываем прогретый Chrome-профиль
|
||
3. JS form fill (НЕ Playwright fill — палится)
|
||
4. Жмём Create account → редирект на /account_verifications
|
||
5. Читаем код подтверждения через IMAP
|
||
6. Вводим код → аккаунт создан
|
||
7. Ждём 2-5 мин (secondary rate limit)
|
||
8. Повторяем
|
||
```
|
||
|
||
## Три критических правила
|
||
|
||
### 1. JS form fill, НЕ `page.fill()`
|
||
|
||
```python
|
||
# ❌ Playwright fill — детектится
|
||
await page.fill('input[type="email"]', email)
|
||
|
||
# ✅ JS value + dispatchEvent — не детектится
|
||
await page.evaluate("""
|
||
(data) => {
|
||
const el = document.querySelector('input[type="email"]');
|
||
el.value = data.email;
|
||
el.dispatchEvent(new Event('input', {bubbles: true}));
|
||
el.dispatchEvent(new Event('change', {bubbles: true}));
|
||
}
|
||
""", {"email": email})
|
||
```
|
||
|
||
### 2. Dismiss flash alerts перед формой
|
||
|
||
```python
|
||
await page.evaluate("""
|
||
document.querySelectorAll('.flash-close, [aria-label="Dismiss"]')
|
||
.forEach(el => el.click());
|
||
document.querySelectorAll('.flash').forEach(el => el.remove());
|
||
""")
|
||
```
|
||
|
||
### 3. Задержка 2-5 минут
|
||
|
||
GitHub банит IP после 2-3 быстрых регистраций. `DELAY = (120, 300)` секунд.
|
||
|
||
## Провайдеры IMAP для .de почт
|
||
|
||
| Домен | IMAP сервер | Порт |
|
||
|-------|-------------|------|
|
||
| t-online.de | imap.t-online.de | 993 |
|
||
| web.de | imap.web.de | 993 |
|
||
| gmx.de | imap.gmx.net | 993 |
|
||
|
||
## Формат выходных данных
|
||
|
||
```
|
||
[REDACTED-EMAIL]|email_password|github_username|github_password
|
||
```
|
||
|
||
## Два backend'а для email
|
||
|
||
### Backend 1: mail.tm (НЕ рекомендуется — домены блокируются с 2026-08-10)
|
||
|
||
Временные почты через mail.tm API. **Работало до 2026-08-10**, но теперь домены (`emalupe.com`) блокируются GitHub — аккаунт не создаётся. Использовать Backend 2.
|
||
|
||
```python
|
||
from src.mailtm_utils import create_email, wait_for_code
|
||
mail = create_email() # → {email, password, token}
|
||
code = wait_for_code(mail["token"], timeout=120)
|
||
```
|
||
|
||
Скрипт: `reg_mailtm.py` (шаблон: `templates/reg_mailtm.py`). Утилиты: `references/mailtm-utils.md`.
|
||
|
||
### Backend 2: .de почты через IMAP (РЕКОМЕНДУЕМЫЙ)
|
||
|
||
t-online.de / web.de / gmx.de через IMAP. Пул: 17,872 почт в `data/working_mails_live.txt` (формат `email:password`). Скрипт: `reg.py` (шаблон: `templates/reg.py`).
|
||
|
||
## Прокси: SOCKS5 обязателен
|
||
|
||
DataDome (первый слой защиты) **блокирует HTTP-прокси** (403), но пропускает SOCKS5. Proxyshard.com: SOCKS5 порт 1080 работает, HTTP порт 80 — нет.
|
||
|
||
### Встроенный SOCKS5-мост (in-process)
|
||
|
||
Внешние процессы моста нестабильны на Windows. Встраивать asyncio SOCKS5 forwarder прямо в скрипт:
|
||
|
||
```python
|
||
class SocksBridge:
|
||
def __init__(self, sid):
|
||
self.user = f"plan-premium-country-de-sid-{sid}-ttl-8000000"
|
||
self.lp = random.randint(12000, 20000)
|
||
async def start(self):
|
||
self.srv = await asyncio.start_server(self._handle, '127.0.0.1', self.lp)
|
||
```
|
||
Полный шаблон: `templates/socks5_bridge.py`.
|
||
|
||
### Не-headless Chrome
|
||
|
||
DataDome JS-челлендж не решается в headless (включая `--headless=new`). **Обязательно `headless=False`**.
|
||
|
||
## OctoCaptcha — второй слой (DataDome в iframe)
|
||
|
||
После заполнения email + Continue, GitHub загружает **OctoCaptcha** — DataDome в скрытом iframe:
|
||
- URL: `https://octocaptcha.com/datadome?origin_page=github_signup_redesign`
|
||
- JS-ключ: `window.ddjskey = "2CF892E038EE5D8217D27787467ED2"`
|
||
- Скрипт: `https://js.datadome.co/tags.js`
|
||
- Токен: `<input name="octocaptcha-token">`
|
||
|
||
**Прогретый Chrome-профиль обходит оба слоя** — DataDome на странице + OctoCaptcha в iframe. Без профиля iframe НЕ завершает challenge (60+ секунд ожидания — поле `octocaptcha-token` пустое).
|
||
|
||
### Что НЕ работает для OctoCaptcha
|
||
|
||
| Подход | Результат |
|
||
|--------|-----------|
|
||
| `fetch()` POST в обход формы | Возвращает `/signup` обратно, аккаунт НЕ создаётся |
|
||
| Мобильный user-agent | DataDome блокирует страницу полностью |
|
||
| YesCaptcha `FunCaptchaTaskProxyless` | Несовместимый тип капчи |
|
||
| YesCaptcha `DataDomeLabsTask` | `ERROR_TASK_NOT_SUPPORTED` |
|
||
| Ручное `iframe.style` → visible | DataDome игнорирует, iframe остаётся `visible=false` |
|
||
|
||
## Google OAuth блокировка
|
||
|
||
GitHub редиректит на Google OAuth для email'ов, ассоциированных с Google (включая t-online.de). Блокировать через Playwright route:
|
||
|
||
```python
|
||
async def block_google(route):
|
||
await route.fulfill(status=204)
|
||
await page.route("**/sessions/social/google/**", block_google)
|
||
await page.route("**/accounts.google.com/**", block_google)
|
||
```
|
||
|
||
Но **блокировка не помогает с t-online.de** — GitHub не показывает форму пароля после блокировки, редиректит обратно на `/signup`. Использовать НЕ-Google email'ы: `proton.me`, `mail.ru`, `yandex.com`, `outlook.com`.
|
||
|
||
## JS form fill — безопасная передача значений
|
||
|
||
Пароли со спецсимволами (`$`, `\`, `"`) ломают f-строки в `page.evaluate()`. Использовать передачу через аргументы:
|
||
|
||
```python
|
||
await page.evaluate("""
|
||
([email, pwd]) => {
|
||
document.querySelector('input[name="user[email]"]').value = email;
|
||
document.querySelector('input[name="user[password]"]').value = pwd;
|
||
}
|
||
""", [email_addr, email_pwd])
|
||
```
|
||
|
||
## GitHub авто-определение страны
|
||
|
||
GitHub ставит `<input type="hidden" name="user_signup[country]" value="DE">` по IP. Поле `email_address` (не `user[email]`) на некоторых формах.
|
||
|
||
## Важные питфолы
|
||
|
||
1. **`:has-text()` не работает в `page.evaluate()`** — это Playwright-селектор, не CSS. В JS использовать стандартные селекторы.
|
||
2. **`mail.noop()` перед каждым IMAP search** — без этого Gmail/t-online кеширует состояние и не видит новые письма.
|
||
3. **`wait_for_selector` таймаутит на странице `/account_verifications`** — DOM меняется после отправки, поля появляются после анимации. **Добавить `page.wait_for_timeout(2000)` перед code fill.** Использовать 3 стратегии: S1 `launch_code[]` боксы (8 шт.) → S2 `input[inputmode="numeric"]` (текущий GitHub, 2026-08-10) → S3 brute force (любой input + любой button). `launch_code[]` боксы больше не используются GitHub (2026-08-10), но сохранены для обратной совместимости. Логировать каждую стратегию (S1/S2/S3). Ждать до 10с появления любого input'а перед заполнением.
|
||
4. **`is_success_url` должен проверять `account_verifications`** — `"verify" in "verifications"` НЕ срабатывает (нет буквы 'y'). Проверять обе строки: `"account_verifications" in url or "verify" in url.lower()`.
|
||
5. **mail.tm домены блокируются GitHub (2026-08-10)** — регистрация через `emalupe.com` и другие mail.tm домены: OTP принимается, но аккаунт НЕ создаётся (404 на API). GitHub молча отклоняет после OTP. Использовать t-online.de IMAP pool (17,872 почты в `data/working_mails_live.txt`).
|
||
6. **Несколько попыток с одним email** — GitHub может уже иметь аккаунт. Не повторять с тем же email.
|
||
7. **GitHub fine-grained PAT без `repo` scope не может push** — для `gh repo create` и `git push` нужен PAT с разрешением `Repository creation` (или classic PAT с `repo` scope). `gh auth refresh -h github.com -s repo` через device flow: открыть https://github.com/login/device и ввести код. Без `repo` — только ручное создание репы через web.
|
||
8. **Playwright `execution context destroyed`** — страница редиректится после `goto /signup`. Ждать стабилизации URL перед `query_selector`. Оборачивать в try/except с retry.
|
||
9. **Registrations без профиля = 0** — все попытки 2026-07-29 без прогретого профиля провалились из-за OctoCaptcha. Только persistent Chrome profile даёт результат.
|
||
10. **`page.fill()` палится** — всегда использовать `page.evaluate()` с `el.value = ` + `dispatchEvent`.
|
||
11. **Playwright Chromium крашится на Windows** — `launch_persistent_context` с bundled Chromium-1208 падает с exit code 2147483651 (STATUS_BREAKPOINT). **Решение: системный Chrome через CDP** (`--remote-debugging-port=9222`). См. `references/cdp-approach.md`.
|
||
12. **OTP ввод: `launch_code[]` БОЛЬШЕ НЕ ИСПОЛЬЗУЕТСЯ (2026-08-10)** — GitHub перешёл на single `input[inputmode="numeric"]`. Использовать 3 стратегии: S1 `launch_code[]` (legacy) → S2 `input[inputmode="numeric"]` (текущий) → S3 brute force. Ждать до 10с появления input'ов. См. `references/otp-and-provisioning.md`.
|
||
13. **Post-OTP URL detection** — проверять **путь** (`urlparse(url).path`), а не query params. `return_to=dashboard` в query params — это `/login`, а не `/dashboard`. См. `references/otp-and-provisioning.md`.
|
||
14. **Python 3.14 isolated mode** — hermes venv загрязняет `sys.path`. Использовать `python -I` для изоляции. Плюс `sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding='utf-8')` для Windows.
|
||
15. **`page.url` — live property, не кешируется** — Playwright/Camoufox `page.url` переоценивается при каждом обращении. Между `log(page.url)` и `if "verif" in page.url` страница может уйти на другой URL. **Fix:** читать один раз в локальную переменную.
|
||
16. **Navigation race condition** — после клика на submit страница может оставаться на `/signup` 30+ сек через медленный прокси. `while "signup" in page.url` с таймаутом — ненадёжен (URL живой, может измениться между проверками). **Fix:** `page.wait_for_selector('input[name="launch_code[]"]', timeout=90000)` вместо URL-поллинга.
|
||
17. **Post-OTP "accepted" без сессии** — GitHub может редиректить на `/` или `/dashboard` после OTP, но аккаунт требует пост-регистрационный логин. **Fix:** после "accepted" → перейти на `/settings/profile`. Если редирект на `/login` → сделать логин (email + password).
|
||
18. **Rate limit держится часами** — secondary rate limit на GitHub может длиться 1+ час. 15-минутное ожидание недостаточно. Поля формы не заполняются (все `querySelector` возвращают null), страница `/signup` возвращается без редиректа. Ротировать IP агрессивно, не ждать на одном IP.
|
||
19. **bpproxy residential pool — ВСЕ прокси мертвы (2026-08-10)** — 10/10 прокси в `bpproxy_hardsession_pool.txt` не отвечают (curl: пустой ответ, Camoufox: NS_ERROR_PROXY_CONNECTION_REFUSED). Прокси не залимичены — они физически недоступны. Нужны свежие прокси от другого провайдера.
|
||
20. **Camoufox `geoip=True`** — при использовании прокси Camoufox выдаёт `LeakWarning`. Добавлять `geoip=True` в launch_opts.
|
||
21. **PYTHONPATH изоляция Python 3.11** — hermes-venv добавляет свои site-packages в `PYTHONPATH`, из-за чего `py -3.11` пытается импортировать playwright из заблокированного herm-венва (PermissionError). **Fix:** `PYTHONPATH= py -3.11 main.py` — очищает PYTHONPATH перед запуском.
|
||
22. **Path-based URL matching needs BOTH path AND full URL** — `urlparse(url).path` alone misses the verification page URL `/login?return_to=...account_verifications` (path = `/login`). Check BOTH `path` AND `url_lower` for `account_verif`/`launch`. The verification page is at `/login?return_to=...account_verifications`, NOT at `/account_verifications` directly. See `references/otp-and-provisioning.md`.
|
||
23. **`still_on_verify` time-limit** — in post-OTP loop, the `still_on_verify` check catches the same URL `/login?return_to=...account_verifications` indefinitely. Limit to first 10s of the 30s post-OTP window: `if still_on_verify and time.time() < deadline - 20`. After 10s, evaluate other signals (has_session, login page, code error).
|
||
24. **HTTP provisioning shares rate limit** — `provision.py` (requests) hits the SAME rate limit as the browser on the local IP. Login to fresh accounts via HTTP returns "login failed: rate". Use the same proxy as registration, or extract browser cookies and inject into `requests.Session`, or do 2FA+PAT through the browser (CDP) instead of HTTP.
|
||
25. **Проверка alive прокси перед использованием** — `_active_proxy_from_db()` выбирает прокси с максимальным `success_count`, но не проверяет актуальную доступность. Все прокси в пуле могут быть мертвы (bpproxy 2026-08-10). **Fix:** `curl -sI --max-time 10 -x <proxy> https://github.com` перед каждым использованием.
|
||
26. **Accounts created without octocaptcha are silently locked** — CDP form submission without `octocaptcha-token` creates the account (OTP email arrives), but GitHub flags and locks it immediately. Login fails with "Incorrect username or password" even through real Chrome browser. The `octocaptcha-token` field is `required` on the signup form — without it, the account is born-dead. Honeypot fields (`required_field_*`) must be left empty. **Fix:** solve octocaptcha before form submission, or use a pre-warmed profile that bypasses the captcha entirely. Verified 2026-08-10: manual browser login with just-created credentials also fails.
|
||
27. **CDP `requestSubmit()` vs `submit()`** — `form.submit()` bypasses JavaScript event handlers (including octocaptcha validation). Use `form.requestSubmit ? form.requestSubmit() : form.submit()` to trigger proper HTML5 form validation and event handlers.
|
||
28. **CDP debug pattern** — Dump page fields and body text via `Runtime.evaluate` to diagnose form issues. JS snippet: `JSON.stringify({title: document.title, url: window.location.href, fields: Array.from(document.querySelectorAll('input')).map(el => el.id + '|' + (el.name||'') + '|' + (el.type||'') + '|' + (el.getAttribute('inputmode')||'')), body: document.body ? document.body.innerText.substring(0, 300) : ''})`. Log before and after each form submission.
|
||
29. **CDP `Runtime.evaluate` with `awaitPromise: true`** — Without `awaitPromise: true`, `Runtime.evaluate` returns immediately without waiting for the expression to complete. Always use `awaitPromise: true` for async operations and form submissions. The CDP message format: `{"id": N, "method": "Runtime.evaluate", "params": {"expression": code, "returnByValue": true, "awaitPromise": true}}`.
|
||
|
||
## Результаты
|
||
|
||
- **2026-07-27**: `nova9417` через mail.tm + persistent profile ✅
|
||
- **2026-07-27**: `0402294270-0001-2943` через t-online.de + persistent profile ✅
|
||
- **2026-07-27**: 3-strategy code fill (digit boxes / single input / keyboard) ✅
|
||
- **2026-07-09**: v6 скрипт работал, но требовал IMAP email (не mail.tm)
|
||
- **2026-08-10**: CDP подход через системный Chrome 151 работает, Playwright Chromium крашится
|
||
- **2026-08-10**: OTP через `launch_code[]` боксы (8 шт.) — больше не используются GitHub. Текущий подход: `input[inputmode="numeric"]` (стратегия S2)
|
||
- **2026-08-10**: Post-OTP `still_on_verify` с time-limit 10s — необходим, иначе проверка ловит `/login?return_to=...account_verifications` бесконечно
|
||
- **2026-08-10**: Path + full URL matching — path-only (pitfall #22) не видит `account_verif` в query string. Нужна проверка обоих
|
||
- **2026-08-10**: bpproxy.at residential pool — все 10 прокси физически мертвы (curl: пустой ответ). Нужны новые прокси
|
||
- **2026-08-10**: `PYTHONPATH=` фикс для Python 3.11 — без него hermes-venv вызывает PermissionError на playwright
|
||
- **2026-08-10**: mail.tm домены (`emalupe.com`) блокируются GitHub — OTP accepted, но аккаунт не создаётся (404). Нужен t-online.de IMAP
|
||
- **2026-08-12**: ZTE proxy + Camoufox + .de IMAP — 4 аккаунта зарегистрировано (2FA+токен+прогрев) за один запуск. DataDome `t=bv` на 5-м — IP забанен. 2Captcha zero balance. ZTE DISCONNECT/CONNECT возвращает failure.
|
||
- **2026-08-12**: Task API формат: все параметры в `config` dict. `executor_type` default = `protocol` (не `headed`). `use_proxy: "0"` в `extra` отключает bpproxy-пул. `proxy` на верхнем уровне config задаёт прокси браузера.
|
||
- **2026-08-12**: IMAP pool `allow_reuse=false` — 17,872 email'ов, 89 использовано, 17,597 доступно. ~30% email'ов уже заняты на GitHub (из предыдущих сессий). Авто-ротация находит свежий за 1-2 попытки.
|
||
|
||
## CDP подход (альтернатива Playwright)
|
||
|
||
Когда Playwright Chromium крашится на Windows, использовать системный Chrome через CDP:
|
||
|
||
```bash
|
||
chrome.exe --remote-debugging-port=9222 --user-data-dir=.../chrome_profile
|
||
```
|
||
|
||
Управление через websocket + `Runtime.evaluate`. См. `references/cdp-approach.md`.
|
||
|
||
## Post-регистрационное provisioning
|
||
|
||
После регистрации — 2FA и PAT через `provision.py` (из `авторег проект/backend/platforms/github/provision.py`):
|
||
|
||
- `enable_2fa(email, password)` → `{totp_secret, recovery_codes}` — чистый HTTP, без браузера
|
||
- `generate_token(email, password, totp_secret, scopes)` → `ghp_...` — classic PAT
|
||
|
||
См. `references/otp-and-provisioning.md`.
|
||
|
||
## Camoufox (альтернативный backend)
|
||
|
||
`авторег проект/backend/platforms/github/browser_register.py` — полноценный Camoufox-based регистратор с:
|
||
- DataDome обходом (два слоя)
|
||
- SOCKS5 прокси
|
||
- Авто-логином после регистрации
|
||
- Извлечением сессии
|
||
|
||
Установлен: `camoufox==0.4.11`, `cloverlabs-camoufox==0.6.0`.
|
||
|
||
30. **IMAP pool exhausted — #1 failure mode в ENI AUTOREG v3.0 (2026-08-11)** — Дашборд показывает `FAIL: IMAP pool exhausted — add accounts or enable reuse` для каждой попытки регистрации. Пул `data/working_mails_live.txt` пуст или все почты израсходованы. **Fix:** (a) пополнить файл свежими t-online.de почтами, (b) переключить дефолтный mailbox на NotLetters API или mail.tm API (не требуют IMAP-пула), (c) включить `reuse` режим в настройках IMAP-провайдера. Проверить состояние пула: `wc -l backend/data/working_mails_live.txt`. Логи дашборда (Tasks → клик по задаче → LIVE LOGS) показывают ошибку мгновенно — задача не тратит прокси, fail fast.
|
||
|
||
31. **ZTE proxy IP бан после 3-4 регистраций (2026-08-12)** — DataDome детектит `t=bv` (banned). Без работающего DataDome-солвера аккаунт фейлится. **Fix:** ротировать IP ZTE-модема каждые 3 регистрации. DISCONNECT/CONNECT через goform ненадёжен — физическая перезагрузка модема надёжнее.
|
||
|
||
32. **`allow_reuse=true` отдаёт уже занятые GitHub email'ы (2026-08-12)** — IMAP-пул не знает, какие email'ы уже зарегистрированы на GitHub. При reuse pool выдаёт те же адреса → GitHub `email TAKEN` → задача тратит время на ротацию. **Fix:** `allow_reuse=false` для чистых регистраций. `allow_reuse=true` только для тестов.
|
||
|
||
33. **2Captcha zero balance — DataDome unsolvable (2026-08-12)** — 2Captcha — единственный DataDome-солвер для Firefox/Camoufox. При нулевом балансе капча не решается → задача фейлится. **Fix:** пополнить 2Captcha ($3-5 минимум). CapSolver не подходит для Camoufox (требует Chrome UA).
|
||
|
||
34. **Task API: `executor_type` default = `protocol`, не `headed` (2026-08-12)** — `task_runtime.py` line 203: `executor_type = payload.get("executor_type", "protocol")`. Без явного указания `executor_type: "headed"` в config задача запускается в HTTP-режиме, не в браузере. Лог: `Task started: github x5 [protocol]` вместо `[headed]`.
|
||
|
||
35. **Recovery codes не сохраняются в `github_accounts_2fa.txt` (2026-08-12)** — ENI AUTOREG v3.0: `provision.py` → `enable_2fa()` вызывает `persist_pending` только для сохранения в БД (таблица `account_credentials`), но **не дописывает строку в `data/github_accounts_2fa.txt`**. Файл содержит только старые аккаунты (16 записей на 2026-08-12). **Fix:** добавить дописывание строки в файл после успешного `enable_2fa` в формате `email:password:[REDACTED] Recovery codes = 12 слов/16 hex-кодов, лежат в поле `recovery_codes` ответа от `enable_2fa`.
|
||
|
||
36. **DataDome wall taxonomy — classify before acting (2026-10-12)** — четыре разные стены: slider (`div.sliderContainer`, решается drag), robot wall (`captcha__robot` в iframe — нерешаема, fail fast + disable сессии), JS-challenge wall (пустая страница «Please enable JS and disable any ad blocker» — переживает reload'ы, disable сессии), SSL-broken proxy (Firefox рендерит «SSL received a record that exceeded…» КАК СТРАНИЦУ — прокси мёртв, не reload). Маркеры проверять и внутри iframe, не только main page. Полная таблица + селекторы: `references/datadome-slider-stall-debug-bank-audit.md`.
|
||
|
||
37. **Residential sticky-пул: disable ТОЛЬКО по exact URL (2026-10-12)** — все sticky-сессии делят один host:port (различается только `sess<N>` в username); disable по host:port комментирует ВЕСЬ пул → runner падает на direct IP → secondary rate limit. Точный URL + ambiguity guard в ротаторе (отказ при >1 совпадении). Residential-латентность ломает тайминги: verify-редирект 10-30с, auto-login cookie ждать 75с (не 30с — иначе акки сохраняются verified-only без repo/2FA/PAT).
|
||
|
||
38. **Patient verify-wait после launch-кода (2026-10-12)** — проверка «verify stable» за ~4с ЛОЖНО объявляет хороший код rejected на медленном residential. Ждать до 90с; «rejected» только при явном error-баннере (incorrect/invalid code/wrong code/try again) или полном таймауте; на середине один раз перепечатать код (auto-submit может пропустить событие 8-го бокса).
|
||
|
||
39. **Параллельные батчи = дизъюнктные пулы (2026-10-12)** — раннер читает config ОДИН раз на старте и поддерживает `--config <file>`; второй батч = `config_b.json` + `proxies_b.txt` с непересекающимся диапазоном сессий → разные exit IP, ноль коллизий. Два батча с одного пула могут взять одну сессию одновременно → кросс-флаг аккаунтов.
|
||
|
||
40. **Цена рестарта батча (2026-10-12)** — kill в mid-flow теряет аккаунт безвозвратно: у упавших акков пароль НЕ сохраняется → backfill невозможен. Группировать фиксы и рестартовать один раз; перед kill сверять живой pid + CreationDate через CIM — heartbeat'ы уже убитых батчей продолжают приходить как stale-буферы (смотреть на таймстемпы в логе, не на номер процесса).
|
||
|
||
## ENI AUTOREG v3.0 Task API (прямой запуск без дашборда)
|
||
|
||
Запуск через `POST /api/tasks` — **все параметры внутри `config`**:
|
||
|
||
```json
|
||
{
|
||
"platform": "github",
|
||
"action": "register",
|
||
"count": 5,
|
||
"config": {
|
||
"executor_type": "headed",
|
||
"captcha_solver": "yescaptcha_api",
|
||
"proxy": "http://127.0.0.1:8899",
|
||
"extra": {
|
||
"use_proxy": "0",
|
||
"identity_provider": "mailbox"
|
||
}
|
||
}
|
||
}
|
||
```
|
||
|
||
**Критично:** `config` — dict с ВСЕМИ runtime-параметрами. `executor_type`, `captcha_solver`, `proxy` — на верхнем уровне config. `use_proxy` — внутри `extra`. `proxy` задаёт прокси для браузера; `use_proxy: "0"` в extra отключает bpproxy-пул.
|
||
|
||
Значения по умолчанию в `task_runtime.py`:
|
||
- `executor_type`: `"protocol"` (НЕ `"headed"`!) — всегда указывать явно
|
||
- `captcha_solver`: `"auto"`
|
||
- `_use_proxies`: `str(extra.get("use_proxy", "1"))` — `"1"` по умолчанию (bpproxy-пул активен)
|
||
|
||
## ZTE Proxy для GitHub
|
||
|
||
ZTE-модем (192.168.0.1) → mobile proxy на `127.0.0.1:8899`. **Работает чисто** — DataDome не появляется на первых 2-3 регистрациях. После 3-4 рег IP банится (`t=bv`), нужна ротация.
|
||
|
||
### Ротация IP ZTE-модема
|
||
|
||
Логин: `SHA256(SHA256(password).upper() + LD).upper()` → POST `goformId=LOGIN` (result=0).
|
||
Ротация: `DISCONNECT_NETWORK` → ждать 10с → `CONNECT_NETWORK`.
|
||
**Важно:** DISCONNECT/CONNECT часто возвращают `{"result":"failure"}` даже после успешного логина. Физическая перезагрузка модема надёжнее.
|
||
|
||
### DataDome solver chain (Camoufox)
|
||
|
||
Camoufox = Firefox UA → **CapSolver отклоняет** (требует Chrome UA, `NotImplementedError`). **2Captcha** — единственный DataDome-солвер для Firefox UA. При `t=bv` солверы не нужны — нужна ротация IP.
|
||
|
||
Порядок в `solve_datadome_with_fallback`: настроенные candidates → CapSolver → 2Captcha. YesCaptcha НЕ поддерживает DataDome.
|
||
|
||
### IMAP пул: reuse и занятые email'ы
|
||
|
||
`allow_reuse: false` — предотвращает повторную выдачу email'ов, уже использованных этим экземпляром пула. **НО:** email'ы, зарегистрированные на GitHub в предыдущих сессиях, пул не знает. GitHub отвечает `email TAKEN` → авто-ротация до 5 раз. При 17,872 почт в пуле большинство свежих находится за 1-2 ротации.
|
||
|
||
Управление: `PUT /api/providers/mailbox/imap_pool` → `config.imap_pool_allow_reuse: "true"/"false"`.
|
||
|
||
## ENI AUTOREG v3.0 Dashboard (основной интерфейс с 2026-08-11)
|
||
|
||
Основной способ запуска GitHub-регистраций — дашборд ENI AUTOREG v3.0, а не standalone-скрипты из `gh-autoreg`.
|
||
|
||
### Пути
|
||
|
||
- **Проект**: `C:\Users\User\Desktop\авторег проект\`
|
||
- **Бэкенд**: `backend/main.py` — FastAPI на `http://127.0.0.1:8002`
|
||
- **Фронтенд**: `frontend/` — Vite dev-server на `http://127.0.0.1:5173`
|
||
- **База**: `backend/account_manager.db` — SQLite (299+ аккаунтов, 1038+ задач)
|
||
- **IMAP-пул**: `backend/data/working_mails_live.txt` — t-online.de почты
|
||
- **Платформы**: 32 платформы (GitHub: 215 аккаунтов, 728 задач)
|
||
|
||
### Запуск
|
||
|
||
```bash
|
||
# Бэкенд (Python 3.11, чистая среда)
|
||
cd "/c/Users/User/Desktop/авторег проект/backend"
|
||
PYTHONPATH= py -3.11 main.py
|
||
|
||
# Фронтенд
|
||
cd "/c/Users/User/Desktop/авторег проект/frontend"
|
||
npm run dev
|
||
```
|
||
|
||
Проверка: `curl http://127.0.0.1:8002/api/health` → `{"ok":true}`.
|
||
|
||
### Запуск регистрации через дашборд
|
||
|
||
1. Открыть `http://127.0.0.1:5173`
|
||
2. Platforms → GitHub → **Register Account**
|
||
3. Модалка: выбрать количество (1-100), executor (Headed/Headless), captcha solver (auto / yescaptcha_api), прокси (опционально)
|
||
4. Нажать **Register account**
|
||
5. Смотреть логи: Tasks → клик по задаче → LIVE LOGS (SSE-стрим)
|
||
|
||
### Провайдеры mailbox в дашборде
|
||
|
||
| Провайдер | Тип | Статус |
|
||
|-----------|-----|--------|
|
||
| t-online.de IMAP Pool | IMAP (файл) | DEFAULT, enabled |
|
||
| NotLetters API | REST API | Enabled |
|
||
| NotLetters IMAP | IMAP (файл) | Enabled |
|
||
| mail.tm | REST API | Enabled |
|
||
| Temp-Mail Web | Web | Enabled |
|
||
| reforrm.me catch-all | IMAP (Gmail) | Disabled |
|
||
|
||
## Связанные референсы
|
||
|
||
- `references/datadome-slider-stall-debug-bank-audit.md` — DataDome wall taxonomy (slider/robot/JS-wall/SSL/mid-wizard interstitial) + живые DOM-селекторы слайдера, residential sticky-пул ops (exact-URL disable), patient verify-wait, параллельные батчи через --config, bank-аудит через PAT `/user`, backfill PAT через password-reset (IMAP TO-search + BODY.PEEK), debug_stall-артефакты
|
||
- `references/camoufox-registration-patterns.md` — Camoufox регистрация: `_wait_form_valid` (octocaptcha), правильный клик (не social buttons), navigation wait, mail.tm API, post-OTP pitfalls
|
||
- `references/zte-proxy-task-api.md` — ZTE прокси, Task API формат, DataDome solver chain, mailbox provider management
|
||
- `references/octocaptcha-datadome.md` — анализ OctoCaptcha (второй слой DataDome), все failed подходы
|
||
- `references/mailtm-utils.md` — утилиты mail.tm
|
||
- `references/cdp-approach.md` — CDP подход (системный Chrome) вместо Playwright
|
||
- `references/otp-and-provisioning.md` — OTP ввод через launch_code[], пост-регистрация (2FA + PAT)
|
||
- `templates/socks5_bridge.py` — встроенный SOCKS5-мост для Playwright
|
||
- `templates/reg.py` — шаблон регистрации через .de IMAP
|
||
- `templates/reg_mailtm.py` — шаблон регистрации через mail.tm
|
||
- Проект: `C:\\Users\\User\\gh-autoreg\\` (готовый к заливке на GitHub) |