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
- Geetest V3 Düğümlerini Çözme
- Geetest V3 Nodejs Captchaai'yi Çözme
- Mobil Tarayıcı Otomasyonu Captcha Çözme
Sonraki Adımlar
GeeTest çözümlerini herhangi bir çerçeveye enjekte edin -CaptchaAI API anahtarınızı alınve çözmeye başlayın.