CaptchaAI menggunakan respons berbasis teks sederhana. Referensi ini mencakup setiap format respons yang akan Anda temui, dengan contoh penguraian.
Kirim Titik Akhir (in.php)
Respon Sukses
OK|TASK_ID
Contoh: OK|73548291
Respon Kesalahan
ERROR_CODE
Contoh: ERROR_WRONG_USER_KEY
Penguraian
resp = requests.get("https://ocr.captchaai.com/in.php", params={...})
if resp.text.startswith("OK|"):
task_id = resp.text.split("|")[1]
else:
error = resp.text
raise Exception(f"Submit failed: {error}")
const resp = await axios.get("https://ocr.captchaai.com/in.php", { params });
if (resp.data.startsWith("OK|")) {
const taskId = resp.data.split("|")[1];
} else {
throw new Error(`Submit failed: ${resp.data}`);
}
Endpoint Polling (res.php)
Respon Belum Siap
CAPCHA_NOT_READY
Tugas tersebut masih diproses. Tunggu 5 detik dan polling lagi.
Sukses — CAPTCHA Berbasis Token
Untuk reCAPTCHA, Turnstile, hCaptcha, dan sejenisnya:
OK|03AGdBq24PBCbw...long_token_string
Sukses — Image/OCR CAPTCHA
OK|abc123
Teks setelah OK| adalah teks yang dikenali dari gambar.
Sukses — GeeTest
OK|challenge:abc123,validate:def456,seccode:ghi789
Parsing setiap bidang:
if result.text.startswith("OK|"):
data = result.text.split("|")[1]
parts = dict(item.split(":") for item in data.split(","))
challenge = parts["challenge"]
validate = parts["validate"]
seccode = parts["seccode"]
Sukses — Cloudflare Challenge
Mengembalikan nilai cookie qa_validation_cookie dan agen pengguna:
OK|qa_validation_cookie=abc123;user_agent=Mozilla/5.0...
Respon Kesalahan
ERROR_CODE
Templat Penguraian
def parse_result(response_text):
if response_text == "CAPCHA_NOT_READY":
return {"status": "pending"}
if response_text.startswith("OK|"):
return {"status": "solved", "result": response_text.split("|", 1)[1]}
return {"status": "error", "error": response_text}
Titik Akhir Saldo
GET https://ocr.captchaai.com/res.php?key=API_KEY&action=getbalance
Tanggapan:
1.234
Angka desimal yang mewakili saldo Anda dalam USD.
balance = float(requests.get("https://ocr.captchaai.com/res.php", params={
"key": API_KEY, "action": "getbalance"
}).text)
print(f"Balance: ${balance:.2f}")
Endpoint Laporan
Laporkan Baik (penyelesaian benar)
GET https://ocr.captchaai.com/res.php?key=API_KEY&action=reportgood&id=TASK_ID
Respons: OK_REPORT_RECORDED
Laporkan Buruk (penyelesaian salah)
GET https://ocr.captchaai.com/res.php?key=API_KEY&action=reportbad&id=TASK_ID
Respons: OK_REPORT_RECORDED
Melaporkan penyelesaian yang buruk membantu meningkatkan akurasi dan dapat mengkredit saldo Anda.
Kode Kesalahan Umum
| Kode Kesalahan | Artinya | Tindakan |
|---|---|---|
ERROR_WRONG_USER_KEY |
Kunci API tidak valid | Verifikasi kunci Anda |
ERROR_KEY_DOES_NOT_EXIST |
Kunci tidak terdaftar | Periksa dasbor |
ERROR_ZERO_BALANCE |
Dana tidak mencukupi | Tambahkan saldo |
ERROR_NO_SLOT_AVAILABLE |
Server pada kapasitas | Coba lagi setelah 5 detik |
ERROR_CAPTCHA_UNSOLVABLE |
Tantangannya terlalu sulit | Coba lagi dengan CAPTCHA baru |
ERROR_BAD_DUPLICATES |
Tugas duplikat ditolak | Tunggu sebelum mengirim ulang |
ERROR_WRONG_CAPTCHA_ID |
ID tugas tidak valid | Periksa nilai ID tugas |
ERROR_EMPTY_ACTION |
Parameter action tidak ada |
Tambahkan action=get |
IP_BANNED |
Terlalu banyak permintaan buruk | Perbaiki kunci API Anda; tunggu |
Contoh Polling Lengkap
import requests
import time
API_KEY = "YOUR_API_KEY"
def solve_captcha(submit_params, timeout=300):
"""Generic solver with proper response handling."""
submit_params["key"] = API_KEY
# Submit
resp = requests.get("https://ocr.captchaai.com/in.php", params=submit_params)
if not resp.text.startswith("OK|"):
raise Exception(f"Submit error: {resp.text}")
task_id = resp.text.split("|")[1]
# Poll
deadline = time.time() + timeout
while time.time() < deadline:
time.sleep(5)
result = requests.get("https://ocr.captchaai.com/res.php", params={
"key": API_KEY,
"action": "get",
"id": task_id
})
parsed = parse_result(result.text)
if parsed["status"] == "pending":
continue
elif parsed["status"] == "solved":
return parsed["result"]
else:
raise Exception(f"Solve error: {parsed['error']}")
raise TimeoutError(f"Task {task_id} timed out after {timeout}s")
Pertanyaan Umum
Mengapa responsnya menggunakan pembatas pipa (|) dan bukan JSON?
Format CaptchaAI dioptimalkan untuk kesederhanaan. Respons yang dibatasi pipa lebih kecil dan lebih cepat diurai dibandingkan JSON. Untuk data terstruktur (hasil GeeTest), data setelah OK| berisi pasangan nilai kunci.
Bagaimana cara menangani kesalahan jaringan?
Bungkus panggilan API di try/except dan coba lagi di ConnectionError atau Timeout. Masalah jaringan terpisah dari kesalahan API; API itu sendiri mempertahankan 99,9%+ waktu aktif.
Berapa panjang token maksimum?
Token reCAPTCHA dapat berisi hingga ~500 karakter. Selalu gunakan split("|", 1) (maks pembagian 1) untuk menghindari pemisahan token itu sendiri.
Panduan Terkait
- Pengaturan dan Autentikasi Kunci API
- Panggilan Balik vs Polling
- Referensi Kode Kesalahan CaptchaAI