أرسلتَ الطلب بمعلمات سليمة، وأعادت الواجهة قيمًا صحيحة، ومع ذلك ترفض الصفحة المستهدفة النتيجة وكأن شيئًا لم يحدث. هذا من أكثر مواقف GeeTest v3 إحباطًا، والسبب في أغلب الحالات واحد: قيمة challenge قديمة أُعيد استخدامها بعد انتهاء صلاحيتها.
تتوزّع إخفاقات GeeTest v3 على ثلاث مراحل واضحة: مرحلة الإرسال إلى in.php، ومرحلة استطلاع النتيجة من res.php، ومرحلة التحقق على الصفحة المستهدفة نفسها. تحديد المرحلة التي تعطّل فيها التكامل يختصر نصف وقت التشخيص، لأن لكل مرحلة مجموعة أخطاء خاصة بها.
تشدّد مستندات GeeTest v3 في CaptchaAI على نقطة جوهرية: احصل على قيمة challenge جديدة قبل كل طلب حل. فبمجرد تحميل الاختبار على الصفحة، تصبح القيمة السابقة غير صالحة — ولهذا قد يفشل تكامل يبدو مضبوطًا بالكامل.
خذ مثالًا واقعيًا: فريق يؤتمت اختبار الجودة على بوابة حجز مواعيد إقليمية تعتمد GeeTest v3 على شاشة الدخول. يعمل السكربت في أول محاولة، ثم تبدأ الطلبات التالية بالفشل لأنها تعيد استخدام أول challenge التُقط. يعالج هذا الدليل هذا النمط وبقية الأخطاء الشائعة، ويعطي أسرع إصلاح لكل منها.
بطاقة مرجعية سريعة: من الخطأ إلى الإصلاح
ابدأ من هذا الجدول للوصول السريع؛ فهو يربط كل خطأ بمرحلته وسببه المرجّح وإصلاحه المباشر، ثم تجد الشرح المفصّل لكل مرحلة في الأقسام التالية.
| خطأ / عَرَض | المرحلة | السبب المحتمل | الإصلاح |
|---|---|---|---|
ERROR_WRONG_USER_KEY |
إرسال | مفتاح API تالف | تحقق من مفتاح الـ 32 حرفًا |
ERROR_KEY_DOES_NOT_EXIST |
إرسال | مفتاح غير صالح | تحقق من لوحة التحكم |
ERROR_ZERO_BALANCE |
إرسال | لا توجد خيوط حرة | انتظر أو رقِّ الخطة |
ERROR_PAGEURL |
إرسال | pageurl مفقود |
أضِف عنوان URL الكامل |
ERROR_BAD_PARAMETERS |
إرسال | gt أو challenge أو pageurl مفقود |
تحقق من كل الحقول المطلوبة |
CAPCHA_NOT_READY |
استطلاع | الحل قيد التقدم | انتظر 5 ثوانٍ ثم أعد المحاولة |
ERROR_WRONG_ID_FORMAT |
استطلاع | معرّف captcha غير رقمي | استخدم المعرّف الدقيق من in.php |
ERROR_WRONG_CAPTCHA_ID |
استطلاع | معرّف captcha غير صالح | تحقق من معرّف الإرسال |
ERROR_EMPTY_ACTION |
استطلاع | action=get مفقود |
أضِف معلمة الإجراء |
ERROR_CAPTCHA_UNSOLVABLE |
استطلاع | تحدٍ منتهٍ أو متغيّر غير مدعوم | حدّث التحدي ثم أعد المحاولة |
| تعيد الواجهة قيمًا لكن الصفحة ترفضها | التحقق | تحدٍ منتهٍ، حقول خاطئة، عنوان URL خاطئ | حدّث التحدي وتحقق من تعيين الحقول |
قيمة challenge المنتهية: العطل الأكثر شيوعًا
إن كان عليك التحقق من شيء واحد أولًا، فليكن حداثة قيمة challenge.
يعتمد GeeTest v3 على معلمتين أساسيتين:
gt— مفتاح الموقع العام، ثابت لا يتغير.challenge— مفتاح التحدي الديناميكي، يتغير مع كل تحميل للصفحة.
لماذا يحدث هذا العطل
تُنشأ قيمة challenge لحظة تهيئة أداة GeeTest على الصفحة. وإذا التقطتها مرة واحدة وأعدت استخدامها عبر عدة طلبات حل، فإن كل طلب بعد الأول سيؤول إلى إحدى نتيجتين:
- رفض من الواجهة عند الإرسال، أو
- نتيجة ترفضها الصفحة المستهدفة لأن التحدي انتهت صلاحيته.
كيفية الإصلاح
قبل كل طلب حل، افحص طلبات الشبكة في الصفحة للعثور على استدعاء الواجهة الذي يعيد challenge جديدًا. أعد تنفيذ ذلك الطلب للحصول على قيمة جديدة، ثم أرسلها فورًا إلى CaptchaAI دون تأخير.
# Pseudocode: fetch a fresh challenge before each solve
import requests
def get_fresh_challenge(target_url):
"""Hit the GeeTest init endpoint to get a new challenge."""
resp = requests.get(f"{target_url}/geetest/register", timeout=10)
data = resp.json()
return data["challenge"], data["gt"]
challenge, gt = get_fresh_challenge("https://example.com")
# Now submit to CaptchaAI immediately — do not delay
قاعدة عملية: إذا تجاوز الفارق الزمني بين التقاط
challengeوإرسال طلب الحل بضع ثوانٍ، فحدّثه قبل الإرسال.
أخطاء مرحلة الإرسال إلى in.php
تظهر هذه الإخفاقات عند إرسال المهمة إلى https://ocr.captchaai.com/in.php.
ERROR_WRONG_USER_KEY
- السبب: تنسيق مفتاح الـ API غير صحيح (يجب أن يتكوّن من 32 حرفًا).
- الإصلاح: تحقق من المفتاح عبر صفحة مفتاح الـ API، ولا تُضِف أي أحرف زائدة أو مسافات.
ERROR_KEY_DOES_NOT_EXIST
- السبب: المفتاح صحيح التنسيق لكنه لا يطابق أي حساب نشط.
- الإصلاح: سجّل الدخول إلى لوحة التحكم في CaptchaAI وتأكد من أن مفتاحك فعّال.
ERROR_ZERO_BALANCE
- السبب: لا تتوفر خيوط معالجة (Threads) حرة في خطتك الحالية.
- الإصلاح: انتظر تحرّر أحد الخيوط، أو قلّل التزامن، أو رقِّ خطتك.
ERROR_PAGEURL
- السبب: المعلمة
pageurlمفقودة من الطلب. - الإصلاح: أضِف عنوان URL الكامل للصفحة التي تُحمَّل فيها أداة GeeTest، على هذا النحو:
pageurl=https://example.com/login
ERROR_BAD_PARAMETERS
السبب: حقل مطلوب أو أكثر مفقود أو مشوّه. المعلمات المطلوبة لـ GeeTest هي:
| المعلمة | النوع | مطلوب | الوصف |
|---|---|---|---|
key |
سلسلة | نعم | مفتاح CaptchaAI API الخاص بك |
method |
سلسلة | نعم | يجب أن يكون geetest |
gt |
سلسلة | نعم | مفتاح الموقع العام الثابت |
challenge |
سلسلة | نعم | مفتاح التحدي الديناميكي (يجب أن يكون جديدًا) |
pageurl |
سلسلة | نعم | عنوان URL للصفحة الكاملة |
الإصلاح: تأكد من وجود gt وchallenge وpageurl جميعًا وصحة تنسيقها.
استجابات HTML أو رموز 500/502
- السبب: خطأ عابر من جهة الخادم، لا مشكلة في المعلمات.
- الإصلاح: انتظر من 5 إلى 10 ثوانٍ ثم أعد إرسال الطلب.
أخطاء مرحلة الاستطلاع من res.php
تظهر هذه الإخفاقات عند استطلاع النتيجة من https://ocr.captchaai.com/res.php.
CAPCHA_NOT_READY
- ليست خطأً. تعني أن الاختبار ما زال قيد الحل. عادةً ما يستغرق حل GeeTest v3 في CaptchaAI أقل من 12 ثانية بمعدل نجاح مرتفع.
- الإصلاح: انتظر 5 ثوانٍ ثم أعد الاستطلاع، ولا تعدّها فشلًا.
ERROR_WRONG_ID_FORMAT
- السبب: تنسيق معرّف الـ captcha غير صحيح — يجب أن تكون المعرّفات رقمية فقط.
- الإصلاح: تأكد من استخدام المعرّف الدقيق الذي أعاده
in.phpدون أي تعديل.
ERROR_WRONG_CAPTCHA_ID
- السبب: المعرّف لا يطابق أي مهمة مُرسَلة.
- الإصلاح: تأكد من استخدام المعرّف الصحيح من استجابة الإرسال. وإذا أرسلت مهام متعددة، فتأكد من أنك تستطلع المهمة الصحيحة.
ERROR_EMPTY_ACTION
- السبب: معلمة
actionمفقودة أو فارغة في طلب الاستطلاع. - الإصلاح: ضمّن
action=getفي كل طلب استطلاع:
https://ocr.captchaai.com/res.php?key=YOUR_KEY&action=get&id=CAPTCHA_ID
ERROR_CAPTCHA_UNSOLVABLE
- السبب: تعذّر حل التحدي، غالبًا بسبب قيمة
challengeمنتهية الصلاحية أو متغيّر GeeTest غير مدعوم. - الإصلاح: حدّث قيمة
challengeثم أعد المحاولة.
ERROR_INTERNAL_SERVER_ERROR
- السبب: مشكلة من جهة خادم CaptchaAI.
- الإصلاح: انتظر 10 ثوانٍ ثم أعد المحاولة.
عندما تُرجع الواجهة نتيجة صحيحة لكن الصفحة ترفضها
هذه أصعب الإخفاقات في التشخيص، لأن واجهة CaptchaAI تعيد نتيجة سليمة بينما ترفضها الصفحة المستهدفة.
عند نجاح حل GeeTest v3 تعيد الواجهة ثلاث قيم — وهنا يظهر فرق جوهري عن reCAPTCHA v2 الذي يكتفي برمز واحد (راجع كيفية حل reCAPTCHA v2 عبر الـ API):
{
"challenge": "1a2b3456cd67890e12345fab678901c2de",
"validate": "09fe8d7c6ba54f32e1dcb0a9fedc8765",
"seccode": "12fe3d4c56789ba01f2e345d6789c012|jordan"
}
ويجب تمريرها إلى الصفحة المستهدفة على هذا النحو:
| حقل استجابة واجهة برمجة التطبيقات | حقل الصفحة المستهدفة |
|---|---|
challenge |
geetest_challenge |
validate |
geetest_validate |
seccode |
geetest_seccode |
الحقل الخطأ في التعيين
- العَرَض: تعيد الواجهة قيمًا، لكن الصفحة المستهدفة ترفضها فورًا.
- السبب: أُدرِجت القيم المُعادة في حقول خاطئة أو في مسار طلب خاطئ.
- الإصلاح: افحص حركة الشبكة أثناء حل GeeTest يدويًا على الصفحة المستهدفة. ابحث عن طلب POST الذي يُرسل نتيجة GeeTest، وطابِق أسماء حقولك معه تمامًا.
إعادة استخدام challenge منتهٍ في المصدر
- العَرَض: تعيد الواجهة قيمًا، لكن الصفحة تُبلغ بأن التحدي منتهٍ أو غير صالح.
- السبب: التُقطت قيمة
challengeمبكرًا جدًا أو أُعيد استخدامها. - الإصلاح: اجلب
challengeجديدًا مباشرة قبل كل طلب حل، ولا تخزّنه مؤقتًا ولا تعِد استخدامه.
سياق صفحة غير مطابق
- العَرَض: يفشل التحقق حتى مع مدخلات جديدة.
- السبب:
pageurlالمُرسَل إلى CaptchaAI لا يطابق الصفحة الفعلية التي حُمِّلت فيها أداة GeeTest. - الإصلاح: استخدم عنوان URL الدقيق بما فيه البروتوكول والمسار. وإذا حُمِّلت الأداة عبر AJAX على مسار مختلف، فاستخدم عنوان ذلك المسار.
بنية طلب غير متوافقة
- العَرَض: الحقول صحيحة لكن تنسيق الطلب خاطئ.
- السبب: تتوقع الصفحة المستهدفة حقول GeeTest بنوع محتوى محدد (مثل جسم JSON مقابل بيانات مُرمَّزة كنموذج) أو بجوار حقول نموذج أخرى.
- الإصلاح: قارن طلب الإرسال لديك بحركة الشبكة من حل يدوي. طابِق نوع المحتوى وترتيب الحقول وأي حقول إضافية.
Python: حل GeeTest v3 كاملًا مع challenge جديد
import time
import requests
API_KEY = "YOUR_CAPTCHAAI_API_KEY"
SUBMIT_URL = "https://ocr.captchaai.com/in.php"
RESULT_URL = "https://ocr.captchaai.com/res.php"
def get_fresh_challenge(target_url):
"""Fetch a fresh GeeTest challenge from the target page."""
resp = requests.get(f"{target_url}/api/geetest/register", timeout=10)
data = resp.json()
return data["gt"], data["challenge"]
def solve_geetest_v3(api_key, gt, challenge, pageurl):
"""Submit a GeeTest v3 challenge and return the validation package."""
# Submit
submit_resp = requests.post(
SUBMIT_URL,
data={
"key": api_key,
"method": "geetest",
"gt": gt,
"challenge": challenge,
"pageurl": pageurl,
"json": 1,
},
timeout=30,
)
submit_resp.raise_for_status()
submit_data = submit_resp.json()
if submit_data.get("status") != 1:
raise RuntimeError(f"Submit failed: {submit_data}")
captcha_id = submit_data["request"]
print(f"Task created — captcha ID: {captcha_id}")
# Wait before first poll
time.sleep(15)
# Poll for result
for _ in range(60):
result_resp = requests.get(
RESULT_URL,
params={
"key": api_key,
"action": "get",
"id": captcha_id,
"json": 1,
},
timeout=30,
)
result_resp.raise_for_status()
result_data = result_resp.json()
if result_data.get("request") == "CAPCHA_NOT_READY":
time.sleep(5)
continue
if result_data.get("status") == 1:
return result_data["request"]
raise RuntimeError(f"Polling error: {result_data}")
raise TimeoutError("GeeTest v3 solve timed out")
# Usage: always fetch a fresh challenge first
PAGE_URL = "https://example.com/login"
gt, challenge = get_fresh_challenge(PAGE_URL)
result = solve_geetest_v3(API_KEY, gt, challenge, PAGE_URL)
print(f"Result: {result}")
# The result contains: challenge, validate, seccode
# Map them to: geetest_challenge, geetest_validate, geetest_seccode
Node.js: حل GeeTest v3 كاملًا مع challenge جديد
const API_KEY = "YOUR_CAPTCHAAI_API_KEY";
const SUBMIT_URL = "https://ocr.captchaai.com/in.php";
const RESULT_URL = "https://ocr.captchaai.com/res.php";
function sleep(ms) {
return new Promise((resolve) => setTimeout(resolve, ms));
}
async function getFreshChallenge(targetUrl) {
const resp = await fetch(`${targetUrl}/api/geetest/register`);
const data = await resp.json();
return { gt: data.gt, challenge: data.challenge };
}
async function solveGeetestV3(apiKey, gt, challenge, pageurl) {
// Submit
const submitResp = await fetch(SUBMIT_URL, {
method: "POST",
headers: { "Content-Type": "application/x-www-form-urlencoded" },
body: new URLSearchParams({
key: apiKey,
method: "geetest",
gt: gt,
challenge: challenge,
pageurl: pageurl,
json: "1",
}),
});
const submitData = await submitResp.json();
if (submitData.status !== 1) {
throw new Error(`Submit failed: ${JSON.stringify(submitData)}`);
}
const captchaId = submitData.request;
console.log(`Task created — captcha ID: ${captchaId}`);
await sleep(15_000);
// Poll for result
for (let i = 0; i < 60; i++) {
const resultResp = await fetch(
`${RESULT_URL}?${new URLSearchParams({
key: apiKey,
action: "get",
id: captchaId,
json: "1",
})}`
);
const resultData = await resultResp.json();
if (resultData.request === "CAPCHA_NOT_READY") {
await sleep(5_000);
continue;
}
if (resultData.status === 1) {
return resultData.request;
}
throw new Error(`Polling error: ${JSON.stringify(resultData)}`);
}
throw new Error("GeeTest v3 solve timed out");
}
// Usage
const PAGE_URL = "https://example.com/login";
(async () => {
const { gt, challenge } = await getFreshChallenge(PAGE_URL);
const result = await solveGeetestV3(API_KEY, gt, challenge, PAGE_URL);
console.log("Result:", result);
// Map result fields to: geetest_challenge, geetest_validate, geetest_seccode
})();
الأسئلة الشائعة
كم يستغرق حل GeeTest v3 عبر CaptchaAI؟
عادةً أقل من 12 ثانية لكل اختبار مع معدل نجاح مرتفع على GeeTest v3. وإذا ظهر CAPCHA_NOT_READY خلال هذه المدة فهذا طبيعي؛ واصل الاستطلاع كل 5 ثوانٍ حتى تعود النتيجة النهائية.
ما الفرق بين أخطاء مرحلة الإرسال وأخطاء مرحلة الاستطلاع؟
أخطاء الإرسال تظهر فور تقديم المهمة إلى in.php وتتعلق بالمصادقة أو المعلمات (مثل ERROR_WRONG_USER_KEY وERROR_BAD_PARAMETERS). أما أخطاء الاستطلاع فتظهر لاحقًا عند الاستفسار عن النتيجة من res.php وتتعلق بمعرّف المهمة أو حالة الحل (مثل ERROR_WRONG_CAPTCHA_ID). تحديد المرحلة أولًا يوجّهك مباشرة إلى القائمة الصحيحة.
أيّ المعلمتين gt وchallenge يتغير مع كل تحميل للصفحة؟
gt هو مفتاح الموقع العام، ثابت لا يتغير، بينما تتغير قيمة challenge مع كل تحميل وتنتهي صلاحيتها بسرعة. لذلك يمكنك تخزين gt بأمان، لكن يجب جلب challenge جديدًا مباشرة قبل كل طلب حل.
ماذا يعني CAPCHA_NOT_READY وهل أعامله كفشل؟
لا، ليس فشلًا، بل يعني أن الحل ما زال جاريًا. انتظر 5 ثوانٍ ثم أعد استطلاع res.php. عدّه فشلًا فقط إذا استمر بعد تجاوز مهلة معقولة، كما في حلقة الاستطلاع الموجودة في أمثلة الكود أعلاه.
هل يتوفّر دعم GeeTest v4 في CaptchaAI؟
لا، لا يدعم CaptchaAI حاليًا GeeTest v4؛ فهو مدرج ضمن قائمة "قريبًا" ولم يُتَح بعد. يغطي هذا الدليل GeeTest v3 فقط. وللاطلاع على أحدث الأنواع المدعومة راجع مستندات CaptchaAI API.
قائمة تحقق لإصلاح تكامل GeeTest
إذا تعطّل تكامل GeeTest لديك، راجع النقاط التالية بالترتيب:
- حداثة التحدي — هل قيمة
challengeجديدة؟ اجلب واحدة جديدة مباشرة قبل كل حل. - صحة المعلمات — يجب أن تكون
gtوchallengeوpageurlصحيحة جميعًا. - تعيين الحقول — يجب أن تذهب
challengeوvalidateوseccodeإلى الحقول الصحيحة على الصفحة. - المقارنة بحل يدوي — استخدم أدوات DevTools في المتصفح لالتقاط بنية الطلب الدقيقة من حل يدوي ناجح.
ابدأ من حلّال GeeTest v3 في CaptchaAI، وتحقق من معلماتك مقابل مستندات الـ API، واقرأ كيف يعمل اختبار GeeTest v3 إن احتجت خلفية عن تدفق التحدي.
سجل التكرار
| التكرار | التركيز | التغييرات |
|---|---|---|
| المسودة 1 | الهيكل والمحتوى | المسودة الأولية لاستكشاف الأخطاء وإصلاحها - 3 مراحل للخطأ، وجدول الأخطاء لإصلاحها، والأسئلة الشائعة |
| المسودة 2 | الدقة الفنية | تم التحقق من جميع رموز الخطأ ومعلمات GeeTest مقابل captchaai.com/api-docs. تمت إضافة جدول معلمات API. تم تأكيد التحدي /validate/seccode لرسم الخرائط الميدانية. |
| المسودة 3 | أمثلة على التعليمات البرمجية | تمت إضافة أمثلة كاملة لـ Python وNode.js مع جلب التحدي الجديد. تمت إضافة الكود الكاذب لنمط تحديث التحدي. |
| المسودة 4 | عمق فشل التحقق من الصحة | قسم موسع للتحقق من صحة الصفحة المستهدفة مع 4 أوضاع فشل مميزة. تمت إضافة جدول تعيين الحقول. تمت إضافة تشخيص عدم تطابق بنية الطلب. |
| المسودة 5 | تلميع ضمان الجودة النهائي | تم التحقق من تطابق جميع رموز الخطأ مع المستندات الرسمية. تمت إضافة جدول مرجعي سريع. تشديد المقدمة. تمت إضافة روابط متقاطعة إلى مقالات المجموعة. إجابات الأسئلة الشائعة المؤكدة جاهزة للمخطط. |
ملخص الأصول المرئية
صورة البطل
- نص بديل: استكشاف أخطاء المطور وإصلاحها في أخطاء GeeTest v3 - تشخيص فشل الطلب والاستقصاء والتحقق من الصحة
- يجب إظهار: سياق تصحيح الأخطاء بمراحل تدفق الأخطاء ونقاط الفشل
- اسم الملف: geetest-v3-errors-troubleshooting-hero.png
في المادة البصرية 1
- الموضع: بعد "أخطاء مرحلة الاستطلاع من res.php"
- النوع: شجرة القرار
- نص بديل: شجرة القرار لحالات فشل GeeTest v3 — أخطاء الطلب مقابل أخطاء الاستقصاء مقابل فشل التحقق من الصحة
- اسم الملف: geetest-v3-error-decision-tree.png
في المادة البصرية 2
- الموضع: بعد "عندما تُرجع الواجهة نتيجة صحيحة لكن الصفحة ترفضها"
- النوع: مخطط الأسباب والحلول
- نص بديل: رسم تخطيطي يوضح الأسباب الشائعة لرفض صفحة GeeTest v3 وإصلاحاتها
- اسم الملف: geetest-v3-validation-causes-fixes.png
مقالات ذات صلة
- حلّ GeeTest v3 في Node.js
- حلّ GeeTest v3 عبر Node.js مع CaptchaAI
- أخطاء captcha صور الشبكة الشائعة وإصلاحها