Kalau integrasi GeeTest v3 Anda gagal padahal gt dan pageurl sudah benar, curigai satu hal lebih dulu: nilai challenge yang basi. Ini akar dari sebagian besar kegagalan GeeTest yang dilaporkan tim automation — bukan bug di API CaptchaAI, melainkan challenge yang ditangkap sekali lalu dipakai ulang di beberapa request solve.
Dokumentasi resmi GeeTest v3 CaptchaAI tegas soal ini: setiap request solve butuh nilai challenge baru. Begitu widget GeeTest dimuat ulang di halaman, challenge lama otomatis tidak valid — jadi request Anda bisa gagal meski parameter lain terlihat sudah tepat.
Panduan ini memetakan tiga kelompok kegagalan GeeTest v3 — submit ke in.php, polling res.php, dan validasi di halaman target — lengkap dengan perbaikan konkret untuk masing-masing.
Tabel Referensi Cepat: Error GeeTest v3 dan Solusinya
Cari error Anda di tabel ini dulu, lalu lompat ke bagian detail untuk penjelasan lengkap.
| Error / Gejala | Tahap | Kemungkinan Penyebab | Solusi Cepat |
|---|---|---|---|
ERROR_WRONG_USER_KEY |
Submit | API key salah format | Verifikasi key 32 karakter |
ERROR_KEY_DOES_NOT_EXIST |
Submit | Key tidak valid | Periksa dashboard |
ERROR_ZERO_BALANCE |
Submit | Tidak ada thread kosong | Tunggu atau upgrade paket |
ERROR_PAGEURL |
Submit | pageurl tidak ada |
Tambahkan URL halaman lengkap |
ERROR_BAD_PARAMETERS |
Submit | gt, challenge, atau pageurl tidak ada |
Verifikasi semua field wajib |
CAPCHA_NOT_READY |
Polling | Solve masih berjalan | Tunggu 5 detik, polling lagi |
ERROR_WRONG_ID_FORMAT |
Polling | ID captcha non-numerik | Gunakan ID persis dari in.php |
ERROR_WRONG_CAPTCHA_ID |
Polling | ID captcha tidak valid | Verifikasi ID submit |
ERROR_EMPTY_ACTION |
Polling | action=get tidak ada |
Tambahkan parameter action |
ERROR_CAPTCHA_UNSOLVABLE |
Polling | Challenge basi atau varian tidak didukung | Refresh challenge, coba lagi |
| API sukses tapi halaman menolak | Validasi | Challenge basi, field salah, atau URL salah | Refresh challenge, cocokkan pemetaan field |
Kalau error Anda tidak ada di tabel ini, atau solusi cepatnya belum menyelesaikan masalah, lanjut ke akar masalah paling umum di bawah.
Akar Masalah Nomor Satu: Challenge GeeTest v3 yang Basi
Kalau ada satu hal yang perlu Anda periksa lebih dulu sebelum menelusuri tabel di atas, itu adalah kesegaran challenge.
GeeTest v3 memerlukan dua parameter utama:
gt— sitekey publik (statis, tidak berubah)challenge— kunci challenge dinamis (berubah setiap page load)
Kenapa Ini Terjadi
Nilai challenge dihasilkan saat widget GeeTest diinisialisasi di halaman. Kalau Anda menangkapnya sekali lalu memakainya ulang di beberapa request solve, setiap request setelah yang pertama akan:
- ditolak API CaptchaAI saat submit, atau
- menghasilkan nilai yang ditolak halaman target karena challenge sudah kedaluwarsa
Cara Memastikan Challenge Selalu Fresh
Sebelum setiap request solve, periksa network request halaman untuk menemukan API call yang mengembalikan challenge baru. Replay request itu untuk mendapatkan nilai baru, lalu langsung kirim ke CaptchaAI — jangan ditunda.
# Pseudocode: fetch a fresh challenge before each solve
import requests
def get_fresh_challenge(target_url):
"""Hit the GeeTest init endpoint to get a new challenge."""
resp = requests.get(f"{target_url}/geetest/register", timeout=10)
data = resp.json()
return data["challenge"], data["gt"]
challenge, gt = get_fresh_challenge("https://example.com")
# Now submit to CaptchaAI immediately — do not delay
Aturan praktis: Kalau jeda antara menangkap
challengedan mengirim request solve lebih dari beberapa detik, ambil ulang dulu.
Skenario yang sering terjadi: tim QA di agensi price-monitoring Jakarta menjalankan job scraping terjadwal dari worker di region ap-southeast-3, lalu heran kenapa GeeTest v3 tiba-tiba menolak separuh task setelah retry otomatis jalan. Setelah ditelusuri, penyebabnya sederhana — retry logic mereka menyimpan challenge dari percobaan pertama dan memakainya ulang di percobaan kedua, alih-alih mengambil challenge baru setiap kali retry. Begitu retry logic diperbaiki agar selalu memanggil ulang endpoint geetest/register sebelum tiap percobaan, ERROR_CAPTCHA_UNSOLVABLE langsung hilang dari log.
Error GeeTest v3 Saat Submit ke in.php
Kegagalan ini muncul saat Anda mengirim task ke https://ocr.captchaai.com/in.php.
ERROR_WRONG_USER_KEY
Penyebab: Format API key salah — seharusnya 32 karakter. Solusi: Verifikasi key Anda di captchaai.com/api.php. Jangan tambahkan karakter atau spasi ekstra.
ERROR_KEY_DOES_NOT_EXIST
Penyebab: Format API key sudah benar, tapi tidak cocok dengan akun aktif mana pun. Solusi: Login ke dashboard CaptchaAI dan pastikan key Anda masih aktif.
ERROR_ZERO_BALANCE
Penyebab: Tidak ada thread kosong di paket Anda saat ini. Solusi: Tunggu thread kosong, kurangi concurrency, atau upgrade paket.
ERROR_PAGEURL
Penyebab: Parameter pageurl tidak disertakan dalam request. Solusi: Tambahkan URL lengkap halaman tempat widget GeeTest dimuat. Contoh:
pageurl=https://staging.example.com/qa-login
ERROR_BAD_PARAMETERS
Penyebab: Satu atau beberapa field wajib tidak ada atau salah format. Untuk GeeTest, parameter yang diperlukan:
| Parameter | Tipe | Wajib | Deskripsi |
|---|---|---|---|
key |
String | Ya | API key CaptchaAI Anda |
method |
String | Ya | Harus geetest |
gt |
String | Ya | Sitekey publik statis |
challenge |
String | Ya | Kunci challenge dinamis (harus fresh) |
pageurl |
String | Ya | URL halaman lengkap |
Solusi: Periksa apakah gt, challenge, dan pageurl semuanya ada dan diformat dengan benar.
Respons HTML atau 500/502
Penyebab: Error sementara di sisi server — bukan masalah parameter. Solusi: Tunggu 5–10 detik, lalu coba lagi request tersebut.
Error GeeTest v3 Saat Polling res.php
Kegagalan ini muncul saat Anda polling https://ocr.captchaai.com/res.php.
CAPCHA_NOT_READY
Ini bukan error. Artinya captcha masih dalam proses solve — solve GeeTest v3 di CaptchaAI biasanya membutuhkan waktu di bawah 12 detik dengan tingkat keberhasilan tinggi pada tipe yang didukung. Solusi: tunggu 5 detik, lalu polling lagi; jangan anggap ini sebagai kegagalan.
ERROR_WRONG_ID_FORMAT
Penyebab: Format ID captcha salah — ID harus berupa angka saja. Solusi: Pastikan Anda memakai ID persis yang dikembalikan in.php, tanpa modifikasi.
ERROR_WRONG_CAPTCHA_ID
Penyebab: ID tidak cocok dengan task yang disubmit. Solusi: Periksa apakah Anda memakai ID yang benar dari respons submit. Kalau Anda mengirim beberapa task sekaligus, pastikan Anda melacak task yang tepat.
ERROR_EMPTY_ACTION
Penyebab: Parameter action tidak ada atau kosong di request polling Anda. Solusi: Sertakan action=get di setiap request polling:
https://ocr.captchaai.com/res.php?key=YOUR_KEY&action=get&id=CAPTCHA_ID
ERROR_CAPTCHA_UNSOLVABLE
Penyebab: Challenge tidak bisa di-solve — biasanya karena nilai challenge basi atau varian GeeTest yang tidak didukung. Solusi: Ambil ulang nilai challenge, lalu coba lagi.
ERROR_INTERNAL_SERVER_ERROR
Penyebab: Masalah di sisi server CaptchaAI. Solusi: Tunggu 10 detik, lalu coba lagi.
Kenapa Halaman Target Menolak Hasil GeeTest v3 yang Valid
Ini kegagalan paling sulit di-debug, karena API CaptchaAI sudah mengembalikan hasil yang valid, tapi halaman target tetap menolaknya.
Saat GeeTest v3 berhasil di-solve, API mengembalikan tiga nilai:
{
"challenge": "1a2b3456cd67890e12345fab678901c2de",
"validate": "09fe8d7c6ba54f32e1dcb0a9fedc8765",
"seccode": "12fe3d4c56789ba01f2e345d6789c012|jordan"
}
Ketiganya harus disubmit ke halaman target sebagai:
| Field respons API | Field halaman target |
|---|---|
challenge |
geetest_challenge |
validate |
geetest_validate |
seccode |
geetest_seccode |
Penyebab 1: Pemetaan Field Salah
Gejala: API mengembalikan nilai, tapi halaman target langsung menolaknya — penyebabnya, nilai yang dikembalikan dimasukkan ke field yang salah atau path request yang salah.
Solusi: Periksa network traffic dari solve GeeTest manual di halaman target. Temukan POST request yang mengirim hasil GeeTest, lalu cocokkan nama field Anda persis.
Penyebab 2: Challenge Basi di Upstream
Gejala: API mengembalikan nilai, tapi halaman menyatakan challenge sudah kedaluwarsa atau tidak valid — biasanya karena nilai challenge diambil terlalu awal atau dipakai ulang.
Solusi: Ambil challenge baru tepat sebelum setiap request solve. Jangan cache atau pakai ulang.
Penyebab 3: Konteks Halaman Salah
Gejala: Validasi tetap gagal meski inputnya sudah baru — pageurl yang dikirim ke CaptchaAI tidak cocok dengan halaman sebenarnya tempat widget GeeTest dimuat.
Solusi: Gunakan URL yang tepat, termasuk protokol dan path. Kalau widget dimuat via AJAX di route berbeda, gunakan URL route tersebut.
Penyebab 4: Struktur Request Tidak Cocok
Gejala: Field sudah benar, tapi format request salah — halaman target mengharapkan field GeeTest dalam content type tertentu (misalnya JSON body vs. form-encoded) atau bersama field form lain.
Solusi: Bandingkan request submit Anda dengan network traffic dari solve manual. Cocokkan content type, urutan field, dan field tambahan lainnya.
Diagnosis Cepat: 3 Hal yang Perlu Anda Pastikan Dulu
Sebelum menelusuri kode error satu per satu, cek tiga hal ini — kombinasinya menyelesaikan sebagian besar kasus GeeTest v3 tanpa perlu debugging panjang:
- Challenge diambil ulang setiap percobaan — bukan dari cache, variabel global, atau hasil retry sebelumnya.
pageurlcocok persis dengan halaman tempat widget GeeTest benar-benar dimuat, termasuk protokol dan path — bukan domain root atau halaman redirect.- Field respons dipetakan ke nama yang tepat di sisi halaman target:
challengemenjadigeetest_challenge,validatemenjadigeetest_validate,seccodemenjadigeetest_seccode.
Kalau ketiganya sudah benar dan error masih muncul, kembali ke tabel referensi cepat di atas untuk kode error yang spesifik.
Contoh Python: Solve GeeTest v3 dengan Challenge Baru
Contoh berikut menyatukan pengambilan challenge baru dan pola submit-polling menjadi satu fungsi siap pakai.
import time
import requests
API_KEY = "YOUR_CAPTCHAAI_API_KEY"
SUBMIT_URL = "https://ocr.captchaai.com/in.php"
RESULT_URL = "https://ocr.captchaai.com/res.php"
def get_fresh_challenge(target_url):
"""Fetch a fresh GeeTest challenge from the target page."""
resp = requests.get(f"{target_url}/api/geetest/register", timeout=10)
data = resp.json()
return data["gt"], data["challenge"]
def solve_geetest_v3(api_key, gt, challenge, pageurl):
"""Submit a GeeTest v3 challenge and return the validation package."""
# Submit
submit_resp = requests.post(
SUBMIT_URL,
data={
"key": api_key,
"method": "geetest",
"gt": gt,
"challenge": challenge,
"pageurl": pageurl,
"json": 1,
},
timeout=30,
)
submit_resp.raise_for_status()
submit_data = submit_resp.json()
if submit_data.get("status") != 1:
raise RuntimeError(f"Submit failed: {submit_data}")
captcha_id = submit_data["request"]
print(f"Task created — captcha ID: {captcha_id}")
# Wait before first poll
time.sleep(15)
# Poll for result
for _ in range(60):
result_resp = requests.get(
RESULT_URL,
params={
"key": api_key,
"action": "get",
"id": captcha_id,
"json": 1,
},
timeout=30,
)
result_resp.raise_for_status()
result_data = result_resp.json()
if result_data.get("request") == "CAPCHA_NOT_READY":
time.sleep(5)
continue
if result_data.get("status") == 1:
return result_data["request"]
raise RuntimeError(f"Polling error: {result_data}")
raise TimeoutError("GeeTest v3 solve timed out")
# Usage: always fetch a fresh challenge first
PAGE_URL = "https://staging.example.com/qa-login"
gt, challenge = get_fresh_challenge(PAGE_URL)
result = solve_geetest_v3(API_KEY, gt, challenge, PAGE_URL)
print(f"Result: {result}")
# The result contains: challenge, validate, seccode
# Map them to: geetest_challenge, geetest_validate, geetest_seccode
Contoh Node.js: Solve GeeTest v3 dengan Challenge Baru
Struktur logikanya identik dengan versi Python — ambil challenge baru, submit, lalu polling sampai status siap.
const API_KEY = "YOUR_CAPTCHAAI_API_KEY";
const SUBMIT_URL = "https://ocr.captchaai.com/in.php";
const RESULT_URL = "https://ocr.captchaai.com/res.php";
function sleep(ms) {
return new Promise((resolve) => setTimeout(resolve, ms));
}
async function getFreshChallenge(targetUrl) {
const resp = await fetch(`${targetUrl}/api/geetest/register`);
const data = await resp.json();
return { gt: data.gt, challenge: data.challenge };
}
async function solveGeetestV3(apiKey, gt, challenge, pageurl) {
// Submit
const submitResp = await fetch(SUBMIT_URL, {
method: "POST",
headers: { "Content-Type": "application/x-www-form-urlencoded" },
body: new URLSearchParams({
key: apiKey,
method: "geetest",
gt: gt,
challenge: challenge,
pageurl: pageurl,
json: "1",
}),
});
const submitData = await submitResp.json();
if (submitData.status !== 1) {
throw new Error(`Submit failed: ${JSON.stringify(submitData)}`);
}
const captchaId = submitData.request;
console.log(`Task created — captcha ID: ${captchaId}`);
await sleep(15_000);
// Poll for result
for (let i = 0; i < 60; i++) {
const resultResp = await fetch(
`${RESULT_URL}?${new URLSearchParams({
key: apiKey,
action: "get",
id: captchaId,
json: "1",
})}`
);
const resultData = await resultResp.json();
if (resultData.request === "CAPCHA_NOT_READY") {
await sleep(5_000);
continue;
}
if (resultData.status === 1) {
return resultData.request;
}
throw new Error(`Polling error: ${JSON.stringify(resultData)}`);
}
throw new Error("GeeTest v3 solve timed out");
}
// Usage
const PAGE_URL = "https://staging.example.com/qa-login";
(async () => {
const { gt, challenge } = await getFreshChallenge(PAGE_URL);
const result = await solveGeetestV3(API_KEY, gt, challenge, PAGE_URL);
console.log("Result:", result);
// Map result fields to: geetest_challenge, geetest_validate, geetest_seccode
})();
Pertanyaan Umum
Berapa thread CaptchaAI yang saya perlukan untuk debug GeeTest v3 secara paralel?
Satu thread menangani satu tantangan GeeTest v3 yang sedang berjalan. Untuk sesi debugging dan pengujian rutin, paket BASIC ($15/bulan, 5 thread) biasanya cukup — Anda bisa menjalankan beberapa percobaan solve sekaligus tanpa antre. Kalau volume pengujian naik atau Anda menjalankan beberapa worker paralel dari region berbeda (misalnya ap-southeast-1 dan ap-southeast-3), pertimbangkan STANDARD ($30/bulan, 15 thread) atau ADVANCE ($90/bulan, 50 thread).
Apa itu CAPCHA_NOT_READY dan haruskah saya khawatir?
Tidak. CAPCHA_NOT_READY bukan error — artinya solve GeeTest v3 masih diproses. Tunggu 5 detik, lalu polling res.php lagi. Solve GeeTest v3 di CaptchaAI biasanya membutuhkan waktu di bawah 12 detik dengan tingkat keberhasilan tinggi pada tipe yang didukung.
Apakah aman melakukan retry otomatis saat error GeeTest v3 muncul?
Ya, retry dengan jeda (backoff) adalah praktik normal untuk error sementara seperti respons HTML/500/502 atau ERROR_INTERNAL_SERVER_ERROR. Yang tidak boleh Anda lakukan adalah retry dengan challenge lama — itu penyebab paling umum kegagalan berulang. Selalu ambil challenge baru setiap kali Anda mengulang request solve, bukan hanya di percobaan pertama.
Bagaimana status GeeTest v4 di CaptchaAI?
Belum. Artikel ini membahas GeeTest v3, yang didukung penuh. Dukungan GeeTest v4 berstatus segera hadir — cek dokumentasi API CaptchaAI untuk daftar tipe CAPTCHA terbaru yang sudah didukung.
Bagaimana cara memastikan fix challenge basi sudah benar-benar berhasil sebelum deploy ke produksi?
Jalankan minimal 10–20 percobaan solve berturut-turut di lingkungan staging dengan retry logic yang sudah diperbaiki, lalu periksa apakah semuanya mengambil challenge baru dan bukan hasil cache. Kalau tidak ada lagi ERROR_CAPTCHA_UNSOLVABLE atau penolakan di halaman target selama percobaan itu, fix Anda aman untuk di-deploy.
Checklist Perbaikan GeeTest v3 Anda
Kalau integrasi GeeTest v3 Anda masih gagal, telusuri urutan ini:
- Cek kesegaran challenge — Apakah diambil segera sebelum solve, bukan dari cache atau percobaan sebelumnya?
- Verifikasi parameter —
gt,challenge, danpageurlsemuanya benar dan lengkap? - Cocokkan pemetaan field —
challenge,validate,seccodedari respons masuk kegeetest_challenge,geetest_validate,geetest_seccodeyang tepat? - Bandingkan dengan solve manual — Tangkap struktur request persis dari solve GeeTest manual yang berhasil lewat DevTools browser.
Kalau alur ini bagian dari pekerjaan scraping, batasi diri pada data yang memang berhak Anda proses — sejalan dengan UU Pelindungan Data Pribadi (UU 27/2022).
Mulai dari GeeTest v3 Solver CaptchaAI, cocokkan parameter Anda dengan dokumentasi API, lalu ikuti panduan lengkap solve GeeTest v3 dengan API untuk implementasi dari nol. Kalau alur Anda juga menangani reCAPTCHA v2, baca panduan solve reCAPTCHA v2 lewat API.