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

انخفاض معدل حل CAPTCHA: تشخيص انحدار الأداء خطوة بخطوة

انخفاض معدل حل CAPTCHA فجأة لا يعني أن الخدمة قد تعطّلت؛ في الغالب يعود السبب إلى طبقة واحدة — الكود، أو الوكيل، أو الموقع المستهدف، أو الخدمة — تعزلها بقراءة رموز الأخطاء أولًا. يقدّم هذا الدليل مسارًا تشخيصيًا مرتّبًا وسكربتًا يجمع الإحصاءات قبل فتح تذكرة دعم.

شجرة قرار سريعة لتحديد السبب

Solve rate dropped
├── Is the API returning errors? → Check error codes
│   ├── ERROR_WRONG_USER_KEY → API key issue
│   ├── ERROR_ZERO_BALANCE → Balance depleted
│   ├── ERROR_NO_SLOT_AVAILABLE → Rate limiting
│   └── ERROR_CAPTCHA_UNSOLVABLE → CAPTCHA changed
├── Are tokens returned but rejected by the target site?
│   ├── Token expired before submission → Speed up injection
│   ├── Sitekey changed → Re-extract from page
│   └── Domain mismatch → Check pageurl parameter
├── Are proxies failing?
│   ├── Proxy banned by target → Rotate proxies
│   └── Proxy timeout → Check proxy health
└── Did the target site change?
    ├── New CAPTCHA type → Update method parameter
    ├── JavaScript changes → Re-analyze page
    └── Rate limiting by site → Reduce frequency

سيناريو من الواقع: لاحظ فريق أتمتة بمتجر تجزئة خليجي انخفاض المعدل من 96% إلى 70% في ساعات الذروة المسائية فقط. لم يكن السبب الخدمة، بل تجاوزَ التزامنُ عددَ الـ threads في خطتهم فظهر ERROR_NO_SLOT_AVAILABLE؛ وحلّتها ترقيةٌ إلى ADVANCE ($90 شهريًا، 50 thread) دون لمس الكود.

جدول مرجعي سريع لاستكشاف الأعطال

السيناريو السبب الأرجح الإجراء الأول
فشل كامل بأخطاء ERROR_WRONG_USER_KEY مفتاح API غير صالح أعد فحص المفتاح
تراجع تدريجي عبر أيام تدهور جودة الوكيل دوّر الوكلاء
هبوط مفاجئ إلى 0% تغيّر المفتاح أو الصفحة أعد استخراج المعلمات
يُحَل لكن يُرفض التوكن انتهاء الصلاحية أو عدم تطابق النطاق راجع التوقيت وpageurl
ينجح بالاختبار ويفشل بالهدف قيود خاصة بالموقع قارن معلمات الموقعين

الخطوة 1: افحص رموز أخطاء CaptchaAI

شغّل سكربتًا تشخيصيًا يتحقّق من الرصيد ويجمع توزيع الأخطاء عبر عدة محاولات:

# diagnose_solve_rate.py
import os
import requests
from collections import Counter

API_KEY = os.environ.get("CAPTCHAAI_KEY", "YOUR_API_KEY")

def check_balance():
    """Verify API key and balance."""
    resp = requests.get("https://ocr.captchaai.com/res.php", params={
        "key": API_KEY, "action": "getbalance", "json": "1",
    })
    result = resp.json()
    print(f"Balance: {result}")
    return result

def test_solve(sitekey, pageurl, runs=5):
    """Run test solves and collect error statistics."""
    errors = Counter()
    successes = 0

    for i in range(runs):
        # Submit
        resp = requests.get("https://ocr.captchaai.com/in.php", params={
            "key": API_KEY,
            "method": "userrecaptcha",
            "googlekey": sitekey,
            "pageurl": pageurl,
            "json": "1",
        })
        result = resp.json()

        if result.get("status") != 1:
            errors[result.get("request", "UNKNOWN")] += 1
            print(f"  Run {i+1}: Submit error: {result.get('request')}")
            continue

        task_id = result["request"]
        import time
        time.sleep(15)

        # Poll
        for _ in range(25):
            poll = requests.get("https://ocr.captchaai.com/res.php", params={
                "key": API_KEY, "action": "get",
                "id": task_id, "json": "1",
            })
            poll_result = poll.json()

            if poll_result.get("status") == 1:
                successes += 1
                print(f"  Run {i+1}: Solved")
                break
            if poll_result.get("request") != "CAPCHA_NOT_READY":
                errors[poll_result.get("request", "UNKNOWN")] += 1
                print(f"  Run {i+1}: Error: {poll_result.get('request')}")
                break
            time.sleep(5)
        else:
            errors["TIMEOUT"] += 1
            print(f"  Run {i+1}: Timeout")

    print(f"\nResults: {successes}/{runs} solved")
    if errors:
        print(f"Errors: {dict(errors)}")

# Run diagnostics
print("=== Balance Check ===")
check_balance()

print("\n=== Test Solves ===")
test_solve("YOUR_SITEKEY", "https://your-target-site.com", runs=5)

غلبةُ ERROR_WRONG_USER_KEY أو ERROR_ZERO_BALANCE تعني مشكلة في بيانات الاعتماد أو الرصيد لا في الحل.

الخطوة 2: تأكّد من معلمات الموقع المستهدف

السبب الأكثر شيوعًا للانحدار هو تغيّر مفتاح الموقع أو بنية الصفحة.

هل تغيّر مفتاح الموقع (sitekey)؟

افتح الصفحة المستهدفة في DevTools (F12) وابحث عن:

  • reCAPTCHA: السمة data-sitekey أو استدعاء grecaptcha.render
  • Cloudflare Turnstile: السمة data-sitekey داخل أداة Turnstile
  • GeeTest: المعلمة gt في التهيئة

حرف واحد مختلف عن المفتاح في كودك يكفي لفشل كل الطلبات؛ انسخه كاملًا.

هل تغيّر نوع CAPTCHA؟

تنتقل بعض المواقع بين مزوّدي CAPTCHA فجأة، فيتوقف الحل حتى تحدّث method:

  • reCAPTCHA v2 → reCAPTCHA v3 (غير مرئي)
  • reCAPTCHA → Cloudflare Turnstile
  • صورة CAPTCHA → reCAPTCHA Enterprise

الخطوة 3: قيّم صحة الوكيل (البروكسي)

تؤثّر جودة الوكيل مباشرةً في معدل الحل، خصوصًا في الأنواع المبنية على التوكن حيث تستخدم CaptchaAI وكيلك. جرّب أولًا بلا وكيل (إن كان النوع يدعم ذلك) لتعزل ما إذا كان الوكيل هو المشكلة.

مشكلة الوكيل العَرَض الإصلاح
محظور من الهدف حُل التوكن لكن رُفض دوّر إلى وكلاء سكنيين
يُرجع أخطاء ERROR_PROXY_NOT_FOUND تأكّد أنه نشط ومتاح
وكيل مركز بيانات مكشوف انخفاض المعدل بدّل إلى وكلاء سكنيين
عدم تطابق جغرافي نتائج غير متّسقة طابِق دولة الوكيل بالهدف

الخطوة 4: راجع توقيت صلاحية التوكن

لكل توكن CAPTCHA عمر محدود؛ إذا طال مسارك بين استلامه وإدخاله تنتهي صلاحيته ويرفضه الموقع رغم نجاح الحل. الإصلاح: قِس الزمن بين getTaskResult وإرسال النموذج، وحسّنه إذا تجاوز 60 ثانية.

نوع التحقق عمر التوكن
reCAPTCHA v2 ~120 ثانية
reCAPTCHA v3 ~120 ثانية
Cloudflare Turnstile ~300 ثانية
GeeTest v3 ~60 ثانية

الخطوة 5: حلّل توزيع الأخطاء

رتّب أخطاءك حسب التكرار للوصول إلى السبب الجذري:

الخطأ المعنى الإجراء
ERROR_CAPTCHA_UNSOLVABLE تحقق معقّد أو تغيّر أبلِغ CaptchaAI وتأكّد من المفتاح
ERROR_WRONG_CAPTCHA_ID معرّف مهمة خاطئ أصلِح تتبّع المعرّف في الكود
ERROR_ZERO_BALANCE نفاد الرصيد اشحن الرصيد
ERROR_NO_SLOT_AVAILABLE تجاوز التزامن قلّل التزامن أو أضف تأخيرًا
CAPCHA_NOT_READY (مهلة) حل بطيء زِد مهلة الاستطلاع

الخطوة 6: قارن بخط الأساس

إذا جمعت مقاييس أداء سابقًا، فقارن الحالية بخط الأساس:

المقياس خط الأساس الحالي الفرق يستدعي التحقيق؟
معدل الحل 95% ؟ انخفاض > 5%
متوسط وقت الحل 15 ثانية ؟ زيادة > 50%
معدل الأخطاء 2% ؟ تجاوز > 5%
قبول التوكن 98% ؟ انخفاض > 3%

الأسئلة الشائعة

كيف أفرّق بين مشكلة الموقع ومشكلة الخدمة؟

إذا عادت التوكنات محلولة لكن رفضها الموقع — قبول التوكن منخفض ومعدل الحل مرتفع — فالمشكلة في جانب الموقع. وارتفاع ERROR_CAPTCHA_UNSOLVABLE عبر عدة مفاتيح معًا يشير إلى الخدمة، ويفصل بينهما اختبارُ مفتاح معروف النجاح.

هل يعني ERROR_NO_SLOT_AVAILABLE أنني بحاجة إلى خطة أعلى؟

ليس دائمًا؛ يعني أن التزامن تجاوز عدد الـ threads، فابدأ بخفضه. وإن احتاج حجمك تزامنًا أكبر، فالانتقال من STANDARD ($30 شهريًا، 15 thread) إلى ADVANCE ($90 شهريًا، 50 thread) يرفع السقف؛ فالفوترة لكل thread متزامن مع حلول غير محدودة.

انتقل الموقع إلى hCaptcha وتوقّف الحل — ما الحل؟

الهبوط المفاجئ إلى 0% غالبًا يعني تغيّر مزوّد CAPTCHA. لاحظ أن CaptchaAI لا تحل حاليًا hCaptcha ولا FunCaptcha (Arkose Labs)، وأن دعم GeeTest v4 قادم قريبًا وليس متاحًا بعد. وإن انتقل إلى نوع مدعوم مثل Turnstile فحدّث method وأعد الاستخراج.

هل ينخفض المعدل رغم نجاح الحل في الـ API؟

نعم؛ السبب المعتاد انتهاء صلاحية التوكن. إذا بطؤ المسار بين استلامه وإرسال النموذج تنتهي صلاحيته (reCAPTCHA نحو 120 ثانية، وTurnstile نحو 300 ثانية) فيُرفض الحل الصحيح.

متى تتواصل مع الدعم

تواصل مع الدعم إذا اجتزت كل الخطوات وبقي المعدل منخفضًا، أو تجاوز ERROR_CAPTCHA_UNSOLVABLE نسبة 20% على مفاتيح كانت تعمل، أو ظهر الرصيد صحيحًا بينما تفشل الحلول، أو استمرّت المشكلة أكثر من ساعتين. وضمّن في تقريرك: نوع CAPTCHA والمفتاح، وعنوان URL، وتوزيع الأخطاء، ووقت البدء، وتعديلات الكود.

أدلة ذات صلة

الخطوات التالية

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