أتقن كل معلمة في عمليات إرسال GeeTest CAPTCHA. تعرف على كيفية استخراج gt وchallenge والقيم الأخرى وإرسالها بشكل صحيح إلى CaptchaAI.
معلمات GeeTest v3
| المعلمة | مطلوب | الوصف |
|---|---|---|
gt |
نعم | معرف حساب GeeTest (سداسي عشري مكون من 32 حرفًا). تم العثور عليه في مصدر الصفحة أو استجابة واجهة برمجة التطبيقات |
challenge |
نعم | سلسلة التحدي الخاصة بالجلسة. يجب أن تكون طازجة لكل حل |
pageurl |
نعم | عنوان URL الكامل للصفحة التي تعرض اختبار CAPTCHA |
api_server |
لا | النطاق الفرعي لخادم GeeTest API المخصص |
استخراج المعلمات من الصفحة
# 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://example.com/login")
print(f"gt: {params['gt']}")
print(f"challenge: {params['challenge']}")
إرسال GeeTest إلى 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")
استخدام الحل
يقوم الحل بإرجاع ثلاث قيم يجب إرسالها إلى نقطة نهاية التحقق من صحة الموقع المستهدف:
# 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
نضارة التحدي
المعلمة challenge خاصة بالجلسة وتنتهي بسرعة:
# 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
القاعدة الأساسية: استخرج التحدي وأرسله إلى CaptchaAI خلال ثوانٍ. التحدي الذي لا معنى له سوف يفشل دائمًا.
خادم API المخصص
تستخدم بعض المواقع نطاقًا فرعيًا مخصصًا لـ GeeTest:
# 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://example.com/login",
api_server="api-na.geetest.com", # North America endpoint
)
استكشاف الأخطاء وإصلاحها
| المشكلة | السبب | الإجراء |
|---|---|---|
ERROR_CAPTCHA_UNSOLVABLE |
التحدي الذي لا معنى له | جلب التحدي الجديد مباشرة قبل الإرسال |
validate فارغ |
إصدار API خاطئ | استخدم version=4 لمواقع GeeTest v4 |
| الحل مرفوض من قبل الموقع | seccode مفقود |
تأكد من إرسال كافة الحقول الثلاثة |
لم يتم العثور على المعلمة gt |
تم التحميل عبر JavaScript | استخدم السيلينيوم أو تحقق من استجابات XHR لنقطة نهاية التسجيل |
الأسئلة الشائعة
ما الفرق بين gt وchallenge؟
gt هو معرف حساب GeeTest الخاص بالموقع - ويظل كما هو. يتم إنشاء challenge في كل جلسة ويجب استخراجه جديدًا في كل مرة.
ما هي مدة صلاحية التحدي؟
عادة 60-120 ثانية. قم باستخراجه وإرساله إلى CaptchaAI على الفور.
ماذا يفعل api_server؟
إنه يخبر CaptchaAI بخادم GeeTest API الذي يجب استخدامه. مطلوب فقط عندما يستخدم الموقع نقطة نهاية GeeTest غير افتراضية. تحقق من طلبات الشبكة الخاصة بالصفحة لـ api-*.geetest.com.
أدلة ذات صلة
- معلمات اختبار GeeTest الرئيسية -ابدأ بـ CaptchaAI.*