Phân Tích Kỹ Thuật

Quy trình phản hồi thử thách của GeeTest v3: Nghiên cứu sâu về kỹ thuật

GeeTest v3 sử dụng giao thức phản hồi thử thách nhiều bước. Không giống như reCAPTCHA nơi một mã thông báo duy nhất giải quyết mọi thứ, GeeTest bao gồm bước đăng ký, trao đổi mã thông báo thử thách và xác thực cuối cùng - mỗi mã tạo ra các thông số khác nhau. Hiểu quy trình này là điều cần thiết để tích hợp chính xác với CaptchaAI.

Giao thức hai pha

GeeTest v3 hoạt động theo hai giai đoạn:

Giai đoạn 1: Đăng ký (Phía máy chủ)

Phần phụ trợ của trang web liên hệ với GeeTest để đăng ký thử thách mới:

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

Giai đoạn 2: Xác minh (Phía máy khách + Phía máy chủ)

Trình duyệt đưa ra thử thách, người dùng giải quyết nó và kết quả được xác minh:

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

Luồng chi tiết

Bước 1: Cuộc gọi API đăng ký

Phần phụ trợ của trang web gọi điểm cuối đăng ký của GeeTest:

GET https://api.geetest.com/register.php?gt=GT_ID&json_format=1

Phản hồi:

{
  "success": 1,
  "gt": "81dc9bdb52d04dc20036dbd8313ed055",
  "challenge": "a1b2c3d4e5f6g7h8i9j0k1l2m3n4o5p6",
  "new_captcha": true
}
tham số Ý nghĩa
gt GeeTest ID - xác định tài khoản GeeTest của trang web
challenge Mã thông báo thử thách duy nhất cho phiên này
new_captcha Có nên sử dụng định dạng CAPTCHA mới hay không

Quan trọng: Giá trị challenge chỉ sử dụng một lần và có giới hạn thời gian. Mỗi lần tải trang sẽ tạo ra một thử thách mới.

Bước 2: Kết xuất thử thách

Trình duyệt nhận gtchallenge và khởi chạy tiện ích 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
  });
});

Bước 3: Các loại thử thách

GeeTest v3 hỗ trợ một số loại thử thách:

loại Hành động của người dùng Mô tả
Thanh trượt Kéo mảnh ghép Di chuyển mảnh ghép để hoàn thành hình ảnh
Nhấp vào biểu tượng Nhấn vào các biểu tượng theo thứ tự Nhấp vào biểu tượng cụ thể theo trình tự hiển thị
Nhấp chuột từ Bấm vào ký tự Bấm vào ký tự tiếng Trung theo đúng thứ tự
Không gian Nhấp vào/select Thử thách lý luận không gian

Loại thử thách được xác định bởi GeeTest dựa trên cấu hình của trang web và hồ sơ rủi ro của người dùng.

Bước 4: Giá trị giải pháp

Sau khi giải quyết, widget tạo ra ba giá trị:

{
  "geetest_challenge": "a1b2c3d4e5f6g7h8i9j0k1l2m3n4o5p6xy",
  "geetest_validate": "abc123def456_validate",
  "geetest_seccode": "abc123def456_validate|jordan"
}
Giá trị Mô tả
geetest_challenge Mã thông báo thử thách đã sửa đổi (bản gốc + 2 ký tự bổ sung)
geetest_validate Băm xác thực
geetest_seccode Mã bảo mật (xác thực + \ | hậu tố jordan)

Bước 5: Xác minh phía máy chủ

Phần phụ trợ của trang web sẽ gửi ba giá trị này tới GeeTest để xác minh:

POST https://api.geetest.com/validate.php

seccode=abc123def456_validate|jordan
&challenge=a1b2c3d4e5f6g7h8i9j0k1l2m3n4o5p6xy
&sdk=geetest-python-3.0.0

GeeTest trả lời:

{
  "seccode": "abc123def456_validate",
  "validate": "abc123def456_validate"
}

Trích xuất tham số cho CaptchaAI

Để giải quyết bằng CaptchaAI, bạn cần gtchallenge từ trang:

Phương pháp 1: Chặn phản hồi đăng ký

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

Cách 2: Trích xuất từ trang JavaScript

gt = page.evaluate("() => document.querySelector('[data-gt]')?.dataset.gt")
challenge = page.evaluate("() => document.querySelector('[data-challenge]')?.dataset.challenge")

Cách 3: Từ cuộc gọi initGeetest

Tìm kiếm nguồn trang cho lệnh gọi 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)

Giải quyết bằng CaptchaAI

Gửi các tham số được trích xuất:

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

Thăm dò kết quả:

GET https://ocr.captchaai.com/res.php?key=YOUR_API_KEY&action=get&id=TASK_ID&json=1

CaptchaAI trả về:

{
  "status": 1,
  "request": {
    "geetest_challenge": "a1b2c3d4e5f6g7h8i9j0k1l2m3n4o5p6xy",
    "geetest_validate": "abc123def456_validate",
    "geetest_seccode": "abc123def456_validate|jordan"
  }
}

Bạn nhận được tất cả ba giá trị cần thiết cho bước xác minh của trang web.

Chế độ ngoại tuyến và trực tuyến

GeeTest v3 có chế độ dự phòng khi máy chủ GeeTest không thể truy cập được:

Chế độ Giá trị success Hành vi
Trực tuyến 1 Phản hồi thử thách thông thường với máy chủ GeeTest
Ngoại tuyến 0 Xác minh cục bộ đơn giản hóa

Ở chế độ ngoại tuyến, thử thách được tạo cục bộ và việc xác minh đơn giản hơn. Hầu hết các trang web đều sử dụng chế độ trực tuyến.

Khắc phục sự cố

Vấn đề Nguyên nhân Cách xử lý
Giá trị challenge trống Đăng ký không thành công Kiểm tra xem trang web có tải GeeTest chính xác không
Giải pháp bị từ chối Thử thách đã hết hạn Trích xuất challenge mới và giải quyết ngay
Giá trị gt sai Nhiều phiên bản GeeTest trên trang Trích xuất gt từ đúng tiện ích
Ba giá trị được trả về nhưng biểu mẫu không gửi được Thiếu trường biểu mẫu Đưa cả ba giá trị vào đúng đầu vào

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

Tại sao GeeTest cần cả gtchallenge?

gt xác định tài khoản GeeTest của trang web (liên tục). challenge là mã thông báo dành riêng cho phiên nhằm ngăn chặn các cuộc tấn công lặp lại — mỗi thử thách chỉ có thể được giải quyết một lần.

Tôi có thể sử dụng lại thử thách GeeTest không?

Không. Mỗi giá trị challenge chỉ được sử dụng một lần. Sau khi được giải quyết (hoặc hết hạn), bạn phải lấy một cái mới từ API đăng ký.

Thử thách GeeTest kéo dài bao lâu?

Các thử thách thường hết hạn trong vòng 1-2 phút. Giải quyết và nộp ngay sau khi trích xuất thông số.

bài viết liên quan

Các bước tiếp theo

Giải quyết các thử thách GeeTest v3 —lấy khóa API CaptchaAI của bạnvà tích hợp phản hồi ba giá trị vào quy trình làm việc của bạn.

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