يقدم GeeTest v3 تحديات تفاعلية - ألغاز الشرائح، أو تحديدات الرموز، أو مطابقة الكلمات. على عكس reCAPTCHA، يستخدم GeeTest تدفق تحقق مخصصًا مع ثلاث معلمات (gt، challenge، api_server) التي يجب عليك استخراجها من الصفحة قبل الحل.
يستعرض هذا الدليل العملية الكاملة لاستخراج معلمات GeeTest وحل التحدي باستخدام CaptchaAI API.
المتطلبات
| البند | القيمة |
|---|---|
| مفتاح CaptchaAI API | منcaptchaai.com |
قيمة GeeTest gt |
معرف ثابت لكل موقع |
جي تيست challenge |
القيمة الديناميكية لكل جلسة |
| عنوان URL للصفحة | عنوان URL الذي يظهر فيه GeeTest |
| اللغة | بايثون 3.7+ أو Node.js 14+ |
الخطوة 1: استخراج معلمات GeeTest
يتطلب GeeTest ثلاث معلمات. gt ثابت (نفسه لكل طلب)، بينما يتغير challenge لكل جلسة.
الطريقة الأولى: علامة تبويب الشبكة
- افتح علامة التبويب DevTools → الشبكة
- التصفية حسب
register-slideأوgettype.phpأوget.php - قم بتشغيل رمز التحقق وابحث عن طلب التهيئة
- يحتوي الرد على
gtوchallengeوأحياناapi_server
{
"success": 1,
"gt": "019924a82c70bb123aae90d483087f94",
"challenge": "12345678abc90def12345678abc90def",
"new_captcha": true
}
الطريقة الثانية: مصدر الصفحة
// Search page source for initGeetest or gt value
document.querySelectorAll('script').forEach(s => {
if (s.textContent.includes('initGeetest')) {
console.log(s.textContent);
}
});
الطريقة الثالثة: نقطة نهاية واجهة برمجة التطبيقات
تقوم العديد من المواقع بجلب معلمات GeeTest من واجهة برمجة التطبيقات الخاصة بها:
# 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"]
الخطوة 2: أرسل المهمة إلى CaptchaAI
بايثون
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://example.com/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;
}
الخطوة 3: استطلاع للحل
يقوم حل GeeTest بإرجاع ثلاث قيم: challenge، وvalidate، وseccode.
بايثون
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');
}
الخطوة 4: إرسال الحل إلى الموقع المستهدف
أرسل القيم الثلاث إلى نقطة نهاية التحقق الخاصة بالموقع:
# 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}")
مثال بايثون الكامل
import requests
import time
API_KEY = "YOUR_API_KEY"
SITE_URL = "https://example.com/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}")
استكشاف الأخطاء وإصلاحها
| خطأ | السبب | إصلاح |
|---|---|---|
ERROR_BAD_PARAMETERS |
مفقود GT أو التحدي | كلاهما مطلوب – مقتطف من الصفحة |
ERROR_CAPTCHA_UNSOLVABLE |
التحدي منتهي الصلاحية أو غير صالح | أعد جلب تحدي جديد من الموقع |
| الحل مرفوض من قبل الموقع | قيمة التحدي التي لا معنى لها | التحدي هو الاستخدام الفردي. احصل على واحدة جديدة لكل محاولة |
geetest_validate فارغ |
فشل الحل داخليا | أعد المحاولة بتحدي جديد |
مثال كامل قابل للتشغيل
هل تحتاج إلى مشروع عمل كامل مع إعداد البيئة والاستقصاء وإعادة المحاولة ومعالجة الأخطاء؟
راجع المثال الكامل القابل للتشغيل على GitHub →
الأسئلة الشائعة
لماذا أحتاج إلى جلب تحدي جديد في كل مرة؟
قيمة challenge للاستخدام الفردي. بمجرد استهلاكه (سواء عن طريق حل ناجح أو انتهاء الصلاحية)، سترفضه الواجهة الخلفية للموقع. أحضر دائمًا تحديًا جديدًا قبل كل حل.
ما هي المعلمة api_server؟
وهو يحدد خادم GeeTest الذي سيتولى عملية التحقق. القيم المشتركة هي api.geetest.com وapi-na.geetest.com. إذا كان الموقع يستخدم خادمًا مخصصًا، فقم بإدراجه في طلبك.
كم من الوقت يستغرق حل GeeTest؟
عادة 15-30 ثانية. تستغرق ألغاز الشرائح وتحديات الأيقونات أوقاتًا مماثلة.
هل يمكنني حل GeeTest v4 بهذه الطريقة؟
لا، يستخدم GeeTest v4 بروتوكولًا مختلفًا. تحقق مما إذا كان CaptchaAI يدعم إصدار GeeTest المحدد على الموقع.
ما الفرق بين تحديات الشريحة والنقر في GeeTest؟
يحتوي GeeTest v3 على أنواع متعددة من التحديات (الشريحة، والنقر على الأيقونة، ومطابقة الكلمات)، ولكن معلمات واجهة برمجة التطبيقات والتدفق متطابقتان. يتعامل CaptchaAI مع جميع أنواع الإصدار 3 بشفافية.