Tutorials

Verbindungs-Keep-Alive und HTTP/2 für schnellere CAPTCHA-API-Aufrufe

Jede CAPTCHA-Lösung erfordert mehrere HTTP-Anfragen: eine Übermittlung und 3 bis 10 Abfragen. Ohne Wiederverwendung von Verbindungen zahlt jede Anfrage die Kosten für einen neuen TCP-Handshake und eine TLS-Aushandlung – 100 bis 300 ms pro Verbindung. Dieser Leitfaden zeigt, wie Sie diesen Overhead mithilfe von Keep-Alive-Verbindungen und HTTP/2-Multiplexing eliminieren könnenCaptchaAI.

Warum die Wiederverwendung von Verbindungen wichtig ist

Eine typische reCAPTCHA v2-Lösung erfordert:

  • 1 Anfrage an in.php senden
  • 4–6 Umfrageanfragen an res.php
  • Gesamt: 5–7 HTTP-Anfragen

Ohne Keep-Alive:

  • 5 × (TCP-Handshake ~50 ms + TLS ~100 ms) = 750 ms Overhead

Mit Keep-Alive:

  • 1 × (TCP + TLS) + 4 × (~5 ms Wiederverwendung) = 170 ms Overhead

Einsparungen: ~580 ms pro Lösung. Bei 10.000 Lösungen/day sind das 1,6 Stunden eingesparte Latenz.

Python: Anfragen.Session verwenden

Die requests-Bibliothek unterstützt standardmäßig Keep-Alive, wenn Sie ein Session-Objekt verwenden:

# 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]}...")

Python: HTTP/2 mit httpx

Für HTTP/2-Unterstützung verwenden Sie 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: Verwendung einer Axios-Instanz mit 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 vs. HTTP/1.1 für die CAPTCHA-Lösung

Funktion HTTP/1.1 Keep-Alive HTTP/2
Wiederverwendung von Verbindungen Ja (sequentiell) Ja (multiplexiert)
Gleichzeitige Streams 1 pro Verbindung Bis zu 100+ pro Verbindung
Header-Komprimierung Nein HPACK-Komprimierung
Latenzreduzierung ~60 % ~70 %
Browserunterstützung erforderlich Nein Nein (API-Aufrufe)
Am besten für Sequentielle Lösungen Parallele Lösungen

Für die sequentielle Lösung (jeweils ein CAPTCHA) ist HTTP/1.1 Keep-Alive ausreichend. Für die parallele Lösung (mehrere CAPTCHAs gleichzeitig) bietet das HTTP/2-Multiplexing einen zusätzlichen Vorteil durch die gemeinsame Nutzung einer einzigen Verbindung.

Dimensionierung des Verbindungspools

Passen Sie Ihre Poolgröße an Ihre Parallelitätsstufe an:

Gleichzeitige Lösungen Empfohlene Poolgröße
1–5 5 Anschlüsse
5–20 10 Verbindungen
20–50 25 Verbindungen
50–100 50 Verbindungen
100+ Verwenden Sie HTTP/2 (1 Verbindung)

Übergroße Pools verschwenden Speicher. Zu kleine Pools erzwingen neue Verbindungen und machen die Keep-Alive-Vorteile zunichte.

Fehlerbehebung

Problem Ursache Lösung
## Fehlerbehebung
Problem Ursache Lösung
Verbindung wird trotz Keep-Alive sofort getrennt Server oder Proxy schließt Verbindungen aktiv Keep-Alive-Timeout des Servers prüfen und Connection: keep-alive-Header explizit senden
HTTP/2 nicht aktiv Client oder Bibliothek unterstützt kein HTTP/2 httpx (Python) oder http2-Bibliothek verwenden und HTTP/2-Support prüfen
Keine Latenzverbesserung Verbindungspooling fehlt Session-Objekt wiederverwenden, nicht pro Anfrage neu erstellen

Verwandte Leitfäden

  • CaptchaAI API-Latenzoptimierung
  • Parallele vs. sequenzielle CAPTCHA-Performance
  • Rate-Limiting und Throttling
Kommentare sind für diesen Artikel deaktiviert.