Hướng Dẫn Thực Hành

Connection Keep-Alive và HTTP/2 cho lệnh gọi API CAPTCHA nhanh hơn

Mỗi giải pháp CAPTCHA bao gồm nhiều yêu cầu HTTP: một lần gửi và 3–10 cuộc thăm dò. Nếu không sử dụng lại kết nối, mỗi yêu cầu sẽ phải trả chi phí cho một lần bắt tay TCP mới và đàm phán TLS – 100–300 mili giây cho mỗi kết nối. Hướng dẫn này chỉ ra cách loại bỏ chi phí đó bằng cách sử dụng các kết nối duy trì và ghép kênh HTTP/2 vớiCaptchaAI.

Tại sao việc tái sử dụng kết nối lại quan trọng

Một phép giải reCAPTCHA v2 điển hình yêu cầu:

  • 1 gửi yêu cầu tới in.php
  • 4–6 yêu cầu thăm dò ý kiến tới res.php
  • Tổng cộng: 5–7 yêu cầu HTTP

Không cần duy trì:

  • 5 × (bắt tay TCP ~50ms + TLS ~100ms) = Chi phí 750ms

Với tính năng duy trì:

  • 1 × (TCP + TLS) + 4 × (tái sử dụng ~ 5 mili giây) = Chi phí 170 mili giây

Tiết kiệm: ~580 mili giây mỗi lần giải. Với 10.000 lần giải/day, độ trễ được tiết kiệm là 1,6 giờ.

Python: Sử dụng request.Session

Thư viện requests hỗ trợ duy trì theo mặc định khi bạn sử dụng đối tượng 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]}...")

Python: HTTP/2 với httpx

Để được hỗ trợ HTTP/2, hãy sử dụng 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: Sử dụng phiên bản Axios với 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 so với HTTP/1.1 để giải CAPTCHA

tính năng HTTP/1.1 Duy trì sự sống HTTP/2
Tái sử dụng kết nối Có (tuần tự) Có (ghép kênh)
Luồng đồng thời 1 cho mỗi kết nối Lên tới hơn 100 cho mỗi kết nối
nén tiêu đề Không nén HPACK
Giảm độ trễ ~60% ~70%
Cần hỗ trợ trình duyệt Không Không (lệnh gọi API)
Tốt nhất cho Giải tuần tự Giải quyết song song

Để giải tuần tự (mỗi lần một CAPTCHA), việc duy trì HTTP/1.1 là đủ. Để giải quyết song song (nhiều CAPTCHA cùng lúc), việc ghép kênh HTTP/2 mang lại lợi ích bổ sung bằng cách chia sẻ một kết nối duy nhất.

Kích thước nhóm kết nối

Khớp kích thước nhóm của bạn với mức đồng thời của bạn:

Giải quyết đồng thời Kích thước hồ bơi được đề xuất
1–5 5 kết nối
5–20 10 kết nối
20–50 25 kết nối
50–100 50 kết nối
100+ Sử dụng HTTP/2 (1 kết nối)

Bể bơi quá khổ gây lãng phí bộ nhớ. Các nhóm có quy mô nhỏ buộc phải kết nối mới, phủ nhận các lợi ích duy trì.

Khắc phục sự cố

Vấn đề Nguyên nhân Cách xử lý
Kết nối đóng giữa các cuộc thăm dò Hết thời gian chờ máy chủ hoặc proxy Đặt thời gian chờ keep-alive > 30 giây trong cấu hình máy khách
Không cải thiện hiệu suất Đã sử dụng keep-alive (mặc định trong một số thư viện) Xác minh bằng các công cụ giám sát mạng
Lỗi từ chối kết nối Hồ bơi cạn kiệt Tăng maxSockets hoặc giảm tính đồng thời
HTTP/2 chưa được thương lượng Máy chủ không hỗ trợ h2 Quay trở lại trạng thái duy trì HTTP/1.1

Câu hỏi thường gặp

CaptchaAI có hỗ trợ HTTP/2 không?

Kiểm tra với curl --http2 https://ocr.captchaai.com/res.php để xác minh. Nếu máy chủ đàm phán h2, ứng dụng khách HTTP/2 của bạn sẽ được hưởng lợi. Nếu không, hãy quay lại HTTP/1.1 để duy trì.

Tôi có nên đóng phiên sau mỗi đợt không?

Không. Giữ phiên mở giữa các đợt nếu bạn đang chạy các bài giải định kỳ. Chỉ đóng khi ứng dụng của bạn tắt.

Điều này có hoạt động với máy chủ proxy không?

Có, nhưng proxy của bạn cũng phải hỗ trợ tính năng duy trì hoạt động và HTTP/2. Một số proxy SOCKS5 không duy trì kết nối liên tục.

bài viết liên quan

Các bước tiếp theo

Giảm chi phí kết nối trên mỗi giải pháp —lấy khóa API CaptchaAI của bạn.

Hướng dẫn liên quan:

Os comentários estão desativados para este artigo.