Tutorials

GeeTest v3 Slider Parametre Çıkarma ve Çözme

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:

  • gt ve challenge parametrelerini üç farklı yöntemle çıkarın.
  • Değerleri CaptchaAI'nin geetest yö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/axios ile 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:

  • gt istekler arasında sabit kalır; bir kez çıkarıp önbelleğe alabilirsiniz.
  • challenge CAPTCHA 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 (initGeetest kancası): 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; ancak challenge bazı 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", ... }

product gibi 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:

  1. gt, challenge ve pageurl değerlerini geetest yöntemiyle in.php uç noktasına gönderin.
  2. Dönen görev kimliğini res.php üzerinden sorgulayın; CAPCHA_NOT_READY yanıtı geldiği sürece 5 saniye aralıkla beklemeye devam edin.
  3. Durum 1 olduğ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ızca challenge'ı 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.


İlgili kılavuzlar

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