دروس API

تحسين وقت استجابة واجهة برمجة التطبيقات CaptchaAI: حل أسرع

يحتوي حل اختبار CAPTCHA على أربعة مكونات لزمن الاستجابة: إرسال الطلب، وانتظار قائمة الانتظار، وتنفيذ الحل، واسترداد الاستقصاء. لا يمكنك التحكم في وقت تنفيذ الحل، ولكن يمكنك تحسين كل شيء آخر.


زمن الاستجابة الأساسي حسب نوع اختبار CAPTCHA

نوع التحقق وقت الحل النموذجي أفضل ما يمكن تحقيقه
Image/OCR 2-5ث 1-3ث
reCAPTCHA v2 15-30 ثانية 10-20 ثانية
reCAPTCHA v3 10-20 ثانية 8-15 ثانية
Cloudflare Turnstile 10-25 ثانية 8-15 ثانية
GeeTest v3 15-30 ثانية 10-20 ثانية

يعكس عمود "أفضل ما يمكن تحقيقه" ما تحصل عليه بعد تطبيق التحسينات أدناه.


1. تحسين فترات الاستطلاع

يؤدي الفاصل الزمني للاستقصاء الافتراضي البالغ 5 ثوانٍ إلى إضاعة الوقت عند اكتمال الحل بين الاستقصاءات. استخدم الاقتراع التكيفي - ابدأ بسرعة، ثم تراجع:

بايثون

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`);
}

يوفر من 1 إلى 4 ثوانٍ في المتوسط مقارنةً بفاصل زمني ثابت مدته 5 ثوانٍ.


2. تجمع الاتصال

أعد استخدام اتصالات HTTP بدلاً من فتح اتصالات جديدة لكل استطلاع:

بايثون

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. الجلب المسبق لاختبارات CAPTCHA

أرسل مهام CAPTCHA قبل أن تحتاج إلى الرموز المميزة. بينما تقوم أداة الكشط الخاصة بك بمعالجة الصفحة N، أرسل اختبار CAPTCHA للصفحة N+1:

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. استخدم طريقة CAPTCHA الصحيحة

يدعم CaptchaAI أحيانًا أساليب أسرع لسيناريوهات محددة:

السيناريو طريقة بطيئة بديل أسرع
reCAPTCHA v2 مع رد الاتصال المعروف userrecaptcha + استطلاع userrecaptcha مع pingback (عنوان URL لرد الاتصال)
صورة نص CAPTCHA base64 بدقة عالية base64 مع numeric=1 إذا كانت الأرقام فقط

5. تخطي البروكسي عند عدم الحاجة إليه

يضيف توجيه الوكيل زمن الوصول. قم بإرسال معلمات الوكيل فقط عندما يتطلب الموقع المستهدف طلبات من عناوين 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. استخدم عناوين URL لرد الاتصال بدلاً من الاستقصاء

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


7. قم بقياس التحسينات الخاصة بك

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()
تنتهي صلاحية رموز الجلب المسبق قبل الاستخدام تستغرق المعالجة وقتًا طويلاً تقليل نافذة الجلب المسبق أو إرسالها إلى وقت قريب من الاستخدام
عنوان URL لرد الاتصال لا يتلقى أي بيانات مطلقًا لا يمكن الوصول إلى الخادم من CaptchaAI تأكد من عنوان URL العام، وقواعد جدار الحماية الصحيحة
يؤدي الاقتراع الأسرع إلى حدود المعدل الاقتراع بقوة شديدة (< 2 ثانية) حافظ على الحد الأدنى للفاصل الزمني عند 3 ثوانٍ

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

ما هو أكبر تحسين واحد؟

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

هل يساعد الاستطلاع التكيفي في اختبارات CAPTCHA للصور؟

أقل من ذلك. يتم حل اختبارات CAPTCHA للصور خلال 2-5 ثوانٍ، لذلك غالبًا ما يلتقطها الاستطلاع الأول بعد 3 ثوانٍ. يكون التحسن أكثر وضوحًا بالنسبة لـ reCAPTCHA (15-30 ثانية).


احصل على أسرع حل لـ CAPTCHA مع CaptchaAI

احصل على مفتاح API الخاص بك علىcaptchaai.com.


أدلة ذات صلة

  • دوران مفتاح CaptchaAI API: إدارة المفاتيح المتعددة
  • تعيين نقطة نهاية API: CaptchaAI مقابل المنافسين
التعليقات غير مفعّلة لهذا المقال.