Memulai

Format Respons API CaptchaAI

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
Komentar dinonaktifkan untuk artikel ini.