كل ما تحتاجه للانتقال من حل اختبار 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
خطوة بخطوة
- استخراج معلمات CAPTCHA من الصفحة المستهدفة (مفتاح الموقع، التحدي، الصورة)
- إرسال المعلمات إلى واجهة برمجة التطبيقات (API) للحل
- استطلاع للنتيجة (رمز أو نص)
- أدخل النتيجة مرة أخرى في الصفحة
- أرسل النموذج
الجزء 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.