Tutorials

GeeTest v3 Slider-Parameterextraktion und -lösung

GeeTest v3-Schieberegler-CAPTCHAS erfordern zur Lösung zwei Parameter: gt (eine statische Site-ID) und challenge (ein dynamisches Sitzungstoken). Diese Anleitung zeigt, wie Sie beides von einer beliebigen Seite extrahieren und an CaptchaAI übermitteln.


GeeTest v3-Parameter erklärt

Parameter Beschreibung Statisch/Dynamic Beispiel
gt Site-ID (32-stellige Hexadezimalzahl) Statisch pro Site 019924a82c70bb123aae90d483b6a0ed
challenge Sitzungstoken (32-stellige Hexadezimalzahl) Dynamisch pro Seitenladevorgang a3f5c8d2e1b04a6789012345678abcdf
api_server GeeTest API-Subdomain (optional) Statisch pro Site api-na.geetest.com

Der gt-Wert bleibt bei allen Anfragen gleich. Der challenge-Wert ändert sich jedes Mal, wenn das CAPTCHA geladen wird – Sie müssen für jeden Lösungsversuch einen neuen Wert extrahieren.


Methode 1: Den Register-API-Aufruf abfangen

Die meisten GeeTest v3-Implementierungen rufen die Challenge von einem Registrierungsendpunkt ab. Die Antwort sieht so aus:

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

Python (Anfragen)

import requests
import re

session = requests.Session()
html = session.get("https://example.com/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-Netzwerkabhörung)

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://example.com/login', { waitUntil: 'networkidle2' });
console.log('Final params:', geetestParams);

Methode 2: Aus der Seitenquelle extrahieren

Einige Websites betten die Parameter direkt in HTML oder Inline-Skripte ein:

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}")

Methode 3: Hook initGeetest

GeeTest v3 wird über initGeetest() initialisiert. Fangen Sie es ab, bevor die Seitenskripte ausgeführt werden:

// 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://example.com/login', { waitUntil: 'networkidle2' });

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

Lösen von GeeTest v3 mit 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://example.com/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://example.com/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);

Injizieren der GeeTest-Lösung

Die CaptchaAI-Antwort für GeeTest v3 umfasst challenge, validate und 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"])

Fehlerbehebung

Problem Ursache Lösung
ERROR_BAD_PARAMETERS gt oder challenge fehlt Beides ist erforderlich; neue Werte extrahieren
Eine abgestandene Herausforderung Der Challenge-Token ist abgelaufen Extrahieren Sie unmittelbar vor dem Absenden eine neue Herausforderung
Falscher gt-Wert Von einer anderen Website kopiert gt ist standortspezifisch; erneut aus dem Ziel extrahieren
Lösung von der Website abgelehnt Die Herausforderung ist während der Lösung abgelaufen Reduzieren Sie die Zeit zwischen Extraktion und Übermittlung

FAQ

Wie lange ist eine GeeTest-Challenge gültig?

Normalerweise 60–120 Sekunden. Extrahieren Sie die Herausforderung und senden Sie sie sofort an CaptchaAI.

Was ist der Unterschied zwischen GeeTest v3 und v4?

GeeTest v3 verwendet gt/BEISPIEL_TOKEN-Parameter und einen Schieberegler. GeeTest v4 verwendet captcha_id und verfügt über mehrere Herausforderungstypen (Klicken, Matchen, Schieben).


Lösen Sie GeeTest v3 CAPTCHAs mit CaptchaAI

Holen Sie sich Ihren API-Schlüssel unter captchaai.com.


Verwandte Leitfäden

  • CAPTCHA-Parameter mit Browser-DevTools extrahieren
  • Extrahieren von reCAPTCHA-Parametern
  • Cloudflare Turnstile Sitekey-Extraktion
Kommentare sind für diesen Artikel deaktiviert.