API Tutorials

Optimasi Latensi API CaptchaAI: Solve Lebih Cepat

Solve CAPTCHA memiliki empat komponen latensi: submit request, menunggu antrean, eksekusi solver, dan pengambilan polling. Anda tidak dapat mengontrol waktu eksekusi solver, namun Anda bisa mengoptimalkan yang lainnya.


Latensi Dasar Berdasarkan Jenis CAPTCHA

Jenis CAPTCHA Waktu solve umum Terbaik yang bisa dicapai
Gambar/OCR 2–5 detik 1–3 detik
reCAPTCHA v2 15–30 detik 10–20 detik
reCAPTCHA v3 10–20 detik 8–15 detik
Cloudflare Turnstile 10–25 detik 8–15 detik
GeeTest v3 15–30 detik 10–20 detik

Kolom "terbaik yang bisa dicapai" mencerminkan hasil setelah menerapkan optimasi di bawah.


1. Optimalkan Interval Polling

Interval polling default 5 detik membuang waktu ketika solve selesai di antara dua poll. Gunakan adaptive polling — mulai cepat, lalu bertahap mundur:

Python

import time
import requests

API_KEY = "YOUR_API_KEY"
RESULT_URL = "https://ocr.captchaai.com/res.php"

def adaptive_poll(task_id, timeout=120):
    """Start polling at 3s, increase to 5s after 4 polls."""
    start = time.time()
    interval = 3  # start aggressive
    polls = 0

    while time.time() - start < timeout:
        time.sleep(interval)
        polls += 1

        resp = requests.get(RESULT_URL, params={
            "key": API_KEY, "action": "get",
            "id": task_id, "json": "1"
        }).json()

        if resp["status"] == 1:
            elapsed = time.time() - start
            print(f"Solved in {elapsed:.1f}s ({polls} polls)")
            return resp["request"]

        if resp["request"] != "CAPCHA_NOT_READY":
            raise Exception(resp["request"])

        # Back off after initial fast polls
        if polls >= 4:
            interval = 5

    raise TimeoutError(f"Task {task_id} timed out")

JavaScript

async function adaptivePoll(taskId, apiKey, timeout = 120000) {
  const start = Date.now();
  let interval = 3000;
  let polls = 0;

  while (Date.now() - start < timeout) {
    await new Promise(r => setTimeout(r, interval));
    polls++;

    const resp = await fetch(
      `https://ocr.captchaai.com/res.php?key=${apiKey}&action=get&id=${taskId}&json=1`
    );
    const data = await resp.json();

    if (data.status === 1) {
      console.log(`Solved in ${((Date.now() - start) / 1000).toFixed(1)}s (${polls} polls)`);
      return data.request;
    }
    if (data.request !== 'CAPCHA_NOT_READY') {
      throw new Error(data.request);
    }

    if (polls >= 4) interval = 5000;
  }
  throw new Error(`Task ${taskId} timed out`);
}

Menghemat rata-rata 1–4 detik dibandingkan interval tetap 5 detik.


2. Connection Pooling

Gunakan kembali koneksi HTTP alih-alih membuka koneksi baru untuk setiap poll:

Python

session = requests.Session()
# Use session.get() and session.post() instead of requests.get/post
# The session reuses TCP connections automatically

JavaScript (Node.js)

const { Agent } = require('http');
const axios = require('axios');

const client = axios.create({
  httpAgent: new Agent({ keepAlive: true, maxSockets: 10 }),
  timeout: 10000,
});
// Use client.get() and client.post() for all API calls

Menghemat ~50–100 ms per request dengan melewati TCP/TLS handshake.


3. Pre-Fetch CAPTCHA

Submit task CAPTCHA sebelum token dibutuhkan. Saat scraper memproses halaman N, submit CAPTCHA untuk halaman N+1:

from concurrent.futures import ThreadPoolExecutor

SUBMIT_URL = "https://ocr.captchaai.com/in.php"

def prefetch_submit(sitekey, page_url):
    resp = session.post(SUBMIT_URL, data={
        "key": API_KEY,
        "method": "userrecaptcha",
        "googlekey": sitekey,
        "pageurl": page_url,
        "json": "1",
    })
    data = resp.json()
    if data["status"] == 1:
        return data["request"]
    raise Exception(data["request"])

# Submit next page's CAPTCHA while processing current page
with ThreadPoolExecutor(max_workers=2) as pool:
    # Submit CAPTCHA for page 2 while processing page 1
    future_task = pool.submit(prefetch_submit, "6Le-SITEKEY", "https://example.com/page/2")

    # Process page 1...
    process_page(current_data)

    # Now get the pre-submitted task ID and poll
    task_id = future_task.result()
    token = adaptive_poll(task_id)

Menghilangkan waktu tunggu penuh dengan menumpang-tindihkan solve dengan pemrosesan.


4. Gunakan Metode CAPTCHA yang Tepat

CaptchaAI terkadang mendukung metode yang lebih cepat untuk skenario tertentu:

Skenario Metode lambat Alternatif lebih cepat
reCAPTCHA v2 dengan callback diketahui userrecaptcha + polling userrecaptcha dengan pingback (callback URL)
Teks gambar CAPTCHA base64 resolusi tinggi base64 dengan numeric=1 jika hanya angka

5. Lewati Proxy Bila Tidak Diperlukan

Routing proxy menambah latensi. Kirimkan parameter proxy hanya ketika situs target memerlukan request dari IP tertentu:

# Without proxy — faster for most use cases
data = {
    "key": API_KEY,
    "method": "userrecaptcha",
    "googlekey": sitekey,
    "pageurl": page_url,
    "json": "1",
}

# With proxy — only when required
data["proxy"] = "user:pass@1.2.3.4:8080"
data["proxytype"] = "HTTP"

6. Gunakan Callback URL daripada Polling

Hilangkan polling sepenuhnya dengan parameter pingback:

resp = session.post(SUBMIT_URL, data={
    "key": API_KEY,
    "method": "userrecaptcha",
    "googlekey": sitekey,
    "pageurl": page_url,
    "json": "1",
    "pingback": "https://your-server.com/captcha-callback",
})

CaptchaAI mengirimkan hasil ke URL Anda saat solve selesai. Tidak diperlukan putaran polling — ini adalah metode pengambilan respons kompetitif.


7. Benchmark Optimasi Anda

import statistics

def benchmark(solve_func, iterations=20):
    times = []
    for i in range(iterations):
        start = time.time()
        try:
            solve_func()
            times.append(time.time() - start)
        except Exception:
            pass

    if times:
        print(f"Samples: {len(times)}/{iterations}")
        print(f"Mean:    {statistics.mean(times):.1f}s")
        print(f"Median:  {statistics.median(times):.1f}s")
        print(f"P95:     {sorted(times)[int(len(times)*0.95)]:.1f}s")
        print(f"Min:     {min(times):.1f}s")
        print(f"Max:     {max(times):.1f}s")

Pemecahan Masalah

Masalah Penyebab Solusi
Latensi polling tidak berubah Masih menggunakan requests.get() tanpa session Ganti dengan session.get()
Token pre-fetch kedaluarsa sebelum digunakan Pemrosesan terlalu lama Perkecil jendela pre-fetch atau submit lebih dekat ke waktu pakai
Callback URL tidak pernah menerima data Server tidak bisa dijangkau dari CaptchaAI Pastikan URL publik dan firewall rule benar
Polling cepat menyebabkan rate limiting Interval terlalu agresif (< 2 detik) Pertahankan interval minimum 3 detik

Pertanyaan Umum

Apa optimasi tunggal terbesar?

Pre-fetch. Ini menumpang-tindihkan waktu solve dengan waktu pemrosesan, secara efektif mengurangi latensi yang dirasakan mendekati nol untuk alur kerja sekuensial.

Apakah adaptive polling membantu CAPTCHA gambar?

Kurang begitu. Gambar CAPTCHA diselesaikan dalam 2–5 detik, sehingga poll pertama pada 3 detik sering langsung berhasil. Peningkatannya lebih terlihat pada reCAPTCHA (15–30 detik).


Dapatkan Solve CAPTCHA Tercepat dengan CaptchaAI

Dapatkan API key Anda di captchaai.com.


Panduan Terkait

Komentar dinonaktifkan untuk artikel ini.