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.comiçin çözüldü ancakexample.com'de doğrulandı - Token
staging.example.comiçin çözüldü ancakexample.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.