Penjelasan Mendalam

Alur Kerja Challenge-Response GeeTest v3: Technical Deep Dive

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
&gt=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.

Komentar dinonaktifkan untuk artikel ini.