Sorun Giderme

reCAPTCHA Alan Adı Doğrulama Hataları ve Düzeltmeleri

reCAPTCHA, jetonların oluşturuldukları alan adı üzerinde kullanıldığını doğrular. CAPTCHA'nın alan adı yapılandırması ile gerçek isteğin kaynağı arasında bir uyumsuzluk olduğunda alan adı doğrulama hataları alırsınız. Bu hatalar sessizdir; jeton geçerli görünür ancak sunucu onu reddeder. Bu kılavuz, etki alanıyla ilgili her hata senaryosunu ve bunların nasıl düzeltileceğini kapsar.


Alan doğrulaması nasıl çalışır?

Site owner registers reCAPTCHA → adds allowed domains (example.com, www.example.com)
    ↓
reCAPTCHA widget loads on example.com → matches allowed domain ✓
    ↓
Token generated with embedded hostname
    ↓
Server validates token via siteverify API
    ↓
Google checks: Does token hostname match allowed domains?
    ├─ YES → { "success": true, "hostname": "example.com" }
    └─ NO  → { "success": false, error or hostname mismatch }

Etki alanının kontrol edildiği yer

Kontrol noktası Ne doğrulandı
İstemci tarafı Widget yalnızca izin verilen alanlarda yüklenir (isteğe bağlı - devre dışı bırakılabilir)
Jeton üretimi Belirtecin içine yerleştirilmiş ana makine adı, sayfanın kökeniyle eşleşiyor
Sunucu doğrulama siteverify ana makine adını döndürür — sunucu bunun eşleştiğini doğrulamalıdır

Yaygın alan adı doğrulama hataları

Hata 1: siteverify yanıtında ana bilgisayar adı uyuşmazlığı

{
    "success": true,
    "hostname": "subdomain.example.com",
    "challenge_ts": "2025-01-15T10:30:00Z"
}

Belirteç geçerli ancak hostname alanı beklenenden farklı bir etki alanı gösteriyor. Bazı sunucu uygulamaları bunu reddeder:

# Server-side validation that checks hostname
def validate_token(token, secret_key, expected_hostname):
    result = requests.post(
        "https://www.google.com/recaptcha/api/siteverify",
        data={"secret": secret_key, "response": token},
    ).json()

    if not result.get("success"):
        return False

    # This check causes failures when hostnames don't match
    if result.get("hostname") != expected_hostname:
        return False  # Domain mismatch!

    return True

Nedenler:

  • Token www.example.com için çözüldü ancak example.com'de doğrulandı
  • Token staging.example.com için çözüldü ancak example.com'de doğrulandı
  • Proxy veya CDN görünen ana bilgisayar adını değiştirir

Düzeltme: Çözücü isteğinizdeki pageurl'nin jetonun gönderileceği alanla tam olarak eşleştiğinden emin olun.

Hata 2: Widget yüklenmeyi reddediyor

reCAPTCHA widget'ı bir hata gösteriyor veya görüntülenmiyor:

ERROR: Invalid domain for site key

Nedenler:

  • Site anahtarının izin verilen alanları mevcut sayfanın alan adını içermiyor
  • Widget'ı localhost veya dosyadan yükleme:// protokolü
  • Alan adı yerine IP adresi kullanma

Otomasyon düzeltmesi: Bu, site sahibi yapılandırma sorunudur. Çözüm için izin verilen alan adıyla eşleşen doğru pageurl'yi ilettiğinizden emin olun.

Hata 3: Doğru çözüme rağmen jeton reddedildi

{
    "success": false,
    "error-codes": ["invalid-input-response"]
}

Belirteç, doğrulandığı yerden farklı bir alan adı için oluşturuldu.

Genel otomasyon nedeni: Çözücüye gönderilen pageurl, gerçek hedef etki alanıyla eşleşmiyor:

# WRONG: pageurl doesn't match actual target
submit = requests.post("https://ocr.captchaai.com/in.php", data={
    "key": API_KEY,
    "method": "userrecaptcha",
    "googlekey": sitekey,
    "pageurl": "https://staging.example.com/qa-login",  # ← Must match actual domain
    "json": 1,
})

# But submitting token to:
requests.post("https://app.staging.example.com/qa-login", ...)  # Different subdomain!

Alan adı eşleştirme kuralları

Tam eşleşme ve joker karakter

reCAPTCHA'nın alan adı doğrulaması, varsayılan olarak katı alt alan adı eşleştirmesi değildir. Davranış, site sahibinin yapılandırmasına bağlıdır:

Kayıtlı alan adı Kabul edilebilir kökenler
example.com example.com, www.example.com, sub.example.com (joker karakter etkinse)
www.example.com Yalnızca www.example.com (katı ise)
*.example.com example.com'un herhangi bir alt alanı
localhost Yalnızca localhost (geliştirme için)

Sunucu tarafı ana bilgisayar adı davranışı

Siteverify aracılığıyla doğrulama yapılırken yanıttaki hostname, jetonun oluşturulduğu sayfayı yansıtır. Site sahibinin sunucusu bunu kabul edip etmeyeceğine karar verir:

# Permissive validation (accepts any subdomain)
def validate_permissive(token, secret, base_domain):
    result = requests.post(
        "https://www.google.com/recaptcha/api/siteverify",
        data={"secret": secret, "response": token},
    ).json()

    if not result.get("success"):
        return False

    hostname = result.get("hostname", "")
    return hostname == base_domain or hostname.endswith(f".{base_domain}")


# Strict validation (exact match only)
def validate_strict(token, secret, expected_hostname):
    result = requests.post(
        "https://www.google.com/recaptcha/api/siteverify",
        data={"secret": secret, "response": token},
    ).json()

    return result.get("success") and result.get("hostname") == expected_hostname

Otomasyondaki etki alanı hatalarını düzeltme

Düzeltme 1: Sayfa URL'sini tam olarak eşleştirin

En yaygın düzeltme — pageurl'nin gerçek hedefle eşleştiğinden emin olun:

# Correct: pageurl matches where you'll submit the token
target_url = "https://www.staging.example.com/qa-login"

submit = requests.post("https://ocr.captchaai.com/in.php", data={
    "key": API_KEY,
    "method": "userrecaptcha",
    "googlekey": "6LcR_RsTAAAAAN_r0GEkGBfq3L7KmU5JbPHJtwNp",
    "pageurl": target_url,  # Must match the actual domain
    "json": 1,
})

Düzeltme 2: www ile www olmayanı ele alın

from urllib.parse import urlparse

def normalize_url(url):
    """Normalize URL for consistent domain matching."""
    parsed = urlparse(url)
    # Use exactly what the target site uses
    # Check if the site redirects www → non-www or vice versa
    return f"{parsed.scheme}://{parsed.netloc}{parsed.path}"

# Test which variant the site uses
response = requests.get("https://staging.example.com/qa-login", allow_redirects=True)
actual_url = response.url  # May be https://www.staging.example.com/qa-login after redirect

Düzeltme 3: Yönlendirme zincirinden doğru etki alanını algılama

Bazı siteler birden çok alan adı üzerinden yönlendirme yapar:

def get_final_url(url):
    """Follow redirects to find the actual CAPTCHA page domain."""
    response = requests.get(url, allow_redirects=True, timeout=15)
    return response.url

# Login URL might redirect:
# https://staging.example.com/qa-login → https://auth.staging.example.com/qa-login
final_url = get_final_url("https://staging.example.com/qa-login")
# Use final_url as pageurl for solver

Düzeltme 4: Alanı reCAPTCHA geri çağırma URL'sinden çıkarın

from bs4 import BeautifulSoup
from urllib.parse import urlparse

def extract_recaptcha_domain(html, page_url):
    """Extract the domain reCAPTCHA uses for token binding."""
    soup = BeautifulSoup(html, "html.parser")

    # Check for reCAPTCHA iframe
    iframe = soup.find("iframe", src=lambda s: s and "recaptcha" in s)
    if iframe:
        src = iframe.get("src", "")
        # The iframe URL may contain the domain parameter
        if "domain=" in src:
            # Extract domain from iframe URL
            pass

    # Default: use the page URL's domain
    return urlparse(page_url).netloc

Alan adı doğrulama teşhis aracı

import requests
from urllib.parse import urlparse

class DomainDiagnostic:
    """Diagnose domain verification issues for reCAPTCHA solving."""

    def __init__(self, target_url):
        self.target_url = target_url
        self.issues = []

    def check_redirects(self):
        """Check if the URL redirects to a different domain."""
        try:
            response = requests.get(
                self.target_url, allow_redirects=True, timeout=15,
                headers={"User-Agent": "Mozilla/5.0 Chrome/120.0.0.0"},
            )
            final_url = response.url
            original_domain = urlparse(self.target_url).netloc
            final_domain = urlparse(final_url).netloc

            if original_domain != final_domain:
                self.issues.append({
                    "type": "redirect",
                    "message": f"Redirects from {original_domain} to {final_domain}",
                    "fix": f"Use pageurl: {final_url}",
                })

            return final_url
        except Exception as e:
            self.issues.append({"type": "error", "message": str(e)})
            return self.target_url

    def check_www_variant(self):
        """Check if www and non-www point to the same content."""
        parsed = urlparse(self.target_url)
        domain = parsed.netloc

        if domain.startswith("www."):
            alt_domain = domain[4:]
        else:
            alt_domain = f"www.{domain}"

        alt_url = self.target_url.replace(domain, alt_domain)

        try:
            alt_response = requests.get(alt_url, allow_redirects=True, timeout=10)
            alt_final = urlparse(alt_response.url).netloc

            if alt_final != domain and alt_final != alt_domain:
                self.issues.append({
                    "type": "www_redirect",
                    "message": f"{alt_domain} redirects to {alt_final}",
                })
        except Exception:
            pass

    def report(self):
        """Generate diagnostic report."""
        final_url = self.check_redirects()
        self.check_www_variant()

        print(f"Target URL: {self.target_url}")
        print(f"Final URL:  {final_url}")
        print(f"Use as pageurl: {final_url}")

        if self.issues:
            print("\nIssues found:")
            for issue in self.issues:
                print(f"  [{issue['type']}] {issue['message']}")
                if "fix" in issue:
                    print(f"  Fix: {issue['fix']}")
        else:
            print("\nNo domain issues detected.")


# Usage
diag = DomainDiagnostic("https://staging.example.com/qa-login")
diag.report()

Sorun giderme tablosu

Belirti Muhtemel sebep Teşhis Düzeltme
Jeton her zaman reddedildi pageurl hedef alan adıyla eşleşmiyor Çözücü sayfa URL'sini gerçek gönderim alanıyla karşılaştırın Sayfa URL'sini eşleşecek şekilde güncelleyin
www'de çalışıyor, www olmayanda başarısız oluyor Alan adı varyantı uyuşmazlığı Yönlendirme davranışını kontrol edin Hedef sitenin kullandığı varyantı kullanın (yönlendirmeleri takip edin)
Bazen çalışıyor, bazen başarısız oluyor CDN veya yük dengeleyici farklı alanlara hizmet eder Alan adının isteğe göre değişip değişmediğini kontrol edin Yönlendirme zincirinden tutarlı bir URL kullanın
Tarayıcıda çalışıyor, komut dosyasında başarısız oluyor Komut dosyası farklı kaynaklardan gönderilir Tarayıcı URL çubuğunu betiğin sayfa URL'si ile karşılaştırın Tarayıcının nihai URL'sini eşleştirin
Kurumsal jeton reddedildi Yanlış proje veya etki alanı bağlama Kurumsal site anahtarının etki alanıyla eşleştiğini doğrulayın Kurumsal konsol etki alanı ayarlarını kontrol edin

Sık sorulan sorular

CaptchaAI alan adı doğrulamasını otomatik olarak gerçekleştiriyor mu?

CaptchaAI, sağladığınız pageurl'ye bağlı belirteçler oluşturur. Bu URL'nin, jetonu göndereceğiniz alan adıyla eşleştiğinden emin olmalısınız. CaptchaAI etki alanı yapılandırmasını doğrulamaz; belirttiğiniz sayfa URL'sini kullanır.

Bir alan adı için CAPTCHA çözüp başka bir alanda kullanabilir miyim?

Hayır. reCAPTCHA jetonları oluşturuldukları alana bağlıdır. example.com için oluşturulan bir jeton other-site.com'de kullanılamaz. Site ana bilgisayar adını kesin bir şekilde doğrularsa farklı alt alanlar bile başarısız olabilir.

Tokenım neden testte çalışıyor ancak üretimde başarısız oluyor?

Yaygın nedenler: (1) Test, farklı etki alanı kurallarına sahip localhost kullanıyor, (2) Üretim, farklı bir etki alanına sahip bir CDN kullanıyor, (3) Üretim, daha katı ana bilgisayar adı doğrulamasına sahip, (4) Üretimde farklı URL yolu veya yönlendirme zinciri var.

Yol önemli mi, yoksa sadece alan adı mı?

Yalnızca alan adı (ana bilgisayar adı) reCAPTCHA tarafından doğrulanır. Yol (/login, /signup) etki alanı doğrulamasını etkilemez. Ancak yine de pageurl olarak doğru tam URL'yi kullanmalısınız çünkü bazı çözümleyici uygulamaları bunu başka amaçlarla kullanabilir.


Özet

reCAPTCHA etki alanı doğrulaması, belirteçleri oluşturuldukları ana makine adına bağlar. En yaygın otomasyon hatası pageurl uyumsuzluğudur (geçilen URL)CaptchaAIbelirtecin gönderileceği alan adıyla eşleşmelidir. Gerçek etki alanını bulmak için yönlendirmeleri izleyin, www ile www olmayan değişkenleri ele alın ve çözmeden önce uyuşmazlıkları belirlemek için alan tanılama aracını kullanın.

İlgili Makaleler

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