Troubleshooting

Yaygın GeeTest v3 Hataları ve Düzeltmeleri

GeeTest v3 entegrasyonunuz sessizce başarısız oluyorsa, ilk bakmanız gereken yer neredeyse her zaman tektir: gönderdiğiniz challenge değeri artık taze değildir. GeeTest'in dinamik doğrulama modeli her çözüm için yeni bir challenge bekler; eski bir değeri yeniden kullandığınız anda, istek gayet doğru görünse bile çözüm başarısız olur.

Bu davranış, GeeTest v3'ü reCAPTCHA v2 gibi statik anahtarlı türlerden ayıran temel farktır — ve sahadaki hataların büyük bölümü tam olarak buradan kaynaklanır. Geri kalan hatalar ise üç aşamadan birine düşer: gönderim (in.php'ye görev iletme), sonuç sorgulama (res.php'den yanıt bekleme) ve hedef sayfa doğrulaması (API değer döndürür ama sayfa yine de reddeder).

Aşağıda her arıza modelini, aldığınız hata kodundan başlayarak en hızlı düzeltmeye kadar tek tek ele alıyoruz. CaptchaAI'nin GeeTest v3 API belgelerinde de açıkça vurgulandığı gibi: her çözüm isteği için mutlaka yeni bir challenge alın.


En sık görülen hata: bayat challenge değeri

Tek bir şeyi önce kontrol edecekseniz, o da challenge değerinin tazeliğidir.

GeeTest v3 iki temel parametreyle çalışır:

  • gt — genel site anahtarı (statik, değişmez)
  • challenge — dinamik doğrulama anahtarı (her sayfa yüklemesinde yenilenir)

Neden başarısız olur?

challenge değeri, GeeTest widget'ı sayfada başlatıldığında üretilir. Bu değeri bir kez yakalayıp birden fazla çözüm isteğinde yeniden kullanırsanız, ilk istekten sonraki her istek şu iki sonuçtan birini verir:

  • gönderim sırasında API tarafından reddedilir veya
  • süresi dolduğu için hedef sayfanın kabul etmediği bir sonuç üretir

Nasıl düzeltilir?

Her çözüm isteğinden önce sayfanın ağ trafiğini inceleyip yeni bir challenge döndüren API çağrısını bulun. Bu isteği yeniden çalıştırarak taze bir değer alın ve gecikmeden CaptchaAI'ye gönderin.

# Pseudocode: fetch a fresh challenge before each solve
import requests

def get_fresh_challenge(target_url):
    """Hit the GeeTest init endpoint to get a new challenge."""
    resp = requests.get(f"{target_url}/geetest/register", timeout=10)
    data = resp.json()
    return data["challenge"], data["gt"]

challenge, gt = get_fresh_challenge("https://example.com")
# Now submit to CaptchaAI immediately — do not delay

Pratik kural: challenge'ı yakalamanızla çözüm isteğini göndermeniz arasında birkaç saniyeden fazla süre geçtiyse yenileyin.


Gönderim aşaması hataları (in.php)

Bu hatalar, görevi https://ocr.captchaai.com/in.php adresine gönderdiğinizde ortaya çıkar. Çoğu, tek bir alanın eksik ya da hatalı olmasından kaynaklanır:

Hata kodu Neden Düzeltme
ERROR_WRONG_USER_KEY API anahtarının biçimi hatalı (32 karakter olmalı) Anahtarı captchaai.com/api.php üzerinden doğrulayın; fazladan karakter veya boşluk eklemeyin
ERROR_KEY_DOES_NOT_EXIST Anahtar doğru biçimli ama etkin bir hesapla eşleşmiyor Kontrol panelinize girip anahtarınızın etkin olduğunu doğrulayın
ERROR_ZERO_BALANCE Planınızda boşta thread kalmamış Bir thread'in serbest kalmasını bekleyin, eşzamanlılığı düşürün veya planı yükseltin — ör. BASIC ($15/ay, 5 thread) yerine STANDARD ($30/ay, 15 thread)
HTML veya 500/502 yanıtı Geçici sunucu tarafı hatası — parametre sorunu değil 5–10 saniye bekleyip isteği yeniden gönderin

İki hata ise ek dikkat ister:

ERROR_PAGEURL

pageurl parametresi istekten düşmüştür. GeeTest widget'ının yüklendiği sayfanın tam URL'sini ekleyin:

pageurl=https://staging.example.com/qa-login

ERROR_BAD_PARAMETERS

Bir veya daha fazla zorunlu alan eksik ya da hatalı biçimlidir. GeeTest için zorunlu parametreler şunlardır:

Parametre Tür Zorunlu Açıklama
key String Evet CaptchaAI API anahtarınız
method String Evet geetest olmalı
gt String Evet Statik genel site anahtarı
challenge String Evet Dinamik doğrulama anahtarı (taze olmalı)
pageurl String Evet Tam sayfa URL'si

Düzeltme için gt, challenge ve pageurl alanlarının hepsinin mevcut ve doğru biçimli olduğundan emin olun.


Sonuç sorgulama aşaması hataları (res.php)

Bu hatalar, https://ocr.captchaai.com/res.php adresini sorguladığınızda ortaya çıkar. En önemli ayrım şudur: CAPCHA_NOT_READY bir hata değildir.

Yanıt Neden Düzeltme
CAPCHA_NOT_READY Hata değil — çözüm sürüyor (genellikle 12 saniyenin altında, yüksek başarı oranıyla) 5 saniye bekleyip res.php'yi yeniden sorgulayın; bunu başarısızlık saymayın
ERROR_WRONG_ID_FORMAT Captcha ID biçimi yanlış — ID yalnızca sayısal olmalı in.php'nin döndürdüğü ID'yi değiştirmeden kullanın
ERROR_WRONG_CAPTCHA_ID ID, gönderilen hiçbir görevle eşleşmiyor Gönderim yanıtındaki doğru ID'yi kullanın; birden çok görevde doğru olanı sorgulayın
ERROR_CAPTCHA_UNSOLVABLE Bayat challenge veya desteklenmeyen bir GeeTest değişkeni challenge değerini yenileyip yeniden deneyin
ERROR_INTERNAL_SERVER_ERROR CaptchaAI tarafında geçici sunucu sorunu 10 saniye bekleyip yeniden deneyin

ERROR_EMPTY_ACTION

Sorgulama isteğinizde action parametresi yok veya boştur. Her sorgulama isteğine action=get ekleyin:

https://ocr.captchaai.com/res.php?key=YOUR_KEY&action=get&id=CAPTCHA_ID

Hedef sayfa doğrulama hataları

Bunlar hata ayıklaması en zor hatalardır: CaptchaAI API geçerli bir sonuç döndürür ama hedef sayfa yine de reddeder.

GeeTest v3 çözümü başarılı olduğunda API üç değer döndürür:

{
  "challenge": "1a2b3456cd67890e12345fab678901c2de",
  "validate": "09fe8d7c6ba54f32e1dcb0a9fedc8765",
  "seccode": "12fe3d4c56789ba01f2e345d6789c012|jordan"
}

Bu değerler hedef sayfaya şu eşlemeyle gönderilmelidir:

API yanıt alanı Hedef sayfa alanı
challenge geetest_challenge
validate geetest_validate
seccode geetest_seccode

Eşleme doğru görünse bile sayfa reddi sürüyorsa, sorun genellikle dört başlıktan birindedir. Her birini teşhis etmenin en sağlam yolu aynıdır: hedef sayfada başarılı bir manuel GeeTest çözümünün ağ trafiğini yakalayıp kendi isteğinizle karşılaştırmak. Aşağıdaki tablo, belirtiden düzeltmeye giden yolu özetler.

Sorun Belirti Neden Düzeltme
Yanlış alan eşlemesi API değer döndürüyor, sayfa anında reddediyor Değerler yanlış alanlara veya yanlış istek yoluna yerleştirilmiş Manuel çözümün POST isteğini bulup alan adlarınızı birebir eşleştirin
Yukarı akışta bayat challenge Sayfa challenge'ın süresinin dolduğunu veya geçersiz olduğunu bildiriyor challenge çok erken yakalanmış ya da yeniden kullanılmış Her çözümden hemen önce taze challenge alın; önbelleğe almayın, yeniden kullanmayın
Yanlış sayfa bağlamı Taze girdilerle bile doğrulama başarısız oluyor pageurl, widget'ın gerçekte yüklendiği sayfayla eşleşmiyor Protokol ve yol dahil tam URL'yi kullanın; widget AJAX ile başka bir rotaya yükleniyorsa o rotayı verin
İstek yapısı uyumsuzluğu Alanlar doğru ama istek biçimi yanlış Sayfa GeeTest alanlarını farklı bir içerik türünde (JSON/form-encoded) veya ek alanlarla bekliyor Gönderiminizi manuel çözümle karşılaştırıp içerik türünü, alan sırasını ve ek alanları eşleştirin

Pratik senaryo: bir QA otomasyon işinde GeeTest v3

Diyelim ki İstanbul'da serbest çalışan bir otomasyon geliştiricisisiniz ve bir müşteri için GeeTest v3 kullanan bir giriş akışının uçtan uca QA testini yazıyorsunuz. Test paketi her gece çalışıyor ve hiçbir kod değişmediği hâlde zaman zaman bir gün yeşil, ertesi gün kırmızı dönüyor. Bu tür "aralıklı" başarısızlıklar, hata kodunu okumadan saatlerce hata ayıklamaya yol açabilir.

Kök neden neredeyse her zaman aynıdır: test kurulumunda bir kez alınan challenge, tüm senaryolar boyunca yeniden kullanılıyor. İlk senaryo geçiyor, geri kalanlar ise süresi dolmuş challenge yüzünden ERROR_CAPTCHA_UNSOLVABLE alıyor. Çözüm, challenge'ı test kurulumunda değil, her çözüm çağrısının hemen öncesinde almaktır. Bunu bir kez düzelttiğinizde gece koşularındaki gürültü büyük ölçüde kaybolur.

İki pratik not:

  • Maliyet öngörülebilirliği: Türkiye'deki geliştiriciler ödemeyi USD üzerinden yapar ve kur oynaklığı aylık bütçeyi zorlaştırır. CaptchaAI çözüm başına değil, eşzamanlı thread başına ücret aldığı ve her planda çözüm sayısı sınırsız olduğu için aylık maliyet sabit kalır; gece çalışan tek bir test paketi için BASIC ($15/ay, 5 thread) genellikle yeterlidir.
  • KVKK: Kazıma veya otomasyon iş akışlarınız kişisel veri topluyorsa bu veri KVKK kapsamındadır. CaptchaAI'yi yalnızca yetkili olduğunuz QA ve veri toplama akışlarında kullanın; hedef sitenin kullanım koşullarını da göz önünde bulundurun.

Python: taze challenge ile eksiksiz GeeTest v3 çözümü

Aşağıdaki örnek; taze challenge alma, görevi gönderme ve sonucu sorgulama adımlarını tek bir akışta birleştirir.

import time
import requests

API_KEY = "YOUR_CAPTCHAAI_API_KEY"

SUBMIT_URL = "https://ocr.captchaai.com/in.php"
RESULT_URL = "https://ocr.captchaai.com/res.php"


def get_fresh_challenge(target_url):
    """Fetch a fresh GeeTest challenge from the target page."""
    resp = requests.get(f"{target_url}/api/geetest/register", timeout=10)
    data = resp.json()
    return data["gt"], data["challenge"]


def solve_geetest_v3(api_key, gt, challenge, pageurl):
    """Submit a GeeTest v3 challenge and return the validation package."""

    # Submit
    submit_resp = requests.post(
        SUBMIT_URL,
        data={
            "key": api_key,
            "method": "geetest",
            "gt": gt,
            "challenge": challenge,
            "pageurl": pageurl,
            "json": 1,
        },
        timeout=30,
    )
    submit_resp.raise_for_status()
    submit_data = submit_resp.json()

    if submit_data.get("status") != 1:
        raise RuntimeError(f"Submit failed: {submit_data}")

    captcha_id = submit_data["request"]
    print(f"Task created — captcha ID: {captcha_id}")

    # Wait before first poll
    time.sleep(15)

    # Poll for result
    for _ in range(60):
        result_resp = requests.get(
            RESULT_URL,
            params={
                "key": api_key,
                "action": "get",
                "id": captcha_id,
                "json": 1,
            },
            timeout=30,
        )
        result_resp.raise_for_status()
        result_data = result_resp.json()

        if result_data.get("request") == "CAPCHA_NOT_READY":
            time.sleep(5)
            continue

        if result_data.get("status") == 1:
            return result_data["request"]

        raise RuntimeError(f"Polling error: {result_data}")

    raise TimeoutError("GeeTest v3 solve timed out")


# Usage: always fetch a fresh challenge first
PAGE_URL = "https://staging.example.com/qa-login"
gt, challenge = get_fresh_challenge(PAGE_URL)
result = solve_geetest_v3(API_KEY, gt, challenge, PAGE_URL)
print(f"Result: {result}")

# The result contains: challenge, validate, seccode
# Map them to: geetest_challenge, geetest_validate, geetest_seccode

Node.js: taze challenge ile eksiksiz GeeTest v3 çözümü

Aynı akışın Node.js karşılığı:

const API_KEY = "YOUR_CAPTCHAAI_API_KEY";
const SUBMIT_URL = "https://ocr.captchaai.com/in.php";
const RESULT_URL = "https://ocr.captchaai.com/res.php";

function sleep(ms) {
  return new Promise((resolve) => setTimeout(resolve, ms));
}

async function getFreshChallenge(targetUrl) {
  const resp = await fetch(`${targetUrl}/api/geetest/register`);
  const data = await resp.json();
  return { gt: data.gt, challenge: data.challenge };
}

async function solveGeetestV3(apiKey, gt, challenge, pageurl) {
  // Submit
  const submitResp = await fetch(SUBMIT_URL, {
    method: "POST",
    headers: { "Content-Type": "application/x-www-form-urlencoded" },
    body: new URLSearchParams({
      key: apiKey,
      method: "geetest",
      gt: gt,
      challenge: challenge,
      pageurl: pageurl,
      json: "1",
    }),
  });

  const submitData = await submitResp.json();
  if (submitData.status !== 1) {
    throw new Error(`Submit failed: ${JSON.stringify(submitData)}`);
  }

  const captchaId = submitData.request;
  console.log(`Task created — captcha ID: ${captchaId}`);

  await sleep(15_000);

  // Poll for result
  for (let i = 0; i < 60; i++) {
    const resultResp = await fetch(
      `${RESULT_URL}?${new URLSearchParams({
        key: apiKey,
        action: "get",
        id: captchaId,
        json: "1",
      })}`
    );

    const resultData = await resultResp.json();

    if (resultData.request === "CAPCHA_NOT_READY") {
      await sleep(5_000);
      continue;
    }

    if (resultData.status === 1) {
      return resultData.request;
    }

    throw new Error(`Polling error: ${JSON.stringify(resultData)}`);
  }

  throw new Error("GeeTest v3 solve timed out");
}

// Usage
const PAGE_URL = "https://staging.example.com/qa-login";

(async () => {
  const { gt, challenge } = await getFreshChallenge(PAGE_URL);
  const result = await solveGeetestV3(API_KEY, gt, challenge, PAGE_URL);
  console.log("Result:", result);
  // Map result fields to: geetest_challenge, geetest_validate, geetest_seccode
})();

Sık sorulan sorular

GeeTest v3 çözümü CaptchaAI'de ne kadar sürer?

Çözümler genellikle 12 saniyenin altında, yüksek başarı oranıyla tamamlanır. CAPCHA_NOT_READY yanıtı bu süre boyunca normaldir; ilk sorgudan önce yaklaşık 15 saniye bekleyip ardından 5 saniyelik aralıklarla res.php'yi sorgulamak sağlıklı bir varsayılandır.

GeeTest v3 iş yükü için hangi CaptchaAI planı yeterli?

CaptchaAI thread başına ücretlendirir ve her planda çözüm sayısı sınırsızdır. Tek bir entegrasyon veya gece çalışan bir test paketi için BASIC ($15/ay, 5 thread) çoğu durumda yeter; eşzamanlı çözüm hacminiz büyüdükçe STANDARD ($30/ay, 15 thread) veya ADVANCE ($90/ay, 50 thread) planına geçebilirsiniz.

challenge değerini birden fazla istekte yeniden kullanabilir miyim?

Hayır. challenge, widget her yüklendiğinde yenilenen dinamik bir değerdir; bir kez yakalayıp yeniden kullanırsanız ERROR_CAPTCHA_UNSOLVABLE ya da hedef sayfada doğrulama reddi alırsınız. Her çözüm çağrısından hemen önce taze bir challenge alın.

GeeTest widget'ının challenge isteğini DevTools'ta nasıl bulurum?

Tarayıcı DevTools'unda Network sekmesini açıp sayfayı yenileyin ve gettype, register veya get.php gibi çağrıları filtreleyin. Yanıt gövdesinde gt ve challenge alanlarını taşıyan istek, sizin her çözümden önce yeniden çalıştırmanız gereken çağrıdır.

GeeTest v3 çözümünü bir CI/otomasyon işinde nasıl güvenilir kılarım?

Üç alışkanlık işin çoğunu halleder: her çözümden önce taze bir challenge alın, CAPCHA_NOT_READY için üstel geri çekilme (exponential backoff) ile sorgulayın ve ERROR_ZERO_BALANCE görürseniz thread kullanımınızı izleyin. Bu üçü, gece çalışan paketlerdeki aralıklı kırmızıların büyük bölümünü ortadan kaldırır.

CaptchaAI, GeeTest v4'ü destekliyor mu?

Hayır; bu makale yalnızca GeeTest v3'ü kapsar. GeeTest v4 için yalnızca "çok yakında" ifadesi geçerlidir, tür henüz kullanılabilir değildir. Güncel desteklenen türler için CaptchaAI API belgelerine bakın.


GeeTest iş akışınızı düzeltin

GeeTest entegrasyonunuz başarısız oluyorsa şu sırayla ilerleyin:

  1. challenge'ı kontrol edin — Taze mi? Her çözümden hemen önce yenisini alın.
  2. Parametreleri doğrulayıngt, challenge ve pageurl eksiksiz ve doğru olmalı.
  3. Alan eşlemesini inceleyin — Dönen challenge, validate ve seccode doğru alanlara girmeli.
  4. Manuel çözümle karşılaştırın — Başarılı bir manuel GeeTest çözümünün tam istek yapısını yakalamak için tarayıcı DevTools'unu kullanın.

Başlamak için CaptchaAI GeeTest v3 çözücüsünü kullanın, parametrelerinizi API belgeleriyle karşılaştırın ve doğrulama akışına dair arka plana ihtiyacınız varsa GeeTest v3 CAPTCHA nasıl çalışır? yazısını okuyun.


Görsel varlık özeti

Kahraman görsel

  • Alternatif metin: Geliştiricinin GeeTest v3 hatalarını gidermesi — gönderim, sorgulama ve doğrulama hatası teşhisi
  • Göstermesi gereken: Hata akış aşamaları ve hata noktalarıyla birlikte hata ayıklama bağlamı
  • Dosya adı: geetest-v3-errors-troubleshooting-hero.png

Yazı içi görsel 1

  • Yerleşim: "Sonuç sorgulama aşaması hataları"ndan sonra
  • Tür: Karar ağacı
  • Alternatif metin: GeeTest v3 hataları için karar ağacı — gönderim hataları, sorgulama hataları ve doğrulama hataları
  • Dosya adı: geetest-v3-error-decision-tree.png

Yazı içi görsel 2

  • Yerleşim: "Hedef sayfa doğrulama hataları"ndan sonra
  • Tür: Nedenler ve düzeltmeler şeması
  • Alternatif metin: GeeTest v3 sayfa reddinin yaygın nedenlerini ve düzeltmelerini gösteren diyagram
  • Dosya adı: geetest-v3-validation-causes-fixes.png

İlgili Makaleler

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