Hướng Dẫn Thực Hành

Trích xuất và giải tham số thanh trượt GeeTest v3

CAPTCHA thanh trượt GeeTest v3 yêu cầu hai tham số để giải quyết: gt (mã định danh trang web tĩnh) và challenge (mã thông báo phiên động). Hướng dẫn này chỉ ra cách trích xuất cả hai từ bất kỳ trang nào và gửi chúng tới CaptchaAI.


Giải thích các thông số GeeTest v3

tham số Mô tả Tĩnh/Dynamic Ví dụ
gt Mã định danh trang web (hex 32 ký tự) Tĩnh trên mỗi trang web 019924a82c70bb123aae90d483b6a0ed
challenge Mã thông báo phiên (hex 32 ký tự) Động trên mỗi lần tải trang a3f5c8d2e1b04a6789012345678abcdf
api_server Tên miền phụ API GeeTest (tùy chọn) Tĩnh trên mỗi trang web api-na.geetest.com

Giá trị gt vẫn giữ nguyên trong các yêu cầu. Giá trị challenge thay đổi mỗi khi tải CAPTCHA — bạn phải trích xuất một giá trị mới cho mỗi lần giải.


Phương pháp 1: Chặn lệnh gọi API đăng ký

Hầu hết các triển khai GeeTest v3 đều lấy thử thách từ điểm cuối đăng ký. Phản hồi trông giống như:

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

Python (yêu cầu)

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 (Đánh chặn mạng Puppeteer)

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);

Cách 2: Trích xuất từ nguồn trang

Một số trang web nhúng các tham số trực tiếp vào HTML hoặc tập lệnh nội tuyến:

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

Cách 3: Móc initGeetest

GeeTest v3 khởi tạo thông qua initGeetest(). Chặn nó trước khi tập lệnh trang chạy:

// 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", ... }

Giải GeeTest v3 bằng 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);

Tiêm dung dịch GeeTest

Phản hồi CaptchaAI cho GeeTest v3 bao gồm challenge, validateseccode:

# 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"])

Khắc phục sự cố

Vấn đề Nguyên nhân Cách xử lý
ERROR_BAD_PARAMETERS Thiếu gt hoặc challenge Cả hai đều được yêu cầu; trích xuất các giá trị mới
Thử thách cũ Mã thông báo thử thách đã hết hạn Trích xuất một thử thách mới ngay trước khi gửi
Giá trị gt sai Sao chép từ trang web khác gt dành riêng cho từng trang web; trích xuất lại từ mục tiêu
Giải pháp bị từ chối bởi trang web Thử thách đã hết hạn trong khi giải Giảm thời gian giữa trích xuất và gửi

Câu hỏi thường gặp

Thử thách GeeTest có hiệu lực trong bao lâu?

Thông thường là 60-120 giây. Trích xuất thử thách và gửi tới CaptchaAI ngay lập tức.

Sự khác biệt giữa GeeTest v3 và v4 là gì?

GeeTest v3 sử dụng các tham số gt/1ZZ và một thanh trượt. GeeTest v4 sử dụng captcha_id và có nhiều loại thử thách (nhấp, khớp, trượt).


Giải quyết CAPTCHA GeeTest v3 bằng CaptchaAI

Nhận khóa API của bạn tạicaptchaai.com.


Hướng dẫn liên quan

Os comentários estão desativados para este artigo.