GeeTest v3 tidak bisa diselesaikan dengan satu token seperti reCAPTCHA. Prosesnya tiga tahap: backend situs mendaftarkan challenge ke server GeeTest, browser me-render widget dan menangkap solusi pengguna, lalu backend memvalidasi ulang tiga nilai hasilnya ke server GeeTest. Kalau integrasi CaptchaAI Anda gagal di tahap render atau submit, akar masalahnya hampir selalu ada di salah satu dari tiga tahap ini — bukan di API CaptchaAI itu sendiri.
Kenapa GeeTest v3 Perlu Dua Fase Terpisah
GeeTest v3 memisahkan prosesnya jadi dua fase di sisi berbeda — desain ini yang membuat tiap challenge unik per sesi dan sulit diputar ulang (replay):
- Registrasi (server-side). Backend situs memesan challenge baru dari GeeTest sebelum widget tampil ke pengguna.
- Verifikasi (client + server-side). Browser me-render widget dan menangkap solusi pengguna, lalu situs memvalidasi ulang ketiga nilainya ke GeeTest sebelum dianggap sah.
Payload fase registrasi terlihat seperti ini:
Site Backend → GeeTest Server: "Give me a challenge for this user"
GeeTest Server → Site Backend: { gt, challenge, new_captcha }
Site Backend → Browser: Passes gt and challenge to the page
Dan fase verifikasi, setelah widget diselesaikan pengguna:
Browser: Renders slider/puzzle using gt + challenge
User: Solves the challenge
Browser → Site Backend: { geetest_challenge, geetest_validate, geetest_seccode }
Site Backend → GeeTest Server: Verifies the three values
GeeTest Server → Site Backend: { result: "success" }
Online vs Offline: Kapan GeeTest v3 Jatuh ke Mode Fallback
GeeTest punya jalur fallback kalau server GeeTest tidak bisa dihubungi:
- Online (
success: 1) — challenge-response normal dengan server GeeTest; dipakai hampir semua situs produksi. - Offline (
success: 0) — verifikasi lokal yang disederhanakan, hanya aktif saat ada gangguan jaringan ke GeeTest dan jarang jadi target integrasi normal.
Detail Alur GeeTest v3, Langkah demi Langkah
Lima langkah ini, dari permintaan pertama backend sampai form situs menerima hasil solve.
Langkah 1: Backend situs registrasi ke GeeTest
Backend situs memanggil endpoint registrasi GeeTest:
GET https://api.geetest.com/register.php?gt=GT_ID&json_format=1
Respons:
{
"success": 1,
"gt": "81dc9bdb52d04dc20036dbd8313ed055",
"challenge": "a1b2c3d4e5f6g7h8i9j0k1l2m3n4o5p6",
"new_captcha": true
}
gt— GeeTest ID, mengidentifikasi akun GeeTest situs.challenge— token unik untuk sesi ini, hanya berlaku sekali dan dibatasi waktu.new_captcha— penanda format CAPTCHA baru.
Tiap pemuatan halaman meminta challenge baru — jangan simpan atau daur ulang nilai lama.
Langkah 2: Browser render widget GeeTest
Begitu gt dan challenge sampai di halaman, browser menginisialisasi widget:
initGeetest({
gt: "81dc9bdb52d04dc20036dbd8313ed055",
challenge: "a1b2c3d4e5f6g7h8i9j0k1l2m3n4o5p6",
offline: false,
new_captcha: true,
product: "float"
}, function(captchaObj) {
captchaObj.appendTo('#captcha-container');
captchaObj.onSuccess(function() {
var result = captchaObj.getValidate();
// result contains: geetest_challenge, geetest_validate, geetest_seccode
});
});
Callback onSuccess memberi Anda ketiga nilai solusi lewat getValidate() — bukan dari network request terpisah.
Langkah 3: Empat tipe tantangan yang bisa muncul
GeeTest menentukan tipe tantangan berdasarkan konfigurasi situs dan profil risiko pengguna saat itu, jadi satu situs bisa menampilkan tipe berbeda ke pengguna berbeda:
- Slider — tarik potongan puzzle untuk melengkapi gambar.
- Klik ikon — klik ikon tertentu, berurutan sesuai yang ditampilkan.
- Klik kata — klik karakter China dalam urutan yang benar.
- Spasial — challenge penalaran spasial berbasis klik/select.
Tipe slider paling sering muncul di login dan checkout — termasuk banyak platform e-commerce dan travel Asia Tenggara yang memakai GeeTest v3 sebagai lapisan verifikasi tambahan.
Langkah 4: Tiga nilai yang dihasilkan setelah solve
Setelah widget selesai, Anda mendapat tiga nilai yang harus dikirim bersamaan — situs menolak submission kalau salah satu hilang atau tidak cocok:
geetest_challenge— token challenge yang dimodifikasi (asli + 2 karakter tambahan).geetest_validate— hash validasi.geetest_seccode— security code (validate + suffix|jordan).
{
"geetest_challenge": "a1b2c3d4e5f6g7h8i9j0k1l2m3n4o5p6xy",
"geetest_validate": "abc123def456_validate",
"geetest_seccode": "abc123def456_validate|jordan"
}
Langkah 5: Situs validasi ulang ke server GeeTest
Backend situs mengirim tiga nilai tadi ke GeeTest untuk verifikasi akhir:
POST https://api.geetest.com/validate.php
seccode=abc123def456_validate|jordan
&challenge=a1b2c3d4e5f6g7h8i9j0k1l2m3n4o5p6xy
&sdk=geetest-python-3.0.0
GeeTest merespons dengan:
{
"seccode": "abc123def456_validate",
"validate": "abc123def456_validate"
}
Baru setelah respons ini keluar, situs menandai sesi sebagai lolos verifikasi — inilah kenapa nilai kedaluwarsa tetap gagal walau formatnya terlihat benar.
Cara Mengekstrak Parameter gt dan challenge dari Halaman
Untuk solve dengan CaptchaAI, Anda perlu gt dan challenge sebelum request dikirim ke in.php. Tiga cara mengambilnya, urut dari yang paling andal:
Cara 1: Intercept respons registrasi dengan Playwright
Cara paling andal — dengarkan response network saat registrasi GeeTest berjalan, lalu tangkap gt dan challenge langsung dari body JSON-nya:
from playwright.sync_api import sync_playwright
import json
with sync_playwright() as p:
browser = p.chromium.launch()
page = browser.new_page()
geetest_params = {}
def handle_response(response):
if "register" in response.url and "geetest" in response.url:
data = response.json()
geetest_params["gt"] = data.get("gt")
geetest_params["challenge"] = data.get("challenge")
page.on("response", handle_response)
page.goto("https://staging.example.com/qa-login")
# Wait for GeeTest to load
page.wait_for_selector(".geetest_holder")
print(f"gt: {geetest_params.get('gt')}")
print(f"challenge: {geetest_params.get('challenge')}")
Cara 2: Ambil dari atribut data- di DOM
Kalau situs menaruh nilainya di atribut DOM, Anda bisa langsung query elemennya:
gt = page.evaluate("() => document.querySelector('[data-gt]')?.dataset.gt")
challenge = page.evaluate("() => document.querySelector('[data-challenge]')?.dataset.challenge")
Cara 3: Parsing source halaman untuk pemanggilan initGeetest
Kalau kedua cara di atas tidak berhasil, cari langsung di HTML mentah tempat initGeetest dipanggil:
import re
source = page.content()
gt_match = re.search(r"gt['\"]?\s*[:=]\s*['\"]([a-f0-9]{32})['\"]", source)
challenge_match = re.search(r"challenge['\"]?\s*[:=]\s*['\"]([a-f0-9]{32})['\"]", source)
Ketiga cara ini punya urutan prioritas: coba Cara 1 dulu karena paling stabil terhadap perubahan struktur halaman, baru turun ke Cara 2 atau Cara 3 kalau situs tidak mengekspos respons registrasi secara langsung.
Submit dan Polling Solve GeeTest v3 ke CaptchaAI
Alurnya mengikuti pola yang sama di semua solve CaptchaAI:
- Kirim
gtdanchallengekein.php. - Simpan task ID dari respons.
- Polling
res.phpsampai status1. - Pakai ketiga nilai balasan untuk verifikasi situs.
Detailnya, mulai dari submit:
POST https://ocr.captchaai.com/in.php
key=YOUR_API_KEY
&method=geetest
>=81dc9bdb52d04dc20036dbd8313ed055
&challenge=a1b2c3d4e5f6g7h8i9j0k1l2m3n4o5p6
&pageurl=https://staging.example.com/qa-login
&json=1
Polling untuk hasilnya:
GET https://ocr.captchaai.com/res.php?key=YOUR_API_KEY&action=get&id=TASK_ID&json=1
CaptchaAI mengembalikan:
{
"status": 1,
"request": {
"geetest_challenge": "a1b2c3d4e5f6g7h8i9j0k1l2m3n4o5p6xy",
"geetest_validate": "abc123def456_validate",
"geetest_seccode": "abc123def456_validate|jordan"
}
}
Ketiga nilai balasan ini langsung dipakai untuk langkah verifikasi situs di atas, tanpa perlu dimodifikasi lagi.
Berapa Thread yang Anda Butuhkan untuk Automasi GeeTest v3
CaptchaAI menagih per thread yang berjalan bersamaan, bukan per solve — kebutuhan thread kira-kira sama dengan jumlah job paralel, baik dari ap-southeast-1 (Singapura) maupun ap-southeast-3 (Jakarta). Solve GeeTest v3 biasanya selesai kurang dari 12 detik dengan tingkat keberhasilan tinggi, jadi satu thread menangani banyak job per hari:
| Skenario tim | Job paralel | Plan yang cukup |
|---|---|---|
| Freelancer atau tim kecil, uji coba awal | 1–5 | BASIC ($15/bulan, 5 thread) |
| Tim price-monitoring atau QA otomatis | 6–15 | STANDARD ($30/bulan, 15 thread) |
| Agency automation dengan banyak klien paralel | 16–50 | ADVANCE ($90/bulan, 50 thread) |
Endpoint dan parameter tetap sama di semua tier — upgrade plan tidak butuh perubahan kode.
Troubleshooting: Masalah Umum saat Solve GeeTest v3
| Masalah | Penyebab | Perbaikan |
|---|---|---|
Nilai challenge kosong |
Registrasi gagal | Cek apakah situs memuat GeeTest dengan benar |
| Solusi ditolak | Challenge kadaluarsa | Ekstrak challenge baru dan segera solve |
Nilai gt salah |
Beberapa instance GeeTest di halaman | Ekstrak gt dari widget yang tepat |
| Tiga nilai dikembalikan tapi form tidak submit | Field form tidak ada | Suntikkan ketiga nilai ke input yang benar |
Pertanyaan Seputar Alur Challenge-Response GeeTest v3
Status dukungan GeeTest v4 di CaptchaAI
Belum tersedia. CaptchaAI saat ini menangani GeeTest v3 secara penuh; GeeTest v4 masih berstatus segera hadir. Kalau situs Anda sudah migrasi ke v4, alur gt/challenge di artikel ini belum berlaku untuk situs tersebut.
Apa beda geetest_validate dan geetest_seccode?
geetest_validate adalah hash hasil validasi widget, sementara geetest_seccode adalah kombinasi nilai yang sama plus suffix |jordan yang dipakai server GeeTest untuk pengecekan tambahan. Situs butuh keduanya, bukan salah satu saja.
Berapa lama parameter challenge GeeTest v3 berlaku?
Umumnya 1–2 menit sejak diterbitkan. Solve dan submit secepatnya setelah parameter diekstrak — makin lama jeda antara ekstraksi dan submit, makin besar risiko challenge kedaluwarsa sebelum verifikasi server selesai.
Bisa pakai ulang gt dan challenge yang sama untuk request berikutnya?
gt boleh dipakai berulang karena itu ID akun GeeTest situs yang sifatnya tetap. challenge tidak — setiap nilai hanya sekali pakai; setelah solve (atau kedaluwarsa) Anda wajib mengambil nilai baru dari API registrasi.
Berapa biaya solve GeeTest v3 lewat CaptchaAI?
Tidak ada biaya per solve. CaptchaAI memakai plan bulanan berbasis thread — mulai BASIC $15/bulan untuk 5 thread — dan setiap thread bisa dipakai solve GeeTest v3 tanpa batas jumlah selama masa berlangganan.
Artikel Terkait
Langkah Selanjutnya
Sudah paham alur tiga nilai GeeTest v3? Ambil API key CaptchaAI Anda dan sambungkan langsung ke fungsi solve di atas — parameter yang sama persis dipakai di kode produksi.