GeeTest uses interactive puzzles — slide, icon click, word match. reCAPTCHA uses image grids (v2) or invisible scoring (v3). Both are widely deployed, but they differ significantly in how they detect bots and what parameters are needed for solving.
Feature comparison
| Feature | GeeTest v3 | reCAPTCHA v2 | reCAPTCHA v3 |
|---|---|---|---|
| Challenge type | Slide/icon/word puzzles | Image grid selection | None (invisible) |
| Behavioral analysis | Mouse trajectory, speed curves | Mouse/keyboard, cookies | Continuous monitoring |
| Parameters needed | gt, challenge, pageurl | googlekey, pageurl | googlekey, action, pageurl |
| Response format | challenge, validate, seccode | Single token | Single token + score |
| Geographic focus | China, Asia, growing globally | Global | Global |
| Free tier | Limited | Yes | Yes |
| Dynamic parameters | challenge changes per session | Static sitekey | Static sitekey |
Detection approach
GeeTest
- Analyzes how you interact: slide speed, acceleration curves, micro-corrections
- Checks for perfectly linear mouse movement (bot indicator)
- Validates timing — too fast or too consistent = bot
- Inspects browser environment for automation signals
reCAPTCHA
- Analyzes behavioral patterns over time (v3 continuous scoring)
- Uses Google cookies for user reputation
- Checks IP reputation against Google's database
- v2 adds visual challenge as secondary verification
Solving complexity
| Aspect | GeeTest v3 | reCAPTCHA v2 | reCAPTCHA v3 |
|---|---|---|---|
| Parameter extraction | Medium (must fetch gt + challenge) | Easy (static sitekey) | Easy (static sitekey + action) |
| API method | method=geetest |
method=userrecaptcha |
method=userrecaptcha + version=v3 |
| Solve time | 15–30s | 15–30s | 5–10s |
| Response parsing | Complex (3 values) | Simple (1 token) | Simple (1 token) |
| Challenge reuse | No (single-use challenge) | N/A (token-based) | N/A (token-based) |
Solving with CaptchaAI
GeeTest v3
# Must fetch fresh challenge first
params = requests.get("https://example.com/api/captcha").json()
resp = requests.get("https://ocr.captchaai.com/in.php", params={
"key": API_KEY, "method": "geetest",
"gt": params["gt"], "challenge": params["challenge"],
"pageurl": URL, "json": 1
}).json()
# Solution has 3 parts
solution = poll_result(resp["request"])
# solution = {geetest_challenge, geetest_validate, geetest_seccode}
reCAPTCHA v2
resp = requests.get("https://ocr.captchaai.com/in.php", params={
"key": API_KEY, "method": "userrecaptcha",
"googlekey": "6Le-wvkSAAAA...", "pageurl": URL, "json": 1
}).json()
# Solution is a single token
token = poll_result(resp["request"])
Key differences for automation
| Consideration | GeeTest | reCAPTCHA |
|---|---|---|
| Fresh params per solve | Yes (challenge is single-use) | No (sitekey is static) |
| Session management | Must maintain session between param fetch and solve | Simpler — token is standalone |
| Token injection | Submit 3 form fields | Inject 1 hidden field |
| Fallback behavior | Usually no fallback | v3 often falls back to v2 |
| Error handling | Must handle expired challenges | Must handle token expiry |
FAQ
Which is more common?
reCAPTCHA is far more common globally. GeeTest dominates in China and is growing in Asia, Latin America, and some European markets.
Which is harder to solve?
Both are solvable with CaptchaAI at similar success rates. GeeTest requires more integration work (parameter extraction, 3-part response) compared to reCAPTCHA's simpler token-based flow.
Can a site use both GeeTest and reCAPTCHA?
Rarely, but some sites use GeeTest for login and reCAPTCHA for other forms. Handle each challenge independently.
Does GeeTest have an invisible mode?
GeeTest v3 always requires user interaction (slide, click, or match). There is no invisible mode like reCAPTCHA v3.
Discussions (0)
Join the conversation
Sign in to share your opinion.
Sign InNo comments yet.