Karşılaştırmalar

reCAPTCHA v2 ve Görünmez reCAPTCHA'nın Açıklaması

Her ikisi de aynı temel teknolojiyi kullanan reCAPTCHA v2 çeşitleridir. onay kutusu sürümü "Ben robot değilim" ifadesini gösterir ve resim ızgaraları sunabilir. Görünmez sürüm, görünür bir widget olmadan kullanıcı eylemleri (düğmeye tıklama, form gönderme veya sayfa yükleme) üzerine otomatik olarak tetiklenir. CaptchaAI çözümü için tek fark isteğinize invisible=1'yi eklemektir; ancak jeton enjeksiyon süreci önemli ölçüde farklılık gösterir.


Yan yana karşılaştırma

Özellik v2 Onay Kutusu v2 Görünmez
Görünür widget Evet — "Ben robot değilim" onay kutusu Hayır — kullanıcılardan gizlendi
Tetik mekanizması Kullanıcı onay kutusunu tıklar Düğme tıklama, form gönderme veya sayfa yükleme
İmaj mücadelesi Google bir bottan şüphelendiğinde gösterilir Şüphelendiğinde sağ alt köşede açılan pencere
Kullanıcı deneyimi Orta sürtünme Düşük/zero sürtünme
Uygulama Sayfaya g-recaptcha div ekle Düğmeye veya grecaptcha.execute()'ye data-callback ekleyin
Site anahtarı biçimi Görünmezle aynı Onay kutusuyla aynı
Jeton alanı g-recaptcha-response g-recaptcha-response
Geri arama işlevi İsteğe bağlı Neredeyse her zaman gerekli
CaptchaAI yöntemi method=userrecaptcha method=userrecaptcha + invisible=1
Jeton ömrü 120 saniye 120 saniye
Zamanı çöz 10-30 saniye 10-25 saniye

Her biri HTML'de nasıl görünür?

v2 Onay Kutusu

<!-- Standard checkbox widget -->
<div class="g-recaptcha"
     data-sitekey="6Le-wvkSAAAAAPBMRTvw..."
     data-callback="onSubmit">
</div>

<!-- Widget renders as: -->
<!-- [✓] I'm not a robot     reCAPTCHA logo -->

Kullanıcı onay kutusunu görür ve onunla etkileşime girer. Google şüphelenirse satır içi bir resim ızgarası sorgulaması görünür.

v2 Görünmez

<!-- Pattern 1: Invisible widget on a button -->
<button class="g-recaptcha"
        data-sitekey="6Le-wvkSAAAAAPBMRTvw..."
        data-callback="onSubmit"
        data-size="invisible">
  Submit
</button>

<!-- Pattern 2: Invisible div (programmatic trigger) -->
<div class="g-recaptcha"
     data-sitekey="6Le-wvkSAAAAAPBMRTvw..."
     data-size="invisible"
     data-callback="onSubmit">
</div>

<!-- Pattern 3: Programmatic render -->
<script>
  grecaptcha.render('submit-btn', {
    sitekey: '6Le-wvkSAAAAAPBMRTvw...',
    callback: onSubmit,
    size: 'invisible'
  });
</script>

Görünür widget yok. reCAPTCHA, kullanıcı belirtilen öğeyi tetiklediğinde veya grecaptcha.execute() çağrıldığında etkinleşir.


Bir sayfada hangi varyantın olduğu nasıl tespit edilir?

Python tespiti:

import requests
from bs4 import BeautifulSoup
import re

def detect_recaptcha_variant(url):
    resp = requests.get(url)
    soup = BeautifulSoup(resp.text, "html.parser")

    # Check for invisible indicators
    invisible_widget = soup.find(attrs={"data-size": "invisible", "class": "g-recaptcha"})
    if invisible_widget:
        return {
            "variant": "invisible",
            "sitekey": invisible_widget.get("data-sitekey"),
            "callback": invisible_widget.get("data-callback")
        }

    # Check for programmatic invisible in scripts
    for script in soup.find_all("script"):
        if script.string and "invisible" in str(script.string):
            key_match = re.search(r"sitekey['\"]?\s*[:=]\s*['\"]([^'\"]+)", script.string)
            if key_match:
                return {
                    "variant": "invisible-programmatic",
                    "sitekey": key_match.group(1),
                    "callback": "check grecaptcha.render() call"
                }

    # Check for standard checkbox
    checkbox_widget = soup.find(class_="g-recaptcha")
    if checkbox_widget:
        return {
            "variant": "checkbox",
            "sitekey": checkbox_widget.get("data-sitekey"),
            "callback": checkbox_widget.get("data-callback")
        }

    return None

result = detect_recaptcha_variant("https://staging.example.com/qa-login")
print(result)

Node.js tespiti:

const axios = require("axios");
const cheerio = require("cheerio");

async function detectRecaptchaVariant(url) {
  const { data } = await axios.get(url);
  const $ = cheerio.load(data);

  // Check for invisible
  const invisible = $(".g-recaptcha[data-size='invisible']");
  if (invisible.length) {
    return {
      variant: "invisible",
      sitekey: invisible.attr("data-sitekey"),
      callback: invisible.attr("data-callback"),
    };
  }

  // Check scripts for programmatic invisible
  const scripts = $("script")
    .map((_, el) => $(el).html())
    .get()
    .join("\n");
  if (scripts.includes("invisible")) {
    const keyMatch = scripts.match(/sitekey['"]?\s*[:=]\s*['"]([^'"]+)/);
    if (keyMatch) {
      return {
        variant: "invisible-programmatic",
        sitekey: keyMatch[1],
        callback: "check render call",
      };
    }
  }

  // Check for standard checkbox
  const checkbox = $(".g-recaptcha");
  if (checkbox.length) {
    return {
      variant: "checkbox",
      sitekey: checkbox.attr("data-sitekey"),
      callback: checkbox.attr("data-callback"),
    };
  }

  return null;
}

Hızlı tarayıcı konsolu kontrolü:

const el = document.querySelector('[data-size="invisible"]');
console.log(el ? "Invisible reCAPTCHA" : "Checkbox reCAPTCHA");
Algılama sinyali v2 Onay Kutusu v2 Görünmez
data-size="invisible" Mevcut değil Mevcut
Sayfada görünür onay kutusu Evet Hayır
grecaptcha.execute() çağrıldı Hayır (kullanıcı tıklamaları) Evet (programatik)
Açılan konuma meydan oku Satır içi, onay kutusunun altında Sayfanın sağ alt köşesi

CaptchaAI ile çözme

v2 Onay Kutusu

import requests
import time

resp = requests.get("https://ocr.captchaai.com/in.php", params={
    "key": "YOUR_API_KEY",
    "method": "userrecaptcha",
    "googlekey": "6Le-wvkSAAAA...",
    "pageurl": "https://example.com/form"
})
task_id = resp.text.split("|")[1]

for _ in range(60):
    time.sleep(5)
    result = requests.get("https://ocr.captchaai.com/res.php", params={
        "key": "YOUR_API_KEY", "action": "get", "id": task_id
    })
    if result.text.startswith("OK|"):
        token = result.text.split("|")[1]
        break

v2 Görünmez

import requests
import time

resp = requests.get("https://ocr.captchaai.com/in.php", params={
    "key": "YOUR_API_KEY",
    "method": "userrecaptcha",
    "googlekey": "6Le-wvkSAAAA...",
    "pageurl": "https://example.com/form",
    "invisible": 1  # Only parameter difference
})
task_id = resp.text.split("|")[1]

for _ in range(60):
    time.sleep(5)
    result = requests.get("https://ocr.captchaai.com/res.php", params={
        "key": "YOUR_API_KEY", "action": "get", "id": task_id
    })
    if result.text.startswith("OK|"):
        token = result.text.split("|")[1]
        break

Token enjeksiyonu — kritik fark

v2 Onay Kutusu: Gizli alan genellikle yeterlidir

# Selenium — inject into hidden field
driver.execute_script(
    f'document.getElementById("g-recaptcha-response").value = "{token}";'
)

# If the page uses a callback, also call it
callback = driver.find_element("css selector", ".g-recaptcha").get_attribute("data-callback")
if callback:
    driver.execute_script(f'{callback}("{token}");')

v2 Görünmez: Geri arama neredeyse her zaman gereklidir

# Selenium — inject AND call the callback
driver.execute_script(
    f'document.getElementById("g-recaptcha-response").value = "{token}";'
)

# CRITICAL: Invisible reCAPTCHA almost always requires calling the callback
callback_name = driver.find_element(
    "css selector", ".g-recaptcha[data-size='invisible']"
).get_attribute("data-callback")

driver.execute_script(f'{callback_name}("{token}");')
// Puppeteer — invisible callback injection
await page.evaluate((tok) => {
  // Set the hidden field
  document.getElementById("g-recaptcha-response").value = tok;

  // Find and call the callback function
  const widget = document.querySelector("[data-size='invisible']");
  const cbName = widget?.getAttribute("data-callback");
  if (cbName && typeof window[cbName] === "function") {
    window[cbName](tok);
  }
}, token);

Önemli fark: v2 onay kutusu formları genellikle yalnızca gizli alan eklemeyle çalışır çünkü kullanıcının onay kutusuna tıklaması zaten geri aramayı kaydetmiştir. Görünmez reCAPTCHA hiçbir zaman bu tıklamayı elde etmez; geri aramanın açıkça çağrılması gerekir.


Her iki varyant için evrensel çözücü

import requests
import time
from bs4 import BeautifulSoup

class RecaptchaV2UniversalSolver:
    def __init__(self, api_key):
        self.api_key = api_key

    def detect_and_solve(self, page_url, page_html=None):
        if not page_html:
            page_html = requests.get(page_url).text

        soup = BeautifulSoup(page_html, "html.parser")

        # Detect variant
        invisible = soup.find(attrs={"data-size": "invisible", "class": "g-recaptcha"})
        widget = invisible or soup.find(class_="g-recaptcha")

        if not widget:
            raise Exception("No reCAPTCHA widget found")

        sitekey = widget.get("data-sitekey")
        is_invisible = invisible is not None
        callback = widget.get("data-callback")

        params = {
            "key": self.api_key,
            "method": "userrecaptcha",
            "googlekey": sitekey,
            "pageurl": page_url
        }
        if is_invisible:
            params["invisible"] = 1

        resp = requests.get("https://ocr.captchaai.com/in.php", params=params)
        if not resp.text.startswith("OK|"):
            raise Exception(f"Submit failed: {resp.text}")

        task_id = resp.text.split("|")[1]
        for _ in range(60):
            time.sleep(5)
            result = requests.get("https://ocr.captchaai.com/res.php", params={
                "key": self.api_key, "action": "get", "id": task_id
            })
            if result.text.startswith("OK|"):
                return {
                    "token": result.text.split("|")[1],
                    "variant": "invisible" if is_invisible else "checkbox",
                    "callback": callback,
                    "sitekey": sitekey
                }
            if result.text != "CAPCHA_NOT_READY":
                raise Exception(f"Solve error: {result.text}")

        raise Exception("Timed out")

# Usage
solver = RecaptchaV2UniversalSolver("YOUR_API_KEY")
result = solver.detect_and_solve("https://staging.example.com/qa-login")
print(f"Variant: {result['variant']}, Callback: {result['callback']}")

Sorun giderme

Sorun Onay kutusu düzeltmesi Görünmez düzeltme
Jeton kabul edilmedi g-recaptcha-response alanına enjekte edin data-callback işlevini enjekte edin VE çağırın
Widget bulunamadı .g-recaptcha sınıfını arayın data-size="invisible" veya komut dosyası oluşturma çağrılarını kontrol edin
Form gönderilir ancak başarısız olur Geri aramanın beklenip beklenmediğini kontrol edin Geri arama neredeyse her zaman gereklidir; bulun ve arayın
Enjeksiyondan sonra sayfa yeniden yükleniyor JavaScript doğrulaması başarısız oldu Otomatik gönderim tetikleyicilerinden önce geri arama yapın

SSS

Görünmez reCAPTCHA'yı çözmek daha mı zor?

Hayır. CaptchaAI aracılığıyla çözüm süreci neredeyse aynıdır. İsteğinize invisible=1 eklenmesi tek değişikliktir. Ekstra zorluk enjeksiyon tarafındadır: geri arama işlevini bulmalı ve çalıştırmalısınız.

Her ikisi de aynı site anahtarı biçimini mi kullanıyor?

Evet. Site anahtarı formatı aynıdır. Varyantı yalnızca site anahtarından anlayamazsınız; HTML'de data-size="invisible" olup olmadığını kontrol edin.

Görünmez reCAPTCHA hala görsel zorlukları gösteriyor mu?

Evet. Google şüpheli bir davranış tespit ettiğinde görünmez reCAPTCHA, sayfanın sağ alt köşesinde bir resim sorgulama açılır penceresi gösterir. Bu nedenle hala CaptchaAI'ye ihtiyacınız var; görünmez versiyon hala zorluklar ortaya çıkarabilir.

Bir site onay kutusu ile görünmez arasında geçiş yapabilir mi?

Evet. Bu, sitenin ucundaki bir yapılandırma değişikliğidir; aynı site anahtarı, farklı uygulama. Bazı siteler masaüstünde onay kutusunu kullanır ve mobilde görünmez. Değişkeni her zaman dinamik olarak tespit edin.

Hangisini çözmek daha hızlı?

Görünmez çözümler genellikle biraz daha hızlıdır (10-25 saniyeye karşı 10-30 saniye), çünkü daha az görüntü sorununu tetikleme eğilimindedirler. Ancak fark marjinaldir.


İlgili kılavuzlar

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