Phân Tích Kỹ Thuật

GeeTest v4 so với v3: những thay đổi và cách giải CAPTCHA

Câu trả lời ngắn gọn trước: hiện tại CaptchaAI giải GeeTest v3 với tỷ lệ giải thành công cao, còn GeeTest v4 vẫn đang sắp ra mắt và chưa khả dụng. Nếu trang bạn đang kiểm thử dùng v4, bài này giúp bạn nhận diện đúng phiên bản, hiểu v4 đã đổi gì so với v3 và dựng sẵn luồng tích hợp cho thời điểm v4 lên sóng.

Nhiều đội QA và thu thập dữ liệu tại Việt Nam gặp GeeTest trên các cổng có nguồn gốc từ nền tảng Trung Quốc hoặc trang thương mại điện tử. Biết chắc đang là v3 hay v4 giúp bạn chọn đúng cách xử lý và tránh gửi nhầm tham số — lỗi phổ biến nhất khi chuyển giữa hai phiên bản.


v3 và v4 khác nhau ở đâu

GeeTest v4 không chỉ là bản làm mới giao diện. Nó thay đổi cách khởi tạo, cách sinh tham số thử thách và cách xác thực kết quả. Bảng dưới đây tóm tắt những khác biệt bạn sẽ chạm tới khi tích hợp.

Tính năng GeeTest v3 GeeTest v4
Khởi tạo gt + challenge từ máy chủ chỉ captcha_id
Tham số thử thách Lấy từ lệnh gọi API Sinh ở phía client
Loại thử thách Trượt, nhấp Trượt, nhấp, chọn biểu tượng, suy luận không gian
Xác thực Máy chủ trả về challenge Dùng lot_number + pass_token
Endpoint API api.geetest.com gcaptcha4.geetest.com
Điều chỉnh độ khó Cố định Chấm điểm rủi ro thích ứng

Ba điểm dễ vấp nhất khi chuyển từ v3 sang v4:

  • v3 lấy gtchallenge từ máy chủ trước khi hiển thị; v4 chỉ cần captcha_id và tự sinh phần còn lại ở phía client.
  • v4 dùng lot_number + pass_token để xác thực thay cho challenge — bộ token trả về hoàn toàn khác v3.
  • v4 chấm điểm rủi ro thích ứng, nên cùng một trang có thể tăng hoặc giảm độ khó tùy hành vi phiên truy cập.

Các loại thử thách trong v4

Trước khi bàn tới tích hợp, cần nắm bốn dạng thử thách mà v4 có thể hiển thị — nhiều hơn và đa dạng hơn v3.

Trượt (slide)

Thử thách kéo mảnh ghép cổ điển: người dùng kéo một mảnh vào đúng vị trí. Đây là dạng quen thuộc kế thừa từ v3.

Nhấp chọn đối tượng

Người dùng nhấp vào các đối tượng cụ thể (ví dụ "nhấp vào tất cả khuôn mặt"), dựa trên nhận dạng biểu tượng.

Suy luận không gian

Dạng mới trong v4 — người dùng sắp xếp các hình theo một mẫu không gian. Phức tạp hơn hẳn v3.

Ghép biểu tượng theo thứ tự

Người dùng ghép các biểu tượng hiển thị theo trình tự, khó tự động hóa thủ công hơn.

Khi hỗ trợ v4 chính thức ra mắt, API của CaptchaAI sẽ trừu tượng hóa phần logic riêng của từng dạng thử thách, giống như cách nó xử lý v3 hôm nay. Hiện tại CaptchaAI giải GeeTest v3; v4 sắp ra mắt.


Cách phát hiện GeeTest v4 trên trang

Trước khi gửi task, hãy xác định trang đang dùng v4 hay v3. v4 nhúng script gcaptcha4 (hoặc gt4.js) và dùng captcha_id thay cho cặp gt + challenge. Đoạn Selenium sau trích captcha_id cùng cờ is_v4 từ HTML đã render:

# extract_geetest_v4.py
import re
from selenium import webdriver

def extract_geetest_v4_params(url):
    """Extract GeeTest v4 captcha_id from a page."""
    driver = webdriver.Chrome()
    driver.get(url)

    page_source = driver.page_source

    # GeeTest v4 uses captcha_id instead of gt
    match = re.search(r'captcha_id["\']?\s*[:=]\s*["\']([a-f0-9]+)', page_source)
    captcha_id = match.group(1) if match else None

    # Check for v4-specific script
    is_v4 = "gcaptcha4" in page_source or "gt4.js" in page_source

    driver.quit()

    return {
        "captcha_id": captcha_id,
        "is_v4": is_v4,
        "pageurl": url,
    }

# Usage
params = extract_geetest_v4_params("https://staging.example.com/qa-login")
print(f"Captcha ID: {params['captcha_id']}")
print(f"Is v4: {params['is_v4']}")

Nếu is_v4 trả về True, trang dùng v4; ngược lại, xử lý theo luồng v3 quen thuộc.


Luồng giải GeeTest v4 (sắp ra mắt)

GeeTest v4 hiện chưa được hỗ trợ và chỉ có thể mô tả là sắp ra mắt; tính năng này nằm trong lộ trình của CaptchaAI nhưng không khả dụng rộng rãi. Trong lúc chờ, hãy dùng GeeTest v3 mà CaptchaAI giải được ngay hôm nay với tỷ lệ giải thành công cao. Đoạn code dưới đây minh họa luồng v4 dự kiến để bạn chuẩn bị trước; kiểm tra trạng thái hiện tại tại trang các loại được hỗ trợ của CaptchaAI.

Về bản chất, luồng đi theo bốn bước quen thuộc của mọi tích hợp CaptchaAI:

  1. Gửi task tới in.php kèm captcha_id, pageurlversion.
  2. Nhận về ID task nếu status trả về 1.
  3. Polling res.php cho tới khi có kết quả.
  4. Chèn bộ token trả về vào form của trang.
# solve_geetest_v4.py
import requests
import time
import os

def solve_geetest_v4(captcha_id, pageurl):
    """Submit GeeTest v4 to CaptchaAI and get solution."""
    api_key = os.environ["CAPTCHAAI_API_KEY"]

    # Submit task
    resp = requests.post("https://ocr.captchaai.com/in.php", data={
        "key": api_key,
        "method": "geetest",
        "gt": captcha_id,      # captcha_id maps to the gt parameter
        "pageurl": pageurl,
        "version": "4",        # Specify v4 explicitly
        "json": 1,
    }, timeout=30)

    result = resp.json()
    if result.get("status") != 1:
        raise RuntimeError(f"Submit failed: {result.get('request')}")

    task_id = result["request"]

    # Poll for result
    time.sleep(10)
    for _ in range(30):
        resp = requests.get("https://ocr.captchaai.com/res.php", params={
            "key": api_key,
            "action": "get",
            "id": task_id,
            "json": 1,
        }, timeout=15)
        data = resp.json()

        if data.get("status") == 1:
            return data["request"]  # Contains validation tokens
        if data["request"] != "CAPCHA_NOT_READY":
            raise RuntimeError(data["request"])
        time.sleep(5)

    raise TimeoutError("GeeTest v4 solve timeout")

# Usage
solution = solve_geetest_v4(
    captcha_id="abc123def456",
    pageurl="https://staging.example.com/qa-login",
)
print(f"Solution: {solution}")

Với GeeTest v3 hôm nay, thay version thành 3 và dùng cặp gt + challenge thay cho captcha_id.


Chèn lời giải v4 vào trang

Bước cuối là đưa các token trả về vào form ẩn của trang. Lưu ý v4 trả về một bộ token khác v3 — gồm lot_number, pass_token, gen_timecaptcha_output:

# inject_geetest_v4.py
import json
from selenium import webdriver
from selenium.webdriver.common.by import By

def inject_geetest_v4_solution(driver, solution):
    """Inject GeeTest v4 solution tokens into the page."""
    # Parse solution — v4 returns different tokens than v3
    if isinstance(solution, str):
        try:
            solution = json.loads(solution)
        except json.JSONDecodeError:
            pass

    # GeeTest v4 validation uses lot_number, pass_token, gen_time, captcha_output
    driver.execute_script("""
        var solution = arguments[0];

        // Set hidden form fields
        var fields = {
            'lot_number': solution.lot_number,
            'pass_token': solution.pass_token,
            'gen_time': solution.gen_time,
            'captcha_output': solution.captcha_output,
        };

        for (var name in fields) {
            var input = document.querySelector('input[name="' + name + '"]');
            if (!input) {
                input = document.createElement('input');
                input.type = 'hidden';
                input.name = name;
                document.forms[0].appendChild(input);
            }
            input.value = fields[name];
        }

        // Trigger validation callback if available
        if (window.captchaObj && typeof window.captchaObj.appendTo === 'function') {
            window.captchaObj.appendTo('#captcha-container');
        }
    """, solution)

Vì token được trả về dưới dạng JSON, hãy luôn parse chuỗi kết quả thành object trước khi đọc từng trường — parse nhầm chuỗi thô là nguyên nhân phổ biến khiến form không nhận.


Khắc phục sự cố

Vấn đề Nguyên nhân Cách xử lý
ERROR_WRONG_CAPTCHA_ID Dùng giá trị v3 gt thay cho v4 captcha_id Kiểm tra script gcaptcha4 trên trang để xác nhận v4
Lời giải bị từ chối Thiếu tham số version=4 Luôn chỉ định version: "4" cho v4
Không tìm thấy captcha_id Trang render bằng JavaScript Dùng Selenium trích xuất từ trang đã render
Lỗi định dạng token Parse chuỗi thay vì JSON Parse lời giải dưới dạng JSON để lấy từng token riêng

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

CaptchaAI đã giải được GeeTest v4 chưa?

Chưa. GeeTest v4 hiện là tính năng sắp ra mắt và chưa khả dụng rộng rãi. Ngay hôm nay CaptchaAI giải GeeTest v3 với tỷ lệ giải thành công cao; hãy dùng v3 trong lúc chờ v4 lên sóng.

Trong lúc chờ v4, tôi giải GeeTest v3 thế nào?

Dùng đúng luồng bốn bước qua API: trích gtchallenge, gửi task tới in.php với version=3, polling res.php, rồi chèn token vào form. Đổi version sang 3 và cặp tham số là toàn bộ khác biệt so với đoạn code v4 ở trên.

Làm sao phân biệt GeeTest v3 và v4 trên một trang?

Tìm gcaptcha4.geetest.com hoặc gt4.js trong nguồn trang thì đó là v4. Nếu thấy api.geetest.com cùng tham số challenge thì đó là v3.

Giải GeeTest với CaptchaAI tính chi phí thế nào?

CaptchaAI tính giá theo thread (luồng giải đồng thời), không tính theo từng lần giải. Gói nhỏ nhất là BASIC ($15/tháng, 5 thread) với số lần giải không giới hạn trong tháng, nên chi phí phụ thuộc vào số task đồng thời chứ không phải tổng số CAPTCHA.


Hướng dẫn liên quan


Giải GeeTest v3 ngay hôm nay — bắt đầu với CaptchaAI. GeeTest v4 sắp ra mắt.

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