Kuasai setiap parameter dalam pengiriman GeeTest CAPTCHA. Pelajari cara mengekstrak gt, challenge, dan nilai lainnya, lalu mengirimkannya dengan benar ke CaptchaAI.
Parameter GeeTest v3
| Parameter | Diperlukan | Deskripsi |
|---|---|---|
gt |
Ya | ID akun GeeTest (32 karakter hex). Ditemukan di sumber halaman atau respons API |
challenge |
Ya | String challenge khusus sesi. Harus fresh untuk setiap solve |
pageurl |
Ya | URL lengkap halaman yang menampilkan CAPTCHA |
api_server |
Tidak | Subdomain server API GeeTest kustom |
Mengekstrak Parameter dari Halaman
# 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']}")
Mengirimkan GeeTest ke 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")
Menggunakan Solusi
Solusi mengembalikan tiga nilai yang harus dikirim ke endpoint validasi situs target:
# 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
Kesegaran Challenge
Parameter challenge bersifat unik per sesi dan cepat kadaluarsa:
# 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
Aturan utama: Ekstrak challenge dan kirimkan ke CaptchaAI dalam hitungan detik. Challenge yang basi akan selalu gagal.
Custom API Server
Beberapa situs menggunakan subdomain GeeTest khusus:
# 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
)
Pemecahan Masalah
| Masalah | Penyebab | Perbaikan |
|---|---|---|
ERROR_CAPTCHA_UNSOLVABLE |
Challenge basi | Ambil challenge baru segera sebelum submit |
validate kosong |
Versi API salah | Gunakan version=4 untuk situs GeeTest v4 |
| Solusi ditolak situs | seccode tidak ada |
Pastikan ketiga field dikirimkan |
Parameter gt tidak ditemukan |
Dimuat via JavaScript | Gunakan Selenium atau periksa respons XHR untuk endpoint register |
Pertanyaan Umum
Apa perbedaan antara gt dan challenge?
gt adalah ID akun GeeTest situs — tetap sama. challenge dibuat per sesi dan harus diekstrak baru setiap kali.
Berapa lama challenge valid?
Biasanya 60–120 detik. Ekstrak dan segera kirim ke CaptchaAI.
Apa fungsi api_server?
Ini memberi tahu CaptchaAI server API GeeTest mana yang digunakan. Hanya diperlukan jika situs menggunakan endpoint GeeTest non-default. Periksa request jaringan halaman untuk api-*.geetest.com.
Panduan Terkait
- GeeTest v4: Perubahan dan Panduan Solve
Kuasai parameter GeeTest — mulai dengan CaptchaAI.