Nắm vững mọi thông số trong bài gửi GeeTest CAPTCHA. Tìm hiểu cách trích xuất gt, challenge và các giá trị khác, đồng thời gửi chúng một cách chính xác đến CaptchaAI.
Thông số GeeTest v3
| tham số | Bắt buộc | Mô tả |
|---|---|---|
gt |
Có | ID tài khoản GeeTest (hex 32 ký tự). Tìm thấy trong nguồn trang hoặc phản hồi API |
challenge |
Có | Chuỗi thử thách dành riêng cho phiên. Phải mới cho mỗi lần giải |
pageurl |
Có | URL đầy đủ của trang hiển thị CAPTCHA |
api_server |
Không | Tên miền phụ máy chủ API GeeTest tùy chỉnh |
Trích xuất tham số từ một trang
# extract_geetest_params.py
import requests
import re
import json
def extract_geetest_v3(page_url, session=None):
"""Extract GeeTest v3 gt and challenge from a page."""
if session is None:
session = requests.Session()
session.headers["User-Agent"] = (
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) "
"AppleWebKit/537.36 Chrome/125.0.0.0 Safari/537.36"
)
resp = session.get(page_url, timeout=15)
html = resp.text
# Method 1: Extract gt from HTML
gt_match = re.search(r'gt["\']?\s*[:=]\s*["\']([a-f0-9]{32})', html)
gt = gt_match.group(1) if gt_match else None
# Method 2: Find API endpoint that returns challenge
api_match = re.search(r'(https?://[^"\']+register-slide[^"\']*)', html)
challenge = None
if api_match:
api_url = api_match.group(1)
api_resp = session.get(api_url, timeout=10)
try:
data = api_resp.json()
challenge = data.get("challenge")
gt = gt or data.get("gt")
except json.JSONDecodeError:
pass
if not challenge:
# Try embedded challenge
ch_match = re.search(r'challenge["\']?\s*[:=]\s*["\']([a-f0-9]+)', html)
challenge = ch_match.group(1) if ch_match else None
return {"gt": gt, "challenge": challenge, "pageurl": page_url}
# Usage
params = extract_geetest_v3("https://staging.example.com/qa-login")
print(f"gt: {params['gt']}")
print(f"challenge: {params['challenge']}")
Gửi GeeTest tới CaptchaAI
# solve_geetest.py
import requests
import time
import os
def solve_geetest(gt, challenge, pageurl, api_server=None):
"""Solve GeeTest v3 slide CAPTCHA via CaptchaAI."""
api_key = os.environ["CAPTCHAAI_API_KEY"]
payload = {
"key": api_key,
"method": "geetest",
"gt": gt,
"challenge": challenge,
"pageurl": pageurl,
"json": 1,
}
if api_server:
payload["api_server"] = api_server
# Submit
resp = requests.post(
"https://ocr.captchaai.com/in.php",
data=payload,
timeout=30,
)
result = resp.json()
if result.get("status") != 1:
raise RuntimeError(f"Submit failed: {result.get('request')}")
task_id = result["request"]
# Poll — GeeTest typically solves in 10-20 seconds
time.sleep(10)
for _ in range(30):
resp = requests.get("https://ocr.captchaai.com/res.php", params={
"key": api_key,
"action": "get",
"id": task_id,
"json": 1,
}, timeout=15)
data = resp.json()
if data.get("status") == 1:
return data["request"] # Returns challenge, validate, seccode
if data["request"] != "CAPCHA_NOT_READY":
raise RuntimeError(data["request"])
time.sleep(5)
raise TimeoutError("GeeTest solve timeout")
Sử dụng giải pháp
Giải pháp trả về ba giá trị phải được gửi đến điểm cuối xác thực của trang đích:
# submit_solution.py
import json
def submit_geetest_solution(session, validation_url, solution, original_challenge):
"""Submit GeeTest solution to the target site."""
# Parse solution if string
if isinstance(solution, str):
solution = json.loads(solution)
payload = {
"geetest_challenge": solution.get("challenge", original_challenge),
"geetest_validate": solution.get("validate", ""),
"geetest_seccode": solution.get("seccode", ""),
}
resp = session.post(validation_url, data=payload, timeout=30)
return resp
# Complete flow
def full_geetest_flow(page_url, validation_url):
import requests
from extract_geetest_params import extract_geetest_v3
session = requests.Session()
session.headers["User-Agent"] = (
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) "
"AppleWebKit/537.36 Chrome/125.0.0.0 Safari/537.36"
)
# Step 1: Extract parameters
params = extract_geetest_v3(page_url, session)
print(f"gt: {params['gt']}, challenge: {params['challenge'][:16]}...")
# Step 2: Solve
solution = solve_geetest(
params["gt"], params["challenge"], params["pageurl"],
)
print("Solved!")
# Step 3: Submit
resp = submit_geetest_solution(
session, validation_url, solution, params["challenge"],
)
print(f"Validation response: {resp.status_code}")
return resp
Thử thách sự tươi mới
Tham số challenge dành riêng cho phiên và hết hạn nhanh chóng:
# fresh_challenge.py
import time
def get_fresh_challenge(session, register_url):
"""Always fetch a fresh challenge before solving."""
resp = session.get(register_url, timeout=10)
data = resp.json()
challenge = data.get("challenge")
if not challenge:
raise ValueError("No challenge returned")
return challenge
def solve_with_fresh_challenge(session, gt, register_url, pageurl):
"""Ensure challenge is fresh before submitting to CaptchaAI."""
challenge = get_fresh_challenge(session, register_url)
# Submit immediately — don't let it expire
solution = solve_geetest(gt, challenge, pageurl)
return solution
Quy tắc chính: Trích xuất thử thách và gửi tới CaptchaAI trong vòng vài giây. Một thử thách cũ sẽ luôn thất bại.
Máy chủ API tùy chỉnh
Một số trang web sử dụng tên miền phụ GeeTest tùy chỉnh:
# The api_server parameter specifies a custom GeeTest backend
# Default: api.geetest.com
# Custom examples: api-na.geetest.com, api.geetest.com/ajax-custom
solution = solve_geetest(
gt="abc123...",
challenge="def456...",
pageurl="https://staging.example.com/qa-login",
api_server="api-na.geetest.com", # North America endpoint
)
Khắc phục sự cố
| Vấn đề | Nguyên nhân | Cách xử lý |
|---|---|---|
ERROR_CAPTCHA_UNSOLVABLE |
Thử thách cũ | Tìm nạp thử thách mới ngay trước khi gửi |
validate trống |
Phiên bản API sai | Sử dụng version=4 cho các trang GeeTest v4 |
| Giải pháp bị từ chối bởi trang web | Thiếu seccode |
Đảm bảo cả ba trường đều được gửi |
Không tìm thấy tham số gt |
Được tải qua JavaScript | Sử dụng Selenium hoặc kiểm tra phản hồi XHR cho điểm cuối đăng ký |
Câu hỏi thường gặp
Sự khác biệt giữa gt và challenge là gì?
gt là ID tài khoản GeeTest của trang web - nó vẫn giữ nguyên. challenge được tạo mỗi phiên và phải được trích xuất mới mỗi lần.
Thử thách có hiệu lực trong bao lâu?
Thông thường là 60-120 giây. Giải nén nó và gửi tới CaptchaAI ngay lập tức.
api_server làm gì?
Nó cho CaptchaAI biết nên sử dụng máy chủ API GeeTest nào. Chỉ bắt buộc khi trang web sử dụng điểm cuối GeeTest không mặc định. Kiểm tra các yêu cầu mạng của trang để tìm api-*.geetest.com.
Hướng dẫn liên quan
- GeeTest v4 Thay đổi
- So sánh GeeTest và BLS
Làm chủ các thông số GeeTest —bắt đầu với CaptchaAI.