GeeTest v3 đưa ra các thử thách tương tác — câu đố trượt, lựa chọn biểu tượng hoặc ghép từ. Không giống như reCAPTCHA, GeeTest sử dụng luồng xác minh tùy chỉnh với ba tham số (gt, challenge, api_server) mà bạn phải trích xuất từ trang trước khi giải.
Hướng dẫn này hướng dẫn toàn bộ quy trình trích xuất các tham số GeeTest và giải quyết thử thách bằng API CaptchaAI.
Yêu cầu
| Mục | Giá trị |
|---|---|
| Khóa API CaptchaAI | Từcaptchaai.com |
Giá trị GeeTest gt |
Mã định danh tĩnh trên mỗi trang web |
GeeTest challenge |
Giá trị động mỗi phiên |
| URL trang | URL nơi GeeTest xuất hiện |
| Ngôn ngữ | Python 3.7+ hoặc Node.js 14+ |
Bước 1: Trích xuất thông số GeeTest
GeeTest yêu cầu ba tham số. gt là tĩnh (giống nhau cho mọi yêu cầu), trong khi challenge thay đổi mỗi phiên.
Cách 1: Tab mạng
- Mở tab DevTools → Mạng
- Lọc theo
register-slidehoặcgettype.phphoặcget.php - Kích hoạt hình ảnh xác thực và tìm yêu cầu khởi tạo
- Phản hồi chứa
gt,challengevà đôi khiapi_server
{
"success": 1,
"gt": "019924a82c70bb123aae90d483087f94",
"challenge": "12345678abc90def12345678abc90def",
"new_captcha": true
}
Cách 2: Nguồn trang
// Search page source for initGeetest or gt value
document.querySelectorAll('script').forEach(s => {
if (s.textContent.includes('initGeetest')) {
console.log(s.textContent);
}
});
Phương pháp 3: Điểm cuối API
Nhiều trang web tìm nạp các tham số GeeTest từ API của riêng họ:
# The site's registration endpoint
params_response = requests.get("https://example.com/api/captcha/register")
data = params_response.json()
gt = data["gt"]
challenge = data["challenge"]
Bước 2: Gửi nhiệm vụ tới CaptchaAI
Python
import requests
import time
API_KEY = "YOUR_API_KEY"
response = requests.get("https://ocr.captchaai.com/in.php", params={
"key": API_KEY,
"method": "geetest",
"gt": "019924a82c70bb123aae90d483087f94",
"challenge": "12345678abc90def12345678abc90def",
"api_server": "api.geetest.com", # Optional, use if site specifies
"pageurl": "https://staging.example.com/qa-login",
"json": 1
})
data = response.json()
if data.get("status") != 1:
raise Exception(f"Submit error: {data.get('request')}")
task_id = data["request"]
print(f"Task submitted: {task_id}")
Node.js
const axios = require('axios');
const API_KEY = 'YOUR_API_KEY';
async function submitGeeTest(gt, challenge, pageurl) {
const { data } = await axios.get('https://ocr.captchaai.com/in.php', {
params: {
key: API_KEY,
method: 'geetest',
gt,
challenge,
api_server: 'api.geetest.com',
pageurl,
json: 1
}
});
if (data.status !== 1) throw new Error(`Submit error: ${data.request}`);
return data.request;
}
Bước 3: Thăm dò ý kiến giải pháp
Việc giải GeeTest trả về ba giá trị: challenge, validate và seccode.
Python
def get_geetest_solution(task_id):
for attempt 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.get("status") == 1:
return result["request"]
if result.get("request") != "CAPCHA_NOT_READY":
raise Exception(f"Error: {result.get('request')}")
raise Exception("Timeout")
solution = get_geetest_solution(task_id)
# solution = {
# "geetest_challenge": "12345678abc90def12345678abc90def1a",
# "geetest_validate": "abcdef1234567890abcdef1234567890",
# "geetest_seccode": "abcdef1234567890abcdef1234567890|jordan"
# }
Node.js
async function getGeeTestSolution(taskId) {
for (let i = 0; i < 30; i++) {
await new Promise(r => setTimeout(r, 5000));
const { data } = await axios.get('https://ocr.captchaai.com/res.php', {
params: { key: API_KEY, action: 'get', id: taskId, json: 1 }
});
if (data.status === 1) return data.request;
if (data.request !== 'CAPCHA_NOT_READY') throw new Error(data.request);
}
throw new Error('Timeout');
}
Bước 4: Gửi giải pháp đến trang đích
Gửi cả ba giá trị đến điểm cuối xác minh của trang web:
# Submit the GeeTest solution with the form data
verify_response = requests.post("https://example.com/api/login", data={
"username": "user@example.com",
"password": "password123",
"geetest_challenge": solution["geetest_challenge"],
"geetest_validate": solution["geetest_validate"],
"geetest_seccode": solution["geetest_seccode"]
})
print(f"Login status: {verify_response.status_code}")
Ví dụ Python hoàn chỉnh
import requests
import time
API_KEY = "YOUR_API_KEY"
SITE_URL = "https://staging.example.com/qa-login"
# 1. Get GeeTest parameters from the site
params = requests.get("https://example.com/api/captcha/register").json()
# 2. Submit to CaptchaAI
submit = requests.get("https://ocr.captchaai.com/in.php", params={
"key": API_KEY,
"method": "geetest",
"gt": params["gt"],
"challenge": params["challenge"],
"pageurl": SITE_URL,
"json": 1
}).json()
task_id = submit["request"]
# 3. Poll for solution
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.get("status") == 1:
solution = result["request"]
break
# 4. Submit to site
login = requests.post(SITE_URL, data={
"username": "user@example.com",
"password": "pass",
"geetest_challenge": solution["geetest_challenge"],
"geetest_validate": solution["geetest_validate"],
"geetest_seccode": solution["geetest_seccode"]
})
print(f"Result: {login.status_code}")
Khắc phục sự cố
| Lỗi | nguyên nhân | sửa chữa |
|---|---|---|
ERROR_BAD_PARAMETERS |
Thiếu gt hoặc thử thách | Cả hai đều được yêu cầu - trích xuất từ trang |
ERROR_CAPTCHA_UNSOLVABLE |
Thử thách đã hết hạn hoặc không hợp lệ | Tìm nạp lại một thử thách mới từ trang web |
| Giải pháp bị từ chối bởi trang web | Giá trị thử thách cũ | Thách thức là sử dụng một lần; nhận một cái mới cho mỗi lần thử |
geetest_validate trống |
Giải quyết thất bại nội bộ | Thử lại với một thử thách mới |
Ví dụ đầy đủ có thể chạy được
Bạn cần một dự án hoạt động hoàn chỉnh với thiết lập môi trường, bỏ phiếu, thử lại và xử lý lỗi?
Xem ví dụ có thể chạy đầy đủ trên GitHub →
Câu hỏi thường gặp
Tại sao tôi cần tìm một thử thách mới mỗi lần?
Giá trị challenge là giá trị sử dụng một lần. Sau khi nó được sử dụng (dù là do giải quyết thành công hay hết hạn), phần phụ trợ của trang web sẽ từ chối nó. Luôn tìm ra một thử thách mới trước mỗi lần giải.
Tham số api_server là gì?
Nó chỉ định máy chủ GeeTest nào xử lý việc xác minh. Các giá trị phổ biến là api.geetest.com và api-na.geetest.com. Nếu trang web sử dụng máy chủ tùy chỉnh, hãy đưa nó vào yêu cầu của bạn.
Việc giải GeeTest mất bao lâu?
Thông thường là 15–30 giây. Câu đố trượt và thử thách biểu tượng mất thời gian tương tự.
Tôi có thể giải GeeTest v4 bằng phương pháp này không?
Không. GeeTest v4 sử dụng một giao thức khác. Kiểm tra xem CaptchaAI có hỗ trợ phiên bản GeeTest cụ thể trên trang web hay không.
Sự khác biệt giữa thử thách trượt và nhấp chuột GeeTest là gì?
GeeTest v3 có nhiều loại thử thách (trượt, nhấp vào biểu tượng, khớp từ), nhưng các tham số và quy trình API giống hệt nhau. CaptchaAI xử lý tất cả các loại v3 một cách minh bạch.