GeeTest v3 kaydırıcısını API ile çözerken zor olan kısım çözümün kendisi değil, doğru parametreleri zamanında yakalamaktır. challenge değeri her sayfa yüklemesinde yeniden üretilir; bir iki saniye geç kalırsanız elinizdeki değer çoktan geçersizdir. Bu rehberin izlediği yol şudur:
gtvechallengeparametrelerini üç farklı yöntemle çıkarın.- Değerleri CaptchaAI'nin
geetestyöntemine gönderin ve sonucu sorgulayın. - Dönen çözümü forma enjekte edip doğrulamayı tamamlayın.
Başlamadan önce
Örnekleri çalıştırmak için birkaç şeye ihtiyacınız var:
- Bir CaptchaAI API anahtarı (panelden alınır).
- Python veya Node.js kurulu bir ortam ve
requests/axiosile Puppeteer. - GeeTest v3 doğrulaması içeren, üzerinde test yetkiniz olan bir hedef sayfa.
GeeTest v3 hangi parametreleri ister?
| Parametre | Açıklama | Statik/Dinamik | Örnek |
|---|---|---|---|
gt |
Site tanımlayıcı (32 karakterlik onaltılık) | Site başına statik | 019924a82c70bb123aae90d483b6a0ed |
challenge |
Oturum token'ı (32 karakterlik onaltılık) | Sayfa yükleme başına dinamik | a3f5c8d2e1b04a6789012345678abcdf |
api_server |
GeeTest API alt alanı (isteğe bağlı) | Site başına statik | api-na.geetest.com |
Üç değerin davranışı birbirinden farklıdır ve GeeTest v3 otomasyonundaki hataların çoğu bu farkı gözden kaçırmaktan doğar:
gtistekler arasında sabit kalır; bir kez çıkarıp önbelleğe alabilirsiniz.challengeCAPTCHA her yüklendiğinde değişir; her çözme girişiminden hemen önce taze bir tane almanız şarttır.api_serverçoğu kurulumda gerekmez; yalnızca site GeeTest'in bölgesel bir alt alanını kullanıyorsa sorun gidermeyi kolaylaştırır ve CaptchaAI'ye göndermek zorunlu değildir.
Pratik bir örnek: Türkiye'deki bir e-ticaret ekibinin staging.example.com/qa-login hazırlık ortamında oturum akışını otomatik test ettiğini düşünün. Kazınan veriler kişisel veri içeriyorsa KVKK kapsamına girer; bu işleri yalnızca yetkili QA akışları içinde yürütün.
Hangi çıkarma yöntemini seçmeliyim?
Aşağıdaki üç yöntem aynı iki değeri hedefler; farkları güvenilirlik ve maliyettir:
- Yöntem 1 (register isteği): Ağ trafiğine erişebiliyorsanız en sağlam seçim; değerleri ham yanıttan okur.
- Yöntem 2 (sayfa kaynağı): Parametreler HTML'ye gömülüyse en hızlısıdır ve tarayıcı gerektirmez.
- Yöntem 3 (
initGeetestkancası): Değerler yalnızca çalışma zamanında üretiliyorsa tek geçerli yoldur; yapılandırmayı bütünüyle verir.
Uygulamada çoğu ekip Yöntem 1'i varsayılan alır ve HTML'ye gömülü değerler için Yöntem 2'ye düşer.
Yöntem 1: register isteğini yakalama
Çoğu GeeTest v3 kurulumu, doğrulamayı bir kayıt (register) uç noktasından çeker. Yanıt tipik olarak şöyle görünür:
{
"success": 1,
"challenge": "a3f5c8d2e1b04a6789012345678abcdf",
"gt": "019924a82c70bb123aae90d483b6a0ed",
"new_captcha": true
}
Python (requests)
import requests
import re
session = requests.Session()
html = session.get("https://staging.example.com/qa-login").text
# Find the register endpoint
register_url = re.search(
r'(https?://[^"\']+(?:register|captcha|geetest)[^"\']*)',
html
)
if register_url:
resp = session.get(register_url.group(1)).json()
gt = resp["gt"]
challenge = resp["challenge"]
print(f"gt: {gt}")
print(f"challenge: {challenge}")
JavaScript (Puppeteer ağ müdahalesi)
const puppeteer = require('puppeteer');
const browser = await puppeteer.launch();
const page = await browser.newPage();
let geetestParams = {};
page.on('response', async (response) => {
const url = response.url();
if (url.includes('register') || url.includes('captcha')) {
try {
const json = await response.json();
if (json.gt && json.challenge) {
geetestParams = {
gt: json.gt,
challenge: json.challenge,
};
console.log('Captured GeeTest params:', geetestParams);
}
} catch (e) {}
}
});
await page.goto('https://staging.example.com/qa-login', { waitUntil: 'networkidle2' });
console.log('Final params:', geetestParams);
Değerleri doğrudan GeeTest'in ürettiği ham yanıttan okuduğu için genellikle en güvenilir yöntem budur.
Yöntem 2: sayfa kaynağından parametre okuma
Bazı siteler parametreleri doğrudan HTML'ye veya satır içi script'lere gömer. Böyle durumlarda ağ trafiğini dinlemeye gerek kalmadan sayfa kaynağını düzenli ifadelerle tarayabilirsiniz:
import re
# From data attributes
gt_match = re.search(r'data-gt=["\']([a-f0-9]{32})', html)
challenge_match = re.search(r'data-challenge=["\']([a-f0-9]{32})', html)
# From JavaScript variables
if not gt_match:
gt_match = re.search(r'gt\s*[=:]\s*["\']([a-f0-9]{32})', html)
if not challenge_match:
challenge_match = re.search(r'challenge\s*[=:]\s*["\']([a-f0-9]{32})', html)
gt = gt_match.group(1) if gt_match else None
challenge = challenge_match.group(1) if challenge_match else None
print(f"gt={gt}, challenge={challenge}")
gt'yi güvenilir biçimde bulur; ancakchallengebazı sitelerde HTML'ye hiç yazılmaz. O durumda Yöntem 1'e veya Yöntem 3'e geçin.
Yöntem 3: initGeetest çağrısını kancalama
GeeTest v3, initGeetest() fonksiyonuyla başlatılır. Sayfa script'leri çalışmadan önce bu çağrıyı araya girip yakalayabilirsiniz:
// Puppeteer: inject before page scripts
await page.evaluateOnNewDocument(() => {
window.__geetestConfig = null;
const origInit = window.initGeetest;
Object.defineProperty(window, 'initGeetest', {
set(fn) {
this._initGeetest = function(config, callback) {
window.__geetestConfig = config;
console.log('GeeTest config:', JSON.stringify(config));
return fn(config, callback);
};
},
get() { return this._initGeetest; }
});
});
await page.goto('https://staging.example.com/qa-login', { waitUntil: 'networkidle2' });
const config = await page.evaluate(() => window.__geetestConfig);
// config = { gt: "019924a...", challenge: "a3f5c8d...", product: "bind", ... }
productgibi ek alanları da yakaladığından, yapılandırmanın tamamını görmek istediğinizde en kapsamlı yöntem budur.
GeeTest v3'ü CaptchaAI ile çözme
Akış üç adımdan oluşur:
gt,challengevepageurldeğerlerinigeetestyöntemiylein.phpuç noktasına gönderin.- Dönen görev kimliğini
res.phpüzerinden sorgulayın;CAPCHA_NOT_READYyanıtı geldiği sürece 5 saniye aralıkla beklemeye devam edin. - Durum
1olduğunda çözümü ayrıştırıp forma enjekte edin.
Python
import requests
import time
API_KEY = "YOUR_API_KEY"
# Submit
resp = requests.post("https://ocr.captchaai.com/in.php", data={
"key": API_KEY,
"method": "geetest",
"gt": gt,
"challenge": challenge,
"pageurl": "https://staging.example.com/qa-login",
"json": "1",
}).json()
if resp["status"] != 1:
raise Exception(f"Submit error: {resp['request']}")
task_id = resp["request"]
# Poll
for _ in range(30):
time.sleep(5)
result = requests.get("https://ocr.captchaai.com/res.php", params={
"key": API_KEY, "action": "get", "id": task_id, "json": "1"
}).json()
if result["status"] == 1:
solution = result["request"]
print(f"Solution: {solution}")
break
if result["request"] != "CAPCHA_NOT_READY":
raise Exception(f"Error: {result['request']}")
JavaScript
const submit = await axios.post('https://ocr.captchaai.com/in.php', null, {
params: {
key: 'YOUR_API_KEY',
method: 'geetest',
gt: geetestParams.gt,
challenge: geetestParams.challenge,
pageurl: 'https://staging.example.com/qa-login',
json: 1,
}
});
const taskId = submit.data.request;
let solution = null;
for (let i = 0; i < 30; i++) {
await new Promise(r => setTimeout(r, 5000));
const poll = await axios.get('https://ocr.captchaai.com/res.php', {
params: { key: 'YOUR_API_KEY', action: 'get', id: taskId, json: 1 }
});
if (poll.data.status === 1) {
solution = poll.data.request;
break;
}
}
console.log('Solution:', solution);
GeeTest v3 çözümünü forma enjekte etme
CaptchaAI'nin GeeTest v3 yanıtı üç alan döndürür: challenge, validate ve seccode. Bu üçünü formdaki gizli alanlara yazmanız gerekir:
# solution is a pipe-delimited string or JSON object
# Parse and inject into the form
import json
sol = json.loads(solution) if isinstance(solution, str) else solution
driver.execute_script("""
const form = document.querySelector('form');
function addHidden(name, value) {
let input = form.querySelector(`input[name="${name}"]`);
if (!input) {
input = document.createElement('input');
input.type = 'hidden';
input.name = name;
form.appendChild(input);
}
input.value = value;
}
addHidden('geetest_challenge', arguments[0]);
addHidden('geetest_validate', arguments[1]);
addHidden('geetest_seccode', arguments[2]);
""", sol["challenge"], sol["validate"], sol["seccode"])
Alanları ekledikten sonra formu normal akışıyla gönderin; site geetest_validate ve geetest_seccode değerlerini kendi tarafında doğrular. Selenium kullanıyorsanız driver nesnesinin doğru sayfa bağlamında olduğundan, form bir iframe içindeyse önce ilgili frame'e geçtiğinizden emin olun. Enjeksiyon ile gönderim arasındaki gecikmeyi de düşük tutun, aksi halde challenge yeniden eskiyebilir.
Sık karşılaşılan hatalar ve çözümleri
| Sorun | Sebep | Çözüm |
|---|---|---|
ERROR_BAD_PARAMETERS |
gt veya challenge eksik |
İkisi de zorunludur; değerleri yeniden çıkarın |
Eskimiş challenge |
challenge token'ının süresi dolmuş |
Göndermeden hemen önce yeni bir challenge çıkarın |
Yanlış gt değeri |
Başka bir siteden kopyalanmış | gt siteye özeldir; hedeften yeniden çıkarın |
| Çözüm site tarafından reddedildi | Çözüm sırasında challenge süresi doldu |
Çıkarma ile gönderme arasındaki süreyi kısaltın |
Üretim için ipuçları
Akışı tek seferlik bir betikten kararlı bir servise taşırken şunlara dikkat edin:
gt'yi önbelleğe alın, her istekte yalnızcachallenge'ı yenileyin.- Çıkarma adımını yeniden denenebilir yapın ve yöntemleri sırayla deneyin.
- Çıkarma ile gönderme arasını mümkün olan en kısa sürede tutun.
Sık sorulan sorular
GeeTest v3 challenge değeri ne kadar süre geçerli kalır?
Tipik olarak 60–120 saniye. challenge'ı çıkardıktan sonra beklemeden CaptchaAI'ye gönderin; aradaki gecikme uzarsa değer eskir ve çözüm reddedilir.
CaptchaAI GeeTest v4'ü destekliyor mu?
Şu an için hayır. CaptchaAI GeeTest v3'ü destekler; GeeTest v4 çok yakında gelecek ancak henüz kullanılabilir değil. Aradaki fark: v3, gt/challenge ile bir kaydırıcı kullanır; v4 ise captcha_id kullanır ve birden fazla zorluk türü içerir.
GeeTest v3 çözümü için hangi CaptchaAI planı yeterli?
Tek bir otomasyon akışı için BASIC ($15/ay, 5 thread) genellikle yeterlidir. Çözümleri paralel yürütmeniz gerekiyorsa STANDARD ($30/ay, 15 thread) veya ADVANCE ($90/ay, 50 thread) planına geçebilirsiniz. Ücretlendirme thread başınadır ve her planda thread başına çözüm sınırsızdır.
gt doğru olduğu halde çözüm neden reddediliyor?
Neredeyse her zaman challenge değerinin eskimesi yüzündendir. gt siteye özel ve statiktir, dolayısıyla nadiren sorun çıkarır; challenge ise dinamiktir. Çıkarma ile gönderme arasındaki süreyi kısaltın ve her denemede taze bir challenge alın.
Parametre çıkarmayı üretimde nasıl daha kararlı hale getiririm?
gt değerini bir kez çıkarıp önbelleğe alın, her istekte yalnızca challenge'ı yenileyin. Çıkarma adımını yeniden denenebilir yapın: bir yöntem parametreyi bulamazsa diğerine düşecek şekilde sıralayın. Böylece site kurulumunu değiştirse bile akışınız tek bir yönteme bağlı kalmaz.
GeeTest v3 CAPTCHA'larını CaptchaAI ile çözün
Parametre çıkarma ve geetest yöntemine gönderme adımlarını bir araya getirdiğinizde, GeeTest v3 kaydırıcısını uçtan uca çözen kararlı bir akış elde edersiniz.
API anahtarınızı şu adresten alın: captchaai.com.