GeeTest v3 doğrulamasını CaptchaAI API'siyle çözmek dört adımdan oluşur: sayfadan gt ve challenge değerlerini çıkarın, bunları geetest metoduyla in.php'ye gönderin, res.php üzerinden sonucu sorgulayın ve dönen üç değeri (geetest_challenge, geetest_validate, geetest_seccode) hedef forma iletin. Süreç tipik olarak 12 saniyenin altında, yüksek başarı oranıyla tamamlanır.
reCAPTCHA'nın aksine GeeTest, sabit bir sitekey yerine sayfaya özgü gt değeri ile oturuma özgü challenge değerini birlikte kullanan özel bir doğrulama akışı çalıştırır — arayüzde slayt bulmaca, simge seçimi veya kelime eşleştirme görseniz de bu ikili arka planda her zaman aynı şekilde işler. Bu rehber, parametrelerin çıkarılmasından çözümün hedef siteye gönderilmesine kadar tüm akışı Python ve Node.js örnekleriyle gösterir.
Not: CaptchaAI şu anda yalnızca GeeTest v3'ü çözer. GeeTest v4 farklı bir protokol kullanır ve henüz desteklenmiyor; entegrasyona başlamadan önce hedef sitenin hangi sürümü çalıştırdığını doğrulayın.
Örnek senaryo: Bir e-ticaret QA ekibinin GeeTest v3 testi
Bir e-ticaret platformunun kayıt formu GeeTest v3 slayt bulmacası kullanıyor. İstanbul merkezli bir otomasyon ekibi bu formu her gece Europe/Istanbul saat diliminde çalışan bir QA hattında test ediyor; test verilerinde +90 formatlı sahte telefon numaraları kullanılıyor ve gerçek kullanıcı bilgisi hiç geçmiyor — bu hem KVKK kapsamındaki kişisel veri riskini ortadan kaldırıyor hem de testin staging ortamıyla sınırlı kalmasını sağlıyor. Akış dört aşamada tamamlanıyor:
| Aşama | Ne olur |
|---|---|
| 1 | QA betiği sitenin kayıt uç noktasını çağırır, gt ve challenge değerlerini alır |
| 2 | Değerler geetest metoduyla CaptchaAI'ye gönderilir |
| 3 | res.php sorgulanır; challenge, validate, seccode değerleri döner |
| 4 | Üç değer test ortamındaki forma iletilir, kayıt akışı tamamlanır |
Aşağıdaki dört adım, bu aşamaların kod düzeyindeki karşılığıdır.
Gereksinimler
Başlamadan önce şunlara ihtiyacınız var:
- CaptchaAI API anahtarı — captchaai.com üzerinden edinin
- GeeTest
gtdeğeri — site başına sabit tanımlayıcı - GeeTest
challengedeğeri — oturum başına değişen, tek kullanımlık değer - Sayfa URL'si — GeeTest doğrulamasının göründüğü sayfa
- Dil ortamı — Python 3.7+ veya Node.js 14+
Adım 1: GeeTest parametrelerini sayfadan çıkarın
GeeTest üç parametre gerektirir: gt her istekte aynıdır, challenge ise her oturumda değişir ve tek kullanımlıktır. Üç yöntemden biriyle çıkarabilirsiniz.
Yöntem 1: Ağ sekmesi
- DevTools → Ağ sekmesini açın
register-slide,gettype.phpveyaget.phpisteğine göre filtreleyin- CAPTCHA'yı tetikleyin ve başlatma isteğini bulun
- Yanıt
gt,challengeve bazenapi_serverdeğerini içerir
{
"success": 1,
"gt": "019924a82c70bb123aae90d483087f94",
"challenge": "12345678abc90def12345678abc90def",
"new_captcha": true
}
Yöntem 2: Sayfa kaynağı
Bazı sitelerde gt değeri sayfa kaynağındaki initGeetest çağrısının içinde düz metin olarak durur; konsol üzerinden arayarak bulabilirsiniz.
// Search page source for initGeetest or gt value
document.querySelectorAll('script').forEach(s => {
if (s.textContent.includes('initGeetest')) {
console.log(s.textContent);
}
});
Yöntem 3: API uç noktası
Birçok site GeeTest parametrelerini kendi kayıt uç noktasından JSON olarak döndürür — yukarıdaki örnek senaryodaki gibi, DevTools açmadan doğrudan bu uç noktayı otomasyon betiğinizden çağırabilirsiniz:
# The site's registration endpoint
params_response = requests.get("https://example.com/api/captcha/register")
data = params_response.json()
gt = data["gt"]
challenge = data["challenge"]
Bu yöntem CI/CD hatlarında ve toplu QA testlerinde özellikle işe yarar, çünkü tarayıcı başlatmadan çalışır.
Adım 2: Görevi CaptchaAI API'sine gönderin
Çıkardığınız gt ve challenge değerlerini geetest metoduyla in.php uç noktasına gönderin. api_server parametresini ne zaman eklemeniz gerektiği basittir:
- Site yanıtı zaten bir
api_serverdeğeri içeriyorsa, onu aynen iletin - İçermiyorsa parametreyi tamamen atlayın — CaptchaAI varsayılan sunucuyu kullanır
Python
import requests
import time
API_KEY = "YOUR_API_KEY"
response = requests.get("https://ocr.captchaai.com/in.php", params={
"key": API_KEY,
"method": "geetest",
"gt": "019924a82c70bb123aae90d483087f94",
"challenge": "12345678abc90def12345678abc90def",
"api_server": "api.geetest.com", # Optional, use if site specifies
"pageurl": "https://staging.example.com/qa-login",
"json": 1
})
data = response.json()
if data.get("status") != 1:
raise Exception(f"Submit error: {data.get('request')}")
task_id = data["request"]
print(f"Task submitted: {task_id}")
Node.js alternatifi:
const axios = require('axios');
const API_KEY = 'YOUR_API_KEY';
async function submitGeeTest(gt, challenge, pageurl) {
const { data } = await axios.get('https://ocr.captchaai.com/in.php', {
params: {
key: API_KEY,
method: 'geetest',
gt,
challenge,
api_server: 'api.geetest.com',
pageurl,
json: 1
}
});
if (data.status !== 1) throw new Error(`Submit error: ${data.request}`);
return data.request;
}
Adım 3: Çözüm sonucunu sorgulayın
GeeTest çözümü tek bir token değil, üç ayrı değer döndürür: challenge, validate ve seccode. res.php uç noktasını periyodik olarak sorgulayarak sonucu alın.
Python
def get_geetest_solution(task_id):
for attempt 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.get("status") == 1:
return result["request"]
if result.get("request") != "CAPCHA_NOT_READY":
raise Exception(f"Error: {result.get('request')}")
raise Exception("Timeout")
solution = get_geetest_solution(task_id)
# solution = {
# "geetest_challenge": "12345678abc90def12345678abc90def1a",
# "geetest_validate": "abcdef1234567890abcdef1234567890",
# "geetest_seccode": "abcdef1234567890abcdef1234567890|jordan"
# }
Node.js alternatifi:
async function getGeeTestSolution(taskId) {
for (let i = 0; i < 30; i++) {
await new Promise(r => setTimeout(r, 5000));
const { data } = await axios.get('https://ocr.captchaai.com/res.php', {
params: { key: API_KEY, action: 'get', id: taskId, json: 1 }
});
if (data.status === 1) return data.request;
if (data.request !== 'CAPCHA_NOT_READY') throw new Error(data.request);
}
throw new Error('Timeout');
}
Adım 4: Çözümü hedef siteye gönderin
Üç değeri de sitenin doğrulama uç noktasına iletin. Formda başka zorunlu alanlar varsa (kullanıcı adı, şifre vb.) bunları aynı istekte gönderin.
# Submit the GeeTest solution with the form data
verify_response = requests.post("https://example.com/api/login", data={
"username": "user@example.com",
"password": "password123",
"geetest_challenge": solution["geetest_challenge"],
"geetest_validate": solution["geetest_validate"],
"geetest_seccode": solution["geetest_seccode"]
})
print(f"Login status: {verify_response.status_code}")
Gerçek kullanıcı bilgileriyle test yapmayın; QA akışında her zaman test hesapları ve staging ortamı kullanın. Bu hem KVKK uyumluluğu hem de hedef sitenin gerçek verisini korumak açısından önemlidir.
Eksiksiz Python örneği
Yukarıdaki dört adımı tek bir betikte birleştirirsek:
import requests
import time
API_KEY = "YOUR_API_KEY"
SITE_URL = "https://staging.example.com/qa-login"
# 1. Get GeeTest parameters from the site
params = requests.get("https://example.com/api/captcha/register").json()
# 2. Submit to CaptchaAI
submit = requests.get("https://ocr.captchaai.com/in.php", params={
"key": API_KEY,
"method": "geetest",
"gt": params["gt"],
"challenge": params["challenge"],
"pageurl": SITE_URL,
"json": 1
}).json()
task_id = submit["request"]
# 3. Poll for solution
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.get("status") == 1:
solution = result["request"]
break
# 4. Submit to site
login = requests.post(SITE_URL, data={
"username": "user@example.com",
"password": "pass",
"geetest_challenge": solution["geetest_challenge"],
"geetest_validate": solution["geetest_validate"],
"geetest_seccode": solution["geetest_seccode"]
})
print(f"Result: {login.status_code}")
Sorun giderme
GeeTest entegrasyonlarında en sık karşılaşılan dört hata ve düzeltmeleri:
ERROR_BAD_PARAMETERS—gtveyachallengeeksik. İkisi de zorunludur; sayfadan yeniden çıkarın.ERROR_CAPTCHA_UNSOLVABLE—challengedeğerinin süresi doldu veya geçersiz. Siteden yeni birchallengeisteyin.- Çözüm site tarafından reddedildi — eski
challengedeğeri kullanıldı.challengetek kullanımlıktır; her denemede yeniden alın. geetest_validateboş döner — çözüm dahili olarak başarısız oldu. Yeni birchallengeile yeniden deneyin.
Tam çalıştırılabilir örnek
Ortam kurulumu, sorgulama, yeniden deneme mantığı ve hata işleme dahil eksiksiz bir proje mi arıyorsunuz?
Çalıştırılabilir tam örneği GitHub'da inceleyin →
SSS
GeeTest v3 entegrasyonu sırasında geliştiricilerin en çok sorduğu beş soru:
GeeTest v3'te challenge değerini her denemede neden yeniden almam gerekiyor?
challenge tek kullanımlıktır. Bir kez tüketildiğinde — başarılı bir çözümle veya süre aşımıyla — sitenin arka ucu aynı değeri bir daha kabul etmez. Her çözüm denemesinden önce sayfadan yeni bir challenge çekin.
GeeTest v3 parametrelerini DevTools kullanmadan nasıl bulabilirim?
Birçok site gt ve challenge değerlerini kendi kayıt uç noktasından JSON olarak döndürür (bkz. Yöntem 3). Bu uç noktayı otomasyon betiğinizden doğrudan çağırarak tarayıcı hiç başlatmadan parametreleri alabilirsiniz.
GeeTest v3 çözümü CaptchaAI ile ne kadar sürer?
Genellikle 12 saniyenin altında, yüksek başarı oranıyla tamamlanır. Slayt, simge ve kelime eşleştirme zorlukları benzer sürelerde çözülür çünkü API parametreleri ve akış hepsinde aynıdır.
GeeTest v3 çözümü reddedilirse ne yapmalıyım?
Sırayla kontrol edin:
challengedeğeri güncel mi — reddedilen çözümlerin büyük çoğunluğu eskichallengekullanmaktan kaynaklanırgeetest_validatealanı boş mu dönüyor- Sorun sürerse yeni bir
challengeile yeniden deneyin
Yoğun GeeTest v3 trafiği için hangi CaptchaAI planı yeterli?
Test ve düşük hacimli entegrasyonlar için BASIC ($15/ay, 5 thread) genellikle yeterlidir. Üretimde eşzamanlı istek sayınız arttıkça ADVANCE ($90/ay, 50 thread) veya üzerine geçin — CaptchaAI thread başına sınırsız çözüm sunar, yani maliyetiniz çözüm hacminden değil eşzamanlı thread sayınızdan etkilenir.