GeeTest v3 trả về ba giá trị sau khi giải: geetest_challenge, geetest_validate và geetest_seccode. Việc đưa những thứ này vào phiên tự động hóa trình duyệt một cách chính xác đòi hỏi phải hiểu nơi trang web mong đợi chúng - các trường biểu mẫu ẩn, lệnh gọi lại JavaScript hoặc tải trọng XHR. Dưới đây là cách thực hiện điều đó trong từng khung chính.
Những gì bạn đang tiêm
CaptchaAI trả về kết quả gồm ba phần:
{
"geetest_challenge": "a1b2c3d4e5...modified_challenge",
"geetest_validate": "abc123def456_validate",
"geetest_seccode": "abc123def456_validate|jordan"
}
Tất cả ba giá trị phải được thêm vào. Thiếu bất kỳ cái nào sẽ gây ra lỗi xác minh.
Bước 1: Trích xuất tham số và giải
Chung cho tất cả các khung – giải nén gt và challenge, sau đó giải bằng CaptchaAI:
import requests
import time
def solve_geetest(gt, challenge, page_url):
resp = requests.post("https://ocr.captchaai.com/in.php", data={
"key": "YOUR_API_KEY",
"method": "geetest",
"gt": gt,
"challenge": challenge,
"pageurl": page_url,
"json": 1
})
task_id = resp.json()["request"]
for _ in range(60):
time.sleep(3)
result = requests.get("https://ocr.captchaai.com/res.php", params={
"key": "YOUR_API_KEY",
"action": "get",
"id": task_id,
"json": 1
})
data = result.json()
if data["status"] == 1:
return data["request"] # Returns dict with three values
raise TimeoutError("GeeTest solve timed out")
Bước 2: Đưa vào Nhà viết kịch (Python)
Trích xuất thông số
from playwright.sync_api import sync_playwright
with sync_playwright() as p:
browser = p.chromium.launch(headless=False)
page = browser.new_page()
# Capture GeeTest registration response
geetest_data = {}
def capture_geetest(response):
if "register" in response.url and response.status == 200:
try:
data = response.json()
if "gt" in data and "challenge" in data:
geetest_data.update(data)
except Exception:
pass
page.on("response", capture_geetest)
page.goto("https://staging.example.com/qa-login")
page.wait_for_selector(".geetest_holder")
gt = geetest_data["gt"]
challenge = geetest_data["challenge"]
tiêm dung dịch
# Solve with CaptchaAI
solution = solve_geetest(gt, challenge, page.url)
# Method 1: Set hidden form fields
page.evaluate(f"""
const fields = {{
'geetest_challenge': '{solution["geetest_challenge"]}',
'geetest_validate': '{solution["geetest_validate"]}',
'geetest_seccode': '{solution["geetest_seccode"]}'
}};
for (const [name, value] of Object.entries(fields)) {{
let input = document.querySelector(`input[name="${{name}}"]`);
if (!input) {{
input = document.createElement('input');
input.type = 'hidden';
input.name = name;
document.querySelector('form').appendChild(input);
}}
input.value = value;
}}
""")
# Submit the form
page.click("#submit-button")
Phương pháp 2: Kích hoạt cuộc gọi lại GeeTest
Một số trang web sử dụng hàm gọi lại JavaScript của GeeTest thay vì các trường biểu mẫu:
page.evaluate(f"""
// Find the GeeTest captcha object
if (window.captchaObj) {{
// Simulate a successful solve
const result = {{
geetest_challenge: '{solution["geetest_challenge"]}',
geetest_validate: '{solution["geetest_validate"]}',
geetest_seccode: '{solution["geetest_seccode"]}'
}};
// Override getValidate to return our solution
window.captchaObj.getValidate = function() {{ return result; }};
// Trigger the success callback
const successEvent = new Event('geetest_success');
document.dispatchEvent(successEvent);
}}
""")
Bước 3: Đưa Puppeteer vào (JavaScript)
const puppeteer = require('puppeteer');
async function solveAndInject() {
const browser = await puppeteer.launch({ headless: false });
const page = await browser.newPage();
// Capture GeeTest params
let gt, challenge;
page.on('response', async (response) => {
if (response.url().includes('register') && response.status() === 200) {
try {
const data = await response.json();
if (data.gt && data.challenge) {
gt = data.gt;
challenge = data.challenge;
}
} catch (e) {}
}
});
await page.goto('https://staging.example.com/qa-login');
await page.waitForSelector('.geetest_holder');
// Solve with CaptchaAI (implementation from earlier)
const solution = await solveCaptcha(gt, challenge, page.url());
// Inject the three values
await page.evaluate((sol) => {
// Set hidden inputs
const form = document.querySelector('form');
['geetest_challenge', 'geetest_validate', 'geetest_seccode'].forEach(name => {
let input = document.querySelector(`input[name="${name}"]`);
if (!input) {
input = document.createElement('input');
input.type = 'hidden';
input.name = name;
form.appendChild(input);
}
input.value = sol[name];
});
}, solution);
await page.click('#submit-button');
}
Bước 4: Tiêm Selenium (Python)
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
driver = webdriver.Chrome()
driver.get("https://staging.example.com/qa-login")
# Wait for GeeTest widget
WebDriverWait(driver, 15).until(
EC.presence_of_element_located((By.CLASS_NAME, "geetest_holder"))
)
# Extract gt and challenge from the page
gt = driver.execute_script(
"return document.querySelector('[data-gt]')?.dataset.gt"
)
challenge = driver.execute_script(
"return document.querySelector('[data-challenge]')?.dataset.challenge"
)
# Solve with CaptchaAI
solution = solve_geetest(gt, challenge, driver.current_url)
# Inject via JavaScript
driver.execute_script(f"""
var fields = {{
'geetest_challenge': '{solution["geetest_challenge"]}',
'geetest_validate': '{solution["geetest_validate"]}',
'geetest_seccode': '{solution["geetest_seccode"]}'
}};
var form = document.querySelector('form');
for (var name in fields) {{
var input = document.querySelector('input[name="' + name + '"]');
if (!input) {{
input = document.createElement('input');
input.type = 'hidden';
input.name = name;
form.appendChild(input);
}}
input.value = fields[name];
}}
""")
driver.find_element(By.ID, "submit-button").click()
Xử lý các bài gửi dựa trên XHR
Một số trang gửi kết quả GeeTest qua XHR thay vì biểu mẫu POST. Chặn và sửa đổi yêu cầu:
# Playwright: Intercept the XHR and inject values
def handle_route(route):
if "login" in route.request.url and route.request.method == "POST":
# Modify the POST data to include our solution
post_data = route.request.post_data
# Add GeeTest values to the request
route.continue_(post_data=modified_data)
else:
route.continue_()
page.route("**/api/login**", handle_route)
Khắc phục sự cố
| Vấn đề | Nguyên nhân | Cách xử lý |
|---|---|---|
| "Xác thực GeeTest không thành công" | Thiếu một trong ba giá trị | Xác minh cả ba giá trị được chèn |
| Thử thách đã hết hạn trước khi tiêm | Quá dài giữa trích xuất và giải quyết | Trích xuất và giải quyết nhanh chóng |
| Biểu mẫu được gửi nhưng không bao gồm các giá trị | Tên trường hoặc bộ chọn biểu mẫu sai | Kiểm tra biểu mẫu thực tế để tìm tên chính xác |
| Cuộc gọi lại không được kích hoạt | Trang web sử dụng tên gọi lại tùy chỉnh | Tìm lệnh gọi lại trong tùy chọn initGeetest |
| Giá trị được chèn nhưng tiện ích vẫn hiển thị | Trạng thái tiện ích chưa được cập nhật | Kích hoạt cuộc gọi lại thành công theo chương trình |
Câu hỏi thường gặp
Tôi có cần ẩn tiện ích GeeTest một cách trực quan sau khi chèn không?
Không. Trạng thái trực quan của tiện ích không ảnh hưởng đến việc gửi biểu mẫu. Miễn là ba giá trị nằm trong dữ liệu biểu mẫu, máy chủ sẽ xác thực chúng bất kể giao diện của tiện ích.
Tôi có thể thêm các giá trị GeeTest mà không cần trình duyệt không?
Có, nếu trang web chấp nhận HTTP POST trực tiếp với ba giá trị. Chặn điểm cuối gửi biểu mẫu và gửi các giá trị qua requests hoặc bất kỳ ứng dụng khách HTTP nào.
Tại sao GeeTest sử dụng ba giá trị riêng biệt thay vì một mã thông báo?
Ba giá trị phục vụ các mục đích khác nhau: geetest_challenge theo dõi phiên, geetest_validate chứng minh thách thức đã được giải quyết và geetest_seccode cung cấp hàm băm để phát hiện giả mạo.
bài viết liên quan
- Giải quyết Geetest V3 Nodejs
- Giải mã Geetest V3 Nodejs Captchaai
- Tự động hóa trình duyệt di động Giải quyết Captcha
Các bước tiếp theo
Đưa các giải pháp GeeTest vào bất kỳ khuôn khổ nào —lấy khóa API CaptchaAI của bạnvà bắt đầu giải quyết.