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.