Tutorials

Thông lượng giải CAPTCHA: Cách xử lý 10.000 tác vụ mỗi giờ

Xử lý 10.000 CAPTCHA mỗi giờ có nghĩa là duy trì được ~2,8 giải mỗi giây. Điều đó có thể đạt được với kiến ​​trúc phù hợp. Hướng dẫn này hướng dẫn các phép toán, mã và cách điều chỉnh cần thiết để đạt được thông lượng này bằng cách sử dụngCaptchaAI.

Toán học

Nếu một lần giải reCAPTCHA v2 mất 15 giây (trung bình):

  • Tuần tự: 3.600 giây / 15 giây = 240 giải/hour
  • Để đạt 10.000/hour: bạn cần ~42 giải quyết đồng thời trong chuyến bay mọi lúc

Thông tin chi tiết quan trọng: bạn không đợi CaptchaAI nhanh hơn - bạn đang chồng chéo đủ yêu cầu mà 42 yêu cầu hoàn thành trong cùng một khoảng thời gian 15 giây.

Kiến trúc

┌──────────┐     ┌────────────┐     ┌─────────────┐     ┌──────────┐
│  Task     │────▶│  Submit    │────▶│  CaptchaAI  │────▶│  Result  │
│  Queue    │     │  Workers   │     │  API        │     │  Store   │
│  (Redis)  │     │  (async)   │     │             │     │  (DB)    │
└──────────┘     └────────────┘     └─────────────┘     └──────────┘
                       │                    ▲
                       │    ┌──────────┐    │
                       └───▶│  Poll    │────┘
                            │  Workers │
                            └──────────┘

thành phần:

  1. Hàng đợi tác vụ — Giữ các tác vụ CAPTCHA đang chờ xử lý bằng khóa trang web và URL
  2. Gửi công nhân - Gửi nhiệm vụ tới API CaptchaAI đồng thời
  3. Nhân viên thăm dò ý kiến — Kiểm tra kết quả theo các khoảng thời gian được tối ưu hóa
  4. Cửa hàng kết quả — Lưu mã thông báo khi chúng đến

Python: Đường ống không đồng bộ

# high_throughput_solver.py
import os
import asyncio
import time
import aiohttp

API_KEY = os.environ.get("CAPTCHAAI_KEY", "YOUR_API_KEY")
BASE_URL = "https://ocr.captchaai.com"
MAX_CONCURRENT = 50  # Max simultaneous solves
POLL_INTERVAL = 5    # Seconds between polls
INITIAL_WAIT = 12    # Seconds before first poll

semaphore = asyncio.Semaphore(MAX_CONCURRENT)
stats = {"submitted": 0, "solved": 0, "failed": 0, "start": 0}

async def solve_one(session, sitekey, pageurl, task_num):
    """Submit and poll a single CAPTCHA."""
    async with semaphore:
        try:
            # Submit
            async with session.get(f"{BASE_URL}/in.php", params={
                "key": API_KEY, "method": "userrecaptcha",
                "googlekey": sitekey, "pageurl": pageurl, "json": "1",
            }) as resp:
                result = await resp.json(content_type=None)

            if result.get("status") != 1:
                stats["failed"] += 1
                return None

            stats["submitted"] += 1
            task_id = result["request"]

            # Wait before first poll
            await asyncio.sleep(INITIAL_WAIT)

            # Poll
            for _ in range(25):
                async with session.get(f"{BASE_URL}/res.php", params={
                    "key": API_KEY, "action": "get",
                    "id": task_id, "json": "1",
                }) as resp:
                    poll_result = await resp.json(content_type=None)

                if poll_result.get("status") == 1:
                    stats["solved"] += 1
                    return poll_result["request"]

                if poll_result.get("request") != "CAPCHA_NOT_READY":
                    stats["failed"] += 1
                    return None

                await asyncio.sleep(POLL_INTERVAL)

            stats["failed"] += 1
            return None

        except Exception as e:
            stats["failed"] += 1
            return None

async def run_batch(tasks):
    """Process a batch of CAPTCHA tasks concurrently."""
    connector = aiohttp.TCPConnector(
        limit=MAX_CONCURRENT,
        keepalive_timeout=60,
    )
    async with aiohttp.ClientSession(connector=connector) as session:
        coros = [
            solve_one(session, task["sitekey"], task["pageurl"], i)
            for i, task in enumerate(tasks)
        ]
        results = await asyncio.gather(*coros)
    return results

async def main():
    # Generate test tasks (replace with your task source)
    tasks = [
        {
            "sitekey": "6Le-wvkSAAAAAPBMRTvw0Q4Muexq9bi0DJwx_mJ-",
            "pageurl": "https://www.google.com/recaptcha/api2/demo",
        }
        for _ in range(100)  # Start with 100 tasks
    ]

    stats["start"] = time.time()
    print(f"Processing {len(tasks)} tasks with {MAX_CONCURRENT} concurrent workers")

    results = await run_batch(tasks)
    elapsed = time.time() - stats["start"]

    print(f"\nCompleted in {elapsed:.0f}s")
    print(f"Submitted: {stats['submitted']}")
    print(f"Solved: {stats['solved']}")
    print(f"Failed: {stats['failed']}")
    print(f"Throughput: {stats['solved'] / (elapsed / 3600):.0f} solves/hour")

asyncio.run(main())

JavaScript: Đường dẫn đồng thời

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

const API_KEY = process.env.CAPTCHAAI_KEY || 'YOUR_API_KEY';
const BASE = 'https://ocr.captchaai.com';
const MAX_CONCURRENT = 50;

const agent = new https.Agent({ keepAlive: true, maxSockets: MAX_CONCURRENT });
const api = axios.create({ baseURL: BASE, httpsAgent: agent, timeout: 30000 });

const stats = { submitted: 0, solved: 0, failed: 0 };

async function solveOne(sitekey, pageurl) {
  try {
    const submit = await api.get('/in.php', {
      params: { key: API_KEY, method: 'userrecaptcha', googlekey: sitekey, pageurl, json: '1' },
    });
    if (submit.data.status !== 1) { stats.failed++; return null; }
    stats.submitted++;

    await new Promise(r => setTimeout(r, 12000));

    for (let i = 0; i < 25; i++) {
      const poll = await api.get('/res.php', {
        params: { key: API_KEY, action: 'get', id: submit.data.request, json: '1' },
      });
      if (poll.data.status === 1) { stats.solved++; return poll.data.request; }
      if (poll.data.request !== 'CAPCHA_NOT_READY') { stats.failed++; return null; }
      await new Promise(r => setTimeout(r, 5000));
    }
    stats.failed++;
    return null;
  } catch { stats.failed++; return null; }
}

async function runWithConcurrency(tasks, limit) {
  const results = [];
  const executing = new Set();

  for (const task of tasks) {
    const p = solveOne(task.sitekey, task.pageurl).then(r => {
      executing.delete(p);
      return r;
    });
    executing.add(p);
    results.push(p);

    if (executing.size >= limit) {
      await Promise.race(executing);
    }
  }
  return Promise.all(results);
}

(async () => {
  const tasks = Array.from({ length: 100 }, () => ({
    sitekey: '6Le-wvkSAAAAAPBMRTvw0Q4Muexq9bi0DJwx_mJ-',
    pageurl: 'https://www.google.com/recaptcha/api2/demo',
  }));

  const start = Date.now();
  console.log(`Processing ${tasks.length} tasks, ${MAX_CONCURRENT} concurrent`);

  await runWithConcurrency(tasks, MAX_CONCURRENT);
  const elapsed = (Date.now() - start) / 1000;

  console.log(`\nDone in ${elapsed.toFixed(0)}s`);
  console.log(`Solved: ${stats.solved}, Failed: ${stats.failed}`);
  console.log(`Throughput: ${(stats.solved / (elapsed / 3600)).toFixed(0)} solves/hour`);

  agent.destroy();
})();

Thông số điều chỉnh

tham số Bảo thủ Cân bằng hung hãn
MAX_CONCURRENT 20 50 100
INITIAL_WAIT 15 giây 12 giây 10 giây
POLL_INTERVAL 7 giây 5 giây 3 giây
MAX_POLL_ATTEMPTS 30 25 20
Thông lượng dự kiến ~4.800/hr ~10.000/hr ~18.000/hr

Bắt đầu thận trọng và tăng MAX_CONCURRENT cho đến khi bạn thấy lợi nhuận giảm dần hoặc tỷ lệ lỗi tăng lên.

Giám sát thông lượng

Theo dõi các số liệu này trong thời gian thực:

  • Giải quyết mỗi phút - Nên ở mức ~167 cho mục tiêu 10K/hour
  • Tỷ lệ lỗi — Giữ ở mức dưới 5%. Nếu tỷ lệ lỗi tăng đột biến, hãy giảm mức độ đồng thời
  • Độ sâu hàng đợi — Nếu phát triển, hãy tăng số lượng công nhân. Nếu trống, bạn đã được cung cấp quá mức
  • Thời gian giải P90 - Nếu tăng, CaptchaAI có thể bị giới hạn tỷ lệ

Khắc phục sự cố

Vấn đề Nguyên nhân Cách xử lý
Thông lượng ổn định ở mức ~5K/hr Không đủ đồng thời Tăng MAX_CONCURRENT lên 80–100
Tỷ lệ lỗi > 10% Quá tải API hoặc proxy xấu Giảm tính đồng thời, kiểm tra tình trạng proxy
Mức sử dụng bộ nhớ ngày càng tăng Tích lũy nhiệm vụ không giới hạn Xử lý kết quả khi chúng đến, không đệm
ERROR_NO_SLOT_AVAILABLE Hàng đợi CaptchaAI đã đầy Hãy lùi lại và thử lại sau 5 giây

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

Giới hạn đồng thời CaptchaAI là gì?

Không có giới hạn cứng đối với các yêu cầu đồng thời, nhưng tỷ lệ đồng thời cực cao (500+) có thể gây ra giới hạn tốc độ. Bắt đầu ở mức 50 và tăng quy mô.

Tôi có thể chạy cái này trên nhiều máy không?

Vâng. Sử dụng hàng đợi dùng chung (Redis, RabbitMQ) và chạy tập lệnh worker trên nhiều máy chủ. Mỗi công nhân kéo nhiệm vụ một cách độc lập.

Còn mức tiêu thụ cân bằng ở mức này thì sao?

Với 10.000 giải/hour, hãy theo dõi số dư của bạn một cách chặt chẽ. Sử dụng điểm cuối kiểm tra số dư (res.php?action=getbalance) và thiết lập cảnh báo.

Các bước tiếp theo

Xây dựng quy trình CAPTCHA thông lượng cao của bạn —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.

Postagens relacionadas

DevOps & Scaling Công nhân giải quyết CAPTCHA tự động mở rộng quy mô
Hướng dẫn Dev Ops về Công nhân giải quyết quy trình tự động mở rộng CAPTCHA, với các quyết định về kiến ​​trúc, các cân nhắc vận hành và mô hình tự động hóa cho...

Hướng dẫn Dev Ops về Công nhân giải quyết quy trình tự động mở rộng CAPTCHA, với các quyết định về kiến ​​trúc...

Apr 24, 2026
Troubleshooting CAPTCHA Giải quyết tỷ lệ giảm: Chẩn đoán hồi quy hiệu suất
Hướng dẫn thực hành về CAPTCHA quyết định giải thích giảm tỷ lệ: Chẩn đoán hồi phục hiệu suất, với các nguyên nhân phổ biến, các bước chẩn đoán và cách khắc phụ...

Hướng dẫn thực hành về CAPTCHA quyết định giải thích giảm tỷ lệ: Chẩn đoán hồi phục hiệu suất, với các nguyên...

May 07, 2026
DevOps & Scaling Xây dựng giải quyết CAPTCHA theo sự kiện bằng AWS SNS và CaptchaAI
Hướng dẫn Dev Ops xây dựng giải pháp giải quyết tình huống CAPTCHA bằng AWS SNS và Captcha AI, với các quyết định về kiến ​​trúc, các cân nhắc vận hành và mô hì...

Hướng dẫn Dev Ops xây dựng giải pháp giải quyết tình huống CAPTCHA bằng AWS SNS và Captcha AI, với các quyết đ...

Apr 25, 2026