Eğitimler

Tarayıcı Otomasyon Çerçevelerine GeeTest Token Ekleme

GeeTest v3, çözümden sonra üç değer döndürür: geetest_challenge, geetest_validate ve geetest_seccode. Bunları bir tarayıcı otomasyon oturumuna doğru bir şekilde enjekte etmek, sitenin bunları nerede beklediğini (gizli form alanları, JavaScript geri aramaları veya XHR yükleri) anlamayı gerektirir.Bunu her ana çerçevede nasıl yapacağınız aşağıda açıklanmıştır.

Ne Enjekte Ediyorsunuz?

CaptchaAI üç parçalı bir sonuç döndürür:

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

Her üç değer de enjekte edilmelidir. Herhangi birinin eksik olması doğrulamanın başarısız olmasına neden olur.

Adım 1: Parametreleri Çıkarın ve Çözün

Tüm çerçevelerde ortaktır - gt ve challenge'yi çıkarın, ardından CaptchaAI ile çözün:

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

Adım 2: Oyun Yazarına Ekleme (Python)

Parametreleri Çıkart

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

Çözümü enjekte edin

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

Yöntem 2: GeeTest Geri Aramasını Tetikleyin

Bazı siteler form alanları yerine GeeTest'in JavaScript geri çağırma özelliğini kullanır:

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

Adım 3: Puppeteer'a enjekte edin (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');
}

Adım 4: Selenyum'a (Python) enjekte edin

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

XHR Tabanlı Gönderimleri İşleme

Bazı siteler GeeTest sonuçlarını POST formu yerine XHR aracılığıyla gönderir. İsteği durdurun ve değiştirin:

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

Sorun giderme

Sorun Sebep Düzeltme
"GeeTest doğrulaması başarısız oldu" Üç değerden biri eksik Üç değerin de eklendiğini doğrulayın
Enjeksiyondan önce meydan okumanın süresi doldu Çıkarma ve çözme arasında çok uzun Hızlı bir şekilde art arda çıkartın ve çözün
Form gönderilir ancak değerler dahil edilmez Yanlış alan adları veya form seçici Doğru adları bulmak için gerçek formu inceleyin
Geri arama tetiklenmedi Site özel bir geri arama adı kullanıyor initGeetest seçeneklerinde geri aramayı bulun
Değerler enjekte edildi ancak widget hala görünüyor Widget durumu güncellenmedi Başarı geri aramasını programlı olarak tetikleyin

SSS

Enjeksiyondan sonra GeeTest widget'ını görsel olarak gizlemem gerekir mi?

Hayır. Widget'ın görsel durumu form gönderimini etkilemez. Üç değer form verilerinde olduğu sürece sunucu, widget'ın görünümünden bağımsız olarak bunları doğrular.

GeeTest değerlerini tarayıcı olmadan enjekte edebilir miyim?

Evet, eğer site üç değere sahip doğrudan bir HTTP POST'u kabul ediyorsa. Form gönderim uç noktasını yakalayın ve değerleri requests veya herhangi bir HTTP istemcisi aracılığıyla gönderin.

GeeTest neden bir belirteç yerine üç ayrı değer kullanıyor?

Üç değer farklı amaçlara hizmet eder: geetest_challenge oturumu izler, geetest_validate sorunun çözüldüğünü kanıtlar ve geetest_seccode kurcalama tespiti için bir karma sağlar.

İlgili Makaleler

Sonraki Adımlar

GeeTest çözümlerini herhangi bir çerçeveye enjekte edin -CaptchaAI API anahtarınızı alınve çözmeye başlayın.

Bu makale için yorumlar devre dışı bırakılmıştır.