Tutorials

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

GeeTest v3 otomasyonunda asıl zorluk CAPTCHA'yı çözmek değil, çözümü sayfada tam olarak doğru yere yerleştirmektir. CaptchaAI size geetest_challenge, geetest_validate ve geetest_seccode olmak üzere üç değer döndürür; sitenin bu üçünü nerede beklediğini (gizli form alanları, JavaScript callback'i veya bir XHR yükü) bilmezseniz gönderim sessizce başarısız olur ve widget yeniden yüklenir. Bu rehber, üç değeri Playwright, Puppeteer ve Selenium oturumlarınıza tam olarak nereye ve nasıl ekleyeceğinizi çalışan örneklerle gösterir.

GeeTest v3 tek bir token değil, üç değer döndürür

reCAPTCHA veya Turnstile'ın aksine GeeTest v3, tek bir g-recaptcha-response benzeri alanla çalışmaz. CaptchaAI çözümü tamamladığında üç parçalı bir sonuç alırsınız:

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

Her değerin ayrı bir işlevi vardır:

  • geetest_challenge — oturumu izleyen, sunucunun ürettiği challenge dizesi.
  • geetest_validate — challenge'ın çözüldüğünü kanıtlayan doğrulama değeri.
  • geetest_seccode — kurcalamayı tespit etmek için kullanılan karma (validate|... biçiminde).

Üçünün de eklenmesi zorunludur. Herhangi biri eksik kalırsa sunucu doğrulamayı reddeder — bu, GeeTest enjeksiyonunda en sık karşılaşılan hatadır. Bu yüzden aşağıdaki her yöntemde üçünü tek bir sözlükten okuyup birlikte yazıyoruz; değerleri ayrı ayrı ele almak, birini atlamanın en kolay yoludur.

Adım 1: Parametreleri çıkarın ve CaptchaAI ile çözün

Bu adım tüm çerçevelerde aynıdır: sayfadan gt ve challenge değerlerini alın, ardından bunları CaptchaAI'ye gönderip sonucu sorgulayın. Aşağıdaki fonksiyon görevi gönderir ve token hazır olana kadar res.php uç noktasını periyodik olarak sorgular:

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

YOUR_API_KEY yerine panelinizdeki API anahtarınızı koyun. Fonksiyon üç değeri içeren bir sözlük döndürür; enjeksiyonu bunun üzerine kurarız.

Adım 2: Playwright'a token ekleme (Python)

Parametreleri yakalayın

GeeTest, gt ve challenge değerlerini sayfa yüklenirken register çağrısıyla alır. Ağ yanıtlarını dinleyerek bunları geçerken yakalayabilirsiniz:

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

Çoğu site üç değeri gizli form alanlarında bekler. Aşağıdaki blok, alanlar yoksa oluşturur ve değerleri yazar, sonra formu gönderir:

# 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 callback'ini tetikleyin

Bazı siteler gizli form alanları yerine GeeTest'in JavaScript callback'ini kullanır. Bu durumda değerleri doğrudan captchaObj üzerine yazıp başarı olayını tetiklersiniz:

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

Doğru yöntemi seçmek için sayfanın initGeetest çağrısına bakın:

  • onSuccess callback'i tanımlıysa Yöntem 2'yi (callback tetikleme) kullanın.
  • Gizli input alanları varsa Yöntem 1 (form alanı) yeterlidir.
  • İkisi de yoksa gönderim büyük olasılıkla XHR üzerinden yapılıyordur — aşağıdaki XHR bölümüne bakın.

Adım 3: Puppeteer'a token ekleme (JavaScript)

Node.js tabanlı bir iş akışında aynı mantık Puppeteer ile birebir uygulanabilir: yanıtları dinleyip gt ve challenge değerlerini yakalayın, CaptchaAI ile çözün ve üç değeri gizli alanlara yazın. Playwright örneğinden tek fark, ağ dinleyicisinin ve evaluate çağrısının Puppeteer sözdizimiyle yazılmasıdır; alan adları ve enjeksiyon sırası aynı kalır.

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: Selenium'a token ekleme (Python)

Selenium'da parametreleri ağ yanıtı yerine DOM'daki data-gt ve data-challenge niteliklerinden okumak daha pratiktir. Çözümden sonra üç değeri yine JavaScript ile enjekte edersiniz:

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 ile gönderilen formları işleme

E-ticaret ve fintech uygulamalarında checkout veya giriş akışları GeeTest sonuçlarını klasik form POST'u yerine XHR ile gönderir. Türkiye'deki ödeme entegrasyonlarının QA testlerinde bu desen sık görülür. Bu durumda isteği durdurup gövdesine üç değeri eklersiniz:

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

Not: Otomasyonu yalnızca yetkiniz olan sistemlerde ve kendi QA ortamınızda çalıştırın; topladığınız kişisel veriler KVKK kapsamına girer, bu yüzden örneklerde staging.example.com gibi test hedefleri kullanıyoruz.

Sorun giderme

Aşağıdaki tablo, GeeTest enjeksiyonunda en çok vakit kaybettiren durumları ve hızlı çözümlerini toplar:

Sorun Sebep Düzeltme
"GeeTest doğrulaması başarısız oldu" Üç değerden biri eksik Üç değerin de forma yazıldığını doğrulayın
Enjeksiyondan önce challenge'ın süresi doldu Çıkarma ile çözme arasında çok fazla süre geçti Değerleri çıkarıp hemen art arda çözün
Form gönderiliyor ama değerler gitmiyor Yanlış alan adı veya form seçici Gerçek formu inceleyip doğru name değerlerini bulun
Callback tetiklenmiyor Site özel bir callback adı kullanıyor Callback'i initGeetest seçeneklerinde arayın
Değerler eklendi ama widget hâlâ duruyor Widget durumu güncellenmedi Başarı callback'ini programlı olarak tetikleyin

Sık sorulan sorular

CaptchaAI, GeeTest'in hangi sürümünü çözer?

CaptchaAI GeeTest v3'ü tam olarak (GA) destekler ve bu rehberdeki geetest method'u onun içindir. GeeTest v4 henüz desteklenmiyor; yalnızca "çok yakında" olarak planlanmıştır. Sürümü ayırt etmek için widget'ın yüklediği script'e bakın: v4, farklı bir uç nokta ve tek parçalı bir yanıt kullanır.

Tarayıcı açmadan token ekleyebilir miyim?

Evet. Site üç değeri kabul eden doğrudan bir HTTP POST'a izin veriyorsa, form gönderim uç noktasını yakalayıp değerleri requests veya herhangi bir HTTP istemcisiyle gönderebilirsiniz. Adım 1'deki solve_geetest fonksiyonu tarayıcıdan bağımsız çalışır.

GeeTest token'ları ne kadar süre geçerli kalır?

Challenge'lar kısa ömürlüdür; genellikle birkaç dakika içinde geçersiz olur. Bu yüzden çıkarma, çözme ve enjeksiyonu tek bir akışta art arda yapın. Değeri saklayıp sonra kullanmayın — süresi dolmuş bir challenge sunucuda reddedilir.

Üç değerden biri eksik olursa ne olur?

Sunucu doğrulamayı tamamen reddeder; kısmi kabul yoktur. geetest_challenge oturumu izler, geetest_validate çözümün geçerliliğini kanıtlar ve geetest_seccode kurcalamayı tespit eden bir karma taşır. Üçü birlikte gönderilmezse istek başarısız olur.

Hangi çerçeveyi seçmeliyim: Playwright, Puppeteer mı Selenium mı?

Yeni bir Python projesinde ağ yakalama ve XHR durdurma en pürüzsüz Playwright'ta çalışır. Node.js ekosisteminde Puppeteer doğal seçimdir. Mevcut bir Selenium test paketiniz varsa Adım 4'teki JavaScript enjeksiyonu yeterlidir; çerçeveyi değiştirmenize gerek yoktur. Üçünde de mantık aynıdır.

İlgili makaleler

Sonraki adımlar

GeeTest çözümlerini herhangi bir çerçeveye ekleyin — BASIC planla ($15/ay, 5 thread) başlayabilir, CaptchaAI API anahtarınızı alıp ilk oturumunuzda token'ı çözebilirsiniz.

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