Pemecahan Masalah

Batas Request Concurrent CaptchaAI: Diagnosis dan Perbaikan

Saat menjalankan terlalu banyak task CAPTCHA paralel, CaptchaAI mengembalikan ERROR_NO_SLOT_AVAILABLE. Ini berarti Anda telah melampaui batas task concurrent pada akun Anda. Panduan ini menjelaskan batasan tersebut, cara menanganinya, dan cara memaksimalkan throughput tanpa mencapai batas.


Gejala

Yang terlihat Penyebab
ERROR_NO_SLOT_AVAILABLE Terlalu banyak task aktif sekaligus
Respons HTTP 429 Terlalu banyak request per detik ke endpoint API
Beberapa task berhasil, yang lain gagal Sesekali mencapai batas
Waktu solve bertambah Kemacetan antrean di akun Anda

Memahami Batasannya

CaptchaAI memiliki dua jenis rate limit:

Jenis batas Yang dikontrol Error
Task concurrent Jumlah maksimum task yang diselesaikan secara bersamaan ERROR_NO_SLOT_AVAILABLE
Request rate Panggilan API maksimal per detik ke endpoint submit/poll HTTP 429

Batas task concurrent Anda bergantung pada paket. Cek dashboard Anda di captchaai.com untuk batas saat ini.


Perbaikan 1: Tambahkan Semaphore untuk Batasi Concurrency

Kontrol berapa banyak task yang berjalan secara paralel:

import requests
import time
import threading

API_KEY = "YOUR_API_KEY"
MAX_CONCURRENT = 20  # Stay below your account limit

semaphore = threading.Semaphore(MAX_CONCURRENT)


def solve_captcha(params):
    """Solve a CAPTCHA with concurrency control."""
    with semaphore:
        params["key"] = API_KEY
        params["json"] = 1

        submit = requests.post("https://ocr.captchaai.com/in.php", data=params).json()
        if submit.get("status") != 1:
            raise RuntimeError(f"Submit: {submit.get('request')}")

        task_id = submit["request"]
        time.sleep(10)

        for _ in range(30):
            result = requests.get("https://ocr.captchaai.com/res.php", params={
                "key": API_KEY, "action": "get", "id": task_id, "json": 1
            }).json()
            if result.get("status") == 1:
                return result["request"]
            if result.get("request") != "CAPCHA_NOT_READY":
                raise RuntimeError(f"Solve: {result['request']}")
            time.sleep(5)
        raise TimeoutError("Timed out")

Perbaikan 2: Retry pada ERROR_NO_SLOT_AVAILABLE

Saat mencapai batas, tunggu dan retry daripada langsung gagal:

def submit_with_retry(params, max_retries=5):
    """Submit with automatic retry for slot errors."""
    params["key"] = API_KEY
    params["json"] = 1

    for attempt in range(max_retries):
        resp = requests.post("https://ocr.captchaai.com/in.php", data=params).json()

        if resp.get("status") == 1:
            return resp["request"]

        error = resp.get("request", "")
        if error == "ERROR_NO_SLOT_AVAILABLE":
            wait = 2 ** attempt  # Exponential backoff: 1, 2, 4, 8, 16 seconds
            print(f"No slot available, retrying in {wait}s (attempt {attempt + 1})")
            time.sleep(wait)
            continue
        else:
            raise RuntimeError(f"Submit error: {error}")

    raise RuntimeError("Max retries exceeded — no slots available")

Perbaikan 3: Gunakan Task Queue

Daripada membanjiri API, antrekan task dan proses dengan kecepatan yang terkendali:

from queue import Queue
from threading import Thread

task_queue = Queue()
results = {}


def worker():
    while True:
        task_id_local, params = task_queue.get()
        try:
            token = solve_captcha(params)
            results[task_id_local] = {"status": "ok", "token": token}
        except Exception as e:
            results[task_id_local] = {"status": "error", "message": str(e)}
        finally:
            task_queue.task_done()


# Start worker threads (limited by semaphore)
for _ in range(MAX_CONCURRENT):
    t = Thread(target=worker, daemon=True)
    t.start()

# Add tasks to queue
captcha_tasks = [
    {"method": "userrecaptcha", "googlekey": "KEY1", "pageurl": "https://site1.com"},
    {"method": "userrecaptcha", "googlekey": "KEY2", "pageurl": "https://site2.com"},
    # ... more tasks
]

for i, params in enumerate(captcha_tasks):
    task_queue.put((i, params))

task_queue.join()
print(f"Completed: {len(results)} tasks")

Perbaikan 4: Kurangi Frekuensi Polling

Polling terlalu sering membuang panggilan API dan dapat memicu rate limit:

# WRONG — polling every 1 second
time.sleep(1)

# CORRECT — poll every 5 seconds
time.sleep(5)

# BETTER — wait longer on initial delay, then poll
time.sleep(15)  # Initial wait
for _ in range(20):
    # ... poll
    time.sleep(5)

Memantau Task Aktif

Lacak berapa banyak task yang sedang aktif:

active_count = 0
lock = threading.Lock()

def track_solve(params):
    global active_count
    with lock:
        active_count += 1
        print(f"Active tasks: {active_count}/{MAX_CONCURRENT}")
    try:
        return solve_captcha(params)
    finally:
        with lock:
            active_count -= 1

Pertanyaan Umum

Berapa batas task concurrent secara default?

Tergantung pada paket akun Anda. Cek dashboard CaptchaAI untuk batas saat ini. Anda bisa meningkatkannya dengan upgrade paket.

Apakah polling diperhitungkan terhadap rate limit?

Ya. Setiap request res.php dihitung. Poll setiap 5 detik, bukan setiap 1 detik.

Bisakah saya meningkatkan batas concurrent?

Ya. Hubungi support CaptchaAI atau upgrade paket Anda untuk meningkatkan jumlah task simultan maksimum.

Apa perbedaan ERROR_NO_SLOT_AVAILABLE dan HTTP 429?

ERROR_NO_SLOT_AVAILABLE berarti terlalu banyak task yang sedang diselesaikan. HTTP 429 berarti terlalu banyak request API per detik (termasuk polling). Keduanya perlu backoff.


Skalakan Solve Anda di CaptchaAI

Maksimalkan throughput di captchaai.com.


Panduan Terkait

Komentar dinonaktifkan untuk artikel ini.