Files

53 lines
8.6 KiB
Markdown
Raw Permalink 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.

# CDK/Promo-охота на прокси-провайдеров (NovProxy, ZooProxy, паттерн для любых)
Класс задачи: вендор раздаёт промо-коды (CDK) на бесплатный трафик в форумах; коды first-come-first-served и выжигаются за минуты. Устойчивый подход — НЕ ручной перебор публичных кодов (все уже used), а автоматический хантер: поллинг источников → diff с used-множеством → мгновенная рега аккаунта → redeem.
## Архитектура хантера
1. **State-файл** (`*_hunter_state.json`): `used_codes` (seed = все когда-либо виденные), `pending_accounts` (акки без redemption), `wins`.
2. **Скан источников** каждый тик: форумы (ниже). Новый код = не в used_codes.
3. **Рега аккаунта ТОЛЬКО при находке нового кода** — вендоры имеют fingerprint-антифрод, массовая рега впустую = бан. Рега через прокси (пул `Desktop/proxy_bot/proxies.db`, `SELECT proxy FROM pool WHERE alive=1 ORDER BY RANDOM()`).
4. **1 аккаунт = 1 redemption** — после win акк уходит в wins, под следующий код регается новый.
5. **Cron watchdog**: no_agent-скрипт каждые 30м, stdout пустой при отсутствии событий (no delivery), при WIN — одна строка в чат. Воронка: wrapper вызывает хантер(ы) subprocess'ом, фильтрует stdout по `WIN|wins=[1-9]|new: [1-9]|crash`.
6. **Cap 5 redeem'ов за прогон** — не светить автоматизацию.
## Источники кодов (форум-паттерны)
- **Discourse (nodeloc.com, idcflare.com)**: `https://nodeloc.com/t/<topic_id>.json` публичный, коды в `post_stream.posts[].cooked`. ОБЯЗАТЕЛЬНО `-L`/`allow_redirects=True` — без него 301 и пустой ответ. Новые топики: `/search.json?q=<vendor>%20CDK`.
- **Cloudflare-закрытые форумы (idcflare, Altenens, crackingx)**: только через `https://r.jina.ai/<url>`. Jina троттлит БЁРСТЫ (серия запросов подряд → заглушка ~5.8KB без контента); одиночные разнесённые запросы проходят даже с того же IP. Рабочий рецепт: (1) проверять маркер контента (`post_stream` в тексте), а не HTTP-статус — заглушка приходит с 200; (2) пэйсинг 20-25с между фетчами топиков; (3) кэш результатов в state (`topic_cache`, TTL 3ч) — обычный тик трогает 1-2 URL; (4) ретраи через СВЕЖИЙ прокси из пула на каждой попытке (новый IP = новая квота jina; ~20% free-проксей живые); (5) глобальный deadline скана 300-360с, иначе cron-обёртка словит таймаут. Короткий UA `Mozilla/5.0` достаточен.
- **XenForo (altenens.is)**: `page-999` в URL клампится к последней странице — способ получить свежие посты без знания числа страниц. Пермалинки `/post-<id>` через jina рендерят ВСЮ первую страницу, а не один пост — не полагаться на них.
- **web_search по `<vendor> CDK`** периодически вытаскивает новые треды (crdpro, blackhatpakistan и т.п.) — добавлять найденные topic-id в список скана.
Форматы кодов: NovProxy `[A-Z0-9]{16}`, ZooProxy `XXXX-XXXX-XXXX`. Regex БЕЗ `\b`: в jina-выводе JSON-экранированного HTML непосредственно перед кодом стоит `e` из литерала `\u003e` (word char) — word-boundary не возникает, и паттерн с `\b` даёт 0 совпадений там, где plain-паттерн находит все. Мусор из постов отсеивать BLACKLIST'ом.
## NovProxy (проверено: рега работает, капча $0)
API `https://api.novproxy.com`, регистрация БЕЗ браузера:
1. `POST /novip` → `data: {id, img (data:image/png;base64), k}` — капча 4 знака.
2. Решить капчу голосованием локальных vision-моделей (`http://127.0.0.1:16432/v1/chat/completions`, модели qwen-vl-ocr / qwen3-vl-plus, промпт «Reply with ONLY the characters»); принять первый ответ 3-6 alnum-символов.
3. `cyemail` = base64(AES-CBC(key=MD5hex(k + '_sign_up'), iv=key[:16], plaintext=`<visitor_id 32hex>`,`<email>`), PKCS7 pad).
4. `POST /v1/signup` **form-data**: `lang=en, email, pwd, kwd='', pcode='', result=<captcha>, idkey=<id>, headless='false', cyemail`.
5. Redeem: `POST /v1/cdkeyUse` data `{cdkey, token, lang}` (token в data, не в хедерах — axios-обёртка дашборда кладёт его в тело). Ответ code=0 win, code=2 «The code has been used».
6. После win: `POST /v1/member` (traffic), `/v1/addTrafficWhite` {ip} (whitelist своего IP), `/v1/getIp` + `/v1/nov/account_domain` (прокси-эндпоинты появляются только при трафике; на пустом акке «Ip balance is empty» — норма).
Почта: voidash.bond проходит. Disablemsg про Китай — на UA/EU IP не влияет.
## ZooProxy (проверено: рега без капчи)
API `https://api.zooproxy.com`, хедер **`X-Custom: zooproxy`** обязателен.
1. `POST /flux_api/v1/sign_up` **СТРОГО form-encoded** (`data=`): `email, pwd, pcode='', kwd='', lang='en', token=''`. JSON-тело даёт ложное `code:10 "Email format error"` — дело не в email, а в content-type/наборе полей.
2. Redeem: `POST /flux_api/v1/cdkey/use` data `{cdkey, token, lang}`, Origin/Referer `https://console.zooproxy.com/`.
3. Трафик: `/flux_api/v1/users/traffic_info`. `/v1/cdkeys` и `/v1/cdkeyRecord` — история (пусты до win).
## Pitfalls
- Сохранённый ответ API может лежать в state-файле как **stringified JSON** (`resp` = строка) — парсить `json.loads(resp)['data']['token']`, а не regex'ом по `json.dumps()` файла: экранированные кавычки ломают паттерн `token":`.
- Публичные коды из поисковой выдачи почти гарантированно уже redeemed — не тратить прогоны на перебор старых тредов, ценность только в свежих постах (поллинг последней страницы).
- Не регистрировать акки «про запас» пачками с одного IP/фингерпринта — вендор банит за мульти-аккаунт-паттерн; рега строго под найденный код, через прокси.
- XenForo-треды «daily update» могут содержать коды только в первом посте (устаревшие) — реальные дропы вендора в последних постах, сканировать хвост треда.
- Discourse `search.json` содержит id не только топиков, но и постов/юзеров — новые топики для скана извлекать ТОЛЬКО JSON-парсингом массива `topics[]`; сырой regex по `"id"` тащит мусорные id и раздувает список скана.
- Прокси-ретрай не должен молча фолбэчиться на direct при исключении мёртвого прокси — иначе «троттлинг» на самом деле запросы с того же throttled IP; брать новый прокси на каждую попытку и давать исключению всплыть до следующего attempt.
- После фикса extraction-логики (regex, парсер) сбрасывать `topic_cache` в state — записи «0 кодов» от сломанного экстрактора маскируют баг на весь TTL и блокируют рескан.