الدروس التطبيقية

اتصال Keep-Alive وHTTP/2 لإجراء مكالمات CAPTCHA API بشكل أسرع

يتضمن كل حل لاختبار CAPTCHA طلبات HTTP متعددة: إرسال واحد و3 إلى 10 استطلاعات. بدون إعادة استخدام الاتصال، يدفع كل طلب تكلفة مصافحة TCP جديدة وتفاوض TLS - 100 إلى 300 مللي ثانية لكل اتصال. يوضح هذا الدليل كيفية التخلص من هذا الحمل باستخدام الاتصالات المستمرة وتعدد إرسال HTTP/2 معCaptchaAI.

لماذا تعتبر إعادة استخدام الاتصال مهمة؟

يتطلب حل reCAPTCHA v2 النموذجي ما يلي:

  • 1 أرسل الطلب إلى in.php
  • 4-6 طلبات استطلاع إلى res.php
  • الإجمالي: 5-7 طلبات HTTP

دون البقاء على قيد الحياة:

  • 5 × (مصافحة TCP ~50 مللي ثانية + TLS ~100 مللي ثانية) = 750 مللي ثانية الحمل

مع البقاء على قيد الحياة:

  • 1 Ó (TCP + TLS) + 4 Ó (~5 مللي ثانية إعادة الاستخدام) = 170 مللي ثانية حمل

التوفير: ~580 مللي ثانية لكل حل. عند 10,000 حل/day، يمثل ذلك 1.6 ساعة من زمن الوصول المحفوظ.

بايثون: استخدام الطلبات.الجلسة

تدعم مكتبة requests البقاء على قيد الحياة بشكل افتراضي عند استخدام كائن Session:

# keepalive_solver.py
import os
import time
import requests

API_KEY = os.environ.get("CAPTCHAAI_KEY", "YOUR_API_KEY")

# Create a session — reuses TCP connections across requests
session = requests.Session()
session.headers.update({"Connection": "keep-alive"})

def solve_captcha(sitekey, pageurl):
    """Solve reCAPTCHA v2 using a persistent connection."""
    # Submit — uses existing connection if available
    resp = session.get("https://ocr.captchaai.com/in.php", params={
        "key": API_KEY,
        "method": "userrecaptcha",
        "googlekey": sitekey,
        "pageurl": pageurl,
        "json": "1",
    })
    result = resp.json()

    if result.get("status") != 1:
        raise Exception(f"Submit failed: {result.get('request')}")

    task_id = result["request"]

    # Poll — reuses the same connection
    time.sleep(15)
    for _ in range(25):
        poll = session.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:
            return poll_result["request"]
        if poll_result.get("request") != "CAPCHA_NOT_READY":
            raise Exception(f"Error: {poll_result.get('request')}")

        time.sleep(5)

    raise Exception("Timeout")

# Solve multiple CAPTCHAs reusing the same connection
for i in range(5):
    token = solve_captcha(
        "6Le-wvkSAAAAAPBMRTvw0Q4Muexq9bi0DJwx_mJ-",
        "https://www.google.com/recaptcha/api2/demo"
    )
    print(f"Solve {i+1}: {token[:30]}...")

بايثون: HTTP/2 مع httpx

للحصول على دعم HTTP/2، استخدم httpx:

# http2_solver.py
import os
import time
import httpx

API_KEY = os.environ.get("CAPTCHAAI_KEY", "YOUR_API_KEY")
BASE_URL = "https://ocr.captchaai.com"

# HTTP/2 client with connection pooling
client = httpx.Client(http2=True, timeout=30.0)

def solve_captcha(sitekey, pageurl):
    """Solve using HTTP/2 multiplexed connections."""
    resp = client.get(f"{BASE_URL}/in.php", params={
        "key": API_KEY,
        "method": "userrecaptcha",
        "googlekey": sitekey,
        "pageurl": pageurl,
        "json": "1",
    })
    result = resp.json()

    if result.get("status") != 1:
        raise Exception(f"Submit failed: {result.get('request')}")

    task_id = result["request"]
    time.sleep(15)

    for _ in range(25):
        poll = client.get(f"{BASE_URL}/res.php", params={
            "key": API_KEY, "action": "get",
            "id": task_id, "json": "1",
        })
        poll_result = poll.json()

        if poll_result.get("status") == 1:
            return poll_result["request"]
        if poll_result.get("request") != "CAPCHA_NOT_READY":
            raise Exception(f"Error: {poll_result.get('request')}")

        time.sleep(5)

    raise Exception("Timeout")

# Multiple solves over a single HTTP/2 connection
for i in range(5):
    token = solve_captcha(
        "6Le-wvkSAAAAAPBMRTvw0Q4Muexq9bi0DJwx_mJ-",
        "https://www.google.com/recaptcha/api2/demo"
    )
    print(f"Solve {i+1}: {token[:30]}...")

client.close()

JavaScript: استخدام مثيل Axios مع Keep-Alive

// keepalive_solver.js
const axios = require('axios');
const http = require('http');
const https = require('https');

const API_KEY = process.env.CAPTCHAAI_KEY || 'YOUR_API_KEY';

// Create agents with keep-alive enabled
const httpAgent = new http.Agent({ keepAlive: true, maxSockets: 10 });
const httpsAgent = new https.Agent({ keepAlive: true, maxSockets: 10 });

// Axios instance with persistent connections
const api = axios.create({
  baseURL: 'https://ocr.captchaai.com',
  httpAgent,
  httpsAgent,
  timeout: 30000,
});

async function solveCaptcha(sitekey, pageurl) {
  // Submit — reuses connection
  const submit = await api.get('/in.php', {
    params: {
      key: API_KEY, method: 'userrecaptcha',
      googlekey: sitekey, pageurl, json: '1',
    },
  });

  if (submit.data.status !== 1) throw new Error(submit.data.request);
  const taskId = submit.data.request;

  // Poll — reuses same connection
  await new Promise(r => setTimeout(r, 15000));
  for (let i = 0; i < 25; i++) {
    const poll = await api.get('/res.php', {
      params: { key: API_KEY, action: 'get', id: taskId, json: '1' },
    });

    if (poll.data.status === 1) return poll.data.request;
    if (poll.data.request !== 'CAPCHA_NOT_READY') throw new Error(poll.data.request);
    await new Promise(r => setTimeout(r, 5000));
  }
  throw new Error('Timeout');
}

(async () => {
  for (let i = 0; i < 5; i++) {
    const token = await solveCaptcha(
      '6Le-wvkSAAAAAPBMRTvw0Q4Muexq9bi0DJwx_mJ-',
      'https://www.google.com/recaptcha/api2/demo'
    );
    console.log(`Solve ${i + 1}: ${token.slice(0, 30)}...`);
  }

  // Clean up agents
  httpAgent.destroy();
  httpsAgent.destroy();
})();

HTTP/2 مقابل HTTP/1.1 لحل اختبار CAPTCHA

ميزة HTTP/1.1 البقاء على قيد الحياة HTTP/2
إعادة استخدام الاتصال نعم (تسلسلي) نعم (متعدد)
التدفقات المتزامنة 1 لكل اتصال ما يصل إلى 100+ لكل اتصال
ضغط الرأس لا ضغط HPACK
تقليل الكمون ~60% ~70%
دعم المتصفح مطلوب لا لا (استدعاءات واجهة برمجة التطبيقات)
الأفضل ل حلول متتابعة يحل الموازي

للحل المتسلسل (اختبار CAPTCHA واحد في كل مرة)، يعد استمرار HTTP/1.1 كافيًا. بالنسبة للحل المتوازي (اختبارات CAPTCHA المتعددة في وقت واحد)، يوفر تعدد إرسال HTTP/2 فائدة إضافية من خلال مشاركة اتصال واحد.

تحجيم تجمع الاتصال

قم بمطابقة حجم مجموعتك مع مستوى التزامن الخاص بك:

الحلول المتزامنة حجم حمام السباحة الموصى به
1-5 5 اتصالات
5-20 10 اتصالات
20-50 25 اتصالات
50-100 50 اتصالات
100+ استخدم HTTP/2 (اتصال واحد)

حمامات السباحة كبيرة الحجم تهدر الذاكرة تفرض حمامات السباحة الصغيرة الحجم اتصالات جديدة، مما يلغي فوائد البقاء على قيد الحياة.

استكشاف الأخطاء وإصلاحها

المشكلة السبب الإجراء
يُنشأ الرمز المميز لكن الجهة المستهدفة ترفضه مفتاح الموقع أو الصفحة أو سياق الجلسة لا يتطابق التقط المعلمات من جديد وأعد استخدام الرمز داخل جلسة HTTP أو المتصفح نفسها
تنتهي عملية الاستطلاع بمهلة الفاصل الزمني أو وقت الانتظار أو معالجة الأخطاء صارمة أكثر من اللازم استطلع كل 5 إلى 10 ثوانٍ وافصل بين انتهاء المهلة والأخطاء الفعلية وسجّل السبب
ينجح المثال محليًا لكنه يفشل داخل سير العمل رد النداء أو حقل النموذج أو حقن الرمز مفقود في السلسلة الفعلية تحقق من المسار الكامل بين أداة الحل والطلب النهائي إلى الموقع المستهدف

الخطوات التالية

أدلة ذات صلة

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