استكشاف الأخطاء

أخطاء GeeTest v3 الشائعة وطرق إصلاحها

أرسلتَ الطلب بمعلمات سليمة، وأعادت الواجهة قيمًا صحيحة، ومع ذلك ترفض الصفحة المستهدفة النتيجة وكأن شيئًا لم يحدث. هذا من أكثر مواقف 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 لديك، راجع النقاط التالية بالترتيب:

  1. حداثة التحدي — هل قيمة challenge جديدة؟ اجلب واحدة جديدة مباشرة قبل كل حل.
  2. صحة المعلمات — يجب أن تكون gt وchallenge وpageurl صحيحة جميعًا.
  3. تعيين الحقول — يجب أن تذهب challenge وvalidate وseccode إلى الحقول الصحيحة على الصفحة.
  4. المقارنة بحل يدوي — استخدم أدوات 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

مقالات ذات صلة

أدلة ذات صلة

التعليقات غير مفعّلة لهذا المقال.