Setiap solve CAPTCHA melibatkan beberapa HTTP request: satu submit dan 3–10 polling. Tanpa reuse koneksi, setiap request membayar biaya TCP handshake dan negosiasi TLS baru — 100–300 ms per koneksi. Panduan ini menunjukkan cara menghilangkan overhead tersebut menggunakan persistent connection dan HTTP/2 multiplexing dengan CaptchaAI.
Mengapa Reuse Koneksi Itu Penting
Solve reCAPTCHA v2 yang tipikal memerlukan:
- 1 submit request ke
in.php - 4–6 polling request ke
res.php - Total: 5–7 HTTP request
Tanpa keep-alive:
- 5 × (TCP handshake ~50 ms + TLS ~100 ms) = overhead 750 ms
Dengan keep-alive:
- 1 × (TCP + TLS) + 4 × (~5 ms reuse) = overhead 170 ms
Penghematan: ~580 ms per solve. Dengan 10.000 solve/hari, itu berarti penghematan latensi sebesar 1,6 jam.
Python: Menggunakan requests.Session
Pustaka requests mendukung keep-alive secara default saat Anda menggunakan objek 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 dengan httpx
Untuk dukungan HTTP/2, gunakan 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: Menggunakan Instance axios dengan 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 untuk Solve CAPTCHA
| Fitur | HTTP/1.1 Keep-Alive | HTTP/2 |
|---|---|---|
| Reuse koneksi | Ya (sekuensial) | Ya (multipleks) |
| Aliran concurrent | 1 per koneksi | Hingga 100+ per koneksi |
| Kompresi header | Tidak | Kompresi HPACK |
| Pengurangan latensi | ~60% | ~70% |
| Browser diperlukan | Tidak | Tidak (API call) |
| Terbaik untuk | Solve sekuensial | Solve paralel |
Untuk solve sekuensial (satu CAPTCHA dalam satu waktu), HTTP/1.1 keep-alive sudah cukup. Untuk solve paralel (beberapa CAPTCHA secara bersamaan), HTTP/2 multiplexing memberikan manfaat tambahan dengan berbagi satu koneksi.
Ukuran Connection Pool
Sesuaikan ukuran pool dengan tingkat concurrency Anda:
| Solve concurrent | Ukuran pool yang disarankan |
|---|---|
| 1–5 | 5 koneksi |
| 5–20 | 10 koneksi |
| 20–50 | 25 koneksi |
| 50–100 | 50 koneksi |
| 100+ | Gunakan HTTP/2 (1 koneksi) |
Pool terlalu besar membuang memori. Pool terlalu kecil memaksa koneksi baru, meniadakan manfaat keep-alive.
Pemecahan Masalah
| Masalah | Penyebab | Perbaikan |
|---|---|---|
| Koneksi tutup antar polling | Timeout server atau proxy | Set timeout keep-alive > 30 detik di konfigurasi client |
| Tidak ada peningkatan performa | Keep-alive sudah aktif secara default | Verifikasi dengan network monitoring tool |
| Error koneksi ditolak | Pool habis | Tingkatkan maxSockets atau kurangi concurrency |
| HTTP/2 tidak dinegosiasikan | Server tidak mendukung h2 | Kembali ke HTTP/1.1 keep-alive |
Pertanyaan Umum
Apakah CaptchaAI mendukung HTTP/2?
Uji dengan curl --http2 https://ocr.captchaai.com/res.php untuk memverifikasi. Jika server menegosiasikan h2, client HTTP/2 Anda akan mendapat manfaatnya. Jika tidak, gunakan HTTP/1.1 keep-alive.
Haruskah saya menutup sesi setelah setiap batch?
Tidak. Biarkan sesi tetap terbuka di antara batch jika Anda menjalankan solve secara berkala. Tutup hanya saat aplikasi Anda dimatikan.
Apakah ini berfungsi dengan server proxy?
Ya, tapi proxy Anda juga harus mendukung keep-alive dan HTTP/2. Beberapa proxy SOCKS5 tidak mempertahankan persistent connection.
Artikel Terkait
- Circuit Breaker Pattern untuk API Call CAPTCHA
- Benchmarking Waktu Solve CAPTCHA
Langkah Selanjutnya
Kurangi overhead koneksi di setiap solve — dapatkan API key CaptchaAI Anda.