Cada resolución de reCAPTCHA a través de CaptchaAI requiere la clave del sitio y la URL de la página correctas. Algunos tipos de CAPTCHA también necesitan parámetros adicionales: acción (v3), datos (sitios de Google) o bandera empresarial. Esta guía cubre todos los métodos de extracción.
Parámetros por versión de reCAPTCHA
| Parámetro | Estándar v2 | v2 invisible | v3 | Empresa |
|---|---|---|---|---|
googlekey (clave del sitio) |
Requerido | Requerido | Requerido | Requerido |
pageurl |
Requerido | Requerido | Requerido | Requerido |
invisible |
- | 1 |
- | - |
action |
- | - | Requerido | A veces |
data-s |
A veces | A veces | - | - |
enterprise |
- | - | - | 1 |
Método 1: extracción de atributos HTML
Del atributo data-sitekey
import re
import requests
url = "https://staging.example.com/qa-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 (titiritero)
const puppeteer = require('puppeteer');
const browser = await puppeteer.launch();
const page = await browser.newPage();
await page.goto('https://staging.example.com/qa-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étodo 2: extracción de etiquetas de script
reCAPTCHA v3 y claves de sitio empresariales
Las claves de sitio v3 están integradas en la URL del 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}")
Encontrar el parámetro de acción
La acción se pasa en código JavaScript, no en atributos 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étodo 3: extracción de Iframe src
Cuando reCAPTCHA se representa dentro de un 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étodo 4: extracción de renderizado de JavaScript
Para páginas que representan reCAPTCHA dinámicamente con 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'}")
Función de extracción completa
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://staging.example.com/qa-login")
for k, v in params.items():
print(f" {k}: {v}")
Resultado esperado:
pageurl: https://staging.example.com/qa-login
sitekey: 6Le-SITEKEY-abc123
invisible: True
callback: onCaptchaComplete
Envío de parámetros extraídos a 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()
Solución de problemas
| problema | causa | Solución |
|---|---|---|
| No se encontró ninguna clave de sitio | La página utiliza renderizado dinámico. | Utilice Puppeteer/Selenium en lugar de HTML estático |
| Clave de sitio incorrecta | Múltiples instancias de reCAPTCHA | Compruebe qué widget se asigna al formulario que está enviando |
| Acción no encontrada | Definido en un archivo JS externo | Obtener y buscar archivos JavaScript vinculados |
data-s cambios por solicitud |
Google lo regenera | Extraiga data-s nuevo para cada solución |
Preguntas frecuentes
¿Puedo extraer parámetros sin cargar la página en un navegador?
Sí, para la mayoría de los sitios, la clave del sitio está en la fuente HTML, pero los CAPTCHA renderizados en JavaScript requieren un navegador o un navegador sin cabeza.
¿La clave del sitio es la misma que la clave API?
No. La clave del sitio es una clave pública asignada al sitio web. Es seguro compartirlo y es visible en la fuente de la página.
Utilice parámetros extraídos con CaptchaAI para una resolución confiable
Obtenga su clave API encaptchaai.com.
Guías relacionadas
- Detección de CAPTCHA de la consola del navegador
- Mecanismo de devolución de llamada reCAPTCHA v2
- reCAPTCHA v2 Invisible: Detección de disparador