المرجع

الدليل الكامل: حل اختبار CAPTCHA من الأساسيات إلى الإنتاج

كل ما تحتاجه للانتقال من حل اختبار CAPTCHA الأول إلى خط أنابيب على مستوى الإنتاج.


الجزء الأول: فهم اختبارات CAPTCHA

ما هو اختبار CAPTCHA؟

يعد اختبار CAPTCHA (اختبار تورينج العام الآلي بالكامل للتمييز بين أجهزة الكمبيوتر والبشر) تحديًا مصممًا لمنع الوصول الآلي مع السماح للمستخدمين البشريين بالمرور.

الأنواع التي ستواجهها

النوع أمثلة التحدي
نص/Image الحروف المشوهة، والتعابير الرياضية اكتب ما تراه
خانة الاختيار reCAPTCHA v2 انقر فوق خانة الاختيار، وربما حل شبكة الصور
غير مرئية reCAPTCHA v3، Turnstile لا يوجد تفاعل من قبل المستخدم - التسجيل السلوكي
تفاعلية شريحة GeeTest، شبكة BLS قم بسحب العناصر أو النقر عليها أو ترتيبها

لماذا تستخدم المواقع اختبار CAPTCHA؟

  • منع إنشاء الحساب الآلي
  • كتلة تجريف وجمع البيانات
  • وقف البريد العشوائي في النماذج والتعليقات
  • الوصول إلى واجهة برمجة التطبيقات (API) بحدود المعدل

الجزء 2: كيفية عمل خدمات حل اختبار CAPTCHA

التدفق

Your Code  →  Submit CAPTCHA to API  →  Solving Service  →  Return Token/Text  →  Your Code Injects Result

خطوة بخطوة

  1. استخراج معلمات CAPTCHA من الصفحة المستهدفة (مفتاح الموقع، التحدي، الصورة)
  2. إرسال المعلمات إلى واجهة برمجة التطبيقات (API) للحل
  3. استطلاع للنتيجة (رمز أو نص)
  4. أدخل النتيجة مرة أخرى في الصفحة
  5. أرسل النموذج

الجزء 3: إعداد CaptchaAI

تثبيت التبعيات

pip install requests

فئة الحلال الأساسية

import time
import requests

class CaptchaAI:
    BASE = "https://ocr.captchaai.com"

    def __init__(self, api_key):
        self.api_key = api_key

    def submit(self, params):
        params["key"] = self.api_key
        params["json"] = 1
        resp = requests.post(f"{self.BASE}/in.php", data=params)
        data = resp.json()
        if data["status"] != 1:
            raise Exception(f"Submit failed: {data['request']}")
        return data["request"]

    def get_result(self, task_id, timeout=300, interval=5, initial_wait=10):
        time.sleep(initial_wait)
        deadline = time.time() + timeout
        while time.time() < deadline:
            resp = requests.get(
                f"{self.BASE}/res.php",
                params={
                    "key": self.api_key,
                    "action": "get",
                    "id": task_id,
                    "json": 1,
                },
            ).json()
            if resp["request"] == "CAPCHA_NOT_READY":
                time.sleep(interval)
                continue
            if resp["status"] == 1:
                return resp["request"]
            raise Exception(f"Solve failed: {resp['request']}")
        raise TimeoutError("Solve timed out")

    def solve(self, params, **kwargs):
        task_id = self.submit(params)
        return self.get_result(task_id, **kwargs)

    def balance(self):
        resp = requests.get(
            f"{self.BASE}/res.php",
            params={"key": self.api_key, "action": "getbalance"},
        )
        return float(resp.text)

الجزء الرابع: حل كل نوع من أنواع CAPTCHA

reCAPTCHA v2

solver = CaptchaAI("YOUR_API_KEY")
token = solver.solve({
    "method": "userrecaptcha",
    "googlekey": "6Le-wvkSAAAAAPBMRTvw0Q4Muexq9bi0DJwx_mJ-",
    "pageurl": "https://example.com/login",
})

reCAPTCHA v3

token = solver.solve({
    "method": "userrecaptcha",
    "googlekey": "SITE_KEY",
    "pageurl": "https://example.com",
    "version": "v3",
    "action": "submit",
}, initial_wait=20)

Cloudflare Turnstile

token = solver.solve({
    "method": "turnstile",
    "sitekey": "0x4AAAAAAAC3a...",
    "pageurl": "https://example.com",
})

GeeTest v3

result = solver.solve({
    "method": "geetest",
    "gt": "GT_VALUE",
    "challenge": "CHALLENGE_VALUE",
    "pageurl": "https://example.com",
})

Image/OCR

import base64

with open("captcha.png", "rb") as f:
    img_b64 = base64.b64encode(f.read()).decode()

text = solver.solve({
    "method": "base64",
    "body": img_b64,
    "numeric": "1",
    "minLen": "4",
    "maxLen": "6",
})

الجزء 5: استخراج معلمات اختبار CAPTCHA

مفتاح الموقع reCAPTCHA

from selenium import webdriver
from selenium.webdriver.common.by import By

driver = webdriver.Chrome()
driver.get("https://example.com/login")

# Method 1: From div attribute
sitekey = driver.find_element(
    By.CSS_SELECTOR, "[data-sitekey]"
).get_attribute("data-sitekey")

# Method 2: From iframe URL
import re
iframe = driver.find_element(By.CSS_SELECTOR, "iframe[src*='recaptcha']")
src = iframe.get_attribute("src")
sitekey = re.search(r"k=([^&]+)", src).group(1)

مفتاح الموقع الدوار

sitekey = driver.find_element(
    By.CSS_SELECTOR, "[data-sitekey], .cf-turnstile"
).get_attribute("data-sitekey")

معلمات GeeTest

import json

gt_data = driver.execute_script("""
    return {
        gt: document.querySelector('[data-gt]')?.getAttribute('data-gt'),
        challenge: document.querySelector('[data-challenge]')?.getAttribute('data-challenge')
    };
""")

الجزء السادس: محاليل الحقن

القائم على الرمز المميز (reCAPTCHA، Turnstile)

driver.execute_script(f"""
    document.querySelector('[name="g-recaptcha-response"]').value = '{token}';
    document.querySelector('[name="cf-turnstile-response"]').value = '{token}';
""")

لعمليات الاسترجاعات

driver.execute_script(f"""
    if (typeof ___grecaptcha_cfg !== 'undefined') {{
        Object.keys(___grecaptcha_cfg.clients).forEach(function(key) {{
            var client = ___grecaptcha_cfg.clients[key];
            // Find and call the callback
        }});
    }}
""")

الجزء السابع: معالجة الأخطاء

إعادة محاولة المنطق

def solve_with_retry(solver, params, max_retries=3):
    for attempt in range(max_retries):
        try:
            return solver.solve(params)
        except Exception as e:
            error = str(e)
            if "ZERO_BALANCE" in error:
                raise  # Don't retry — need funds
            if "UNSOLVABLE" in error:
                print(f"Attempt {attempt + 1} failed, retrying...")
                continue
            raise
    raise Exception(f"Failed after {max_retries} attempts")

مراقبة الرصيد

def check_balance_before_solve(solver, min_balance=0.10):
    balance = solver.balance()
    if balance < min_balance:
        raise Exception(f"Low balance: ${balance:.2f}")
    return balance

الجزء الثامن: أنماط الإنتاج

تجمع الاتصال

import requests
from requests.adapters import HTTPAdapter
from urllib3.util.retry import Retry

def create_session():
    session = requests.Session()
    retry = Retry(total=3, backoff_factor=1, status_forcelist=[500, 502, 503])
    adapter = HTTPAdapter(max_retries=retry, pool_connections=10, pool_maxsize=20)
    session.mount("https://", adapter)
    return session

الحل المتزامن

from concurrent.futures import ThreadPoolExecutor, as_completed

def solve_batch(solver, captcha_list, max_workers=5):
    results = {}
    with ThreadPoolExecutor(max_workers=max_workers) as executor:
        futures = {
            executor.submit(solver.solve, params): url
            for url, params in captcha_list
        }
        for future in as_completed(futures):
            url = futures[future]
            try:
                results[url] = future.result()
            except Exception as e:
                results[url] = f"ERROR: {e}"
    return results

الحد من المعدل

import threading

class RateLimiter:
    def __init__(self, max_per_second=10):
        self.interval = 1.0 / max_per_second
        self.lock = threading.Lock()
        self.last_call = 0

    def wait(self):
        with self.lock:
            now = time.time()
            wait_time = self.last_call + self.interval - now
            if wait_time > 0:
                time.sleep(wait_time)
            self.last_call = time.time()

الجزء التاسع: المراقبة

التسجيل

import logging

logging.basicConfig(level=logging.INFO, format="%(asctime)s %(levelname)s %(message)s")
logger = logging.getLogger("captcha")

def solve_logged(solver, params):
    start = time.time()
    logger.info(f"Submitting {params.get('method')} CAPTCHA")
    try:
        result = solver.solve(params)
        elapsed = time.time() - start
        logger.info(f"Solved in {elapsed:.1f}s")
        return result
    except Exception as e:
        elapsed = time.time() - start
        logger.error(f"Failed after {elapsed:.1f}s: {e}")
        raise

تتبع المقاييس

class SolveMetrics:
    def __init__(self):
        self.total = 0
        self.success = 0
        self.failures = 0
        self.total_time = 0.0

    def record(self, success, elapsed):
        self.total += 1
        self.total_time += elapsed
        if success:
            self.success += 1
        else:
            self.failures += 1

    def summary(self):
        rate = (self.success / self.total * 100) if self.total else 0
        avg = (self.total_time / self.total) if self.total else 0
        return {
            "total": self.total,
            "success_rate": f"{rate:.1f}%",
            "avg_time": f"{avg:.1f}s",
        }

الجزء 10: قائمة المراجعة

خطوة المهمة
1 قم بتثبيت requests واحصل على مفتاح API
2 تحديد نوع CAPTCHA في الصفحة المستهدفة
3 استخراج sitekey/parameters
4 أرسل إلى CaptchaAI بالطريقة الصحيحة
5 التصويت مع التوقيت المناسب
6 أدخل الرمز المميز وأرسل النموذج
7 أضف منطق إعادة المحاولة للإنتاج
8 مراقبة معدل النجاح والتكاليف
9 مقياس مع تجمع الاتصال والتزامن

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

ما هي تكلفة حل اختبار CAPTCHA؟

يختلف السعر حسب النوع. تحقق من لوحة المعلومات الخاصة بك لمعرفة الأسعار الحالية. تعتبر اختبارات CAPTCHA للصور هي الأرخص؛ الأنواع القائمة على الرمز المميز تكلف أكثر.

ما هو نوع CAPTCHA الأسرع في الحل؟

يتم حل Image/OCR CAPTCHA خلال 5 إلى 15 ثانية. يتم حل Turnstile بسرعة نظرًا لمعدل النجاح بمعدل نجاح عالٍ. قد يستغرق reCAPTCHA v3 من 20 إلى 30 ثانية.

هل يمكنني حل اختبارات CAPTCHA بدون متصفح؟

نعم، بالنسبة لاختبارات CAPTCHA المستندة إلى الرمز المميز، فإنك تحتاج فقط إلى مفتاح الموقع وعنوان URL للصفحة - ولا يلزم وجود متصفح. تحتاج اختبارات CAPTCHA للصور إلى بيانات الصورة فقط.

كيف أتعامل مع انتهاء صلاحية الرمز المميز؟

قم بحل اختبارات CAPTCHA قبل أن تحتاج إليها. تنتهي صلاحية رموز reCAPTCHA خلال 120 ثانية تقريبًا، وتنتهي صلاحية Turnstile خلال 300 ثانية تقريبًا. لا تحل مسبقًا بكميات كبيرة.


أدلة ذات صلة

  • البدء السريع مع CaptchaAI: حلّ أول كابتشا في 5 دقائق
  • reCAPTCHA v2 الشائعة لحل الأخطاء والإصلاحات

من الأساسيات إلى الإنتاج في دليل واحد —ابدأ بـ CaptchaAI.

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