Otomasyonunuz formu gönderiyor, HTTP 200 dönüyor ama kayıt oluşmuyorsa büyük olasılıkla sayfada görünmez bir reCAPTCHA v2 vardır. Görünmez varyantın onay kutusu yoktur: kullanıcı butona bastığı anda arka planda çalışır ve yalnızca Google'ın risk analizi tedirgin olursa ekrana bir doğrulama getirir. Hiçbir şey "görünmediği" için sorunu CAPTCHA'ya bağlamak genelde en son akla gelir.
Bu yazı üç soruyu sırayla yanıtlıyor: sayfada görünmez reCAPTCHA var mı, CaptchaAI ile nasıl çözülür, ve alınan token hangi öğeye bağlanıp forma geri verilir.
Sayfada görünmez reCAPTCHA nasıl tespit edilir?
Dört kontrolü sırayla uygulayın. İlk üçü çoğu sitede yeterlidir; dördüncüsü v3 ile karışma ihtimalini eler. Hepsini tarayıcı konsolunda, sayfa tamamen yüklendikten sonra çalıştırın.
data-sizeözniteliği → varyantı vesitekey'i birlikte verir.grecaptcha-badge→ widget basılmasa bile rozet DOM'da kalırgrecaptcha.execute→ sitekey yalnızca satır içi script'te duruyorsa- Script URL'sindeki
render=→ görünmez v2 ile v3'ü ayırmanın son adımı
1. data-size özniteliğine bakın
İlk bakılacak yer burasıdır. Widget varsa boyut değeri doğrudan varyantı söyler ve aynı çıktıda sitekey de gelir.
// Browser console
const widgets = document.querySelectorAll('.g-recaptcha');
widgets.forEach((el, i) => {
const size = el.getAttribute('data-size');
const sitekey = el.getAttribute('data-sitekey');
console.log(`Widget ${i}: size=${size}, sitekey=${sitekey}`);
if (size === 'invisible') {
console.log(' → This is Invisible reCAPTCHA');
}
});
2. Köşedeki rozeti arayın
Görünür widget yoksa bile Google'ın rozeti genellikle DOM'da durur. Rozet varken onay kutusu yoksa, elinizde görünmez varyant var demektir.
const badge = document.querySelector('.grecaptcha-badge');
if (badge) {
console.log('reCAPTCHA badge found — likely Invisible reCAPTCHA');
console.log('Badge visibility:', getComputedStyle(badge).visibility);
}
3. grecaptcha.execute çağrılarını tarayın
Bazı siteler hiç .g-recaptcha div'i basmaz; her şeyi JavaScript ile kurar. Bu durumda sitekey'i satır içi script'lerden çıkarmanız gerekir.
// Look for grecaptcha.execute in page scripts
document.querySelectorAll('script:not([src])').forEach(s => {
if (s.textContent.includes('grecaptcha.execute')) {
console.log('Found grecaptcha.execute — Invisible reCAPTCHA');
const match = s.textContent.match(/grecaptcha\.execute\s*\(\s*['"]?([^'",\s)]+)/);
if (match) console.log('Sitekey:', match[1]);
}
});
4. Script etiketindeki render parametresini kontrol edin
Script URL'sinde render= varsa ve değeri explicit değilse, sayfa görünmez v2 ya da v3 kullanıyordur. Ayrımı SSS bölümündeki action kuralına göre yapın.
document.querySelectorAll('script[src*="recaptcha"]').forEach(s => {
if (s.src.includes('render=') && !s.src.includes('render=explicit')) {
console.log('Invisible/v3 reCAPTCHA detected in script:', s.src);
}
});
Görünmez varyantı standart v2'den ayıran nedir?
Kontroller görünmez varyantı doğruladıysa, sıradaki soru entegrasyonda neyin değiştiğidir. Fark yalnızca görsel değil: standart v2'de kullanıcı onay kutusunu tıklar ve g-recaptcha-response alanı dolar; görünmez varyantta bu adım hiç yoktur, token'ı siz üretip yerine koymak ve akışı elle ilerletmek zorundasınız.
| Özellik | reCAPTCHA v2 Standardı | reCAPTCHA v2 Görünmez |
|---|---|---|
| Görünür widget | Evet (onay kutusu) | Hayır (yalnızca rozet) |
| Kullanıcı etkileşimi | Onay kutusunu tıklayın | Form gönderiminde otomatik |
data-size |
normal veya compact |
invisible |
| Doğrulama penceresi | Her zaman mümkün | Yalnızca şüpheli trafikte |
| DOM öğesi | .g-recaptcha div |
.g-recaptcha div veya programatik |
Pratik sonucu şudur: görünmez varyantta hata mesajı çoğu zaman "CAPTCHA" demez. Site "oturum doğrulanamadı" der ya da sessizce başa yönlendirir. Türkiye'deki e-ticaret ekiplerinin ödeme adımını her gece Europe/Istanbul saatiyle koşturduğu QA senaryolarında bu tipik bir kör noktadır: testler haftalarca yeşil görünür, sonra sağlayıcı görünmez reCAPTCHA'yı devreye alır ve gece koşusu sessizce boşa döner. Yukarıdaki dört kontrolü koşunun başına koymak, bu tür regresyonları ilk gecede yakalatır.
CaptchaAI ile çözüm: invisible=1 bayrağı
Kritik ayrıntı tek bir parametrede: isteğe invisible=1 ekleyin ki çözüm tarafı görünmez bir varyantla çalıştığını bilsin. Gerisi standart reCAPTCHA v2 akışıdır — aynı in.php / res.php deseni, aynı userrecaptcha metodu.
Görev gönderimi için gereken tek girdi sitekey ve sayfa URL'sidir; tarayıcı oturumu göndermeniz gerekmez.
Python örneği
import requests
import time
API_KEY = "YOUR_API_KEY"
# Submit with invisible flag
resp = requests.post("https://ocr.captchaai.com/in.php", data={
"key": API_KEY,
"method": "userrecaptcha",
"googlekey": "6Le-SITEKEY",
"pageurl": "https://staging.example.com/qa-login",
"invisible": "1", # critical for Invisible reCAPTCHA
"json": "1",
}).json()
if resp["status"] != 1:
raise Exception(f"Submit error: {resp['request']}")
task_id = resp["request"]
print(f"Submitted: {task_id}")
# Poll for result
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:
print(f"Token: {result['request'][:50]}...")
break
if result["request"] != "CAPCHA_NOT_READY":
raise Exception(f"Error: {result['request']}")
Döngü, sonucu beş saniyede bir sorgular. CAPCHA_NOT_READY yanıtı normaldir ve beklemeye devam etmeniz gerektiği anlamına gelir; başka bir değer geldiğinde hata koduyla birlikte durun.
Node.js örneği
Node.js tarafında aynı istek axios ile kurulur. Parametre isimleri birebir aynıdır; yalnızca invisible değerini eklemeyi unutmayın.
const axios = require('axios');
const resp = await axios.post('https://ocr.captchaai.com/in.php', null, {
params: {
key: 'YOUR_API_KEY',
method: 'userrecaptcha',
googlekey: '6Le-SITEKEY',
pageurl: 'https://staging.example.com/qa-login',
invisible: 1,
json: 1,
}
});
const taskId = resp.data.request;
console.log(`Submitted: ${taskId}`);
Maliyet tarafı thread sayısına bağlıdır, çözüm adedine değil — yani ölçekleyeceğiniz şey eşzamanlılıktır:
| Senaryo | Uygun plan | Eşzamanlı görev |
|---|---|---|
| Tek QA koşusu, düşük hacimli entegrasyon | BASIC ($15/ay) | 5 thread |
| Birden fazla ortamda gece koşusu | STANDARD ($30/ay) | 15 thread |
| Onlarca paralel senaryo | ADVANCE ($90/ay) | 50 thread |
Kur dalgalanırken sabit USD abonelik, bütçesini önceden bağlamak isteyen ekipler için öngörülebilir bir kalem olur. Aynı gönder–sorgula deseni diğer desteklenen türlerde de geçerlidir; yalnızca method ve türe özgü parametreler değişir.
Token'ı enjekte edin ve akışı ilerletin
Token elinize geçtiğinde iş bitmez. Görünmez reCAPTCHA bir butona ya da form gönderimine bağlı olduğu için, alanı doldurmanın yanında data-callback fonksiyonunu da çağırmanız gerekir. Aşağıdaki Selenium örneği ikisini tek adımda yapar: g-recaptcha-response alanını doldurur, widget'ta tanımlı bir callback varsa token ile çağırır ve ardından formu gönderir. Callback adı widget'ta yazmıyorsa, aşağıdaki "Tetikleyici öğeyi belirleyin" bölümü nereye bakacağınızı gösterir.
from selenium import webdriver
from selenium.webdriver.common.by import By
driver = webdriver.Chrome()
driver.get("https://staging.example.com/qa-login")
# After solving, inject and trigger
driver.execute_script("""
// Set the token
document.querySelector('textarea[name="g-recaptcha-response"]').value = arguments[0];
// Find and trigger the callback
var widget = document.querySelector('.g-recaptcha');
var callbackName = widget ? widget.getAttribute('data-callback') : null;
if (callbackName && typeof window[callbackName] === 'function') {
window[callbackName](arguments[0]);
}
""", token)
# Submit the form
driver.find_element(By.CSS_SELECTOR, "form#login").submit()
Token'ın ömrü kısadır. Çözümden sonra bekletmeyin; aldığınız gibi enjekte edip formu gönderin.
Bu akışı yalnızca yetkiniz olan sistemlerde çalıştırın. Test verisinde gerçek kullanıcı bilgisi kullanıyorsanız KVKK kapsamına girdiğinizi unutmayın — QA ortamlarında sentetik veri tercih edin.
Sık karşılaşılan sorunlar
| Sorun | Sebep | Düzeltme |
|---|---|---|
| Token reddedildi | Gönderimde invisible=1 eksik |
CaptchaAI isteğine invisible: "1" ekleyin |
| Sitekey bulunamıyor | Sayfada .g-recaptcha div'i yok |
Programatik grecaptcha.render() / grecaptcha.execute() çağrılarını arayın |
| Form gönderiliyor ama başarısız oluyor | Callback tetiklenmedi | data-callback fonksiyonunu bulup token ile çağırın |
| CAPTCHA hiç görünmüyor | Yalnızca şüpheli trafikte çıkıyor | grecaptcha-badge öğesini ve recaptcha script etiketlerini kontrol edin |
Tekrarlayan bir hata alıyorsanız önce isteğin gövdesini loglayın. Sırayla şu üç şeye bakın:
invisiblealanı istekte gerçekten var mı- Değeri
"1"string'i mi, yoksa boolean olarak mı gidiyor pageurl, token'ı enjekte edeceğiniz sayfayla birebir aynı mı
Tetikleyici öğeyi belirleyin
Enjeksiyonun neden bazen sessizce çalışmadığını burada görürsünüz: callback her sitede aynı yere yazılmaz. İki yaygın kalıp vardır.
Birincisi, doğrudan butona bağlanan bildirimsel kullanım:
<button class="g-recaptcha"
data-sitekey="6Le-SITEKEY"
data-callback="onSubmit"
data-size="invisible">
Submit
</button>
İkincisi, sitenin kendi kodundan programatik tetikleme:
// Site's code
document.getElementById('submit-btn').addEventListener('click', function() {
grecaptcha.execute();
});
Hangi kalıbın kullanıldığını tek geçişte görmek için buton ve input öğelerini tarayın. Çıktıdaki data-callback değeri, enjeksiyon script'inin çağırması gereken fonksiyonun adıdır.
// Find elements with g-recaptcha class that are buttons
document.querySelectorAll('button.g-recaptcha, input.g-recaptcha').forEach(el => {
console.log('Trigger element:', el.tagName, el.textContent.trim());
console.log(' data-sitekey:', el.getAttribute('data-sitekey'));
console.log(' data-callback:', el.getAttribute('data-callback'));
});
Sık sorulan sorular
Entegrasyon sırasında en sık gelen beş soru ve kısa yanıtları.
Görünmez v2 ile v3'ü nasıl ayırt ederim?
action parametresine bakın. Görünmez v2, grecaptcha.execute() çağrısını parametresiz kullanır; v3 ise bir eylem adı geçirir ve script URL'sinde render=SITEKEY taşır.
Sayfada .g-recaptcha div'i yoksa sitekey'i nereden alırım?
Satır içi script'lerden. grecaptcha.execute veya grecaptcha.render çağrılarını tarayın; sitekey ilk argüman ya da sitekey alanı olarak orada durur. Yukarıdaki üçüncü kontrol bunu tek satırda çıkarır.
Çözüm süresi ve bakiye nasıl işliyor?
Süre yüke ve türe göre değişir. Planlar thread bazlıdır ve çözüm başına ücret yoktur: aynı anda kaç görev çalıştırabildiğinizi thread sayınız belirler, aylık çözüm adediniz değil.
CaptchaAI hCaptcha'yı da çözüyor mu?
Hayır. hCaptcha ve FunCaptcha (Arkose Labs) şu an desteklenmiyor. Desteklenen aile reCAPTCHA v2/v3, Cloudflare Turnstile ve Cloudflare doğrulama akışı, GeeTest v3, görüntü/OCR, grid ve BLS'tir; CaptchaFox (beta), Friendly Captcha (beta) ve Lemin (beta) beta aşamasındadır. GeeTest v4 için yalnızca "çok yakında" ifadesi geçerlidir.
invisible bayrağını unutursam ne olur?
Çözüm tarafı farklı bir yaklaşım deneyebilir ve ürettiği token site tarafından reddedilir. Bayrağı eklemek tek satırlık bir düzeltmedir; token reddi hatalarında ilk bakılacak yer burasıdır.
Görünmez reCAPTCHA'yı bugün iş akışınıza bağlayın
Tespit kontrollerini bir kez yazın, invisible=1 bayrağını ekleyin ve sessiz form reddi sınıfını kapatın.
API anahtarınızı şu adresten alın: captchaai.com.