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

Chèn mã thông báo GeeTest vào khung tự động hóa trình duyệt

GeeTest v3 trả về ba giá trị sau khi giải: geetest_challenge, geetest_validategeetest_seccode. Việc đưa những thứ này vào phiên tự động hóa trình duyệt một cách chính xác đòi hỏi phải hiểu nơi trang web mong đợi chúng - các trường biểu mẫu ẩn, lệnh gọi lại JavaScript hoặc tải trọng XHR. Dưới đây là cách thực hiện điều đó trong từng khung chính.

Những gì bạn đang tiêm

CaptchaAI trả về kết quả gồm ba phần:

{
  "geetest_challenge": "a1b2c3d4e5...modified_challenge",
  "geetest_validate": "abc123def456_validate",
  "geetest_seccode": "abc123def456_validate|jordan"
}

Tất cả ba giá trị phải được thêm vào. Thiếu bất kỳ cái nào sẽ gây ra lỗi xác minh.

Bước 1: Trích xuất tham số và giải

Chung cho tất cả các khung – giải nén gtchallenge, sau đó giải bằng CaptchaAI:

import requests
import time

def solve_geetest(gt, challenge, page_url):
    resp = requests.post("https://ocr.captchaai.com/in.php", data={
        "key": "YOUR_API_KEY",
        "method": "geetest",
        "gt": gt,
        "challenge": challenge,
        "pageurl": page_url,
        "json": 1
    })
    task_id = resp.json()["request"]

    for _ in range(60):
        time.sleep(3)
        result = requests.get("https://ocr.captchaai.com/res.php", params={
            "key": "YOUR_API_KEY",
            "action": "get",
            "id": task_id,
            "json": 1
        })
        data = result.json()
        if data["status"] == 1:
            return data["request"]  # Returns dict with three values
    raise TimeoutError("GeeTest solve timed out")

Bước 2: Đưa vào Nhà viết kịch (Python)

Trích xuất thông số

from playwright.sync_api import sync_playwright

with sync_playwright() as p:
    browser = p.chromium.launch(headless=False)
    page = browser.new_page()

    # Capture GeeTest registration response
    geetest_data = {}
    def capture_geetest(response):
        if "register" in response.url and response.status == 200:
            try:
                data = response.json()
                if "gt" in data and "challenge" in data:
                    geetest_data.update(data)
            except Exception:
                pass

    page.on("response", capture_geetest)
    page.goto("https://staging.example.com/qa-login")
    page.wait_for_selector(".geetest_holder")

    gt = geetest_data["gt"]
    challenge = geetest_data["challenge"]

tiêm dung dịch

# Solve with CaptchaAI
solution = solve_geetest(gt, challenge, page.url)

# Method 1: Set hidden form fields
page.evaluate(f"""
    const fields = {{
        'geetest_challenge': '{solution["geetest_challenge"]}',
        'geetest_validate': '{solution["geetest_validate"]}',
        'geetest_seccode': '{solution["geetest_seccode"]}'
    }};
    for (const [name, value] of Object.entries(fields)) {{
        let input = document.querySelector(`input[name="${{name}}"]`);
        if (!input) {{
            input = document.createElement('input');
            input.type = 'hidden';
            input.name = name;
            document.querySelector('form').appendChild(input);
        }}
        input.value = value;
    }}
""")

# Submit the form
page.click("#submit-button")

Phương pháp 2: Kích hoạt cuộc gọi lại GeeTest

Một số trang web sử dụng hàm gọi lại JavaScript của GeeTest thay vì các trường biểu mẫu:

page.evaluate(f"""
    // Find the GeeTest captcha object
    if (window.captchaObj) {{
        // Simulate a successful solve
        const result = {{
            geetest_challenge: '{solution["geetest_challenge"]}',
            geetest_validate: '{solution["geetest_validate"]}',
            geetest_seccode: '{solution["geetest_seccode"]}'
        }};

        // Override getValidate to return our solution
        window.captchaObj.getValidate = function() {{ return result; }};

        // Trigger the success callback
        const successEvent = new Event('geetest_success');
        document.dispatchEvent(successEvent);
    }}
""")

Bước 3: Đưa Puppeteer vào (JavaScript)

const puppeteer = require('puppeteer');

async function solveAndInject() {
  const browser = await puppeteer.launch({ headless: false });
  const page = await browser.newPage();

  // Capture GeeTest params
  let gt, challenge;
  page.on('response', async (response) => {
    if (response.url().includes('register') && response.status() === 200) {
      try {
        const data = await response.json();
        if (data.gt && data.challenge) {
          gt = data.gt;
          challenge = data.challenge;
        }
      } catch (e) {}
    }
  });

  await page.goto('https://staging.example.com/qa-login');
  await page.waitForSelector('.geetest_holder');

  // Solve with CaptchaAI (implementation from earlier)
  const solution = await solveCaptcha(gt, challenge, page.url());

  // Inject the three values
  await page.evaluate((sol) => {
    // Set hidden inputs
    const form = document.querySelector('form');
    ['geetest_challenge', 'geetest_validate', 'geetest_seccode'].forEach(name => {
      let input = document.querySelector(`input[name="${name}"]`);
      if (!input) {
        input = document.createElement('input');
        input.type = 'hidden';
        input.name = name;
        form.appendChild(input);
      }
      input.value = sol[name];
    });
  }, solution);

  await page.click('#submit-button');
}

Bước 4: Tiêm Selenium (Python)

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

driver = webdriver.Chrome()
driver.get("https://staging.example.com/qa-login")

# Wait for GeeTest widget
WebDriverWait(driver, 15).until(
    EC.presence_of_element_located((By.CLASS_NAME, "geetest_holder"))
)

# Extract gt and challenge from the page
gt = driver.execute_script(
    "return document.querySelector('[data-gt]')?.dataset.gt"
)
challenge = driver.execute_script(
    "return document.querySelector('[data-challenge]')?.dataset.challenge"
)

# Solve with CaptchaAI
solution = solve_geetest(gt, challenge, driver.current_url)

# Inject via JavaScript
driver.execute_script(f"""
    var fields = {{
        'geetest_challenge': '{solution["geetest_challenge"]}',
        'geetest_validate': '{solution["geetest_validate"]}',
        'geetest_seccode': '{solution["geetest_seccode"]}'
    }};
    var form = document.querySelector('form');
    for (var name in fields) {{
        var input = document.querySelector('input[name="' + name + '"]');
        if (!input) {{
            input = document.createElement('input');
            input.type = 'hidden';
            input.name = name;
            form.appendChild(input);
        }}
        input.value = fields[name];
    }}
""")

driver.find_element(By.ID, "submit-button").click()

Xử lý các bài gửi dựa trên XHR

Một số trang gửi kết quả GeeTest qua XHR thay vì biểu mẫu POST. Chặn và sửa đổi yêu cầu:

# Playwright: Intercept the XHR and inject values
def handle_route(route):
    if "login" in route.request.url and route.request.method == "POST":
        # Modify the POST data to include our solution
        post_data = route.request.post_data
        # Add GeeTest values to the request
        route.continue_(post_data=modified_data)
    else:
        route.continue_()

page.route("**/api/login**", handle_route)

Khắc phục sự cố

Vấn đề Nguyên nhân Cách xử lý
"Xác thực GeeTest không thành công" Thiếu một trong ba giá trị Xác minh cả ba giá trị được chèn
Thử thách đã hết hạn trước khi tiêm Quá dài giữa trích xuất và giải quyết Trích xuất và giải quyết nhanh chóng
Biểu mẫu được gửi nhưng không bao gồm các giá trị Tên trường hoặc bộ chọn biểu mẫu sai Kiểm tra biểu mẫu thực tế để tìm tên chính xác
Cuộc gọi lại không được kích hoạt Trang web sử dụng tên gọi lại tùy chỉnh Tìm lệnh gọi lại trong tùy chọn initGeetest
Giá trị được chèn nhưng tiện ích vẫn hiển thị Trạng thái tiện ích chưa được cập nhật Kích hoạt cuộc gọi lại thành công theo chương trình

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

Tôi có cần ẩn tiện ích GeeTest một cách trực quan sau khi chèn không?

Không. Trạng thái trực quan của tiện ích không ảnh hưởng đến việc gửi biểu mẫu. Miễn là ba giá trị nằm trong dữ liệu biểu mẫu, máy chủ sẽ xác thực chúng bất kể giao diện của tiện ích.

Tôi có thể thêm các giá trị GeeTest mà không cần trình duyệt không?

Có, nếu trang web chấp nhận HTTP POST trực tiếp với ba giá trị. Chặn điểm cuối gửi biểu mẫu và gửi các giá trị qua requests hoặc bất kỳ ứng dụng khách HTTP nào.

Tại sao GeeTest sử dụng ba giá trị riêng biệt thay vì một mã thông báo?

Ba giá trị phục vụ các mục đích khác nhau: geetest_challenge theo dõi phiên, geetest_validate chứng minh thách thức đã được giải quyết và geetest_seccode cung cấp hàm băm để phát hiện giả mạo.

bài viết liên quan

Các bước tiếp theo

Đưa các giải pháp GeeTest vào bất kỳ khuôn khổ nào —lấy khóa API CaptchaAI của bạnvà bắt đầu giải quyết.

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