El parámetro data-s es un token específico de la sesión que aparece en algunas implementaciones de reCAPTCHA, principalmente en propiedades propiedad de Google, como la Búsqueda de Google, YouTube y Google Play. Cuando esté presente, debe incluirse en su solicitud de API de solución; omitirlo provoca fallas de resolución o tokens no válidos. Esta guía explica qué es data-s, dónde aparece, cómo extraerlo y cómo pasarlo a CaptchaAI.
¿Qué es el parámetro data-s?
El parámetro data-s es un token de sesión generado por el servidor integrado en el widget HTML de reCAPTCHA. Vincula el desafío CAPTCHA a una sesión de servidor específica, evitando la reutilización de tokens en diferentes sesiones.
donde aparece
<!-- reCAPTCHA widget with data-s parameter -->
<div class="g-recaptcha"
data-sitekey="6LcR_RsTAAAAAN_r0GEkGBfq3L7KmU5JbPHJtwNp"
data-s="AB2grfE8_kyMp3XYRuJo5c..."
data-callback="onCaptchaSolved">
</div>
El atributo data-s se encuentra junto al estándar data-sitekey en el elemento reCAPTCHA <div>.
Características clave
| Propiedad | Valor |
|---|---|
| Formato | Cadena codificada en Base64, 200-500 caracteres |
| Vida útil | De un solo uso, vinculado a la carga de la página actual |
| Alcance | Específico de la sesión, no se puede reutilizar entre cargas de páginas |
| Requerido | Sí, cuando está presente: la resolución falla sin él. |
| Actualiza | Nuevo valor en cada página load/refresh |
Cuando los datos están presentes
El parámetro data-s NO está presente en la mayoría de las implementaciones de reCAPTCHA. Aparece principalmente en:
| Sitio | Presencia | Notas |
|---|---|---|
| Búsqueda de Google (lo siento, tráfico /unusual) | siempre | Requerido para resolver CAPTCHA de Búsqueda de Google |
| YouTube | A veces | Aparece en ciertos flujos de verificación |
| ** Google Play ** | A veces | Verificación de listado de aplicaciones |
| Formularios de Google | Rara vez | Implementaciones limitadas |
| Sitios de terceros que utilizan reCAPTCHA | Casi nunca | Las integraciones estándar no utilizan datos |
Si NO está trabajando con propiedades propiedad de Google, probablemente no tenga que preocuparse por data-s. Si su solucionador devuelve tokens no válidos para un CAPTCHA de búsqueda de Google, la causa probable es que falta data-s.
Cómo funcionan técnicamente los datos
User triggers CAPTCHA (e.g., Google flags unusual search traffic)
↓
Google serves a CAPTCHA page with:
- data-sitekey (site key, same for all Google search CAPTCHAs)
- data-s (session token, unique per page load)
↓
reCAPTCHA widget initializes with both parameters
↓
Challenge completion generates a g-recaptcha-response token
↓
Token is submitted alongside the session reference
↓
Google validates token + session binding
↓
If data-s was not used during solving: "invalid-input-response" or silent failure
El parámetro data-s actúa esencialmente como un nonce: vincula el desafío CAPTCHA a una sesión específica del lado del servidor. El solucionador debe usar este valor al generar el token para que el token resultante coincida con la sesión esperada.
Extrayendo datos de la página
Extracción de Python
import requests
from bs4 import BeautifulSoup
import re
def extract_recaptcha_params(url):
"""Extract reCAPTCHA parameters including data-s from a page."""
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) "
"AppleWebKit/537.36 (KHTML, like Gecko) "
"Chrome/120.0.0.0 Safari/537.36",
}
response = requests.get(url, headers=headers, timeout=15)
soup = BeautifulSoup(response.text, "html.parser")
# Find reCAPTCHA widget div
widget = soup.find("div", class_="g-recaptcha")
if not widget:
# Try finding by data-sitekey attribute
widget = soup.find(attrs={"data-sitekey": True})
if not widget:
return {"error": "No reCAPTCHA widget found"}
params = {
"sitekey": widget.get("data-sitekey"),
"data_s": widget.get("data-s"),
"callback": widget.get("data-callback"),
"size": widget.get("data-size"),
"has_data_s": widget.get("data-s") is not None,
}
return params
# Example: Google "unusual traffic" page
params = extract_recaptcha_params("https://www.google.com/sorry/index")
print(params)
# {
# "sitekey": "6LfwuyUT...",
# "data_s": "AB2grfE8_kyMp3...",
# "has_data_s": True
# }
Extracción de Node.js
const axios = require("axios");
const cheerio = require("cheerio");
async function extractRecaptchaParams(url) {
const { data: html } = await axios.get(url, {
headers: {
"User-Agent":
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) " +
"AppleWebKit/537.36 (KHTML, like Gecko) " +
"Chrome/120.0.0.0 Safari/537.36",
},
timeout: 15000,
});
const $ = cheerio.load(html);
const widget = $(".g-recaptcha, [data-sitekey]").first();
if (widget.length === 0) {
return { error: "No reCAPTCHA widget found" };
}
return {
sitekey: widget.attr("data-sitekey"),
dataS: widget.attr("data-s") || null,
callback: widget.attr("data-callback") || null,
hasDataS: !!widget.attr("data-s"),
};
}
extractRecaptchaParams("https://www.google.com/sorry/index")
.then(console.log);
Extracción de selenio (para páginas dinámicas)
from selenium import webdriver
from selenium.webdriver.common.by import By
def extract_data_s_selenium(driver, url):
"""Extract data-s from a dynamically loaded reCAPTCHA page."""
driver.get(url)
# Wait for reCAPTCHA widget to load
import time
time.sleep(3)
try:
widget = driver.find_element(By.CSS_SELECTOR, ".g-recaptcha, [data-sitekey]")
return {
"sitekey": widget.get_attribute("data-sitekey"),
"data_s": widget.get_attribute("data-s"),
}
except Exception:
return {"error": "Widget not found"}
Resolviendo con data-s usando CaptchaAI
Cuando data-s esté presente, inclúyalo en su solicitud de API CaptchaAI:
pitón
import requests
import time
API_KEY = "YOUR_API_KEY"
# Step 1: Extract parameters from the CAPTCHA page
sitekey = "6LfwuyUTAAAAAOAmoS0fdqijC2PbbdH4kjq62Y1b"
data_s = "AB2grfE8_kyMp3XYRuJo5c..." # Extracted from data-s attribute
page_url = "https://www.google.com/sorry/index?continue=..."
# Step 2: Submit to CaptchaAI WITH data-s
submit = requests.post("https://ocr.captchaai.com/in.php", data={
"key": API_KEY,
"method": "userrecaptcha",
"googlekey": sitekey,
"pageurl": page_url,
"data-s": data_s, # Include data-s parameter
"json": 1,
})
task_id = submit.json()["request"]
# Step 3: Poll for result
for _ in range(60):
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.get("status") == 1:
token = result["request"]
print(f"Token: {token[:60]}...")
# Submit this token to the Google CAPTCHA form
break
Nodo.js
const axios = require("axios");
async function solveWithDataS(sitekey, dataS, pageUrl) {
const API_KEY = "YOUR_API_KEY";
// Submit with data-s
const { data: submit } = await axios.post(
"https://ocr.captchaai.com/in.php",
new URLSearchParams({
key: API_KEY,
method: "userrecaptcha",
googlekey: sitekey,
pageurl: pageUrl,
"data-s": dataS,
json: 1,
})
);
const taskId = submit.request;
// Poll
for (let i = 0; i < 60; i++) {
await new Promise((r) => setTimeout(r, 5000));
const { data: result } = await axios.get(
"https://ocr.captchaai.com/res.php",
{
params: {
key: API_KEY,
action: "get",
id: taskId,
json: 1,
},
}
);
if (result.status === 1) {
return result.request;
}
}
throw new Error("Timeout");
}
Errores comunes en los datos
| error | Síntoma | Solución |
|---|---|---|
| Omitir datos-s cuando están presentes | La validación del token falla silenciosamente | Siempre verifique el atributo data-s antes de enviar |
| Incluyendo datos cuando no están presentes | Resolver error o solicitud rechazada | Solo incluya data-s si el atributo existe en el widget |
| Reutilización de datos entre cargas de páginas | Token no válido | Extraiga datos nuevos para cada carga de página |
| Los datos de codificación de URL son incorrectos | Parámetro mal formado | Pase el valor base64 sin formato sin codificación adicional |
| Usando datos obsoletos (página cargada hace minutos) | Discrepancia de tokens | Extraiga los datos inmediatamente antes de enviarlos al solucionador |
Ayudante de extracción de datos
Una utilidad reutilizable que maneja páginas reCAPTCHA con y sin datos:
import requests
from bs4 import BeautifulSoup
class RecaptchaExtractor:
"""Extract reCAPTCHA parameters from any page."""
def __init__(self, url, session=None):
self.url = url
self.session = session or requests.Session()
self.params = None
def extract(self):
"""Extract sitekey, data-s, and other parameters."""
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) "
"AppleWebKit/537.36 (KHTML, like Gecko) "
"Chrome/120.0.0.0 Safari/537.36",
}
response = self.session.get(self.url, headers=headers, timeout=15)
soup = BeautifulSoup(response.text, "html.parser")
widget = soup.find(attrs={"data-sitekey": True})
if not widget:
raise ValueError("No reCAPTCHA widget found on page")
self.params = {
"sitekey": widget["data-sitekey"],
"pageurl": self.url,
}
# Include data-s only if present
data_s = widget.get("data-s")
if data_s:
self.params["data-s"] = data_s
return self.params
def build_solver_payload(self, api_key):
"""Build CaptchaAI submission payload with correct parameters."""
if not self.params:
self.extract()
payload = {
"key": api_key,
"method": "userrecaptcha",
"googlekey": self.params["sitekey"],
"pageurl": self.params["pageurl"],
"json": 1,
}
# Only include data-s when it exists
if "data-s" in self.params:
payload["data-s"] = self.params["data-s"]
return payload
# Usage
extractor = RecaptchaExtractor("https://www.google.com/sorry/index?continue=...")
payload = extractor.build_solver_payload("YOUR_API_KEY")
# payload includes data-s only when present on the page
Preguntas frecuentes
¿Siempre necesito datos para resolver reCAPTCHA?
No. El parámetro data-s solo aparece en un pequeño subconjunto de implementaciones de reCAPTCHA, principalmente propiedades propiedad de Google. Para sitios web estándar de terceros que utilizan reCAPTCHA, solo necesita sitekey y pageurl. Verifique siempre la presencia de data-s en el widget antes de decidir si incluirlo.
¿Qué sucede si incluyo datos cuando no son necesarios?
Algunos solucionadores pueden ignorar el parámetro adicional. Otros pueden devolver un error. Es una buena práctica incluir únicamente data-s cuando realmente exista en el widget reCAPTCHA de la página de destino.
¿Puedo almacenar en caché datos en varias soluciones?
No. El valor data-s es específico de la sesión y está vinculado a la carga de una sola página. Cada vez que carga la página CAPTCHA, se genera un nuevo valor data-s. Debe extraer un valor nuevo antes de cada solicitud de resolución.
¿Por qué mi resolución CAPTCHA de Búsqueda de Google falla incluso con la clave de sitio correcta?
Si está resolviendo un CAPTCHA de "tráfico inusual" de la Búsqueda de Google, la causa de falla más común es la falta del parámetro data-s. Los CAPTCHA de búsqueda de Google siempre incluyen data-s y la resolución fallará sin él. Extraiga el atributo data-s del elemento <div> del widget reCAPTCHA.
Resumen
El parámetro data-s es un token de enlace de sesión que se encuentra en implementaciones selectas de reCAPTCHA, principalmente propiedades propiedad de Google. Cuando esté presente, debe extraerlo del HTML del widget reCAPTCHA e incluirlo en suCaptchaAISolicitud de API. Siempre verifique data-s antes de enviar: inclúyalo cuando esté presente, omítalo cuando no esté. Específicamente para los CAPTCHA de búsqueda de Google, siempre se requiere data-s.
Artículos relacionados
- Cómo resolver la devolución de llamada de Recaptcha V2 usando Api
- Torniquete Recaptcha V2 Manejo en el mismo sitio
- Explicación del ciclo de vida del token Recaptcha