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
- API Kullanarak reCAPTCHA v2 Nasıl Çözülür?— tam v2 onay kutusu eğitimi
- reCAPTCHA Invisible Nasıl Çalışır?— görünmez mekanizma açıklandı
- API Kullanarak reCAPTCHA Invisible Nasıl Çözülür?— görünmez çözme öğreticisi
- Yaygın reCAPTCHA Invisible Hataları ve Düzeltmeleri— görünmez sorun giderme
- API Kullanarak reCAPTCHA Invisible Nasıl Çözülür?
- reCAPTCHA Invisible Nasıl Çalışır?
- reCAPTCHA v2 vs v3 Açıklaması