معظم التأخير الذي تلاحظه عند استدعاء CaptchaAI API لا ينبع من حل الاختبار نفسه، بل من طريقة انتظارك للنتيجة وإدارتك للاتصالات. يمرّ حل أي كابتشا بأربع مراحل زمنية:
- إرسال الطلب: الوقت حتى تستقبل الخدمة مهمتك.
- الانتظار في قائمة المعالجة: حتى يلتقط أحد العمال المهمة.
- تنفيذ الحل: المرحلة الوحيدة الخارجة عن سيطرتك.
- استرداد النتيجة: زمن الاستطلاع الدوري حتى تصلك النتيجة.
ثلاث من هذه المراحل الأربع قابلة للضغط إلى أدنى حد — وفي سير العمل المتسلسل إلى ما يقارب الصفر. هذا الدليل يوضّح كيف.
زمن الاستجابة الأساسي حسب نوع الكابتشا
قبل التحسين، من المفيد معرفة السقف المتوقع لكل نوع. العمود الأول هو الحد الأقصى وفق مواصفة الخدمة (SLA)، والثاني هو ما يتحقق فعلياً بعد تطبيق الخطوات أدناه:
| نوع الكابتشا | الحد الأقصى وفق SLA | أفضل ما يتحقق عملياً |
|---|---|---|
| Image/OCR | < 0.5 ث | 0.2–0.4 ث |
| reCAPTCHA v2 | < 60 ث | 10–20 ث |
| reCAPTCHA v3 | < 4 ث | 1–3 ث |
| Cloudflare Turnstile | < 10 ث | 4–8 ث |
| GeeTest v3 | < 12 ث | 6–10 ث |
هذه أرقام السرعة على الأنواع المدعومة بمعدل نجاح مرتفع؛ الفارق بين العمودين هو ما تكسبه من الخطوات التالية.
1. اضبط فترات الاستطلاع الدوري بذكاء
الفاصل الافتراضي البالغ 5 ثوانٍ يهدر وقتاً حين ينتهي الحل بين استطلاعين. الحل هو استطلاع تكيفي يبدأ سريعاً ثم يتباطأ:
- ابدأ بفاصل قصير مقداره 3 ثوانٍ لالتقاط الحلول السريعة مبكراً.
- تراجع إلى 5 ثوانٍ بعد أربع محاولات لتخفيف الضغط على الخدمة.
Python
import time
import requests
API_KEY = "YOUR_API_KEY"
RESULT_URL = "https://ocr.captchaai.com/res.php"
def adaptive_poll(task_id, timeout=120):
"""Start polling at 3s, increase to 5s after 4 polls."""
start = time.time()
interval = 3 # start aggressive
polls = 0
while time.time() - start < timeout:
time.sleep(interval)
polls += 1
resp = requests.get(RESULT_URL, params={
"key": API_KEY, "action": "get",
"id": task_id, "json": "1"
}).json()
if resp["status"] == 1:
elapsed = time.time() - start
print(f"Solved in {elapsed:.1f}s ({polls} polls)")
return resp["request"]
if resp["request"] != "CAPCHA_NOT_READY":
raise Exception(resp["request"])
# Back off after initial fast polls
if polls >= 4:
interval = 5
raise TimeoutError(f"Task {task_id} timed out")
JavaScript
async function adaptivePoll(taskId, apiKey, timeout = 120000) {
const start = Date.now();
let interval = 3000;
let polls = 0;
while (Date.now() - start < timeout) {
await new Promise(r => setTimeout(r, interval));
polls++;
const resp = await fetch(
`https://ocr.captchaai.com/res.php?key=${apiKey}&action=get&id=${taskId}&json=1`
);
const data = await resp.json();
if (data.status === 1) {
console.log(`Solved in ${((Date.now() - start) / 1000).toFixed(1)}s (${polls} polls)`);
return data.request;
}
if (data.request !== 'CAPCHA_NOT_READY') {
throw new Error(data.request);
}
if (polls >= 4) interval = 5000;
}
throw new Error(`Task ${taskId} timed out`);
}
يوفّر هذا من ثانية إلى أربع ثوانٍ في المتوسط مقارنةً بفاصل ثابت مدته 5 ثوانٍ.
2. أعد استخدام الاتصالات عبر تجميع الاتصال
بدل فتح اتصال HTTP جديد مع كل استطلاع، أعد استخدام الاتصالات القائمة:
Python
session = requests.Session()
# Use session.get() and session.post() instead of requests.get/post
# The session reuses TCP connections automatically
JavaScript (Node.js)
const { Agent } = require('http');
const axios = require('axios');
const client = axios.create({
httpAgent: new Agent({ keepAlive: true, maxSockets: 10 }),
timeout: 10000,
});
// Use client.get() and client.post() for all API calls
يوفّر ذلك نحو 50–100 مللي ثانية لكل طلب بتخطّي مصافحة TCP/TLS المتكررة.
3. اجلب رموز الكابتشا مسبقاً (Prefetch)
أرسل مهام الكابتشا قبل أن تحتاج رموزها فعلياً. تخيّل فريقاً في القاهرة أو الرياض يشغّل مراقبة أسعار على سوق تجارة إلكترونية إقليمي كبير، ويحتاج حل reCAPTCHA v2 على آلاف الصفحات كل ليلة؛ هنا يكون التأخير المتراكم من الانتظار — لا من الحل — هو ما يحدد زمن انتهاء المهمة. الحل أن ترسل كابتشا الصفحة N+1 بينما تعالج أداة الاستخراج الصفحة N:
from concurrent.futures import ThreadPoolExecutor
SUBMIT_URL = "https://ocr.captchaai.com/in.php"
def prefetch_submit(sitekey, page_url):
resp = session.post(SUBMIT_URL, data={
"key": API_KEY,
"method": "userrecaptcha",
"googlekey": sitekey,
"pageurl": page_url,
"json": "1",
})
data = resp.json()
if data["status"] == 1:
return data["request"]
raise Exception(data["request"])
# Submit next page's CAPTCHA while processing current page
with ThreadPoolExecutor(max_workers=2) as pool:
# Submit CAPTCHA for page 2 while processing page 1
future_task = pool.submit(prefetch_submit, "6Le-SITEKEY", "https://example.com/page/2")
# Process page 1...
process_page(current_data)
# Now get the pre-submitted task ID and poll
task_id = future_task.result()
token = adaptive_poll(task_id)
يلغي هذا الأسلوب زمن الانتظار الكامل بمزامنة الحل مع المعالجة، وهو الأثر الأكبر في تسريع سير العمل المتسلسل.
4. اختر طريقة الكابتشا الأنسب للسرعة
يوفّر CaptchaAI أحياناً طرقاً أسرع لسيناريوهات بعينها:
| السيناريو | الطريقة الأبطأ | البديل الأسرع |
|---|---|---|
| reCAPTCHA v2 مع رد نداء معروف | userrecaptcha مع الاستطلاع |
userrecaptcha مع pingback (رابط رد النداء) |
| كابتشا نصية على شكل صورة | base64 بدقة عالية |
base64 مع numeric=1 عند الأرقام فقط |
القاعدة العملية بسيطة:
- استخدم
pingbackكلما توفّر لديك رابط رد نداء عام قابل للوصول. - فعّل
numeric=1فقط حين تكون الكابتشا أرقاماً خالصة، فهو يضيّق مجال التعرف ويسرّعه.
5. استغنِ عن البروكسي عند عدم الحاجة إليه
يضيف توجيه البروكسي زمناً إضافياً على كل طلب. لا ترسل معاملات البروكسي إلا في الحالات التي تستدعيها فعلاً:
- يشترط الموقع المستهدف ورود الطلبات من عناوين IP بدولة أو مزوّد محدد.
- تحتاج سمعة عنوان IP سكني لاجتياز فحوصات إضافية على الموقع.
# Without proxy — faster for most use cases
data = {
"key": API_KEY,
"method": "userrecaptcha",
"googlekey": sitekey,
"pageurl": page_url,
"json": "1",
}
# With proxy — only when required
data["proxy"] = "user:pass@1.2.3.4:8080"
data["proxytype"] = "HTTP"
6. استخدم روابط رد النداء (pingback) بدل الاستطلاع
ألغِ الاستطلاع كلياً عبر المعامل pingback:
resp = session.post(SUBMIT_URL, data={
"key": API_KEY,
"method": "userrecaptcha",
"googlekey": sitekey,
"pageurl": page_url,
"json": "1",
"pingback": "https://your-server.com/captcha-callback",
})
يرسل CaptchaAI النتيجة إلى رابطك فور اكتمال الحل، فلا حاجة إلى حلقة استطلاع. هذه أسرع طريقة لاسترداد النتيجة.
7. قِس تحسيناتك بالأرقام
لا تعتمد على الانطباع؛ قِس المتوسط والوسيط والمئين 95 قبل التحسين وبعده لتعرف أين ذهب الوقت فعلاً:
import statistics
def benchmark(solve_func, iterations=20):
times = []
for i in range(iterations):
start = time.time()
try:
solve_func()
times.append(time.time() - start)
except Exception:
pass
if times:
print(f"Samples: {len(times)}/{iterations}")
print(f"Mean: {statistics.mean(times):.1f}s")
print(f"Median: {statistics.median(times):.1f}s")
print(f"P95: {sorted(times)[int(len(times)*0.95)]:.1f}s")
print(f"Min: {min(times):.1f}s")
print(f"Max: {max(times):.1f}s")
استكشاف الأخطاء وإصلاحها
أكثر المشكلات شيوعاً وحلولها السريعة:
| المشكلة | السبب | الحل |
|---|---|---|
| زمن الاستطلاع لم يتغيّر | ما زلت تستخدم requests.get() دون جلسة |
انتقل إلى session.get() |
| تنتهي صلاحية رموز الجلب المسبق قبل استخدامها | المعالجة تستغرق وقتاً طويلاً | قلّل نافذة الجلب المسبق أو أرسل الطلب قرب وقت الاستخدام |
| رابط رد النداء لا يستقبل أي بيانات | الخادم غير قابل للوصول من CaptchaAI | تأكد من أن الرابط عام وأن قواعد جدار الحماية صحيحة |
| الاستطلاع الأسرع يسبّب تجاوز حد الطلبات | استطلاع بقوة مفرطة (< 2 ث) | أبقِ الحد الأدنى للفاصل عند 3 ثوانٍ |
الأسئلة الشائعة
ما الحد الأدنى الآمن لفاصل الاستطلاع دون تجاوز حد الطلبات؟
اجعل الحد الأدنى 3 ثوانٍ. النزول تحت ثانيتين يزيد الضغط على الخدمة دون تسريع فعلي، وقد يؤدي إلى تحديد معدل الطلبات (rate limiting). الاستطلاع التكيفي يمنحك السرعة المطلوبة مع البقاء ضمن الحدود الآمنة.
هل استخدام pingback أفضل دائماً من الاستطلاع الدوري؟
هو الأسرع من حيث زمن الاسترداد لأنه يلغي حلقة الانتظار كلياً، لكنه يتطلب خادماً عاماً قادراً على استقبال طلب رد النداء. إن كنت تعمل داخل شبكة مغلقة أو بيئة محلية دون عنوان عام، فالاستطلاع التكيفي هو الخيار العملي.
لماذا لا يتغيّر زمن الاستجابة رغم تقصير فترة الاستطلاع؟
غالباً لأنك ما زلت تفتح اتصالاً جديداً في كل طلب. انتقل إلى session.get() أو عميل يعيد استخدام الاتصالات؛ فبدون تجميع الاتصال تُهدر مكاسب الاستطلاع السريع في مصافحات TCP/TLS المتكررة.
هل تؤثر خطة CaptchaAI على سرعة الحل؟
زمن حل الطلب الواحد يحدده نوع الكابتشا، لا الخطة. الخطط تُسعّر حسب عدد الـ threads المتزامنة — تبدأ BASIC من 15$ شهرياً بخمسة threads مع حلول غير محدودة لكل thread — وهي ترفع الإنتاجية الكلية عند المعالجة المتوازية، لكنها لا تُقصّر زمن الطلب المفرد.
احصل على أسرع زمن استجابة مع CaptchaAI
احصل على مفتاح API الخاص بك من captchaai.com وطبّق الخطوات السابقة لتقليص زمن الاستجابة تدريجياً حتى أقرب نقطة إلى سقف الخدمة.