Saatte 10.000 CAPTCHA'nın işlenmesi, saniyede ~2,8 çözümün sürdürüldüğü anlamına gelir. Doğru mimariyle bu başarılabilir. Bu kılavuzda, bu verime ulaşmak için gereken matematik, kod ve ayarlamalar anlatılmaktadır.CaptchaAI.
Matematik
Tek bir reCAPTCHA v2 çözümü 15 saniye sürerse (medyan):
- Sıralı: 3.600s / 15s = 240 çözüm/hour
- 10.000/hour'ye ulaşmak için: uçuş sırasında her zaman ~42 eşzamanlı çözüme ihtiyacınız var
Temel fikir: CaptchaAI'nin daha hızlı olmasını beklemiyorsunuz; aynı 15 saniyelik pencere içinde 42 çözümün tamamlanmasına yetecek kadar istekle çakışıyorsunuz.
Mimarlık
┌──────────┐ ┌────────────┐ ┌─────────────┐ ┌──────────┐
│ Task │────▶│ Submit │────▶│ CaptchaAI │────▶│ Result │
│ Queue │ │ Workers │ │ API │ │ Store │
│ (Redis) │ │ (async) │ │ │ │ (DB) │
└──────────┘ └────────────┘ └─────────────┘ └──────────┘
│ ▲
│ ┌──────────┐ │
└───▶│ Poll │────┘
│ Workers │
└──────────┘
Bileşenler:
- Görev kuyruğu – Bekleyen CAPTCHA görevlerini site anahtarları ve URL'lerle tutar
- Çalışanları gönderin – Görevleri eş zamanlı olarak CaptchaAI API'sine gönderin
- Anket çalışanları – Sonuçları optimize edilmiş aralıklarla kontrol edin
- Sonuç deposu – Belirteçleri geldiklerinde kaydeder
Python: Eşzamansız Boru Hattı
# 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: Eşzamanlı Boru Hattı
// 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();
})();
Ayar Parametreleri
| Parametre | Muhafazakar | Dengeli | Agresif |
|---|---|---|---|
| MAX_CONCURRENT | 20 | 50 | 100 |
| INITIAL_WAIT | 15'ler | 12'li | 10'lar |
| POLL_INTERVAL | 7'ler | 5'ler | 3'ler |
| MAX_POLL_ATTEMPTS | 30 | 25 | 20 |
| Beklenen verim | ~4,800/hr | ~10.000/hr | ~18.000/hr |
İhtiyatlı başlayın ve azalan getirileri veya artan hata oranlarını görene kadar MAX_CONCURRENT'yi artırın.
Verimi İzleme
Bu ölçümleri gerçek zamanlı olarak izleyin:
- Dakika başına çözer — 10K/hour hedefi için ~167'de kalmalı
- Hata oranı – %5'in altında tutun. Yükselirse eşzamanlılığı azaltın
- Kuyruk derinliği – Büyüyorsanız çalışan sayısını artırın. Boşsa, fazla provizyon almışsınız demektir
- P90 çözüm süresi - Artıyorsa CaptchaAI hız sınırlayıcı olabilir
Sorun giderme
| Sorun | Sebep | Düzeltme |
|---|---|---|
| ~5K/hr'de üretim platoları | Yetersiz eşzamanlılık | MAX_CONCURRENT'yi 80-100'e yükseltin |
| Hata oranı > %10 | API'nin veya hatalı proxy'lerin aşırı yüklenmesi | Eşzamanlılığı azaltın, proxy sağlığını kontrol edin |
| Bellek kullanımı artıyor | Sınırsız görev birikimi | Sonuçları geldikçe işleyin, ara belleğe almayın |
ERROR_NO_SLOT_AVAILABLE |
CaptchaAI sırası dolu | Geri çekilin ve 5 saniye sonra yeniden deneyin |
SSS
CaptchaAI eşzamanlılık sınırı nedir?
Eşzamanlı isteklerde kesin bir sınır yoktur, ancak aşırı yüksek eşzamanlılık (500+) hız sınırlamasını tetikleyebilir. 50'den başlayın ve ölçeği artırın.
Bunu birden fazla makinede çalıştırabilir miyim?
Evet. Paylaşılan bir kuyruk (Redis, RabbitMQ) kullanın ve çalışan komut dosyasını birden çok sunucuda çalıştırın. Her çalışan görevleri bağımsız olarak yerine getirir.
Bu gidişle denge tüketimi ne olacak?
10.000 çözün/hour'de bakiyenizi yakından izleyin. Bakiye kontrolü uç noktasını (res.php?action=getbalance) kullanın ve uyarıları ayarlayın.
Sonraki Adımlar
Yüksek verimli CAPTCHA ardışık düzeninizi oluşturun —CaptchaAI API anahtarınızı alın.
İlgili kılavuzlar: