Solve GeeTest v3 lewat API CaptchaAI intinya empat langkah: ambil gt dan challenge dari halaman, kirim ke in.php, polling di res.php, lalu suntikkan solusinya ke form. Yang bikin tim automation dan scraping di Indonesia stuck bukan API call-nya — polanya mirip reCAPTCHA — tapi ekstraksi parameter di awal, karena GeeTest v3 tidak sesederhana kirim sitekey dan pageurl.
Panduan ini membahas keempat langkah itu secara berurutan, dari ekstraksi parameter sampai kirim solusi ke form situs, plus troubleshooting untuk error yang paling sering muncul.
Alur Singkat
- Ekstrak
gtdanchallengedari halaman target (tiga cara — pilih yang paling cocok dengan stack Anda) - Submit ke
in.phpdenganmethod=geetest - Polling
res.phpsetiap 5 detik sampai dapatchallenge,validate,seccode - Kirim ketiga nilai itu ke endpoint verifikasi situs target
Yang Anda Butuhkan Sebelum Mulai
Siapkan lima hal ini dulu sebelum masuk ke Langkah 1:
- API key CaptchaAI — ambil di captchaai.com
- Nilai
gtGeeTest — ID statis, sama untuk tiap request di situs yang sama - Nilai
challengeGeeTest — berubah setiap sesi, sekali pakai - URL halaman target — halaman tempat challenge GeeTest muncul
- Environment — Python 3.7+ atau Node.js 14+
Langkah 1: Ambil Parameter gt dan challenge dari Halaman
GeeTest v3 butuh tiga parameter sebelum task disubmit. gt statis — sama di tiap request pada situs yang sama — sedangkan challenge berubah tiap sesi dan sekali pakai. Tiga cara mengambilnya:
Cara 1: Tab Network di DevTools
- Buka DevTools → tab Network
- Filter permintaan dengan
register-slide,gettype.php, atauget.php - Picu captcha-nya, lalu cari request inisialisasi
- Responsnya berisi
gt,challenge, dan kadangapi_server
{
"success": 1,
"gt": "019924a82c70bb123aae90d483087f94",
"challenge": "12345678abc90def12345678abc90def",
"new_captcha": true
}
Cara 2: Cek Page Source
// Search page source for initGeetest or gt value
document.querySelectorAll('script').forEach(s => {
if (s.textContent.includes('initGeetest')) {
console.log(s.textContent);
}
});
Cara 3: Endpoint API Situs
Banyak situs mengambil parameter GeeTest dari endpoint API mereka sendiri sebelum form dirender:
# The site's registration endpoint
params_response = requests.get("https://example.com/api/captcha/register")
data = params_response.json()
gt = data["gt"]
challenge = data["challenge"]
Langkah 2: Kirim Task ke CaptchaAI
Setelah gt dan challenge di tangan, submit ke in.php dengan method geetest. Parameter api_server opsional — isi kalau situs menunjuk server tertentu (api.geetest.com, api-na.geetest.com), atau biarkan kosong dan CaptchaAI akan pakai default.
Python
import requests
import time
API_KEY = "YOUR_API_KEY"
response = requests.get("https://ocr.captchaai.com/in.php", params={
"key": API_KEY,
"method": "geetest",
"gt": "019924a82c70bb123aae90d483087f94",
"challenge": "12345678abc90def12345678abc90def",
"api_server": "api.geetest.com", # Optional, use if site specifies
"pageurl": "https://staging.example.com/qa-login",
"json": 1
})
data = response.json()
if data.get("status") != 1:
raise Exception(f"Submit error: {data.get('request')}")
task_id = data["request"]
print(f"Task submitted: {task_id}")
Node.js
const axios = require('axios');
const API_KEY = 'YOUR_API_KEY';
async function submitGeeTest(gt, challenge, pageurl) {
const { data } = await axios.get('https://ocr.captchaai.com/in.php', {
params: {
key: API_KEY,
method: 'geetest',
gt,
challenge,
api_server: 'api.geetest.com',
pageurl,
json: 1
}
});
if (data.status !== 1) throw new Error(`Submit error: ${data.request}`);
return data.request;
}
Langkah 3: Polling Hasil Solve
Solusi GeeTest berisi tiga nilai: challenge, validate, seccode. Polling tiap 5 detik sampai 30 kali percobaan cukup — solve GeeTest v3 di CaptchaAI biasanya selesai di bawah 12 detik, baik untuk slide puzzle maupun challenge ikon.
Kalau server automation Anda deploy di region AWS
ap-southeast-1(Singapura) atau GCPasia-southeast2(Jakarta), latency ke endpoint CaptchaAI biasanya stabil, jadi interval 5 detik di bawah ini tidak perlu diperpanjang.
Python
def get_geetest_solution(task_id):
for attempt in range(30):
time.sleep(5)
result = requests.get("https://ocr.captchaai.com/res.php", params={
"key": API_KEY,
"action": "get",
"id": task_id,
"json": 1
}).json()
if result.get("status") == 1:
return result["request"]
if result.get("request") != "CAPCHA_NOT_READY":
raise Exception(f"Error: {result.get('request')}")
raise Exception("Timeout")
solution = get_geetest_solution(task_id)
# solution = {
# "geetest_challenge": "12345678abc90def12345678abc90def1a",
# "geetest_validate": "abcdef1234567890abcdef1234567890",
# "geetest_seccode": "abcdef1234567890abcdef1234567890|jordan"
# }
Node.js
async function getGeeTestSolution(taskId) {
for (let i = 0; i < 30; i++) {
await new Promise(r => setTimeout(r, 5000));
const { data } = await axios.get('https://ocr.captchaai.com/res.php', {
params: { key: API_KEY, action: 'get', id: taskId, json: 1 }
});
if (data.status === 1) return data.request;
if (data.request !== 'CAPCHA_NOT_READY') throw new Error(data.request);
}
throw new Error('Timeout');
}
Langkah 4: Kirim Solusi ke Endpoint Verifikasi Situs
Kirim ketiga nilai solusi ke endpoint verifikasi situs — biasanya bagian dari request login yang sama:
# Submit the GeeTest solution with the form data
verify_response = requests.post("https://example.com/api/login", data={
"username": "user@example.com",
"password": "password123",
"geetest_challenge": solution["geetest_challenge"],
"geetest_validate": solution["geetest_validate"],
"geetest_seccode": solution["geetest_seccode"]
})
print(f"Login status: {verify_response.status_code}")
Sedang scraping data publik (harga, listing, jadwal)? UU PDP (UU 27/2022) dan UU ITE tetap berlaku — pastikan Anda hanya mengumpulkan data yang berwenang Anda proses, bukan data pribadi di balik login milik orang lain.
Kalau Solve Gagal: Troubleshooting Umum
ERROR_BAD_PARAMETERS—gtatauchallengetidak dikirim. Keduanya wajib; pastikan sudah diekstrak dari halaman sebelum submit.ERROR_CAPTCHA_UNSOLVABLE— challenge sudah kedaluwarsa atau tidak valid. Ambil ulang challenge baru dari situs sebelum retry.- Solusi ditolak situs target — nilai challenge sudah basi (dipakai sebelumnya). Challenge sekali pakai; ambil yang baru untuk tiap percobaan.
geetest_validatekosong — proses solve gagal di sisi internal. Retry dengan challenge yang baru.
Contoh Lengkap: Alur GeeTest v3 di Python
Semua potongan di atas digabung jadi satu skrip, dari ekstraksi parameter sampai submit solusi ke situs:
import requests
import time
API_KEY = "YOUR_API_KEY"
SITE_URL = "https://staging.example.com/qa-login"
# 1. Get GeeTest parameters from the site
params = requests.get("https://example.com/api/captcha/register").json()
# 2. Submit to CaptchaAI
submit = requests.get("https://ocr.captchaai.com/in.php", params={
"key": API_KEY,
"method": "geetest",
"gt": params["gt"],
"challenge": params["challenge"],
"pageurl": SITE_URL,
"json": 1
}).json()
task_id = submit["request"]
# 3. Poll for solution
for _ in range(30):
time.sleep(5)
result = requests.get("https://ocr.captchaai.com/res.php", params={
"key": API_KEY, "action": "get", "id": task_id, "json": 1
}).json()
if result.get("status") == 1:
solution = result["request"]
break
# 4. Submit to site
login = requests.post(SITE_URL, data={
"username": "user@example.com",
"password": "pass",
"geetest_challenge": solution["geetest_challenge"],
"geetest_validate": solution["geetest_validate"],
"geetest_seccode": solution["geetest_seccode"]
})
print(f"Result: {login.status_code}")
Contoh Proyek Lengkap yang Bisa Langsung Dijalankan
Butuh proyek kerja penuh, bukan cuma potongan kode? Repo contohnya sudah mencakup:
- Setup environment dan dependency, siap jalan
- Helper polling dengan retry dan backoff
- Error handling untuk kasus timeout dan challenge basi
Lihat proyek lengkapnya di GitHub →
Pertanyaan yang Sering Ditanyakan
Berapa biaya solve GeeTest v3 lewat API CaptchaAI?
CaptchaAI pakai harga berbasis thread, bukan per solve — tidak ada biaya tambahan khusus GeeTest v3 di luar plan bulanan Anda. Plan BASIC ($15/bulan, 5 thread) sudah termasuk solve tak terbatas per thread, cocok untuk tim automation atau scraping skala kecil-menengah yang baru mulai. Kalau volumenya sudah tinggi, plan ADVANCE ($90/bulan, 50 thread) biasanya jadi titik masuk berikutnya.
Kenapa parameter challenge harus diambil ulang setiap kali mau solve?
Nilai challenge sekali pakai. Begitu terpakai — solve berhasil atau kedaluwarsa — backend situs menolaknya kalau dipakai lagi. Selalu ambil challenge baru sebelum tiap percobaan.
Apakah GeeTest v3 lebih rumit diotomatisasi dibanding reCAPTCHA v2?
Sedikit lebih rumit di awal — reCAPTCHA v2 cuma butuh sitekey dan pageurl, GeeTest v3 mengharuskan ekstrak gt dan challenge dulu. Setelahnya, alur submit-polling ke CaptchaAI sama saja, jadi tambahan kerjanya cuma di tahap ekstraksi.
Apakah metode di panduan ini juga berlaku untuk GeeTest v4?
Tidak. GeeTest v4 memakai protokol berbeda dari v3, jadi langkah-langkah ini tidak berlaku untuknya. CaptchaAI mencantumkan status GeeTest v4 sebagai segera hadir, bukan versi yang sudah bisa diproses sekarang.
Apakah error ERROR_CAPTCHA_UNSOLVABLE bisa ditangani otomatis dengan retry?
Bisa, asal ambil challenge baru sebelum retry. Error ini hampir selalu berarti challenge kedaluwarsa, bukan API key salah — retry dengan challenge lama gagal terus. Tambahkan logic re-ekstraksi sebelum tiap percobaan ulang, bukan sekadar mengulang request yang sama.
Ringkasan
Empat langkah di atas berlaku untuk semua tipe challenge GeeTest v3 — slide, klik ikon, atau pencocokan kata:
- Ambil
gtdanchallengedari halaman (DevTools, page source, atau endpoint situs) - Submit ke
in.phpdenganmethod=geetest - Polling
res.phpsampai dapatchallenge,validate,seccode - Kirim ketiganya ke endpoint verifikasi situs
Kalau macet di salah satu langkah, cek bagian troubleshooting di atas dulu sebelum mengubah kode.