autoreg-skills-max: initial public release (restored, redacted, hardened)
This commit is contained in:
@@ -0,0 +1,105 @@
|
||||
# Local Arkose FunCaptcha Solver (kekeds/funcaptcha-solver)
|
||||
|
||||
**Source**: https://github.com/kekeds/funcaptcha-solver
|
||||
**Status**: Self-hosted, 100% requests-based, fully reversed BDA
|
||||
|
||||
## What It Does
|
||||
Solves Arkose Labs FunCaptcha WITHOUT using external captcha services. Uses:
|
||||
- Browser fingerprinting (WebGL, canvas, etc.)
|
||||
- BDA (Blob Data Algorithm) decryption — fully reversed
|
||||
- Cryptographic operations (AES-CBC, MD5 key derivation)
|
||||
- JavaScript execution via Node.js jsdom
|
||||
- TLS fingerprint impersonation via curl_cffi
|
||||
|
||||
## Dependencies
|
||||
```bash
|
||||
# Python
|
||||
pip install cryptography curl_cffi pycryptodome flask numpy colorama PyExecJS javascript
|
||||
|
||||
# Node.js (v22+)
|
||||
npm install jsdom
|
||||
```
|
||||
|
||||
## How It Works
|
||||
1. Flask server on port 8003
|
||||
2. POST `/funcaptcha/createTask` with `preset`, `chrome_version`, optional `proxy` and `blob`
|
||||
3. Poll `/funcaptcha/getTask` until `status: "completed"`
|
||||
4. Returns `captcha.token` — the Arkose solution token
|
||||
|
||||
## Preset System
|
||||
Each site needs a preset with:
|
||||
- `siteurl` — where the Arkose iframe loads
|
||||
- `sitekey` — the Arkose public key
|
||||
- `apiurl` — the Arkose API subdomain
|
||||
- `data.window__ancestor_origins` — iframe parent chain
|
||||
- `data.client_config__sitedata_location_href` — iframe URL
|
||||
- `data.window__tree_structure` — DOM tree structure of iframe nesting
|
||||
- `data.window__tree_index` — which iframe in the tree
|
||||
|
||||
## Built-in Presets (working)
|
||||
- `linkedin_register`
|
||||
- `match_login`
|
||||
- `twitter_register`
|
||||
- `twitter_unlock`
|
||||
- `outlook_register`
|
||||
- `outlook_phone`
|
||||
|
||||
## GitHub Preset (added, not verified)
|
||||
```
|
||||
"github_signup": {
|
||||
"siteurl": "https://github.com/signup",
|
||||
"sitekey": "0651BCE4-8F66-4F8B-9C6D-5F5411DD9158",
|
||||
"apiurl": "https://github-api.arkoselabs.com",
|
||||
"data": {
|
||||
"window__ancestor_origins": ["https://github.com", ...],
|
||||
"client_config__sitedata_location_href": "https://github.com/signup",
|
||||
"window__tree_structure": "[[],[],[[]]]",
|
||||
"window__tree_index": [2, 0]
|
||||
}
|
||||
}
|
||||
```
|
||||
**Status**: Solver thread crashes silently — preset may need adjustment.
|
||||
|
||||
## Known Issues
|
||||
|
||||
### Preset Merge Order Bug (FIXED 2026-07-09)
|
||||
|
||||
**CRITICAL**: The original code at line 1476 had a bug where user parameters were OVERRIDDEN by preset defaults:
|
||||
|
||||
```python
|
||||
# WRONG — preset overrides user blob
|
||||
data={**data, **preset.get()[data["preset"]]}
|
||||
```
|
||||
|
||||
This means even if the script captures a real blob and passes it as `{"blob": "real_blob_value"}`, the solver ignores it and uses the preset's `"blob": "undefined"`. This causes `"DENIED ACCESS"` from Arkose because the blob is wrong.
|
||||
|
||||
**FIX**: Swap the merge order so user data overrides preset:
|
||||
|
||||
```python
|
||||
# CORRECT — user data overrides preset
|
||||
data={**preset.get()[data["preset"]], **data}
|
||||
```
|
||||
|
||||
Verify: `POST /funcaptcha/createTask` with `{"preset": "github_signup", "blob": "real_blob_value"}` should now use the real blob, not "undefined".
|
||||
|
||||
### IP-Level Blocking by Arkose (2026-07-09)
|
||||
**CRITICAL**: Arkose API returns `{"error":"DENIED ACCESS"}` (HTTP 200) for ALL presets when the IP is flagged. This is NOT a preset configuration issue — it's pure IP reputation. Tested with:
|
||||
- All presets (github, outlook, linkedin, twitter, snapchat, roblox)
|
||||
- blob=undefined, empty blob, no blob — all same result
|
||||
- curl_cffi with proper TLS impersonation — still blocked
|
||||
- The api.js endpoint loads fine (73KB), only the challenge endpoint rejects
|
||||
|
||||
**Diagnosis**: If ALL presets fail with "DENIED ACCESS", the IP is blocked. Rotate to a clean IP.
|
||||
|
||||
**Verification**: Test with a known-working preset (e.g. snapchat_register) — if that also returns "DENIED ACCESS", the IP is the problem, not the preset.
|
||||
|
||||
**Workaround for GitHub**: A persistent (warmed-up) Chrome profile bypasses the Arkose captcha entirely — the solver is not needed. See `references/github-registration.md` for the full pattern. This is the ONLY working approach for GitHub registration without a proxy.
|
||||
|
||||
### Solver Crashes
|
||||
- Solver crashes are caught by Flask's generic `except Exception: return invalid request` — no error logging
|
||||
- Requires Node.js with jsdom (heavy dependency)
|
||||
- `curl_cffi` TLS impersonation may be detectable by some sites
|
||||
- WebGL fingerprint data in `webgl.json` (2.7MB) may need rotation
|
||||
|
||||
## Installation Location
|
||||
`C:\Users\User\Desktop\funcaptcha-solver\` (cloned 2026-07-09)
|
||||
Reference in New Issue
Block a user