زمن الحل ليس رقمًا تجميليًا. فارق بضع ثوانٍ في كل مهمة قد يتحول إلى ساعات إضافية عندما تعمل على آلاف التحديات يوميًا. لهذا السبب تحتاج إلى قياس منظم يوضح المتوسط والقمم العليا ونسبة النجاح، لا الاكتفاء بانطباع عام عن السرعة.
يقدم هذا الدليل أرقامًا مرجعية تقريبية لكل نوع من أنواع CAPTCHA التي يدعمها CaptchaAI، إلى جانب نصوص اختبار يمكنك استخدامها لبناء Benchmarks خاصة ببيئتك.
تنبيه تحريري: الأرقام التالية تقريبية ومخصّصة لتصميم الاختبارات الداخلية، وليست التزامًا منشورًا بالأداء. استخدمها كنقطة بداية فقط، ثم قس بنفسك داخل البيئة المستهدفة.
أوقات الحل النموذجية
تعكس هذه المعايير نطاقات مرجعية تقريبية لعينة اختبار داخلية، ويُقاس الزمن من إرسال الطلب إلى استرجاع النتيجة:
| نوع CAPTCHA | الوسيط | P90 | P99 | معدل القبول التقريبي |
|---|---|---|---|---|
| reCAPTCHA v2 | 12-18 ثانية | 25 ثانية | نحو 40 ثانية | مرتفع |
| reCAPTCHA v2 Invisible | 10-15 ثانية | نحو 20 ثانية | 35 ثانية | مرتفع |
| reCAPTCHA v3 | 8-12 ثانية | 18 ثانية | 30 ثانية | جيد إلى مرتفع |
| reCAPTCHA Enterprise | 15-25 ثانية | 35 ثانية | نحو 50 ثانية | جيد إلى مرتفع |
| Cloudflare Turnstile | 5-10 ثوانٍ | 15 ثانية | 25 ثانية | مرتفع جدًا |
| GeeTest v3 | 10-18 ثانية | 25 ثانية | نحو 40 ثانية | جيد إلى مرتفع |
| Image/OCR | 3-8 ثوانٍ | 12 ثانية | نحو 20 ثانية | 85%+ |
| BLS CAPTCHA | 5-10 ثوانٍ | 15 ثانية | نحو 20 ثانية | مرتفع جدًا |
تختلف الأوقات والقبول الفعلي بحسب الوكيل، والمنطقة، والضغط، ونوع التحدي، وسياسة الموقع المستهدف.
ما الذي يؤثر فعليًا في زمن الحل؟
زمن وصول الشبكة
تضيف المسافة بينك وبين نقاط نهاية الواجهة وقتًا ذهابًا وإيابًا. فإذا كان زمن RTT مرتفعًا، فسيتضخم الفارق الإجمالي عبر الإرسال والاستطلاع المتكرر.
جودة الوكيل
عند استخدام الوكلاء، عادةً ما ينتج الوكلاء السكنيون حلولاً أسرع من وكلاء مراكز البيانات لأنهم يثيرون عددًا أقل من التحديات الثانوية.
تعقيد اختبار CAPTCHA
تختلف تحديات الصورة reCAPTCHA v2 في الصعوبة. يستغرق تحدي "تحديد إشارات المرور" مع الصور الباهتة وقتًا أطول من مجرد التحقق من مربع الاختيار.
استراتيجية الاستطلاع
يكشف الاستطلاع السريع، مثل كل ثانيتين، النتيجة باكرًا لكنه يرفع عدد استدعاءات الواجهة. أما الاستطلاع المحافظ، مثل كل 10 ثوانٍ، فيقلل التحميل لكنه يضيف زمن انتظار غير ضروري. لذلك يجب أن توازن بين عدد المهام، وسقف الاستهلاك، وحساسية الزمن في تطبيقك.
البرنامج النصي المعياري بايثون
# benchmark_captchaai.py
import os
import time
import statistics
import requests
API_KEY = os.environ.get("CAPTCHAAI_KEY", "YOUR_API_KEY")
def benchmark_solve(method, params, runs=10):
"""Benchmark a CAPTCHA type over multiple runs."""
times = []
successes = 0
for i in range(runs):
start = time.time()
# Submit
submit_params = {"key": API_KEY, "json": "1", **params}
resp = requests.get("https://ocr.captchaai.com/in.php",
params=submit_params)
result = resp.json()
if result.get("status") != 1:
print(f" Run {i+1}: Submit failed - {result.get('request')}")
continue
task_id = result["request"]
# Poll
time.sleep(10)
solved = False
for _ in range(30):
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:
elapsed = time.time() - start
times.append(elapsed)
successes += 1
solved = True
print(f" Run {i+1}: {elapsed:.1f}s")
break
if poll_result.get("request") != "CAPCHA_NOT_READY":
print(f" Run {i+1}: Error - {poll_result.get('request')}")
break
time.sleep(5)
if not solved and poll_result.get("request") == "CAPCHA_NOT_READY":
print(f" Run {i+1}: Timeout")
if times:
return {
"runs": runs,
"successes": successes,
"success_rate": f"{successes/runs*100:.0f}%",
"median": f"{statistics.median(times):.1f}s",
"p90": f"{sorted(times)[int(len(times)*0.9)]:.1f}s" if len(times) >= 10 else "N/A",
"min": f"{min(times):.1f}s",
"max": f"{max(times):.1f}s",
}
return {"error": "No successful solves"}
# Benchmark reCAPTCHA v2
print("=== reCAPTCHA v2 ===")
recaptcha_v2 = benchmark_solve("userrecaptcha", {
"method": "userrecaptcha",
"googlekey": "6Le-wvkSAAAAAPBMRTvw0Q4Muexq9bi0DJwx_mJ-",
"pageurl": "https://www.google.com/recaptcha/api2/demo",
})
print(recaptcha_v2)
# Benchmark Image/OCR
print("\n=== Image CAPTCHA ===")
# Submit a base64-encoded test image
import base64
# Use a test image for benchmarking
image_result = benchmark_solve("post", {
"method": "base64",
"body": "BASE64_ENCODED_CAPTCHA_IMAGE",
})
print(image_result)
JavaScript البرنامج النصي المعياري
// benchmark_captchaai.js
const axios = require('axios');
const API_KEY = process.env.CAPTCHAAI_KEY || 'YOUR_API_KEY';
async function benchmarkSolve(params, runs = 10) {
const times = [];
let successes = 0;
for (let i = 0; i < runs; i++) {
const start = Date.now();
// Submit
const submit = await axios.get('https://ocr.captchaai.com/in.php', {
params: { key: API_KEY, json: '1', ...params },
});
if (submit.data.status !== 1) {
console.log(` Run ${i + 1}: Submit failed - ${submit.data.request}`);
continue;
}
// Poll
await new Promise(r => setTimeout(r, 10000));
let solved = false;
for (let j = 0; j < 30; j++) {
const poll = await axios.get('https://ocr.captchaai.com/res.php', {
params: { key: API_KEY, action: 'get', id: submit.data.request, json: '1' },
});
if (poll.data.status === 1) {
const elapsed = (Date.now() - start) / 1000;
times.push(elapsed);
successes++;
solved = true;
console.log(` Run ${i + 1}: ${elapsed.toFixed(1)}s`);
break;
}
if (poll.data.request !== 'CAPCHA_NOT_READY') {
console.log(` Run ${i + 1}: Error - ${poll.data.request}`);
break;
}
await new Promise(r => setTimeout(r, 5000));
}
if (!solved) console.log(` Run ${i + 1}: Timeout`);
}
if (times.length === 0) return { error: 'No successful solves' };
times.sort((a, b) => a - b);
return {
runs, successes,
successRate: `${((successes / runs) * 100).toFixed(0)}%`,
median: `${times[Math.floor(times.length / 2)].toFixed(1)}s`,
min: `${times[0].toFixed(1)}s`,
max: `${times[times.length - 1].toFixed(1)}s`,
};
}
(async () => {
console.log('=== reCAPTCHA v2 ===');
const v2 = await benchmarkSolve({
method: 'userrecaptcha',
googlekey: '6Le-wvkSAAAAAPBMRTvw0Q4Muexq9bi0DJwx_mJ-',
pageurl: 'https://www.google.com/recaptcha/api2/demo',
});
console.log(v2);
console.log('\n=== Cloudflare Turnstile ===');
const turnstile = await benchmarkSolve({
method: 'turnstile',
sitekey: 'YOUR_TURNSTILE_SITEKEY',
pageurl: 'https://example.com',
});
console.log(turnstile);
})();
تفسير النتائج
متوسط مقابل P90
- الوسيط — التجربة النموذجية. استخدم هذا لتخطيط القدرات.
- P90 — "أسوأ حالة" لـ 9 من أصل 10 حلول. استخدم هذا لإعدادات المهلة.
- P99 — حالة الحافة الحقيقية. قم بتعيين الحد الأقصى للمهلة أعلى من هذا.
فترات الاقتراع الأمثل
استنادًا إلى المعايير المذكورة أعلاه، قم بتكوين الاستقصاء لكل نوع اختبار CAPTCHA:
| نوع التحقق | الانتظار الأولي | الفاصل الزمني للاستطلاع | الحد الأقصى للمحاولات |
|---|---|---|---|
| Image/OCR | 5 ثوانٍ | 3 ثوانٍ | 15 |
| Cloudflare Turnstile | 5 ثوانٍ | 3 ثوانٍ | 15 |
| BLS CAPTCHA | 5 ثوانٍ | 3 ثوانٍ | 15 |
| reCAPTCHA v2 | 15 ثانية | 5 ثوانٍ | 20 |
| reCAPTCHA v3 | 10 ثوانٍ | 5 ثوانٍ | 20 |
| GeeTest v3 | 12 ثانية | 5 ثوانٍ | 20 |
| reCAPTCHA Enterprise | 15 ثانية | 5 ثوانٍ | 25 |
استكشاف الأخطاء وإصلاحها
| الحالة | السبب المحتمل | ما الذي تراجعه |
|---|---|---|
| الأرقام أبطأ من المتوقع | المنطقة بعيدة أو الضغط مرتفع | قارن التوقيت من منطقة أخرى وكرّر الاختبار في وقت مختلف |
| تفاوت كبير بين تشغيل وآخر | تذبذب في نوع التحدي أو في الوكلاء | ثبّت العينة، وافصل الاختبارات حسب النوع والوكيل |
| ارتفاع P90 وP99 فقط | حالات طرفية قليلة لكنها مكلفة | اضبط المهلة بناءً على P90/P99 لا على الوسيط فقط |
| معدل القبول أقل من الجدول | السياق الفعلي يختلف عن المختبر | اختبر على الصفحات الفعلية نفسها بدل الاكتفاء بالعينة المرجعية |
النقاشات (0)
شارك في النقاش
سجّل الدخول لمشاركة رأيك.
تسجيل الدخوللا توجد تعليقات بعد.