Chaque résolution reCAPTCHA via CaptchaAI nécessite la clé de site et l'URL de la page correctes. Certains types de CAPTCHA nécessitent également des paramètres supplémentaires : action (v3), données (sites Google) ou indicateur d'entreprise. Ce guide couvre chaque méthode d'extraction.
Paramètres par version de reCAPTCHA
| Paramètre | Norme v2 | v2 invisible | v3 | Entreprise |
|---|---|---|---|---|
googlekey (clé de site) |
Obligatoire | Obligatoire | Obligatoire | Obligatoire |
pageurl |
Obligatoire | Obligatoire | Obligatoire | Obligatoire |
invisible |
- | 1 |
- | - |
action |
- | - | Obligatoire | Parfois |
data-s |
Parfois | Parfois | - | - |
enterprise |
- | - | - | 1 |
Méthode 1 : extraction d'attributs HTML
À partir de l'attribut data-sitekey
import re
import requests
url = "https://example.com/login"
html = requests.get(url).text
# Find data-sitekey
match = re.search(r'data-sitekey=["\']([A-Za-z0-9_-]+)["\']', html)
if match:
sitekey = match.group(1)
print(f"Sitekey: {sitekey}")
# Check if invisible
invisible_match = re.search(r'data-size=["\']invisible["\']', html)
is_invisible = bool(invisible_match)
print(f"Invisible: {is_invisible}")
# Find callback
callback_match = re.search(r'data-callback=["\'](\w+)["\']', html)
callback = callback_match.group(1) if callback_match else None
print(f"Callback: {callback}")
# Check for data-s (Google-owned sites)
data_s_match = re.search(r'data-s=["\']([^"\']+)["\']', html)
data_s = data_s_match.group(1) if data_s_match else None
print(f"data-s: {data_s}")
JavaScript (Marionnette)
const puppeteer = require('puppeteer');
const browser = await puppeteer.launch();
const page = await browser.newPage();
await page.goto('https://example.com/login', { waitUntil: 'networkidle2' });
const params = await page.evaluate(() => {
const widget = document.querySelector('.g-recaptcha');
if (!widget) return null;
return {
sitekey: widget.getAttribute('data-sitekey'),
size: widget.getAttribute('data-size'),
callback: widget.getAttribute('data-callback'),
dataS: widget.getAttribute('data-s'),
invisible: widget.getAttribute('data-size') === 'invisible',
};
});
console.log(params);
Méthode 2 : extraction de balises de script
Clés de site reCAPTCHA v3 et Enterprise
Les clés de site v3 sont intégrées dans l'URL du script :
# Find sitekey from script src
v3_match = re.search(
r'recaptcha/(?:api|enterprise)\.js\?.*?render=([A-Za-z0-9_-]+)',
html
)
if v3_match:
sitekey = v3_match.group(1)
print(f"v3 Sitekey: {sitekey}")
# Check enterprise
is_enterprise = 'enterprise.js' in html
print(f"Enterprise: {is_enterprise}")
Trouver le paramètre d'action
L'action est transmise dans le code JavaScript, pas dans les attributs HTML :
# Search for grecaptcha.execute calls
action_match = re.search(
r'grecaptcha\.execute\s*\([^,]+,\s*\{[^}]*action\s*:\s*["\']([^"\']+)',
html
)
if action_match:
action = action_match.group(1)
print(f"Action: {action}")
Méthode 3 : extraction Iframe src
Lorsque reCAPTCHA est rendu dans une iframe :
# Find reCAPTCHA iframe
iframe_match = re.search(
r'<iframe[^>]+src=["\']([^"\']*recaptcha/api2/anchor[^"\']*)["\']',
html
)
if iframe_match:
iframe_src = iframe_match.group(1)
sitekey_match = re.search(r'k=([A-Za-z0-9_-]+)', iframe_src)
if sitekey_match:
sitekey = sitekey_match.group(1)
print(f"Iframe sitekey: {sitekey}")
Méthode 4 : extraction du rendu JavaScript
Pour les pages qui affichent reCAPTCHA dynamiquement avec grecaptcha.render() :
# Find grecaptcha.render calls
render_match = re.search(
r'grecaptcha\.render\s*\([^,]*,\s*\{([^}]+)\}',
html
)
if render_match:
config = render_match.group(1)
sk = re.search(r'sitekey\s*:\s*["\']([A-Za-z0-9_-]+)', config)
cb = re.search(r'callback\s*:\s*["\']?(\w+)', config)
sz = re.search(r'size\s*:\s*["\'](\w+)', config)
print(f"Sitekey: {sk.group(1) if sk else 'not found'}")
print(f"Callback: {cb.group(1) if cb else 'not found'}")
print(f"Size: {sz.group(1) if sz else 'not found'}")
Fonction d'extraction complète
import re
import requests
def extract_recaptcha_params(url):
html = requests.get(url, timeout=15).text
params = {"pageurl": url}
# Sitekey from data-sitekey
sk = re.search(r'data-sitekey=["\']([A-Za-z0-9_-]+)', html)
if sk:
params["sitekey"] = sk.group(1)
# Sitekey from script render parameter (v3)
if "sitekey" not in params:
v3 = re.search(r'render=([A-Za-z0-9_-]{20,})', html)
if v3:
params["sitekey"] = v3.group(1)
# Sitekey from iframe
if "sitekey" not in params:
iframe = re.search(r'recaptcha.*?k=([A-Za-z0-9_-]+)', html)
if iframe:
params["sitekey"] = iframe.group(1)
# Sitekey from grecaptcha.render
if "sitekey" not in params:
render = re.search(r'sitekey\s*:\s*["\']([A-Za-z0-9_-]+)', html)
if render:
params["sitekey"] = render.group(1)
# Version detection
if re.search(r'data-size=["\']invisible', html):
params["invisible"] = True
if 'enterprise.js' in html:
params["enterprise"] = True
# Action (v3)
action = re.search(
r'action\s*:\s*["\']([^"\']+)',
html[html.find('grecaptcha.execute'):] if 'grecaptcha.execute' in html else ''
)
if action:
params["action"] = action.group(1)
# data-s
ds = re.search(r'data-s=["\']([^"\']+)', html)
if ds:
params["data_s"] = ds.group(1)
# Callback
cb = re.search(r'data-callback=["\'](\w+)', html)
if cb:
params["callback"] = cb.group(1)
return params
# Usage
params = extract_recaptcha_params("https://example.com/login")
for k, v in params.items():
print(f" {k}: {v}")
Résultat attendu :
pageurl: https://example.com/login
sitekey: 6Le-SITEKEY-abc123
invisible: True
callback: onCaptchaComplete
Soumission des paramètres extraits à CaptchaAI
data = {
"key": API_KEY,
"method": "userrecaptcha",
"googlekey": params["sitekey"],
"pageurl": params["pageurl"],
"json": "1",
}
if params.get("invisible"):
data["invisible"] = "1"
if params.get("enterprise"):
data["enterprise"] = "1"
if params.get("action"):
data["action"] = params["action"]
if params.get("data_s"):
data["data-s"] = params["data_s"]
resp = requests.post("https://ocr.captchaai.com/in.php", data=data).json()
Dépannage
| Problème | Parce que | Corriger |
|---|---|---|
| Aucune clé de site trouvée | La page utilise le rendu dynamique | Utilisez Puppeteer/Selenium au lieu du HTML statique |
| Mauvaise clé de site | Plusieurs instances de reCAPTCHA | Vérifiez quel widget correspond au formulaire que vous soumettez |
| Action introuvable | Défini dans un fichier JS externe | Récupérer et rechercher des fichiers JavaScript liés |
Modifications data-s par demande |
Google le régénère | Extrayez de nouveaux data-s pour chaque résolution |
FAQ
Puis-je extraire des paramètres sans charger la page dans un navigateur ?
Oui, pour la plupart des sites : la clé du site se trouve dans la source HTML. Mais les CAPTCHA rendus en JavaScript nécessitent un navigateur ou un navigateur sans tête.
La clé du site est-elle la même que la clé API ?
Non. La clé du site est une clé publique attribuée au site Web. Le partage est sécurisé et est visible dans la source de la page.
Utilisez les paramètres extraits avec CaptchaAI pour une résolution fiable
Obtenez votre clé API surcaptchaai.com.
Guides associés
- Détection CAPTCHA de la console du navigateur
- Mécanisme de rappel reCAPTCHA v2
- reCAPTCHA v2 Invisible : Détection de déclenchement