reCAPTCHA v2 Invisible n'a pas de case à cocher visible. Il s'active automatiquement lorsqu'un utilisateur soumet un formulaire ou clique sur un bouton, et affiche un défi uniquement si l'analyse des risques de Google détecte un comportement suspect. Cela rend la détection plus difficile dans l'automatisation : vous ne réaliserez peut-être pas qu'il existe un CAPTCHA jusqu'à ce que la soumission de votre formulaire échoue.
En quoi Invisible reCAPTCHA diffère de la version standard v2
| Caractéristique | Norme reCAPTCHA v2 | reCAPTCHA v2 Invisible |
|---|---|---|
| Widget visible | Oui (case à cocher) | Non (badge uniquement) |
| Interaction de l'utilisateur | Cliquez sur la case à cocher | Automatique lors de la soumission du formulaire |
data-size |
normal ou compact |
invisible |
| Fenêtre contextuelle du défi | Toujours possible | Uniquement pour les utilisateurs suspects |
| Élément DOM | .g-recaptcha div |
.g-recaptcha div ou programmatique |
Détection du reCAPTCHA invisible
Méthode 1 : vérifier l'attribut data-size
// 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');
}
});
Méthode 2 : Vérifier le badge
Invisible reCAPTCHA affiche un petit badge dans le coin :
const badge = document.querySelector('.grecaptcha-badge');
if (badge) {
console.log('reCAPTCHA badge found — likely Invisible reCAPTCHA');
console.log('Badge visibility:', getComputedStyle(badge).visibility);
}
Méthode 3 : vérifier les appels grecaptcha.execute
Si la page utilise l'invocation programmatique (pas de div .g-recaptcha) :
// 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]);
}
});
Méthode 4 : vérifier le paramètre de rendu de la balise de script
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);
}
});
Résolution avec CaptchaAI
La principale différence : passez invisible=1 à CaptchaAI pour que le solveur sache qu'il gère une variante invisible.
Python
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://example.com/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']}")
Javascript
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://example.com/login',
invisible: 1,
json: 1,
}
});
const taskId = resp.data.request;
console.log(`Submitted: ${taskId}`);
Injection de jetons pour Invisible reCAPTCHA
Invisible reCAPTCHA est généralement lié à un bouton ou à un formulaire de soumission. Après l'injection, vous devez déclencher le rappel ou soumettre le formulaire :
from selenium import webdriver
from selenium.webdriver.common.by import By
driver = webdriver.Chrome()
driver.get("https://example.com/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()
Identifier l'élément déclencheur
Le reCAPTCHA invisible peut être lié à un bouton spécifique :
<button class="g-recaptcha"
data-sitekey="6Le-SITEKEY"
data-callback="onSubmit"
data-size="invisible">
Submit
</button>
Ou activé par programme :
// Site's code
document.getElementById('submit-btn').addEventListener('click', function() {
grecaptcha.execute();
});
Vérifiez les deux modèles :
// 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'));
});
Dépannage
| Problème | Parce que | Corriger |
|---|---|---|
| Jeton rejeté | invisible=1 manquant dans la soumission |
Ajouter invisible: "1" à la requête CaptchaAI |
| Impossible de trouver la clé du site | Pas de div .g-recaptcha |
Recherchez les appels programmatiques grecaptcha.render() ou grecaptcha.execute() |
| Le formulaire est soumis mais échoue | Rappel non déclenché | Recherchez et appelez la fonction data-callback |
| CAPTCHA non détecté | Apparaît uniquement pour le trafic suspect | Recherchez l'élément grecaptcha-badge ou les balises de script recaptcha |
FAQ
Comment distinguer Invisible v2 de v3 ?
Invisible v2 utilise grecaptcha.execute() sans paramètre action. La v3 utilise grecaptcha.execute(sitekey, {action: 'submit'}) avec une action. De plus, la v3 utilise render=SITEKEY dans l'URL du script.
Est-ce important d’oublier le drapeau invisible ?
Oui. Sans invisible=1, le solveur peut essayer une approche de résolution différente qui produit des jetons rejetés par le site.
Puis-je résoudre Invisible reCAPTCHA sans navigateur ?
Oui, vous n'avez besoin que de la clé du site et de l'URL de la page. Le navigateur n'a besoin que d'injecter le jeton et de déclencher le rappel.
Résolvez reCAPTCHA v2 Invisible de manière transparente avec CaptchaAI
Obtenez votre clé API surcaptchaai.com.
Guides associés
- Mécanisme de rappel reCAPTCHA v2
- Extraction des paramètres reCAPTCHA de la source de la page
- Détection CAPTCHA de la console du navigateur