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:
- 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
- Gửi công nhân - Gửi nhiệm vụ tới API CaptchaAI đồng thời
- 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
- 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:
- Giải quyết CAPTCHA song song
- Kết nối duy trì
- Thời gian giải quyết điểm chuẩn