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

لماذا ينخفض معدل نجاح حل CAPTCHA؟ دليل التشخيص خطوة بخطوة

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


ملاحظة: الأرقام الواردة أدناه مستندة إلى قياسات داخلية ضمن ظروف محددة، وقد تختلف بحسب نوع CAPTCHA والموقع وبيئة التشغيل. أجرِ قياسًا مستقلًا في بيئتك قبل الاعتماد عليها.

مخطط تشخيص انخفاض المعدل

ابدأ من السؤال الأول: هل يجري توليد الرموز أصلًا؟ إجابتك تحدد المسار الذي تسلكه في المخطط.

Success rate dropped
│
├── Are tokens being generated?
│   ├── NO → Check API errors
│   │   ├── ERROR_WRONG_GOOGLEKEY → Sitekey changed. Re-extract.
│   │   ├── ERROR_BAD_PARAMETERS → Check required params
│   │   ├── ERROR_NO_SLOT → Retry with backoff
│   │   └── Other errors → See error decision tree
│   │
│   └── YES → Tokens generated but rejected by target site
│       │
│       ├── Token expired before use?
│       │   └── YES → Submit token faster (< 60-120s)
│       │
│       ├── Token used for wrong domain?
│       │   └── YES → Check pageurl matches submission domain
│       │
│       ├── reCAPTCHA v3 score too low?
│       │   └── YES → Check action parameter, attach cookies/UA/proxy
│       │
│       ├── Site changed CAPTCHA type?
│       │   └── YES → Re-detect CAPTCHA type
│       │
│       └── Site added additional checks?
│           └── YES → Check for fingerprinting, cookies, headers

الخطوة 1: قِس معدلك الحالي أولًا

ثبّت رقمًا مرجعيًا أولًا. الكلاس التالي يسجّل كل محاولة بحسب نوع الحل ويحسب النسبة مع تجميع الأخطاء الأكثر تكرارًا، لتعرف هل الانخفاض عام أم محصور في نوع واحد.

import requests
import time
from collections import defaultdict

class SuccessTracker:
    """Track solve success rates over time."""

    def __init__(self):
        self.stats = defaultdict(lambda: {"attempts": 0, "success": 0, "errors": defaultdict(int)})

    def record(self, method, success, error_code=None):
        self.stats[method]["attempts"] += 1
        if success:
            self.stats[method]["success"] += 1
        elif error_code:
            self.stats[method]["errors"][error_code] += 1

    def report(self):
        for method, data in self.stats.items():
            rate = data["success"] / data["attempts"] * 100 if data["attempts"] > 0 else 0
            print(f"\n{method}:")
            print(f"  Attempts: {data['attempts']}")
            print(f"  Success: {data['success']} ({rate:.1f}%)")
            if data["errors"]:
                print("  Errors:")
                for err, count in sorted(data["errors"].items(), key=lambda x: -x[1]):
                    print(f"    {err}: {count}")

tracker = SuccessTracker()

الخطوة 2: حدّد فئة المشكلة

الفئة أ: أخطاء على مستوى الـ API

تُرجع واجهة CaptchaAI API رمز خطأ بدل الرمز المطلوب. شغّل محاولات اختبارية واجمع نمط الأخطاء:

def diagnose_api_failures(api_key, method, params, attempts=10):
    """Run test solves and collect error patterns."""
    errors = defaultdict(int)
    successes = 0

    for i in range(attempts):
        try:
            resp = requests.post("https://ocr.captchaai.com/in.php", data={
                "key": api_key, "method": method, "json": 1, **params,
            }, timeout=30)
            result = resp.json()

            if result.get("status") != 1:
                errors[result.get("request", "UNKNOWN")] += 1
                continue

            task_id = result["request"]
            # Quick poll
            time.sleep(15)
            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:
                successes += 1
            else:
                errors[data.get("request", "POLL_ERROR")] += 1

        except Exception as e:
            errors[f"EXCEPTION:{type(e).__name__}"] += 1

        time.sleep(2)

    print(f"\nResults: {successes}/{attempts} success")
    for err, count in sorted(errors.items(), key=lambda x: -x[1]):
        print(f"  {err}: {count}")

الفئة ب: رفض الرمز من الموقع الهدف

هنا تحصل على رمز صالح فعلًا، لكن الموقع الهدف يرفضه عند الإرسال. الأسباب الشائعة:

السبب ما الذي تتحقق منه
انتهاء صلاحية الرمز استخدام الرمز بعد أكثر من 120 ثانية من توليده
عدم تطابق النطاق لا يطابق pageurl نطاق الإرسال
درجة reCAPTCHA v3 منخفضة يتطلب الموقع 0.7+ بينما يحصل الحل على 0.3
معلمة action مفقودة يتطلب الإصدار v3 تطابق معلمة action
تغيّر معلمات الموقع تغيّر مفتاح الموقع أو بنية الصفحة

الخطوة 3: أصلح الأسباب الأكثر شيوعًا

إصلاح انتهاء صلاحية الرمز

استخدم الرمز فور استلامه ولا تخزّنه لوقت لاحق. الدالة التالية تستطلع بتردد عالٍ وترسل الرمز مباشرة:

def solve_and_use_immediately(api_key, sitekey, pageurl):
    """Solve and use token as fast as possible."""
    # Submit
    resp = requests.post("https://ocr.captchaai.com/in.php", data={
        "key": api_key,
        "method": "userrecaptcha",
        "googlekey": sitekey,
        "pageurl": pageurl,
        "json": 1,
    }, timeout=30)
    task_id = resp.json()["request"]

    # Poll aggressively
    for _ in range(24):
        time.sleep(5)
        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:
            token = data["request"]
            # USE IMMEDIATELY — don't store for later
            submit_form(token)
            return True

    return False

إصلاح مفتاح الموقع القديم

إذا غيّر الموقع مفتاحه، ستفشل كل طلباتك بخطأ ERROR_WRONG_GOOGLEKEY. أعد استخراج المفتاح من الصفحة قبل كل حل:

def solve_with_fresh_params(api_key, pageurl):
    """Re-extract sitekey before each solve."""
    import re

    resp = requests.get(pageurl, timeout=15)
    match = re.search(r'data-sitekey="([^"]+)"', resp.text)
    if not match:
        raise RuntimeError("Could not find sitekey")

    sitekey = match.group(1)
    # Now solve with fresh sitekey
    # ...

إصلاح معلمة action في الإصدار v3

يجب أن تطابق قيمة action ما يستخدمه الموقع في grecaptcha.execute؛ أي اختلاف يخفض الدرجة ويؤدي إلى الرفض:

# Check what action the site uses
# Look for: grecaptcha.execute('sitekey', {action: 'submit'})

data = {
    "key": api_key,
    "method": "userrecaptcha",
    "googlekey": sitekey,
    "pageurl": pageurl,
    "version": "v3",
    "action": "submit",  # Must match site's action
    "json": 1,
}

معدلات النجاح المتوقعة

قارن قياسك الفعلي بالنطاقات التالية؛ تجاوز عتبة التنبيه إشارة إلى مشكلة في المعلمات أو التوقيت:

نوع CAPTCHA المعدل الطبيعي عتبة التنبيه
reCAPTCHA v2 95-99% أقل من 90%
reCAPTCHA v3 90-98% أقل من 85%
Cloudflare Turnstile 99-100% أقل من 95%
GeeTest v3 99-100% أقل من 95%
BLS 99-100% أقل من 95%
Image/OCR 90-98% أقل من 85%

مثال من الواقع: انخفاض مفاجئ أثناء ذروة الطلب

تخيّل فريقًا يدير اختبارات آلية لإتمام الشراء على متجر إلكتروني في الخليج. خلال حملة الجمعة البيضاء ارتفع الحِمل، وانخفض معدل النجاح من 97% إلى 68% خلال ساعة. أظهر تقرير SuccessTracker أن الأخطاء تركّزت في ERROR_NO_SLOT لا في رفض الرموز — أي أن العلّة في الطاقة الاستيعابية لا في المعلمات. رفع الفريق عدد الـ threads بالانتقال إلى خطة أعلى — مثل PREMIUM بسعر 170 دولارًا شهريًا و100 thread — وأضاف إعادة محاولة مع تراجع أسّي، فعاد المعدل خلال دقائق. الدرس: صنّف الخطأ أولًا، فالرقم وحده لا يدلّك على موضع الخلل.


استكشاف الأخطاء وإصلاحها

جدول مرجعي يربط العرض الظاهر بالسبب ثم بالإجراء:

العرض الظاهر السبب المحتمل الإجراء
انخفاض المعدل من 98% إلى 70% تغيّر مفتاح الموقع أو بنية الصفحة أعد استخراج كل المعلمات
رفض جميع رموز v3 معلمة action خاطئة طابق action من مصدر الصفحة
رموز تعمل لكنها تنتهي صلاحيتها بطء في الاستخدام أرسل الرمز خلال 60 ثانية
تذبذب المعدل بحسب وقت اليوم تحديد معدل من جانب الخادم أضف تأخيرًا بين عمليات الإرسال

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

لماذا ينخفض المعدل فجأة بعد أسابيع من الاستقرار؟

غالبًا لأن الموقع الهدف غيّر شيئًا: مفتاح الموقع، أو نوع CAPTCHA، أو أضاف فحوصات بصمة. ابدأ بإعادة استخراج المعلمات ومقارنة نوع التحقق الظاهر بما يرسله سكربتك.

كيف أفرّق بين خطأ الـ API ورفض الموقع للرمز؟

راقب حقل status في استجابة CaptchaAI: إذا لم يساوِ 1 فالمشكلة على مستوى الـ API (الفئة أ). أمّا إذا استلمت رمزًا صالحًا ثم فشل الإرسال في موقعك، فهي الفئة ب.

هل يرفع تغيير البروكسي أو عنوان IP معدل النجاح؟

نعم في حالات reCAPTCHA v3، حيث تعتمد الدرجة جزئيًا على سمعة عنوان IP. بروكسي نظيف مع كوكيز وسلسلة User-Agent متسقة يرفع الدرجة ويقلّل الرفض.

ماذا لو غيّر الموقع نوع CAPTCHA إلى نوع غير مدعوم؟

إذا انتقل الموقع إلى hCaptcha أو FunCaptcha فلن ينجح الحل، لأن CaptchaAI لا يدعمهما حاليًا. تحقّق من نوع التحقق الظاهر وطابقه مع الأنواع المدعومة قبل إلقاء اللوم على المعلمات.


أدلة ذات صلة


شخّص أسرع وحافظ على معدل نجاحك — ابدأ مع CaptchaAI.

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