CAPTCHA thanh trượt GeeTest v3 yêu cầu hai tham số để giải quyết: gt (mã định danh trang web tĩnh) và challenge (mã thông báo phiên động). Hướng dẫn này chỉ ra cách trích xuất cả hai từ bất kỳ trang nào và gửi chúng tới CaptchaAI.
Giải thích các thông số GeeTest v3
| tham số | Mô tả | Tĩnh/Dynamic | Ví dụ |
|---|---|---|---|
gt |
Mã định danh trang web (hex 32 ký tự) | Tĩnh trên mỗi trang web | 019924a82c70bb123aae90d483b6a0ed |
challenge |
Mã thông báo phiên (hex 32 ký tự) | Động trên mỗi lần tải trang | a3f5c8d2e1b04a6789012345678abcdf |
api_server |
Tên miền phụ API GeeTest (tùy chọn) | Tĩnh trên mỗi trang web | api-na.geetest.com |
Giá trị gt vẫn giữ nguyên trong các yêu cầu. Giá trị challenge thay đổi mỗi khi tải CAPTCHA — bạn phải trích xuất một giá trị mới cho mỗi lần giải.
Phương pháp 1: Chặn lệnh gọi API đăng ký
Hầu hết các triển khai GeeTest v3 đều lấy thử thách từ điểm cuối đăng ký. Phản hồi trông giống như:
{
"success": 1,
"challenge": "a3f5c8d2e1b04a6789012345678abcdf",
"gt": "019924a82c70bb123aae90d483b6a0ed",
"new_captcha": true
}
Python (yêu cầu)
import requests
import re
session = requests.Session()
html = session.get("https://staging.example.com/qa-login").text
# Find the register endpoint
register_url = re.search(
r'(https?://[^"\']+(?:register|captcha|geetest)[^"\']*)',
html
)
if register_url:
resp = session.get(register_url.group(1)).json()
gt = resp["gt"]
challenge = resp["challenge"]
print(f"gt: {gt}")
print(f"challenge: {challenge}")
JavaScript (Đánh chặn mạng Puppeteer)
const puppeteer = require('puppeteer');
const browser = await puppeteer.launch();
const page = await browser.newPage();
let geetestParams = {};
page.on('response', async (response) => {
const url = response.url();
if (url.includes('register') || url.includes('captcha')) {
try {
const json = await response.json();
if (json.gt && json.challenge) {
geetestParams = {
gt: json.gt,
challenge: json.challenge,
};
console.log('Captured GeeTest params:', geetestParams);
}
} catch (e) {}
}
});
await page.goto('https://staging.example.com/qa-login', { waitUntil: 'networkidle2' });
console.log('Final params:', geetestParams);
Cách 2: Trích xuất từ nguồn trang
Một số trang web nhúng các tham số trực tiếp vào HTML hoặc tập lệnh nội tuyến:
import re
# From data attributes
gt_match = re.search(r'data-gt=["\']([a-f0-9]{32})', html)
challenge_match = re.search(r'data-challenge=["\']([a-f0-9]{32})', html)
# From JavaScript variables
if not gt_match:
gt_match = re.search(r'gt\s*[=:]\s*["\']([a-f0-9]{32})', html)
if not challenge_match:
challenge_match = re.search(r'challenge\s*[=:]\s*["\']([a-f0-9]{32})', html)
gt = gt_match.group(1) if gt_match else None
challenge = challenge_match.group(1) if challenge_match else None
print(f"gt={gt}, challenge={challenge}")
Cách 3: Móc initGeetest
GeeTest v3 khởi tạo thông qua initGeetest(). Chặn nó trước khi tập lệnh trang chạy:
// Puppeteer: inject before page scripts
await page.evaluateOnNewDocument(() => {
window.__geetestConfig = null;
const origInit = window.initGeetest;
Object.defineProperty(window, 'initGeetest', {
set(fn) {
this._initGeetest = function(config, callback) {
window.__geetestConfig = config;
console.log('GeeTest config:', JSON.stringify(config));
return fn(config, callback);
};
},
get() { return this._initGeetest; }
});
});
await page.goto('https://staging.example.com/qa-login', { waitUntil: 'networkidle2' });
const config = await page.evaluate(() => window.__geetestConfig);
// config = { gt: "019924a...", challenge: "a3f5c8d...", product: "bind", ... }
Giải GeeTest v3 bằng CaptchaAI
Python
import requests
import time
API_KEY = "YOUR_API_KEY"
# Submit
resp = requests.post("https://ocr.captchaai.com/in.php", data={
"key": API_KEY,
"method": "geetest",
"gt": gt,
"challenge": challenge,
"pageurl": "https://staging.example.com/qa-login",
"json": "1",
}).json()
if resp["status"] != 1:
raise Exception(f"Submit error: {resp['request']}")
task_id = resp["request"]
# Poll
for _ in range(30):
time.sleep(5)
result = requests.get("https://ocr.captchaai.com/res.php", params={
"key": API_KEY, "action": "get", "id": task_id, "json": "1"
}).json()
if result["status"] == 1:
solution = result["request"]
print(f"Solution: {solution}")
break
if result["request"] != "CAPCHA_NOT_READY":
raise Exception(f"Error: {result['request']}")
JavaScript
const submit = await axios.post('https://ocr.captchaai.com/in.php', null, {
params: {
key: 'YOUR_API_KEY',
method: 'geetest',
gt: geetestParams.gt,
challenge: geetestParams.challenge,
pageurl: 'https://staging.example.com/qa-login',
json: 1,
}
});
const taskId = submit.data.request;
let solution = null;
for (let i = 0; i < 30; i++) {
await new Promise(r => setTimeout(r, 5000));
const poll = await axios.get('https://ocr.captchaai.com/res.php', {
params: { key: 'YOUR_API_KEY', action: 'get', id: taskId, json: 1 }
});
if (poll.data.status === 1) {
solution = poll.data.request;
break;
}
}
console.log('Solution:', solution);
Tiêm dung dịch GeeTest
Phản hồi CaptchaAI cho GeeTest v3 bao gồm challenge, validate và seccode:
# solution is a pipe-delimited string or JSON object
# Parse and inject into the form
import json
sol = json.loads(solution) if isinstance(solution, str) else solution
driver.execute_script("""
const form = document.querySelector('form');
function addHidden(name, value) {
let input = form.querySelector(`input[name="${name}"]`);
if (!input) {
input = document.createElement('input');
input.type = 'hidden';
input.name = name;
form.appendChild(input);
}
input.value = value;
}
addHidden('geetest_challenge', arguments[0]);
addHidden('geetest_validate', arguments[1]);
addHidden('geetest_seccode', arguments[2]);
""", sol["challenge"], sol["validate"], sol["seccode"])
Khắc phục sự cố
| Vấn đề | Nguyên nhân | Cách xử lý |
|---|---|---|
ERROR_BAD_PARAMETERS |
Thiếu gt hoặc challenge |
Cả hai đều được yêu cầu; trích xuất các giá trị mới |
| Thử thách cũ | Mã thông báo thử thách đã hết hạn | Trích xuất một thử thách mới ngay trước khi gửi |
Giá trị gt sai |
Sao chép từ trang web khác | gt dành riêng cho từng trang web; trích xuất lại từ mục tiêu |
| Giải pháp bị từ chối bởi trang web | Thử thách đã hết hạn trong khi giải | Giảm thời gian giữa trích xuất và gửi |
Câu hỏi thường gặp
Thử thách GeeTest có hiệu lực trong bao lâu?
Thông thường là 60-120 giây. Trích xuất thử thách và gửi tới CaptchaAI ngay lập tức.
Sự khác biệt giữa GeeTest v3 và v4 là gì?
GeeTest v3 sử dụng các tham số gt/1ZZ và một thanh trượt. GeeTest v4 sử dụng captcha_id và có nhiều loại thử thách (nhấp, khớp, trượt).
Giải quyết CAPTCHA GeeTest v3 bằng CaptchaAI
Nhận khóa API của bạn tạicaptchaai.com.