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.