Reference

Migrasi dari EndCaptcha ke CaptchaAI: Panduan Pemetaan API

Migrasi dari EndCaptcha ke CaptchaAI sebenarnya hanya soal menukar dua hal: endpoint dan cara autentikasi. Anda tidak perlu menulis ulang logika solver — cukup arahkan panggilan lama ke in.php/res.php dan ganti pasangan username/password menjadi satu API key. Panduan ini memetakan tiap panggilan EndCaptcha ke padanannya, dengan contoh Python dan JavaScript siap pakai.

Alur empat langkah CaptchaAI tetap sama seperti kebanyakan solver: kirim task → simpan task ID → polling → pakai token. Yang berubah hanya nama endpoint, parameter, dan bentuk respons — setelah tabel pemetaan, sisanya tinggal cari-ganti.

Perbedaan arsitektur API EndCaptcha vs CaptchaAI

EndCaptcha memakai API SOAP/XML dengan nama method khusus. CaptchaAI memakai REST API yang jauh lebih ringkas: satu endpoint kirim (in.php), satu ambil hasil (res.php), plus respons JSON standar.

Aspek EndCaptcha CaptchaAI
Protokol SOAP/XML atau HTTP POST HTTP POST/GET (REST)
Submit /Captcha/Upload atau WSDL https://ocr.captchaai.com/in.php
Hasil /Captcha/GetText atau WSDL https://ocr.captchaai.com/res.php
Autentikasi Username + password API key
Respons XML/custom JSON (json=1) atau plain text

Kenapa tim otomatisasi Indonesia mempertimbangkan pindah

Buat banyak pengembang scraping dan otomatisasi di Indonesia — apalagi yang menggarap proyek freelance atau price-monitoring dengan margin tipis — biaya jadi pertimbangan utama. CaptchaAI menagih per thread konkuren, bukan per solve: paket BASIC ($15/bulan, 5 thread) mencakup solve tak terbatas per thread selama sebulan, naik bertahap sampai VIP-3 ($7,500/bulan, 5.000 thread). Yang membatasi throughput jadi jumlah thread dan kecepatan solve per tipe, bukan kuota harian.

Soal latency, deploy worker dekat region aplikasi — AWS ap-southeast-3 (Jakarta) atau ap-southeast-1 (Singapura). Karena solve CAPTCHA sudah menambah jeda, jaga logika polling dan batas waktu seperti contoh di bawah agar retry tidak menumpuk saat jaringan padat.

Pemetaan parameter EndCaptcha ke CaptchaAI

Sebagian besar parameter punya padanan langsung. Bedanya yang terbesar: CaptchaAI membuang field password karena API key sudah mencakup autentikasi.

Parameter EndCaptcha Parameter CaptchaAI Catatan
username key CaptchaAI menggunakan API key tunggal
password Tidak diperlukan; API key mencakup autentikasi
captchaData (base64) body (base64) Data gambar base64 yang sama
captchaType method Identifier tipe berbeda
siteKey googlekey Untuk tipe reCAPTCHA
pageUrl pageurl Konsep sama, casing berbeda
captchaId id Task ID untuk polling

Pemetaan tipe CAPTCHA

EndCaptcha memakai penomoran captchaType; CaptchaAI memakai nama method deskriptif. Berikut padanan untuk tipe yang paling sering dipakai.

Tipe di EndCaptcha Method CaptchaAI Parameter CaptchaAI
Image / OCR CAPTCHA method=base64 body={base64_image}
reCAPTCHA v2 method=userrecaptcha googlekey, pageurl
Cloudflare Turnstile method=turnstile sitekey, pageurl

Cek dulu: tipe yang belum didukung sebelum migrasi

Sebelum menukar trafik, pastikan semua tipe yang Anda pakai di EndCaptcha tersedia di CaptchaAI. CaptchaAI menyelesaikan reCAPTCHA v2/v3 (termasuk Enterprise dan Invisible), Cloudflare Turnstile dan Challenge, GeeTest v3, image/OCR, grid, dan BLS — plus CaptchaFox (beta), Friendly Captcha (beta), serta Lemin (beta).

Ada tiga tipe yang perlu diperhatikan: hCaptcha dan FunCaptcha (Arkose Labs) belum didukung, dan GeeTest v4 masih berstatus segera hadir. Kalau alur Anda bergantung pada salah satunya, siapkan solusi terpisah sebelum mematikan EndCaptcha.

Migrasi kode: sebelum dan sesudah

Pola dasarnya tidak berubah — hanya endpoint, autentikasi, dan parsing respons.

Python — sebelum (EndCaptcha)

import requests

USERNAME = "your_endcaptcha_user"
PASSWORD = "your_endcaptcha_pass"

def solve_image_endcaptcha(image_base64):
    # EndCaptcha image solve
    resp = requests.post("https://api.endcaptcha.com/Captcha/Upload", data={
        "username": USERNAME,
        "password": PASSWORD,
        "captchaData": image_base64,
        "captchaType": "1"
    })
    result = resp.json()
    captcha_id = result.get("captchaId")

    import time
    for _ in range(30):
        time.sleep(5)
        poll = requests.post("https://api.endcaptcha.com/Captcha/GetText", data={
            "username": USERNAME,
            "password": PASSWORD,
            "captchaId": captcha_id
        })
        poll_result = poll.json()
        if poll_result.get("text"):
            return {"solution": poll_result["text"]}
        if poll_result.get("error"):
            return {"error": poll_result["error"]}

    return {"error": "TIMEOUT"}

Python — setelah (CaptchaAI)

import os
import time
import requests

API_KEY = os.environ["CAPTCHAAI_API_KEY"]

def solve_image_captchaai(image_base64):
    resp = requests.post("https://ocr.captchaai.com/in.php", data={
        "key": API_KEY,
        "method": "base64",
        "body": image_base64,
        "json": 1
    })
    data = resp.json()
    if data.get("status") != 1:
        return {"error": data.get("request")}

    captcha_id = data["request"]

    for _ in range(30):
        time.sleep(5)
        result = requests.get("https://ocr.captchaai.com/res.php", params={
            "key": API_KEY,
            "action": "get",
            "id": captcha_id,
            "json": 1
        }).json()
        if result.get("status") == 1:
            return {"solution": result["request"]}
        if result.get("request") != "CAPCHA_NOT_READY":
            return {"error": result.get("request")}

    return {"error": "TIMEOUT"}

Dua hal berubah: kredensial kini dibaca dari environment variable (CAPTCHAAI_API_KEY), dan Anda memeriksa status == 1, bukan field text. Saat polling, respons CAPCHA_NOT_READY berarti task masih diproses.

Python — reCAPTCHA v2 (CaptchaAI)

def solve_recaptcha_v2(sitekey, pageurl):
    resp = requests.post("https://ocr.captchaai.com/in.php", data={
        "key": API_KEY,
        "method": "userrecaptcha",
        "googlekey": sitekey,
        "pageurl": pageurl,
        "json": 1
    })
    data = resp.json()
    if data.get("status") != 1:
        return {"error": data.get("request")}

    captcha_id = data["request"]

    for _ in range(60):
        time.sleep(5)
        result = requests.get("https://ocr.captchaai.com/res.php", params={
            "key": API_KEY, "action": "get",
            "id": captcha_id, "json": 1
        }).json()
        if result.get("status") == 1:
            return {"solution": result["request"]}
        if result.get("request") != "CAPCHA_NOT_READY":
            return {"error": result.get("request")}

    return {"error": "TIMEOUT"}

Untuk CAPTCHA berbasis token seperti reCAPTCHA, perbesar jendela polling ke 60 iterasi (60 × 5 detik) karena penyelesaiannya lebih lama.

JavaScript — sebelum (EndCaptcha)

const axios = require("axios");

const USERNAME = "your_endcaptcha_user";
const PASSWORD = "your_endcaptcha_pass";

async function solveImageEndCaptcha(imageBase64) {
  const submit = await axios.post("https://api.endcaptcha.com/Captcha/Upload", {
    username: USERNAME,
    password: PASSWORD,
    captchaData: imageBase64,
    captchaType: "1",
  });
  const captchaId = submit.data.captchaId;

  for (let i = 0; i < 30; i++) {
    await new Promise((r) => setTimeout(r, 5000));
    const poll = await axios.post("https://api.endcaptcha.com/Captcha/GetText", {
      username: USERNAME,
      password: PASSWORD,
      captchaId,
    });
    if (poll.data.text) return { solution: poll.data.text };
    if (poll.data.error) return { error: poll.data.error };
  }
  return { error: "TIMEOUT" };
}

JavaScript — setelah (CaptchaAI)

const axios = require("axios");
const API_KEY = process.env.CAPTCHAAI_API_KEY;

async function solveImageCaptchaAI(imageBase64) {
  const submit = await axios.post("https://ocr.captchaai.com/in.php", null, {
    params: { key: API_KEY, method: "base64", body: imageBase64, json: 1 },
  });
  if (submit.data.status !== 1) return { error: submit.data.request };

  const captchaId = submit.data.request;

  for (let i = 0; i < 30; i++) {
    await new Promise((r) => setTimeout(r, 5000));
    const poll = await axios.get("https://ocr.captchaai.com/res.php", {
      params: { key: API_KEY, action: "get", id: captchaId, json: 1 },
    });
    if (poll.data.status === 1) return { solution: poll.data.request };
    if (poll.data.request !== "CAPCHA_NOT_READY") return { error: poll.data.request };
  }
  return { error: "TIMEOUT" };
}

Perbedaan penting yang perlu diperhatikan

Detail kecil berikut paling sering menyandung migrasi kalau tidak dicek lebih dulu.

Area EndCaptcha CaptchaAI
Autentikasi Username + password API key tunggal
Format error JSON custom dengan field error Field request standar dengan kode error
Polling POST ke endpoint terpisah GET ke res.php dengan query parameter
Cek saldo Method SOAP terpisah res.php?action=getbalance&key=KEY
Laporkan salah Method terpisah res.php?action=reportbad&id=ID&key=KEY

Checklist migrasi langkah demi langkah

Kerjakan berurutan dari atas ke bawah. Uji paralel sengaja ditaruh sebelum penggantian trafik produksi supaya Anda punya data pembanding sebelum benar-benar pindah.

Langkah Status
Buat akun CaptchaAI
Petakan semua panggilan EndCaptcha ke ekuivalen CaptchaAI
Ganti autentikasi (username/password → API key)
Perbarui submit endpoint (/Captcha/Upload/in.php)
Perbarui polling endpoint (/Captcha/GetText/res.php)
Perbarui parsing respons
Jalankan uji paralel dengan kedua provider
Ganti traffic produksi
Hapus kredensial EndCaptcha

Uji paralel dulu sebelum ganti trafik produksi

Jangan langsung mematikan EndCaptcha begitu kode baru jadi. Jalankan kedua layanan berdampingan pada sebagian kecil trafik, lalu bandingkan tingkat keberhasilan dan waktu penyelesaian per tipe — ini menangkap perbedaan halus seperti field respons atau timeout yang perlu disetel ulang. Setelah data stabil beberapa hari, pindahkan sisa trafik dan hapus kredensial lama.

Mengatasi masalah umum

Masalah Penyebab Solusi
ERROR_KEY_DOES_NOT_EXIST Menggunakan username EndCaptcha alih-alih API key Gunakan API key CaptchaAI dari dashboard
Parsing respons gagal Struktur JSON berbeda Perbarui untuk memeriksa field status dan request
Parameter method tidak ada EndCaptcha menggunakan penomoran captchaType Petakan ke nama method CaptchaAI (base64, userrecaptcha, dll.)
Timeout pada reCAPTCHA Default timeout berbeda Set polling ke 60 iterasi × 5 detik untuk token CAPTCHA

Pertanyaan umum

Berapa lama proses migrasi dari EndCaptcha biasanya?

Untuk integrasi standar, sebagian besar pekerjaan adalah cari-ganti endpoint dan parameter plus memperbarui parsing respons — sering selesai dalam satu sore. Yang memakan waktu biasanya fase uji paralel, bukan penulisan kode.

Apakah CaptchaAI mendukung semua tipe CAPTCHA yang saya pakai di EndCaptcha?

Tergantung tipenya. reCAPTCHA v2/v3, Cloudflare Turnstile dan Challenge, GeeTest v3, image/OCR, grid, dan BLS didukung penuh; CaptchaFox, Friendly Captcha, dan Lemin masih beta. Tapi hCaptcha dan FunCaptcha belum didukung dan GeeTest v4 masih segera hadir — siapkan alternatif untuk tipe itu.

Perlukah menjalankan kedua layanan secara paralel dulu?

Sangat disarankan. Uji paralel pada sebagian trafik memberi perbandingan tingkat keberhasilan dan waktu penyelesaian, sehingga penggantian trafik produksi berbasis data, bukan tebakan.

Bagaimana model penagihan CaptchaAI berbeda dari layanan per-solve?

CaptchaAI menagih per thread konkuren, bukan per solve; setiap paket mencakup solve tak terbatas per thread selama sebulan. Paket mulai dari BASIC ($15/bulan, 5 thread), jadi biaya ditentukan jumlah permintaan bersamaan.

Artikel terkait

Langkah selanjutnya

Sederhanakan solve CAPTCHA Anda dengan REST API CaptchaAI — ambil API key Anda dan mulai migrasi hari ini.

Komentar dinonaktifkan untuk artikel ini.