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:
onSuccesscallback'i tanımlıysa Yöntem 2'yi (callback tetikleme) kullanın.- Gizli
inputalanları 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
- Node.js ile GeeTest v3 çözme
- CaptchaAI ile Node.js GeeTest v3 çözme rehberi
- Mobil tarayıcı otomasyonunda CAPTCHA çözme
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.