Migrasi NextCaptcha ke CaptchaAI cuma soal menukar format request (JSON → form-encoded) dan cara baca respons (errorId/status → status/request). Logika solver Anda tidak perlu ditulis ulang.
Alurnya tetap sama seperti kebanyakan solver: kirim task → simpan task ID → polling → pakai token. Yang berubah cuma endpoint, parameter, dan struktur respons — setelah tabel pemetaan di bawah, sisanya cari-ganti.
Perbedaan arsitektur API NextCaptcha vs CaptchaAI
NextCaptcha memakai endpoint JSON /createTask dan /getTaskResult; CaptchaAI memakai format in.php/res.php yang lebih umum di industri solver.
| Aksi | NextCaptcha | CaptchaAI |
|---|---|---|
| Submit task | POST /createTask |
POST https://ocr.captchaai.com/in.php |
| Ambil hasil | POST /getTaskResult |
GET https://ocr.captchaai.com/res.php |
| Cek saldo | POST /getBalance |
GET res.php?action=getbalance&key=KEY |
Body JSON bertingkat vs parameter form datar
NextCaptcha membungkus data dalam objek JSON dengan task sebagai sub-objek:
{
"clientKey": "next_captcha_key",
"task": {
"type": "RecaptchaV2TaskProxyless",
"websiteURL": "https://example.com",
"websiteKey": "6Le-wvkSAAAAAPBMRTvw0Q4Muexq9bi0DJwx_mJ-"
}
}
CaptchaAI meratakannya jadi parameter form di satu baris, tanpa nesting:
POST https://ocr.captchaai.com/in.php
key=YOUR_API_KEY&method=userrecaptcha&googlekey=6Le-wvkSAAAAAPBMRTvw0Q4Muexq9bi0DJwx_mJ-&pageurl=https://example.com&json=1
Kenapa tim otomatisasi Indonesia mempertimbangkan pindah
Banyak pengembang scraping Indonesia — freelancer maupun agensi price-monitoring bermargin tipis — menganggap body JSON bertingkat NextCaptcha bikin satu task lebih ribet dari perlunya. CaptchaAI menagih per thread konkuren, bukan per solve: BASIC ($15/bulan, 5 thread) sudah mencakup solve tak terbatas per thread, naik sampai VIP-3 ($7,500/bulan, 5.000 thread).
Untuk latency, deploy worker dekat AWS ap-southeast-3 (Jakarta) atau ap-southeast-1 (Singapura).
Pemetaan parameter NextCaptcha ke CaptchaAI
Field bertingkat NextCaptcha menjadi parameter form datar:
| Field NextCaptcha | Field CaptchaAI | Catatan |
|---|---|---|
clientKey |
key |
API key |
task.type |
method |
Lihat tabel tipe task |
task.websiteURL |
pageurl |
URL halaman target |
task.websiteKey |
googlekey atau sitekey |
Sitekey CAPTCHA |
task.recaptchaDataSValue |
data-s |
Parameter data-s reCAPTCHA |
task.isInvisible |
invisible=1 |
Flag reCAPTCHA invisible |
task.pageAction |
action |
Aksi reCAPTCHA v3 |
taskId |
id |
Task ID untuk polling |
Pemetaan tipe task
| Tipe task NextCaptcha | Method CaptchaAI + parameter |
|---|---|
RecaptchaV2TaskProxyless |
method=userrecaptcha |
RecaptchaV2Task |
method=userrecaptcha + proxy, proxytype |
ImageToTextTask |
method=base64 + body |
TurnstileTaskProxyless |
method=turnstile |
HCaptchaTaskProxyless / HCaptchaTask |
Tidak ada padanan — lihat catatan di bawah |
Cek dulu: hCaptcha dan FunCaptcha belum didukung, dan GeeTest v4 masih segera hadir. Kalau task Anda memakai HCaptchaTaskProxyless/HCaptchaTask, siapkan solusi terpisah.
Perbedaan format respons
Respons submit
| Field | NextCaptcha | CaptchaAI |
|---|---|---|
| Cek sukses | errorId === 0 |
status === 1 |
| Task ID | taskId (integer) |
request (string) |
| Pesan error | errorDescription |
request (string kode error) |
Respons polling
| Field | NextCaptcha | CaptchaAI |
|---|---|---|
| Cek siap | status === "ready" |
status === 1 |
| Belum siap | status === "processing" |
request === "CAPCHA_NOT_READY" |
| Solusi | solution.gRecaptchaResponse |
request |
| Error | errorDescription |
request (kode error) |
Migrasi kode: sebelum dan sesudah
Python — sebelum (NextCaptcha)
import requests
import time
CLIENT_KEY = "your_nextcaptcha_key"
BASE_URL = "https://api.nextcaptcha.com"
def solve_recaptcha_v2(sitekey, pageurl):
# Submit
resp = requests.post(f"{BASE_URL}/createTask", json={
"clientKey": CLIENT_KEY,
"task": {
"type": "RecaptchaV2TaskProxyless",
"websiteURL": pageurl,
"websiteKey": sitekey
}
})
data = resp.json()
if data.get("errorId") != 0:
return {"error": data.get("errorDescription")}
task_id = data["taskId"]
# Poll
for _ in range(60):
time.sleep(5)
result = requests.post(f"{BASE_URL}/getTaskResult", json={
"clientKey": CLIENT_KEY,
"taskId": task_id
}).json()
if result.get("status") == "ready":
return {"solution": result["solution"]["gRecaptchaResponse"]}
if result.get("errorId") != 0:
return {"error": result.get("errorDescription")}
return {"error": "TIMEOUT"}
Python — sesudah (CaptchaAI)
import os
import time
import requests
API_KEY = os.environ["CAPTCHAAI_API_KEY"]
def solve_recaptcha_v2(sitekey, pageurl):
# Submit — different endpoint and format
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"]
# Poll — GET instead of POST, different response format
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"}
JavaScript — sebelum (NextCaptcha)
const axios = require("axios");
const CLIENT_KEY = "your_nextcaptcha_key";
const BASE_URL = "https://api.nextcaptcha.com";
async function solveRecaptchaV2(sitekey, pageurl) {
const submit = await axios.post(`${BASE_URL}/createTask`, {
clientKey: CLIENT_KEY,
task: {
type: "RecaptchaV2TaskProxyless",
websiteURL: pageurl,
websiteKey: sitekey,
},
});
if (submit.data.errorId !== 0) return { error: submit.data.errorDescription };
const taskId = submit.data.taskId;
for (let i = 0; i < 60; i++) {
await new Promise((r) => setTimeout(r, 5000));
const poll = await axios.post(`${BASE_URL}/getTaskResult`, {
clientKey: CLIENT_KEY,
taskId,
});
if (poll.data.status === "ready") return { solution: poll.data.solution.gRecaptchaResponse };
if (poll.data.errorId !== 0) return { error: poll.data.errorDescription };
}
return { error: "TIMEOUT" };
}
JavaScript — sesudah (CaptchaAI)
Perubahan sama seperti versi Python di atas.
const axios = require("axios");
const API_KEY = process.env.CAPTCHAAI_API_KEY;
async function solveRecaptchaV2(sitekey, pageurl) {
const submit = await axios.post("https://ocr.captchaai.com/in.php", null, {
params: { key: API_KEY, method: "userrecaptcha", googlekey: sitekey, pageurl, json: 1 },
});
if (submit.data.status !== 1) return { error: submit.data.request };
const captchaId = submit.data.request;
for (let i = 0; i < 60; 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" };
}
Checklist migrasi langkah demi langkah
- Buat akun CaptchaAI dan isi saldo.
- Petakan semua tipe
createTaskke method CaptchaAI. - Ganti
clientKeydengan API key CaptchaAI. - Perbarui submit dari POST JSON body ke POST form-encoded.
- Perbarui polling dari POST ke GET dengan query parameter.
- Perbarui parsing respons (format
status/request). - Jalankan uji perbandingan paralel.
- Alihkan trafik produksi secara bertahap.
Mengatasi masalah umum
| Masalah | Penyebab | Solusi |
|---|---|---|
ERROR_KEY_DOES_NOT_EXIST |
Masih memakai clientKey NextCaptcha |
Ganti dengan API key CaptchaAI dari dashboard |
| Parsing respons berhenti bekerja | Struktur JSON berbeda | Perbarui kode untuk memeriksa field status (integer) dan request |
ERROR_WRONG_USER_KEY |
Format API key salah | Verifikasi format key di dashboard CaptchaAI |
| Tipe task tidak dikenali | Masih memakai nama tipe NextCaptcha | Petakan ke method CaptchaAI (lihat tabel tipe task) |
Pertanyaan umum
Apakah CaptchaAI mendukung semua tipe CAPTCHA yang saya pakai di NextCaptcha?
Tergantung tipenya. reCAPTCHA, Turnstile, GeeTest v3, image/OCR, dan grid didukung penuh, plus CaptchaFox, Friendly Captcha, dan Lemin (beta). hCaptcha dan FunCaptcha belum didukung, GeeTest v4 masih segera hadir.
Task saya di NextCaptcha pakai proxy — bagaimana di CaptchaAI?
NextCaptcha pakai tipe terpisah seperti RecaptchaV2Task. CaptchaAI tambahkan proxy=user:pass@host:port dan proxytype=HTTP ke method yang sama.
Bagaimana model penagihan CaptchaAI dibanding harga per-task NextCaptcha?
Per thread konkuren dengan solve tak terbatas, bukan per task selesai. Paket mulai BASIC ($15/bulan, 5 thread).
Langkah selanjutnya
Ambil API key CaptchaAI Anda dan alihkan integrasi dalam beberapa menit.
Panduan terkait: