Tutorial

Ekstraksi Parameter GeeTest v3 Slider dan Cara Solve

GeeTest v3 slider CAPTCHA memerlukan dua parameter untuk di-solve: gt (identifikasi situs statis) dan challenge (token sesi dinamis). Panduan ini menunjukkan cara mengekstrak keduanya dari halaman manapun dan mengirimkannya ke CaptchaAI.


Parameter GeeTest v3

Parameter Deskripsi Statis/Dinamis Contoh
gt Identifier situs (32 karakter hex) Statis per situs 019924a82c70bb123aae90d483b6a0ed
challenge Token sesi (32 karakter hex) Dinamis per page load a3f5c8d2e1b04a6789012345678abcdf
api_server Subdomain API GeeTest (opsional) Statis per situs api-na.geetest.com

Nilai gt tetap sama di semua request. Nilai challenge berubah setiap kali CAPTCHA dimuat — Anda harus mengekstrak nilai baru untuk setiap upaya solve.


Metode 1: Intercept API Call Register

Sebagian besar implementasi GeeTest v3 mengambil challenge dari endpoint registrasi. Responsnya terlihat seperti:

{
  "success": 1,
  "challenge": "a3f5c8d2e1b04a6789012345678abcdf",
  "gt": "019924a82c70bb123aae90d483b6a0ed",
  "new_captcha": true
}

Python (requests)

import requests
import re

session = requests.Session()
html = session.get("https://staging.example.com/qa-login").text

# Find the register endpoint
register_url = re.search(
    r'(https?://[^"\']+(?:register|captcha|geetest)[^"\']*)',
    html
)

if register_url:
    resp = session.get(register_url.group(1)).json()
    gt = resp["gt"]
    challenge = resp["challenge"]
    print(f"gt: {gt}")
    print(f"challenge: {challenge}")

JavaScript (Puppeteer: intercept network)

const puppeteer = require('puppeteer');

const browser = await puppeteer.launch();
const page = await browser.newPage();

let geetestParams = {};

page.on('response', async (response) => {
  const url = response.url();
  if (url.includes('register') || url.includes('captcha')) {
    try {
      const json = await response.json();
      if (json.gt && json.challenge) {
        geetestParams = {
          gt: json.gt,
          challenge: json.challenge,
        };
        console.log('Captured GeeTest params:', geetestParams);
      }
    } catch (e) {}
  }
});

await page.goto('https://staging.example.com/qa-login', { waitUntil: 'networkidle2' });
console.log('Final params:', geetestParams);

Metode 2: Ekstrak dari sumber halaman

Beberapa situs menyematkan parameter secara langsung dalam skrip HTML atau sebaris:

import re

# From data attributes
gt_match = re.search(r'data-gt=["\']([a-f0-9]{32})', html)
challenge_match = re.search(r'data-challenge=["\']([a-f0-9]{32})', html)

# From JavaScript variables
if not gt_match:
    gt_match = re.search(r'gt\s*[=:]\s*["\']([a-f0-9]{32})', html)
if not challenge_match:
    challenge_match = re.search(r'challenge\s*[=:]\s*["\']([a-f0-9]{32})', html)

gt = gt_match.group(1) if gt_match else None
challenge = challenge_match.group(1) if challenge_match else None
print(f"gt={gt}, challenge={challenge}")

Metode 3: Hook initGeetest

GeeTest v3 diinisialisasi via initGeetest(). Intercept sebelum skrip halaman dijalankan:

// Puppeteer: inject before page scripts
await page.evaluateOnNewDocument(() => {
  window.__geetestConfig = null;
  const origInit = window.initGeetest;

  Object.defineProperty(window, 'initGeetest', {
    set(fn) {
      this._initGeetest = function(config, callback) {
        window.__geetestConfig = config;
        console.log('GeeTest config:', JSON.stringify(config));
        return fn(config, callback);
      };
    },
    get() { return this._initGeetest; }
  });
});

await page.goto('https://staging.example.com/qa-login', { waitUntil: 'networkidle2' });

const config = await page.evaluate(() => window.__geetestConfig);
// config = { gt: "019924a...", challenge: "a3f5c8d...", product: "bind", ... }

Solve GeeTest v3 dengan CaptchaAI

Python

import requests
import time

API_KEY = "YOUR_API_KEY"

# Submit
resp = requests.post("https://ocr.captchaai.com/in.php", data={
    "key": API_KEY,
    "method": "geetest",
    "gt": gt,
    "challenge": challenge,
    "pageurl": "https://staging.example.com/qa-login",
    "json": "1",
}).json()

if resp["status"] != 1:
    raise Exception(f"Submit error: {resp['request']}")

task_id = resp["request"]

# Poll
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["status"] == 1:
        solution = result["request"]
        print(f"Solution: {solution}")
        break
    if result["request"] != "CAPCHA_NOT_READY":
        raise Exception(f"Error: {result['request']}")

JavaScript

const submit = await axios.post('https://ocr.captchaai.com/in.php', null, {
  params: {
    key: 'YOUR_API_KEY',
    method: 'geetest',
    gt: geetestParams.gt,
    challenge: geetestParams.challenge,
    pageurl: 'https://staging.example.com/qa-login',
    json: 1,
  }
});
const taskId = submit.data.request;

let solution = null;
for (let i = 0; i < 30; i++) {
  await new Promise(r => setTimeout(r, 5000));
  const poll = await axios.get('https://ocr.captchaai.com/res.php', {
    params: { key: 'YOUR_API_KEY', action: 'get', id: taskId, json: 1 }
  });
  if (poll.data.status === 1) {
    solution = poll.data.request;
    break;
  }
}
console.log('Solution:', solution);

Menyuntikkan Solusi GeeTest

Respons CaptchaAI untuk GeeTest v3 menyertakan challenge, validate, dan seccode:

# solution is a pipe-delimited string or JSON object
# Parse and inject into the form
import json

sol = json.loads(solution) if isinstance(solution, str) else solution

driver.execute_script("""
    const form = document.querySelector('form');
    function addHidden(name, value) {
        let input = form.querySelector(`input[name="${name}"]`);
        if (!input) {
            input = document.createElement('input');
            input.type = 'hidden';
            input.name = name;
            form.appendChild(input);
        }
        input.value = value;
    }
    addHidden('geetest_challenge', arguments[0]);
    addHidden('geetest_validate', arguments[1]);
    addHidden('geetest_seccode', arguments[2]);
""", sol["challenge"], sol["validate"], sol["seccode"])

Pemecahan Masalah

Masalah Penyebab Perbaikan
ERROR_BAD_PARAMETERS gt atau challenge tidak ada Keduanya wajib; ekstrak nilai baru
Challenge basi Token challenge kadaluarsa Ekstrak challenge baru segera sebelum submit
Nilai gt salah Disalin dari situs lain gt spesifik per lokasi; ekstrak ulang dari target
Solusi ditolak situs Challenge kadaluarsa saat solving Kurangi waktu antara ekstraksi dan submission

Pertanyaan Umum

Berapa lama challenge GeeTest valid?

Biasanya 60–120 detik. Ekstrak dan segera kirimkan ke CaptchaAI.

Apa perbedaan GeeTest v3 dan v4?

GeeTest v3 menggunakan parameter gt/challenge dan slider. GeeTest v4 menggunakan captcha_id dan memiliki beberapa tipe challenge (klik, cocokkan, geser).


Solve GeeTest v3 dengan CaptchaAI

Dapatkan API key Anda di captchaai.com.


Panduan Terkait

  • Mengekstrak Parameter reCAPTCHA dari Source Halaman
  • Ekstraksi Sitekey Cloudflare Turnstile
Komentar dinonaktifkan untuk artikel ini.