Explainers

reCAPTCHA v2 Invisible: Tetikleme Tespiti ve Çözümü

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ı ve sitekey'i birlikte verir
  • .grecaptcha-badge → widget basılmasa bile rozet DOM'da kalır
  • grecaptcha.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:

  • invisible alanı 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.


İlgili kılavuzlar

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