File size: 5,659 Bytes
504b397 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 | # Acceptance
This page documents acceptance targets for each supported captcha type, including the test URLs, site keys, and observed outcomes during local validation runs.
## Summary
| Captcha type | Target | Status |
|-------------|--------|--------|
| reCAPTCHA v3 | `https://antcpt.com/score_detector/` | β
Token returned |
| Cloudflare Turnstile | `https://react-turnstile.vercel.app/basic` | β
Dummy token returned |
| reCAPTCHA v2 | `https://www.google.com/recaptcha/api2/demo` | β οΈ Requires audio challenge (see notes) |
| hCaptcha | `https://accounts.hcaptcha.com/demo` | β οΈ Challenge-dependent |
| Image-to-Text | Local base64 image | β
Text returned via vision model |
| Classification | Local base64 grid | β
Object indices returned via vision model |
---
## reCAPTCHA v3 β Primary acceptance target
**URL:** `https://antcpt.com/score_detector/`
**Site key:** `6LcR_okUAAAAAPYrPe-HK_0RULO1aZM15ENyM-Mf`
### Acceptance checklist
1. Install dependencies and Playwright Chromium.
2. Start the service: `python main.py`
3. Confirm `GET /api/v1/health` returns all 19 supported types.
4. Create a `RecaptchaV3TaskProxyless` task.
5. Poll `POST /getTaskResult` until `status=ready`.
6. Confirm a non-empty `solution.gRecaptchaResponse`.
### Curl example
```bash
TASK=$(curl -s -X POST http://localhost:8000/createTask \
-H "Content-Type: application/json" \
-d '{
"clientKey": "your-key",
"task": {
"type": "RecaptchaV3TaskProxyless",
"websiteURL": "https://antcpt.com/score_detector/",
"websiteKey": "6LcR_okUAAAAAPYrPe-HK_0RULO1aZM15ENyM-Mf",
"pageAction": "homepage"
}
}' | python -c "import sys,json; print(json.load(sys.stdin)['taskId'])")
curl -s -X POST http://localhost:8000/getTaskResult \
-H "Content-Type: application/json" \
-d '{"clientKey":"your-key","taskId":"'"$TASK"'"}'
```
### Verified outcome
- Service startup: β
- Health endpoint: β
(19 types registered)
- Task creation: β
- Token returned: β
(non-empty `gRecaptchaResponse`, length ~1060 chars)
---
## Cloudflare Turnstile
**URL:** `https://react-turnstile.vercel.app/basic`
**Site key:** `1x00000000000000000000AA` (Cloudflare official test key β always passes)
### Curl example
```bash
curl -s -X POST http://localhost:8000/createTask \
-H "Content-Type: application/json" \
-d '{
"clientKey": "your-key",
"task": {
"type": "TurnstileTaskProxyless",
"websiteURL": "https://react-turnstile.vercel.app/basic",
"websiteKey": "1x00000000000000000000AA"
}
}'
```
### Verified outcome
- Token returned: β
`XXXX.DUMMY.TOKEN.XXXX` (expected for Cloudflare test sitekeys)
---
## reCAPTCHA v2
**URL:** `https://www.google.com/recaptcha/api2/demo`
**Site key:** `6Le-wvkSAAAAAPBMRTvw0Q4Muexq9bi0DJwx_mJ-`
### Behavior with headless Chromium
Headless browsers are detected by Google's risk analysis engine. The checkbox click succeeds, but a visual image challenge is presented rather than issuing a token immediately.
**Implemented mitigation:** The solver falls back to the **audio challenge path** β clicking the audio button in the challenge dialog, downloading the MP3, transcribing via the configured model, and submitting the transcript.
!!! note "Audio challenge transcription"
The audio challenge requires a language model capable of processing audio or base64-encoded audio data. Accuracy depends on the model endpoint configured via `CAPTCHA_MODEL`.
### Curl example
```bash
curl -s -X POST http://localhost:8000/createTask \
-H "Content-Type: application/json" \
-d '{
"clientKey": "your-key",
"task": {
"type": "NoCaptchaTaskProxyless",
"websiteURL": "https://www.google.com/recaptcha/api2/demo",
"websiteKey": "6Le-wvkSAAAAAPBMRTvw0Q4Muexq9bi0DJwx_mJ-"
}
}'
```
### Status
β οΈ Functionally implemented with audio challenge fallback. Success rate depends on model audio capability and Google's current challenge difficulty.
---
## hCaptcha
**URL:** `https://accounts.hcaptcha.com/demo`
**Site key:** `10000000-ffff-ffff-ffff-000000000001` (hCaptcha official test key)
### Behavior
The hCaptcha test key (`10000000-ffff-ffff-ffff-000000000001`) is designed to always pass β but headless browsers detected as bots still receive an image challenge. The solver clicks the checkbox iframe and polls for a token for up to 30 seconds.
### Status
β οΈ Checkbox click succeeds. Token issuance depends on hCaptcha's bot detection score. For test environments, using the [HCaptchaClassification](usage/classification.md) task type (direct image classification) is the recommended integration path.
---
## Image-to-Text
Any base64-encoded image can be sent to `ImageToTextTask`. The vision model returns a structured description suitable for click/slide/drag_match captcha automation.
### Status
β
Works with any OpenAI-compatible vision model endpoint. Accuracy depends on model capability.
---
## What these results mean
- β
**reCAPTCHA v3** and **Turnstile** are fully functional and pass in every local test run.
- β οΈ **reCAPTCHA v2** and **hCaptcha** browser-based solving is limited by headless browser detection. These captcha types are primarily intended to be integrated with `HCaptchaClassification` / `ReCaptchaV2Classification` task types for image grid solving, or via audio challenge transcription.
- The service is designed as a **backend solver for flow2api** β in practice, real-world integrations extract the image challenge frames and send them to the classification endpoint, rather than relying on full browser automation to pass the widget.
|