Bir reCAPTCHA çözümünün sessizce başarısız olmasının en sık nedeni, yanlış çıkarılmış bir parametredir. CaptchaAI'ye görev göndermeden önce en az iki değeri doğru okumanız gerekir: sitekey ve pageurl. v3 için ayrıca action, Google'a ait sayfalarda data-s, Enterprise akışlarında ise enterprise bayrağı gerekir. Bu rehber, bu parametreleri sayfa kaynağından çıkarmanın dört yöntemini regex, DOM sorgusu ve iframe okumasıyla gösterir.
Örneğin bir e-ticaret sitesinin ödeme adımını QA ortamında test ederken, görünmez reCAPTCHA'nın sitekey'ini yanlış widget'tan okumak token'ın reddedilmesine yol açar.
Aşağıdaki dört yöntemi, sayfanın reCAPTCHA'yı nasıl yüklediğine göre sırayla deneyin:
- Statik HTML özniteliklerinden okuma — sunucu tarafından render edilen sayfalarda en hızlı yol.
- Script URL'sindeki
renderparametresi — v3 ve Enterprise anahtarları için. - Iframe
src'sindekikparametresi — widget bir iframe içinde oluşturulduğunda. grecaptcha.render()yapılandırması — anahtar çalışma zamanında enjekte edildiğinde.
reCAPTCHA sürümüne göre hangi parametreler gerekir?
Çıkaracağınız alanlar reCAPTCHA sürümüne göre değişir:
| Parametre | v2 Standart | v2 Görünmez | v3 | Enterprise |
|---|---|---|---|---|
googlekey (sitekey) |
Gerekli | Gerekli | Gerekli | Gerekli |
pageurl |
Gerekli | Gerekli | Gerekli | Gerekli |
invisible |
— | 1 |
— | — |
action |
— | — | Gerekli | Bazen |
data-s |
Bazen | Bazen | — | — |
enterprise |
— | — | — | 1 |
Pratikte sitekey ve pageurl her zaman zorunludur; geri kalan alanlar yalnızca ilgili sürümde anlam taşır. v2 ile v3'ü karıştırmak en sık yapılan hatadır: v2 anahtarı data-sitekey özniteliğinde, v3 anahtarı ise script URL'sindeki render parametresinde bulunur. Yanlış yerden okunan bir anahtar, görev gönderilse bile token'ın reddedilmesine yol açar.
Yöntem 1: HTML özniteliklerinden sitekey okuma
En yaygın durumda sitekey doğrudan HTML özniteliklerindedir; statik sayfalarda en hızlı yol budur. Kaynakta şu öznitelikleri arayın:
data-sitekey— anahtarın kendisi.data-size="invisible"— görünmez v2 işareti.data-callback— token hazır olduğunda çağrılan fonksiyonun adı.data-s— yalnızca Google'a ait sayfalarda görülür.
data-sitekey özniteliğinden regex ile
import re
import requests
url = "https://staging.example.com/qa-login"
html = requests.get(url).text
# Find data-sitekey
match = re.search(r'data-sitekey=["\']([A-Za-z0-9_-]+)["\']', html)
if match:
sitekey = match.group(1)
print(f"Sitekey: {sitekey}")
# Check if invisible
invisible_match = re.search(r'data-size=["\']invisible["\']', html)
is_invisible = bool(invisible_match)
print(f"Invisible: {is_invisible}")
# Find callback
callback_match = re.search(r'data-callback=["\'](\w+)["\']', html)
callback = callback_match.group(1) if callback_match else None
print(f"Callback: {callback}")
# Check for data-s (Google-owned sites)
data_s_match = re.search(r'data-s=["\']([^"\']+)["\']', html)
data_s = data_s_match.group(1) if data_s_match else None
print(f"data-s: {data_s}")
Puppeteer ile DOM'dan okuma
Öznitelik JavaScript ile eklendiğinde widget'ı DOM üzerinden okuyun:
const puppeteer = require('puppeteer');
const browser = await puppeteer.launch();
const page = await browser.newPage();
await page.goto('https://staging.example.com/qa-login', { waitUntil: 'networkidle2' });
const params = await page.evaluate(() => {
const widget = document.querySelector('.g-recaptcha');
if (!widget) return null;
return {
sitekey: widget.getAttribute('data-sitekey'),
size: widget.getAttribute('data-size'),
callback: widget.getAttribute('data-callback'),
dataS: widget.getAttribute('data-s'),
invisible: widget.getAttribute('data-size') === 'invisible',
};
});
console.log(params);
Yöntem 2: Script etiketinden v3 ve Enterprise sitekey
reCAPTCHA v3 ve Enterprise data-sitekey kullanmaz; anahtar, yüklenen script'in URL'sindedir.
Script URL'sindeki render parametresi
# Find sitekey from script src
v3_match = re.search(
r'recaptcha/(?:api|enterprise)\.js\?.*?render=([A-Za-z0-9_-]+)',
html
)
if v3_match:
sitekey = v3_match.group(1)
print(f"v3 Sitekey: {sitekey}")
# Check enterprise
is_enterprise = 'enterprise.js' in html
print(f"Enterprise: {is_enterprise}")
action parametresini JavaScript içinde bulma
action bir HTML özniteliği değil; grecaptcha.execute çağrısıyla iletilir:
# Search for grecaptcha.execute calls
action_match = re.search(
r'grecaptcha\.execute\s*\([^,]+,\s*\{[^}]*action\s*:\s*["\']([^"\']+)',
html
)
if action_match:
action = action_match.group(1)
print(f"Action: {action}")
Yöntem 3: Iframe src'sinden sitekey çıkarma
reCAPTCHA bir iframe içinde oluşturulduğunda sitekey, iframe URL'sindeki k parametresindedir:
# Find reCAPTCHA iframe
iframe_match = re.search(
r'<iframe[^>]+src=["\']([^"\']*recaptcha/api2/anchor[^"\']*)["\']',
html
)
if iframe_match:
iframe_src = iframe_match.group(1)
sitekey_match = re.search(r'k=([A-Za-z0-9_-]+)', iframe_src)
if sitekey_match:
sitekey = sitekey_match.group(1)
print(f"Iframe sitekey: {sitekey}")
Yöntem 4: grecaptcha.render ile dinamik oluşturma
reCAPTCHA'yı grecaptcha.render() ile çalışma zamanında oluşturan sayfalarda yapılandırma nesnesini ayrıştırın:
# Find grecaptcha.render calls
render_match = re.search(
r'grecaptcha\.render\s*\([^,]*,\s*\{([^}]+)\}',
html
)
if render_match:
config = render_match.group(1)
sk = re.search(r'sitekey\s*:\s*["\']([A-Za-z0-9_-]+)', config)
cb = re.search(r'callback\s*:\s*["\']?(\w+)', config)
sz = re.search(r'size\s*:\s*["\'](\w+)', config)
print(f"Sitekey: {sk.group(1) if sk else 'not found'}")
print(f"Callback: {cb.group(1) if cb else 'not found'}")
print(f"Size: {sz.group(1) if sz else 'not found'}")
Statik HTML mı, tarayıcı mı kullanmalısınız?
Yöntem seçimi, sayfanın reCAPTCHA'yı sunucuda mı yoksa tarayıcıda mı oluşturduğuna bağlıdır. Sunucu tarafından render edilen sayfalarda requests ile alınan ham HTML yeterlidir ve en hızlı yoldur. Anahtar yalnızca JavaScript çalıştıktan sonra DOM'a ekleniyorsa ham HTML boş döner; bu durumda Puppeteer veya Selenium ile sayfayı yükleyip DOM'u okumanız gerekir.
Karar için basit bir kural:
- Ham HTML içinde
data-sitekeyya darender=görüyorsanız statik çıkarma yeterlidir. - Sayfa kaynağı boşsa veya anahtar bir XHR yanıtından geliyorsa headless tarayıcı kullanın.
- Tek seferlik bir kontrol için tarayıcının geliştirici araçlarındaki Ağ sekmesi de anahtarı hızlıca gösterir.
Tüm yöntemleri birleştiren çıkarma fonksiyonu
Aşağıdaki fonksiyon dört yöntemi sırayla dener:
import re
import requests
def extract_recaptcha_params(url):
html = requests.get(url, timeout=15).text
params = {"pageurl": url}
# Sitekey from data-sitekey
sk = re.search(r'data-sitekey=["\']([A-Za-z0-9_-]+)', html)
if sk:
params["sitekey"] = sk.group(1)
# Sitekey from script render parameter (v3)
if "sitekey" not in params:
v3 = re.search(r'render=([A-Za-z0-9_-]{20,})', html)
if v3:
params["sitekey"] = v3.group(1)
# Sitekey from iframe
if "sitekey" not in params:
iframe = re.search(r'recaptcha.*?k=([A-Za-z0-9_-]+)', html)
if iframe:
params["sitekey"] = iframe.group(1)
# Sitekey from grecaptcha.render
if "sitekey" not in params:
render = re.search(r'sitekey\s*:\s*["\']([A-Za-z0-9_-]+)', html)
if render:
params["sitekey"] = render.group(1)
# Version detection
if re.search(r'data-size=["\']invisible', html):
params["invisible"] = True
if 'enterprise.js' in html:
params["enterprise"] = True
# Action (v3)
action = re.search(
r'action\s*:\s*["\']([^"\']+)',
html[html.find('grecaptcha.execute'):] if 'grecaptcha.execute' in html else ''
)
if action:
params["action"] = action.group(1)
# data-s
ds = re.search(r'data-s=["\']([^"\']+)', html)
if ds:
params["data_s"] = ds.group(1)
# Callback
cb = re.search(r'data-callback=["\'](\w+)', html)
if cb:
params["callback"] = cb.group(1)
return params
# Usage
params = extract_recaptcha_params("https://staging.example.com/qa-login")
for k, v in params.items():
print(f" {k}: {v}")
Beklenen çıktı:
pageurl: https://staging.example.com/qa-login
sitekey: 6Le-SITEKEY-abc123
invisible: True
callback: onCaptchaComplete
Çıkarılan parametreleri CaptchaAI API'sine gönderme
Parametreleri in.php uç noktasına görev olarak gönderin; yalnızca dolu alanları ekleyin (v2 için sitekey ve pageurl yeterlidir):
data = {
"key": API_KEY,
"method": "userrecaptcha",
"googlekey": params["sitekey"],
"pageurl": params["pageurl"],
"json": "1",
}
if params.get("invisible"):
data["invisible"] = "1"
if params.get("enterprise"):
data["enterprise"] = "1"
if params.get("action"):
data["action"] = params["action"]
if params.get("data_s"):
data["data-s"] = params["data_s"]
resp = requests.post("https://ocr.captchaai.com/in.php", data=data).json()
Sonucu res.php üzerinden sorgulayarak g-recaptcha-response token'ını alırsınız. Token'ın süresi kısa olduğu için çıkarma ve gönderme adımlarını art arda çalıştırın.
Çıkardığınız parametreleri her zaman yetkili bir QA veya test bağlamında kullanın. Türkiye'de kişisel veri içeren sayfaları test ederken toplanan verilerin KVKK kapsamına girdiğini unutmayın; bu akışı kendi e-ticaret ödeme adımınızın otomatik testi gibi izinli senaryolarla sınırlı tutun.
Sık karşılaşılan sorunlar ve çözümleri
Çıkarma başarısız olduğunda sorun çoğunlukla anahtarın nerede aranacağıyla ilgilidir. En sık karşılaşılan durumlar ve hızlı çözümleri:
| Sorun | Sebep | Düzeltme |
|---|---|---|
| Site anahtarı bulunamadı | Sayfa dinamik oluşturmayı kullanıyor | Statik HTML yerine Puppeteer/Selenium kullanın |
| Yanlış site anahtarı | Birden çok reCAPTCHA örneği | Hangi widget'ın gönderdiğiniz formla eşleştiğini kontrol edin |
| Eylem bulunamadı | Harici JS dosyasında tanımlandı | Bağlantılı JavaScript dosyalarını getir ve ara |
data-s istek başına değişir |
Google onu yeniden oluşturuyor | Her çözüm için yeni data-s'yi çıkarın |
Sık sorulan sorular
Sayfada reCAPTCHA v2 mi v3 mü kullanıldığını kaynaktan nasıl anlarım?
data-sitekey özniteliği ve görünür bir onay kutusu varsa v2'dir. api.js?render= biçiminde bir script URL'si ve grecaptcha.execute çağrısı görüyorsanız v3'tür.
reCAPTCHA v3'te action parametresini nerede bulurum?
action, HTML'de değil JavaScript kodundadır. Sayfa kaynağında veya bağlantılı .js dosyalarında grecaptcha.execute(..., { action: '...' }) çağrısını arayın.
Enterprise reCAPTCHA'sını standart sürümden nasıl ayırt ederim?
Script URL'si recaptcha/enterprise.js içeriyorsa Enterprise'dır ve görevinize enterprise bayrağını eklemeniz gerekir.
Bir sayfada birden fazla reCAPTCHA varsa doğru sitekey'i nasıl seçerim?
Gönderdiğiniz formu saran öğeyi bulun ve o form içindeki .g-recaptcha widget'ının sitekey'ini okuyun; ilk anahtarı körlemesine almayın.
data-s parametresini her zaman göndermeli miyim?
Hayır. data-s yalnızca Google'a ait bazı sayfalarda bulunur ve istek başına değişir. Sıradan bir sitede data-s yoksa görevinize eklemeyin; yalnızca kaynakta gerçekten varsa ve tazeyken gönderin.
Çıkardığınız parametrelerle güvenilir çözüme geçin
Sitekey ve pageurl elinizde; sırada bunları token'a dönüştürmek var. API anahtarınızı captchaai.com üzerinden alın ve ilk görevinizi gönderin.
İlgili kılavuzlar
- Tarayıcı konsolundan CAPTCHA parametrelerini tespit etme
- reCAPTCHA v2 callback mekanizması nasıl çalışır
- Görünmez reCAPTCHA v2: tetikleyiciyi tespit etme