Bir sayfada hem reCAPTCHA v2 hem de v3 varsa, ikisini tek çağrıyla çözemezsiniz: bunlar farklı site anahtarlarına ve farklı çözüm yöntemlerine sahip iki ayrı CAPTCHA türüdür. Doğru yaklaşım siteyle aynı sırayı izlemektir — önce v3'ü çözün, v3 puanı eşiğin altında kalıp v2 geri dönüşünü tetiklerse v2'yi de çözün. Bu rehber, ikili yapıyı nasıl tespit edeceğinizi, hangi durumda hangi stratejiyi seçeceğinizi ve otomasyonda en çok takılınan uç durumları gösteriyor.
Bu senaryo sandığınızdan yaygındır. Türkiye'deki bir e-ticaret sitesinin ödeme adımını QA ortamında test eden bir otomasyon geliştiricisi, giriş sayfasında v3 puanı düştüğü anda beliren v2 doğrulamasıyla düzenli karşılaşır. Akışı önceden tanımadan yazılan bir bot, v3'ü geçtiğini sanırken sunucudan dönen v2 formuna takılır.
Siteler neden v2 ve v3'ü birlikte kullanır?
Mantık basittir: v3 arka planda sessizce bir güven puanı üretir; v2 ise yalnızca bu puan düşük olduğunda devreye giren görünür bir güvenlik ağıdır.
User visits page
↓
reCAPTCHA v3 runs invisibly in background
↓
Score returned to server (e.g., 0.4)
↓
Score below threshold (e.g., < 0.7)?
├─ YES → Show reCAPTCHA v2 checkbox/image challenge
└─ NO → Allow action without visible CAPTCHA
Bu tasarımın kimin için ne anlama geldiği aşağıdaki gibidir:
| Taraf | v3 puanı | Kullanıcının gördüğü |
|---|---|---|
| Sıradan ziyaretçi | Yüksek | Hiçbir CAPTCHA — düşük sürtünme |
| Şüpheli / otomatik trafik | Düşük | Görünür v2 doğrulaması |
| Site operatörü | Eşiği belirler | Görünmez ve görünür arası dengeyi kontrol eder |
Otomasyon açısından kritik nokta: puan eşiği tamamen sitenin elindedir ve otomatik trafiğe genellikle düşük puan verilir. Bir sayfada ikili yapı gördüğünüzde v2 geri dönüşünü istisna değil, olası ana yol olarak kabul edin.
İkili reCAPTCHA'nın üç yaygın yapısı
Uygulamada üç kalıba rastlarsınız. Hepsinin ortak paydası, v3 ve v2 için iki ayrı site anahtarı kullanılmasıdır.
| Yapı | v3'ün rolü | v2'nin rolü |
|---|---|---|
| Yapı 1 | Ön değerlendirme (görünmez) | Puan düşükse geri dönüş |
| Yapı 2 | Bazı sayfalarda pasif puan | Yüksek riskli işlemlerde zorunlu |
| Yapı 3 | Tek script içinde execute | Aynı script içinde render |
Yapı 1: v3 ön değerlendirme + v2 geri dönüşü
<!-- Both scripts loaded -->
<script src="https://www.google.com/recaptcha/api.js?render=V3_SITE_KEY"></script>
<script src="https://www.google.com/recaptcha/api.js?render=explicit" async defer></script>
<form id="loginForm">
<!-- v2 widget (hidden initially) -->
<div id="recaptcha-v2-container" style="display:none;">
<div class="g-recaptcha" data-sitekey="V2_SITE_KEY"></div>
</div>
<button type="submit">Login</button>
</form>
<script>
// First attempt: v3 invisible
grecaptcha.ready(function() {
grecaptcha.execute('V3_SITE_KEY', {action: 'login'}).then(function(v3Token) {
fetch('/api/verify-v3', {
method: 'POST',
body: JSON.stringify({token: v3Token})
})
.then(r => r.json())
.then(data => {
if (data.score < 0.7) {
// Score too low → show v2 fallback
document.getElementById('recaptcha-v2-container').style.display = 'block';
grecaptcha.render('recaptcha-v2-container', {sitekey: 'V2_SITE_KEY'});
} else {
// Score OK → submit form directly
document.getElementById('loginForm').submit();
}
});
});
});
</script>
Yapı 2: İşleme göre ayrı site anahtarları
Homepage → v3 only (passive score)
Login page → v3 assessment, v2 fallback
Checkout → v2 always (high security)
Contact form → v3 only
Yapı 3: Tek script, iki mod
Google, aynı reCAPTCHA script'i içinde hem v2 render'ını hem v3 execute'unu destekler:
<script src="https://www.google.com/recaptcha/api.js?render=V3_SITE_KEY"></script>
<script>
// v3 execute
grecaptcha.execute('V3_SITE_KEY', {action: 'login'});
// v2 render (uses a different site key)
grecaptcha.render('v2-container', {sitekey: 'V2_SITE_KEY'});
</script>
İkili yapıyı tespit etme
Strateji seçmeden önce sayfanın ikili olup olmadığını doğrulayın. Ayrım pratikte nettir:
| Sürüm | Sayfada nerede görünür | Anahtar kaynağı |
|---|---|---|
| reCAPTCHA v3 | ?render= parametresi veya grecaptcha.execute |
Script URL'si |
| reCAPTCHA v2 | Widget div'indeki data-sitekey |
Widget HTML'si |
İkisi de varsa ve anahtarlar farklıysa sayfa ikilidir. Aşağıdaki fonksiyonlar bu kontrolü otomatikleştirir.
Python ile tespit
import requests
import re
def detect_dual_recaptcha(url):
"""Detect if a page uses both reCAPTCHA v2 and v3."""
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) "
"AppleWebKit/537.36 (KHTML, like Gecko) "
"Chrome/120.0.0.0 Safari/537.36",
}
html = requests.get(url, headers=headers, timeout=15).text
result = {
"has_v3": False,
"has_v2": False,
"v3_site_key": None,
"v2_site_key": None,
"dual": False,
"pattern": None,
}
# Detect v3 (render parameter or enterprise.execute)
v3_match = re.search(r"api\.js\?render=([A-Za-z0-9_-]+)", html)
if v3_match and v3_match.group(1) != "explicit":
result["has_v3"] = True
result["v3_site_key"] = v3_match.group(1)
# Detect v3 in execute calls
v3_execute = re.search(
r"grecaptcha\.(?:enterprise\.)?execute\s*\(\s*['\"]([^'\"]+)['\"]",
html,
)
if v3_execute:
result["has_v3"] = True
if not result["v3_site_key"]:
result["v3_site_key"] = v3_execute.group(1)
# Detect v2 (g-recaptcha class or explicit render)
v2_match = re.search(r'data-sitekey="([^"]+)"', html)
if v2_match:
key = v2_match.group(1)
if key != result.get("v3_site_key"):
result["has_v2"] = True
result["v2_site_key"] = key
# Check for explicit v2 render
v2_render = re.search(
r"grecaptcha\.render\s*\([^,]+,\s*\{[^}]*sitekey:\s*['\"]([^'\"]+)",
html,
)
if v2_render:
result["has_v2"] = True
if not result["v2_site_key"]:
result["v2_site_key"] = v2_render.group(1)
result["dual"] = result["has_v3"] and result["has_v2"]
if result["dual"]:
# Determine pattern
if "display:none" in html or "display: none" in html:
result["pattern"] = "v3_pre_assessment_v2_fallback"
else:
result["pattern"] = "v2_v3_simultaneous"
return result
detection = detect_dual_recaptcha("https://staging.example.com/qa-login")
print(detection)
Node.js ile tespit
const axios = require("axios");
async function detectDualRecaptcha(url) {
const { data: html } = await axios.get(url, { timeout: 15000 });
const result = {
hasV3: false,
hasV2: false,
v3SiteKey: null,
v2SiteKey: null,
dual: false,
};
// v3 detection
const v3Match = html.match(/api\.js\?render=([A-Za-z0-9_-]+)/);
if (v3Match && v3Match[1] !== "explicit") {
result.hasV3 = true;
result.v3SiteKey = v3Match[1];
}
// v2 detection
const v2Match = html.match(/data-sitekey="([^"]+)"/);
if (v2Match && v2Match[1] !== result.v3SiteKey) {
result.hasV2 = true;
result.v2SiteKey = v2Match[1];
}
result.dual = result.hasV3 && result.hasV2;
return result;
}
detectDualRecaptcha("https://staging.example.com/qa-login").then(console.log);
Çift reCAPTCHA çözme stratejileri
Tespit tamamlanınca üç yol arasından seçim yaparsınız. Karar, sitenin otomatik trafiğe nasıl davrandığına ve akışın dinamikliğine bağlıdır:
| Strateji | Ne zaman uygun | Not |
|---|---|---|
| Strateji 1 | v2 bazen tetiklenir | Siteyle aynı akış; en genel çözüm |
| Strateji 2 | v2 neredeyse her zaman çıkar | v3 çözüm süresinden ve maliyetinden tasarruf |
| Strateji 3 | v2 görünürlüğü JavaScript'e bağlı | Tarayıcıyla en güvenilir yönetim |
Strateji 1: Önce v3'ü, gerekirse v2'yi çözün
- Ne zaman: v2 yalnızca bazı denemelerde tetikleniyorsa.
- Mantık: sitenin akışını birebir izleyin — v3 token'ını gönderin, v2 geri dönüşü açılırsa onu da çözün.
import requests
import time
API_KEY = "YOUR_API_KEY"
def solve_v3(site_key, page_url, action="login"):
"""Solve reCAPTCHA v3 and return token."""
submit = requests.post("https://ocr.captchaai.com/in.php", data={
"key": API_KEY,
"method": "userrecaptcha",
"googlekey": site_key,
"pageurl": page_url,
"version": "v3",
"action": action,
"json": 1,
}).json()
task_id = submit["request"]
for _ in range(60):
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"]
raise TimeoutError("v3 solve timeout")
def solve_v2(site_key, page_url):
"""Solve reCAPTCHA v2 and return token."""
submit = requests.post("https://ocr.captchaai.com/in.php", data={
"key": API_KEY,
"method": "userrecaptcha",
"googlekey": site_key,
"pageurl": page_url,
"json": 1,
}).json()
task_id = submit["request"]
for _ in range(60):
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"]
raise TimeoutError("v2 solve timeout")
def solve_dual_recaptcha(v3_key, v2_key, page_url, action="login"):
"""Handle dual reCAPTCHA: try v3, fall back to v2."""
# Step 1: Try v3
v3_token = solve_v3(v3_key, page_url, action)
# Step 2: Submit v3 token to target
response = requests.post(f"{page_url}/verify", data={
"g-recaptcha-response": v3_token,
})
# Step 3: Check if v2 fallback is needed
if "recaptcha" in response.text.lower() and v2_key:
print("v3 score too low — v2 fallback triggered")
v2_token = solve_v2(v2_key, page_url)
return {"version": "v2", "token": v2_token}
return {"version": "v3", "token": v3_token}
result = solve_dual_recaptcha(
v3_key="6LcExample_v3_key",
v2_key="6LcExample_v2_key",
page_url="https://staging.example.com/qa-login",
)
print(f"Solved with {result['version']}")
Dikkat edilecek iki nokta var:
- Her iki sürüm de aynı
g-recaptcha-responsealanını kullanır; ayrı olan tek şey site anahtarıdır. - v3'te ek olarak
versionveactionparametreleri gönderilir; v2'de bunlara gerek yoktur.
Strateji 2: v3 aşamasını çözmeden doğrudan v2'yi çözün
- Ne zaman: site otomatik trafiğe neredeyse her zaman v2 gösteriyorsa.
- Kazanç: eşiği geçemeyecek bir v3 çözümünün süresinden ve maliyetinden tasarruf edersiniz.
# If you consistently fail v3 assessment, just solve v2 directly
token = solve_v2(v2_site_key, page_url)
submit_form(token)
Strateji 3: Tarayıcı tabanlı işleme
- Ne zaman: v2'nin görünürlüğü tamamen JavaScript'e bağlıysa.
- Yöntem: geri dönüşü gerçek bir tarayıcıyla yönetin; widget görünürse v2'yi, görünmezse v3'ü çözün.
from selenium import webdriver
from selenium.webdriver.common.by import By
import time
driver = webdriver.Chrome()
driver.get("https://staging.example.com/qa-login")
time.sleep(3)
# Check if v2 widget is visible
v2_visible = driver.execute_script("""
const container = document.querySelector('.g-recaptcha');
if (!container) return false;
const style = window.getComputedStyle(container.parentElement);
return style.display !== 'none' && style.visibility !== 'hidden';
""")
if v2_visible:
# v2 is showing — solve v2
sitekey = driver.find_element(
By.CSS_SELECTOR, "[data-sitekey]"
).get_attribute("data-sitekey")
token = solve_v2(sitekey, driver.current_url)
driver.execute_script(
f'document.getElementById("g-recaptcha-response").value = "{token}";'
)
else:
# v3 only — solve v3
# Extract v3 key from page source
v3_key = driver.execute_script(
"return document.querySelector('script[src*=\"render=\"]')"
".src.match(/render=([^&]+)/)[1];"
)
token = solve_v3(v3_key, driver.current_url)
# Inject v3 token into the form
driver.execute_script(f"""
const input = document.createElement('input');
input.type = 'hidden';
input.name = 'g-recaptcha-response';
input.value = '{token}';
document.querySelector('form').appendChild(input);
""")
driver.find_element(By.CSS_SELECTOR, "form").submit()
Sık karşılaşılan uç durumlar
Aynı sayfada iki farklı site anahtarı
- İkili sitelerde her zaman İKİ ayrı site anahtarı vardır — biri v3, biri v2 için.
- v3 anahtarı
?render=KEYvegrecaptcha.execute('KEY', ...)içinde görünür. - v2 anahtarı widget'taki
data-sitekey="KEY"içinde yer alır. - Yanlış sürüme yanlış anahtar vermek geçersiz token üretir — en sık yapılan hatadır.
v2 geri dönüşlü reCAPTCHA Enterprise
Bazı Enterprise uygulamaları puanlama için v3 Enterprise'ı, doğrulama için v2'yi kullanır. Enterprise'ı sayfa kaynağından tanıyıp isteğe enterprise parametresini ekleyin:
# Detect and handle Enterprise + v2 combo
if "recaptcha/enterprise.js" in html:
# Use enterprise parameter for v3
v3_params = {"enterprise": 1, "version": "v3"}
else:
v3_params = {"version": "v3"}
Tek sayfada birden fazla form
Bir sayfada birden fazla form (giriş + kayıt) varsa her birinin kendi reCAPTCHA örneği olabilir. Site anahtarını genel sayfadan değil, hedeflediğiniz belirli formdan çıkarın:
# Target the login form specifically
login_form = soup.find("form", id="login-form")
widget = login_form.find(attrs={"data-sitekey": True})
sitekey = widget["data-sitekey"]
Otomasyonda en sık yapılan hatalar
İkili reCAPTCHA'da hataların çoğu birbirine benzer birkaç noktadan çıkar:
| Belirti | Olası neden | Çözüm |
|---|---|---|
| Geçersiz token | v3 anahtarını v2'ye (veya tersi) verdiniz | Her sürüm için doğru site anahtarını kullanın |
| v2 hep beliriyor | Otomatik trafiğe düşük v3 puanı veriliyor | Strateji 2 ile doğrudan v2'yi çözün |
| Token kabul edilmiyor | v3'te action veya version eksik |
v3 isteğine iki parametreyi de ekleyin |
| Yanlış formun anahtarı | Sayfada birden fazla widget var | Anahtarı hedef formdan çıkarın |
Bu tabloyu bir kontrol listesi gibi kullanın: sorun genellikle "yanlış anahtar" veya "eksik parametre" başlığına düşer.
Sık sorulan sorular
reCAPTCHA v2 ve v3 çözümü CaptchaAI'de ne kadar tutar?
CaptchaAI çözüm başına değil, eşzamanlı thread başına ücretlendirir ve her planda thread başına sınırsız çözüm vardır. BASIC ($15/ay, 5 thread) ile başlayabilir, hacminiz arttıkça STANDARD ($30/ay, 15 thread) veya üst planlara geçebilirsiniz. Fiyatlar USD üzerinden sabit olduğundan öngörülebilir bir aylık maliyet elde edersiniz — v2 ve v3 aynı plan içinde ek ücret olmadan çözülür.
v3 puanı eşiğin altında kalırsa otomasyonum durur mu?
Hayır. Doğru kurulmuş bir akışta düşük v3 puanı yalnızca v2 geri dönüşünü tetikler. v3 token'ını gönderip yanıtı kontrol eder, v2 doğrulaması açılırsa onu ayrı bir çağrıyla çözersiniz. Akış kesintiye uğramaz, yalnızca ikinci bir adım eklenir.
İkili reCAPTCHA'yı tek bir API çağrısıyla çözebilir miyim?
Genellikle hayır. v2 ve v3 farklı site anahtarları ve yöntemleriyle iki ayrı türdür; her biri CaptchaAI'ye kendi çağrısını gerektirir. Ancak v3 puanı eşiği geçer ve v2 geri dönüşü hiç tetiklenmezse o istekte tek çağrı yeterli olur.
CaptchaAI hCaptcha ve FunCaptcha'yı da çözüyor mu?
Hayır. CaptchaAI reCAPTCHA v2/v3, Cloudflare Turnstile ve Challenge, GeeTest v3, görüntü/OCR, grid ve BLS türlerini çözer; hCaptcha ve FunCaptcha (Arkose Labs) desteklenmez. Bu rehberdeki ikili akış yalnızca reCAPTCHA v2 ile v3 içindir.
Enterprise puanlama + v2 geri dönüşü nasıl ele alınır?
Sayfa kaynağında recaptcha/enterprise.js görürseniz v3 isteğine enterprise parametresini ekleyin; v2 tarafı standart userrecaptcha yöntemiyle çözülür. Puanlama Enterprise olsa bile geri dönüş mantığı değişmez, yalnızca v3 çağrısına bir parametre eklenir.
Özet
İkili reCAPTCHA uygulamaları, görünmez ön değerlendirme için v3'ü, puan çok düştüğünde açılan görünür bir güvenlik ağı olarak da v2'yi kullanır. Her iki sürümü tespit etmek için ?render= parametresine (v3) ve widget'taki data-sitekey'e (v2) bakın; ikisi de varsa ve anahtarlar farklıysa sayfa ikilidir. En sağlam otomasyon akışı sitenin kendi mantığını izler: önce v3'ü CaptchaAI ile çözün, token'ı gönderin ve yalnızca geri dönüş tetiklenirse v2'yi çözün. Her sürüm kendi site anahtarıyla ayrı bir API çağrısı ister — bunu unutmamak, geçersiz token hatalarının çoğunu baştan önler.
İlgili Makaleler
- Tek sayfa uygulamalarda dinamik reCAPTCHA yönetimi
- reCAPTCHA v2 callback'i API ile çözme
- Aynı sitede reCAPTCHA v2 ve Turnstile'ı birlikte kullanma