Teknik Açıklamalar

reCAPTCHA v2 Geri Arama Mekanizması: Geri Aramalar Nasıl Çalışır ve Nasıl Tetiklenir?

Bir kullanıcı reCAPTCHA v2 sorgulamasını tamamladığında Google, site tarafından tanımlanan bir JavaScript geri çağırma işlevini çağırır. Bu geri arama genellikle bir gönder düğmesini etkinleştirir, formu doğrular veya bir AJAX isteği gönderir. CaptchaAI'den çözülmüş bir jeton enjekte ettikten sonra aynı geri aramayı tetiklemeniz gerekir; aksi takdirde form, CAPTCHA'nın çözüldüğünü tanımayacaktır.


Geri aramalar nasıl çalışır?

Site, reCAPTCHA widget'ında bir geri aramayı tanımlar:

<div class="g-recaptcha"
     data-sitekey="6Le-SITEKEY"
     data-callback="onCaptchaSuccess"
     data-expired-callback="onCaptchaExpired">
</div>

<script>
function onCaptchaSuccess(token) {
  document.getElementById('submit-btn').disabled = false;
  document.getElementById('captcha-token').value = token;
}
</script>

Kullanıcı CAPTCHA'yı çözdüğünde Google'ın JavaScript'i onCaptchaSuccess(token)'yi çağırır. İşlev, belirteç dizesini tek argümanı olarak alır.


Geri arama işlevini bulma

Yöntem 1: Veri geri arama özelliğini kontrol edin

// In browser console
const widget = document.querySelector('.g-recaptcha');
const callbackName = widget?.getAttribute('data-callback');
console.log('Callback:', callbackName);

Yöntem 2: Grecaptcha'nın iç kısımlarını kontrol edin

Bazı siteler data-callback özelliği yerine geri arama seçeneğiyle grecaptcha.render()'yi kullanır:

// Search page source for grecaptcha.render
document.querySelectorAll('script:not([src])').forEach(s => {
  if (s.textContent.includes('grecaptcha.render')) {
    console.log(s.textContent.match(/callback\s*:\s*(\w+)/)?.[1]);
  }
});

Yöntem 3: Geri arama kaydını durdurma

Sayfa yüklenmeden önce bunu DevTools'ta çalıştırın (Kaynaklar → Parçacıkları):

const origRender = grecaptcha.render;
grecaptcha.render = function(container, params) {
  console.log('Render callback:', params.callback);
  console.log('Expired callback:', params['expired-callback']);
  return origRender.apply(this, arguments);
};

Jeton enjeksiyonundan sonra geri aramayı tetiklemek

Python (Selenyum)

import requests
import time
from selenium import webdriver
from selenium.webdriver.common.by import By

API_KEY = "YOUR_API_KEY"
driver = webdriver.Chrome()
driver.get("https://staging.example.com/qa-login")

# Extract sitekey and callback
sitekey = driver.find_element(
    By.CSS_SELECTOR, ".g-recaptcha"
).get_attribute("data-sitekey")

callback = driver.find_element(
    By.CSS_SELECTOR, ".g-recaptcha"
).get_attribute("data-callback")

# Solve with CaptchaAI
resp = requests.post("https://ocr.captchaai.com/in.php", data={
    "key": API_KEY,
    "method": "userrecaptcha",
    "googlekey": sitekey,
    "pageurl": driver.current_url,
    "json": "1",
}).json()
task_id = resp["request"]

token = None
for _ in range(24):
    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["status"] == 1:
        token = result["request"]
        break

# Inject token into textarea
driver.execute_script("""
    document.querySelector('textarea[name="g-recaptcha-response"]').value = arguments[0];
""", token)

# Trigger the callback
if callback:
    driver.execute_script(f"window['{callback}'](arguments[0]);", token)
    print(f"Triggered callback: {callback}")
else:
    # Fallback: try ___grecaptcha_cfg
    driver.execute_script("""
        try {
            var widgetId = Object.keys(___grecaptcha_cfg.clients)[0];
            var callback = ___grecaptcha_cfg.clients[widgetId].aa.l.callback;
            if (typeof callback === 'function') callback(arguments[0]);
        } catch(e) {}
    """, token)
    print("Triggered callback via ___grecaptcha_cfg")

JavaScript (Puppeteer)

const puppeteer = require('puppeteer');

// After solving and getting the token...
await page.evaluate((token, callbackName) => {
  // Set textarea value
  const textarea = document.querySelector(
    'textarea[name="g-recaptcha-response"]'
  );
  textarea.value = token;
  textarea.style.display = 'block'; // sometimes hidden

  // Trigger callback
  if (callbackName && typeof window[callbackName] === 'function') {
    window[callbackName](token);
    console.log(`Called ${callbackName}()`);
  } else {
    // Fallback: search grecaptcha config
    try {
      const clients = ___grecaptcha_cfg.clients;
      const widgetId = Object.keys(clients)[0];
      const cb = clients[widgetId]?.aa?.l?.callback;
      if (typeof cb === 'function') cb(token);
    } catch (e) {}
  }
}, token, callbackName);

Veri geri araması olmayan siteler

Bazı siteler geri arama kullanmaz. Bunun yerine form gönderildiğinde grecaptcha.getResponse()'yi kontrol ederler. Bu siteler için işlevi geçersiz kılın:

driver.execute_script("""
    const token = arguments[0];
    document.querySelector('textarea[name="g-recaptcha-response"]').value = token;
    // Override getResponse to return the token
    if (typeof grecaptcha !== 'undefined') {
        grecaptcha.getResponse = function() { return token; };
    }
""", token)

# Then submit the form normally
driver.find_element(By.CSS_SELECTOR, "form").submit()

Süresi dolmuş geri aramalar

Bazı siteler, belirtecin süresi dolduğunda gönder düğmesini devre dışı bırakmak için data-expired-callback'yi tanımlar. Belirtecinizin son kullanma tarihi yaklaşmışsa bu geri arama etkinleşebilir ve formu yeniden kilitleyebilir. Bunu önlemek için teslim zamanına yakın çözün.

// Check for expired callback
const expiredCallback = document.querySelector('.g-recaptcha')
  ?.getAttribute('data-expired-callback');
console.log('Expired callback:', expiredCallback);

Sorun giderme

Sorun Sebep Düzeltme
Form enjeksiyondan sonra hala devre dışı Geri arama tetiklenmedi Geri arama işlevini bulun ve arayın
ReferenceError: function not defined Bir kapanışta tanımlanan geri arama ___grecaptcha_cfg geri dönüşünü kullanın
Jeton enjekte edildi ancak AJAX gönderilmedi Geri arama, form gönderimini değil AJAX'ı tetikler Geri arama işlevinin ne yaptığını kontrol edin
Jeton kabul edildi ancak sayfada hata gösteriliyor Geri aramadan önce jetonun süresi doldu Gönderim zamanına yaklaştıkça çözün

SSS

Peki ya hiç geri arama olmazsa?

Bazı siteler form gönderildiğinde yalnızca sunucu tarafındaki jetonu kontrol eder. Bu durumda g-recaptcha-response textarea değerini ayarlayıp formu göndermeniz yeterlidir.

Geri çağırma işlevinin adı sayfa yüklemeleri arasında değişebilir mi?

Evet bazı sitelerde. Geri arama adını sabit kodlamak yerine her zaman DOM'dan dinamik olarak çıkarın.

reCAPTCHA v3 aynı geri çağırma mekanizmasını kullanıyor mu?

Hayır. reCAPTCHA v3, bir Söz döndüren grecaptcha.execute()'yi kullanır. Görünür bir widget veya data-callback özelliği yok.


CaptchaAI'yi kullanarak reCAPTCHA v2'yi uygun geri arama yönetimiyle çözün

API anahtarınızı şu adresten alın:captchaai.com.


İlgili kılavuzlar

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