GeeTest v3 menggunakan protokol challenge-response multi-langkah. Tidak seperti reCAPTCHA di mana satu token menyelesaikan segalanya, GeeTest melibatkan langkah registrasi, pertukaran token challenge, dan validasi akhir — masing-masing menghasilkan parameter berbeda. Memahami aliran ini penting untuk integrasi yang benar dengan CaptchaAI.
Protokol Dua Fase
GeeTest v3 beroperasi dalam dua fase:
Fase 1: Registrasi (Server-side)
Backend situs menghubungi GeeTest untuk mendaftarkan challenge baru:
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
Fase 2: Verifikasi (Client-side + Server-side)
Browser me-render challenge, pengguna menyelesaikannya, dan hasilnya diverifikasi:
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" }
Aliran Terperinci
Langkah 1: API Call Registrasi
Backend situs memanggil endpoint registrasi GeeTest:
GET https://api.geetest.com/register.php?gt=GT_ID&json_format=1
Tanggapan:
{
"success": 1,
"gt": "81dc9bdb52d04dc20036dbd8313ed055",
"challenge": "a1b2c3d4e5f6g7h8i9j0k1l2m3n4o5p6",
"new_captcha": true
}
| Parameter | Keterangan |
|---|---|
gt |
GeeTest ID — mengidentifikasi akun GeeTest situs |
challenge |
Token challenge unik untuk sesi ini |
new_captcha |
Apakah menggunakan format CAPTCHA baru |
Penting: Nilai challenge hanya sekali pakai dan dibatasi waktu. Setiap pemuatan halaman menghasilkan challenge baru.
Langkah 2: Render Challenge
Browser menerima gt dan challenge dan menginisialisasi widget GeeTest:
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
});
});
Langkah 3: Tipe Challenge
GeeTest v3 mendukung beberapa tipe challenge:
| Tipe | Aksi Pengguna | Deskripsi |
|---|---|---|
| Slider | Tarik potongan puzzle | Geser potongan puzzle untuk melengkapi gambar |
| Klik ikon | Klik ikon secara berurutan | Klik ikon tertentu dalam urutan yang ditampilkan |
| Klik kata | Klik karakter | Klik karakter China dalam urutan yang benar |
| Spasial | Klik/select | Challenge penalaran spasial |
Tipe challenge ditentukan GeeTest berdasarkan konfigurasi situs dan profil risiko pengguna.
Langkah 4: Nilai Solusi
Setelah diselesaikan, widget menghasilkan tiga nilai:
{
"geetest_challenge": "a1b2c3d4e5f6g7h8i9j0k1l2m3n4o5p6xy",
"geetest_validate": "abc123def456_validate",
"geetest_seccode": "abc123def456_validate|jordan"
}
| Nilai | Deskripsi |
|---|---|
geetest_challenge |
Token challenge yang dimodifikasi (asli + 2 karakter tambahan) |
geetest_validate |
Hash validasi |
geetest_seccode |
Security code (validate + \|jordan suffix) |
Langkah 5: Verifikasi Server-side
Backend situs mengirimkan tiga nilai ke GeeTest untuk verifikasi:
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"
}
Mengekstrak Parameter untuk CaptchaAI
Untuk solve dengan CaptchaAI, Anda memerlukan gt dan challenge dari halaman:
Metode 1: Intercept Respons Registrasi
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')}")
Metode 2: Ekstrak dari JavaScript Halaman
gt = page.evaluate("() => document.querySelector('[data-gt]')?.dataset.gt")
challenge = page.evaluate("() => document.querySelector('[data-challenge]')?.dataset.challenge")
Metode 3: Dari Panggilan initGeetest
Cari sumber halaman untuk panggilan initGeetest:
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)
Solve dengan CaptchaAI
Kirimkan parameter yang diekstrak:
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"
}
}
Anda menerima ketiga nilai yang diperlukan untuk langkah verifikasi situs.
Mode Offline vs Online
GeeTest v3 memiliki mode fallback ketika server GeeTest tidak dapat dijangkau:
| Mode | Nilai success |
Perilaku |
|---|---|---|
| Online | 1 |
Challenge-response normal dengan server GeeTest |
| Offline | 0 |
Verifikasi lokal yang disederhanakan |
Dalam mode offline, challenge dibuat secara lokal dan verifikasi lebih sederhana. Sebagian besar situs menggunakan mode online.
Pemecahan Masalah
| 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 Umum
Mengapa GeeTest memerlukan gt dan challenge?
gt mengidentifikasi akun GeeTest situs (persisten). challenge adalah token unik per sesi yang mencegah replay attack — setiap challenge hanya dapat diselesaikan sekali.
Bisakah saya menggunakan kembali challenge GeeTest?
Tidak. Setiap nilai challenge hanya sekali pakai. Setelah solved (atau kadaluarsa), Anda harus mendapatkan yang baru dari registration API.
Berapa lama challenge GeeTest berlaku?
Challenge biasanya expire dalam 1–2 menit. Solve dan submit segera setelah mengekstrak parameter.
Artikel Terkait
- reCAPTCHA Enterprise Assessment API: Deep Dive
Langkah Selanjutnya
Solve challenge GeeTest v3 — dapatkan API key CaptchaAI Anda dan integrasikan respons tiga nilai ke dalam workflow Anda.