Tutorials

reCAPTCHA Parametrelerini Sayfa Kaynağından Çıkarma

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 render parametresi — v3 ve Enterprise anahtarları için.
  • Iframe src'sindeki k parametresi — 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-sitekey ya da render= 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

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