En este artículo hemos intentado responder a todas las preguntas clave. Para empezar a resolver la tarea, primero hay que determinar qué sistema de protección se está utilizando. Para ello, puedes consultar la lista de captchas y sistemas de protección antibot más populares, donde se muestran ejemplos visuales y señales clave que te ayudarán a identificar rápidamente con qué estás tratando.
Si descubres que tu sitio web utiliza DataDome CAPTCHA, el siguiente paso será analizar con más detalle sus propiedades y su funcionamiento. En este mismo artículo también puedes consultar la guía de integración de DataDome CAPTCHA para comprender por completo cómo funciona en tu sitio. Esto te permitirá no solo entender la protección actual, sino también planificar correctamente su mantenimiento.
Trabajar con CapMonster Cloud mediante la API suele implicar los siguientes pasos:
type - CustomTask
class - DataDome
websiteURL - la dirección de la página principal donde se resuelve el CAPTCHA.
captchaUrl (dentro de metadata) - "captchaUrl" — el enlace al CAPTCHA. Normalmente en este formato: "https://geo.captcha-delivery.com/captcha/?initialCid=..."
datadomeCookie (dentro de metadata) - Tus cookies de DataDome. Se pueden obtener en la página usando document.cookie (si las cookies no tienen la bandera HttpOnly), en el encabezado de solicitud Set-Cookie: "datadome=...", o directamente desde el código HTML de la página initialCid.
userAgent - User-Agent del navegador. Proporciona solo el UA actual desde Windows.
Además, para esta tarea debes usar tus proxies:
proxyType :
proxyAddress - Dirección IP del proxy (IPv4/IPv6).
proxyPort - Puerto del proxy.
proxyLogin - Usuario del proxy.
proxyPassword - Contraseña del proxy.
https://api.capmonster.cloud/createTask
{
"clientKey": "API_KEY",
"task": {
"type": "CustomTask",
"class": "DataDome",
"websiteURL": "https://example.com",
"userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/142.0.0.0 Safari/537.36",
"metadata": {
"captchaUrl": "https://geo.captcha-delivery.com/interstitial/?initialCid=AHrlqAAAAAMA9UvsL58YLqIAXNLFPg%3D%3D&hash=C0705ACD75EBF650A07FF8291D3528&cid=7sfa5xUfDrR4bQTp1c2mhtiD7jj9TXExcQypjdNAxKVFyIi1S9tE0~_mqLa2EFpOuzxKcZloPllsNHjNnqzD9HmBA4hEv7SsEyPYEidCBvjZEaDyfRyzefFfolv0lAHM&referer=https%3A%2F%2Fwww.example.com.au%2F&s=6522&b=978936&dm=cm",
"datadomeCookie": "datadome=VYUWrgJ9ap4zmXq8Mgbp...64emvUPeON45z"
},
"proxyType": "http",
"proxyAddress": "123.45.67.89",
"proxyPort": 8080,
"proxyLogin": "proxyUsername",
"proxyPassword": "proxyPassword"
}
}
{
"errorId":0,
"taskId":407533072
}https://api.capmonster.cloud/getTaskResult{
"clientKey":"API_KEY",
"taskId": 407533072
}
{
"errorId": 0,
"status": "ready",
"solution": {
"domains": {
"www.example.com": {
"cookies": {
"datadome": "P1w0VnjFcTFslfps0J4FaPpY_QPbPBW4MeYxj4LW~pztIfJiSSuBPr8oQTUHzdrfgv137FbOBd3kCUOOgny7LhIkhm5e1qdtzYM4s2e46U_qfERK4KiCy22MOSIDsDyh"
},
"localStorage": null
}
},
"url": null,
"fingerprint": null,
"headers": null,
"data": null
}
}
// npx playwright install chromium
import { chromium } from 'playwright';
import { CapMonsterCloudClientFactory, ClientOptions, DataDomeRequest } from '@zennolab_com/capmonstercloud-client';
// Introduce tu clave API de CapMonster Cloud
const API_KEY = 'YOUR_API_KEY';
// Tu sitio está protegido por DataDome
const TARGET_URL = 'https://example.com/';
const USER_AGENT = Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/142.0.0.0 Safari/537.36
// Configuración del proxy
const proxy = {
proxyType: "http",
proxyAddress: '8.8.8.8',
proxyPort: 8080,
proxyLogin: 'proxyLogin',
proxyPassword: 'proxyPassword'
};
async function main() {
// Iniciar navegador
const browser = await chromium.launch({ headless: true });
const context = await browser.newContext({ userAgent: USER_AGENT });
const page = await context.newPage();
// Ir al sitio web
await page.goto(TARGET_URL, { waitUntil: 'networkidle' });
// Buscando cookie datadome existente (si hay)
const existingDd = (await context.cookies()).find(c => /datadome|dd_/i.test(c.name));
// Encontrar iframe de DataDome -> URL del CAPTCHA
const captchaUrl = await page.evaluate(() =>
Array.from(document.querySelectorAll('iframe[src]'))
.find(i => /captcha-delivery\.com\/captcha/i.test(i.src))
?.src || null
);
console.log(`=== Parámetros de DataDome extraídos ===`);
console.log(`captchaUrl:`, captchaUrl || 'no encontrado');
console.log(`cookie datadome actual::`, existingDd ? ${existingDd.name}=${existingDd.value}` : 'ninguna');
const cm = CapMonsterCloudClientFactory.Create(
new ClientOptions({ clientKey: API_KEY })
);
// Enviar tarea a CapMonster
console.log(`Enviando tarea DataDome a CapMonster......`);
// Enviando tarea de DataDome para resolver
const solve = await cm.Solve(new DataDomeRequest({
_class: "DataDome",
websiteURL: TARGET_URL,
userAgent: USER_AGENT,
proxy,
metadata: {
captchaUrl: captchaUrl || undefined,
datadomeCookie: existingDd
? `${existingDd.name}=${existingDd.value}`
: undefined
}
}));
const sol = solve?.solution;
// Obtener dominio y cookies necesarias de la solución
const host = new URL(TARGET_URL).hostname;
const domainKey =
Object.keys(sol.domains).find(d => d.includes(host))
|| Object.keys(sol.domains)[0];
const cookiesArr = sol.domains[domainKey]?.cookies || [];
console.log(`\n=== Cookies de CapMonster ===`);
cookiesArr.forEach(c => console.log(`${c.name}=${c.value}`));
const ddSolved =
cookiesArr.find(c => c.name?.toLowerCase() === 'datadome')
|| cookiesArr.find(c => /datadome/i.test(c.name));
// Establecer cookie datadome en el navegador
await context.addCookies([{
name: 'datadome',
value: ddSolved.value,
domain: '.' + host,
path: '/',
httpOnly: ddSolved.httpOnly ?? true,
secure: ddSolved.secure ?? true,
sameSite: ddSolved.sameSite ?? 'Lax'
}]);
console.log(`Cookie datadome establecida:`, ddSolved.value);
// Reabrir sitio después de insertar cookie
const page2 = await context.newPage();
const resp2 = await page2.goto(TARGET_URL, { waitUntil: 'domcontentloaded', timeout: 60000 });
console.log(`Estado después de establecer cookie:: ${resp2?.status()}`);
await browser.close();
}
main();
1. Inicia sesión en tu cuenta o regístrate en DataDome y obtén las claves (client-side y server-side).
Importante: se requiere un correo corporativo de tu empresa para el registro.
Después del registro, accederás al panel de administración.
2. Agrega tu sitio (dominio) en el panel de DataDome.
Agrega tu dominio al sistema y selecciona parámetros de protección:
3. Instala la integración del lado del servidor.
Usa Protection API o selecciona un módulo listo para tu stack (Node.js / Express, Nginx, Cloudflare, Java (Tomcat/Jetty/Vert.x), Go, etc.).
Instala el SDK/middleware oficial de DataDome y configura la clave del servidor (server-side key).
Ejemplo de integración de DataDome en Node.js:
DataDome protege el servidor de bots y solicitudes sospechosas, mostrando automáticamente un desafío cuando es necesario. El módulo se puede usar con Express o con el servidor HTTP integrado Node.js.
Instalación
Para Express:
npm install @datadome/module-expressPara módulo HTTP de Node.js:
npm install @datadome/module-httpSe admiten Node.js versión 18 o superior. Se requiere la clave server-side de tu panel de DataDome.
const { DatadomeExpress } = require('@datadome/module-express');
const express = require('express');
const app = express();
// Inicializar cliente DataDome
const datadomeClient = new DatadomeExpress('YOUR_SERVER_KEY');
// Conectar middleware
app.use(datadomeClient.middleware());
// Tus rutas
app.get('/', (req, res) => {
res.send('Hello World');
});
// Iniciar servidor
app.listen(3000, () => {
console.log('Server running on port 3000');
})
const { DatadomeHttp } = require('@datadome/module-http');
const http = require('http');
const datadomeClient = new DatadomeHttp('YOUR_SERVER_KEY');
const hostname = '127.0.0.1';
const port = 3000;
const server = http.createServer(async (req, res) => {
const { result, error } = await datadomeClient.handleRequest(req, res);
if (result === 'ALLOW') {
res.statusCode = 200;
res.setHeader('Content-Type', 'text/plain');
res.end('Hello World\n');
} else {
console.log('Request challenged');
if (error) console.error(error);
}
});
server.listen(port, hostname, () => {
console.log(`Server running at http://${hostname}:${port}/`);
});Configuración del módulo
Puedes pasar la configuración al crear el cliente:
const datadomeClient = new DatadomeExpress('YOUR_SERVER_KEY', {
timeout: 150, // timeout en ms después del cual la solicitud se permite
urlPatternInclusion: null, // qué URLs comprobar
urlPatternExclusion: /\.(avi|flv|mka|mkv|mov|mp4|mpeg|mpg|mp3|flac|ogg|ogm|opus|wav|webm|webp|bmp|gif|ico|jpeg|jpg|png|svg|svgz|swf|eot|otf|ttf|woff|woff2|css|less|js|map|json|avif|xml|gz|zip)$/i,
endpointHost: 'api.datadome.co',
});Opciones avanzadas:
Más detalles sobre la integración del lado del servidor en documentación oficial.
4. Integra el lado del cliente.
Inserta JS Tag en el <head> de tu sitio:
<head>
<script>
window.ddjskey = 'YOUR_DATADOME_JS_KEY';
window.ddoptions = {
// Agrega tus configuraciones aquí (opcional)
};
</script>
<script src="https://js.datadome.co/tags.js" async></script>
<!-- Otros elementos del head -->
</head>
YOUR_DATADOME_JS_KEY → Reemplaza con tu Client-Side key.
Carga el script al inicio del <head> para permitir que DataDome intercepte las solicitudes y rastree el comportamiento del usuario correctamente.
Si el sitio usa CSP, agrega las siguientes directivas:
<script nonce="DYNAMIC_NONCE">
window.ddjskey = 'YOUR_DATADOME_JS_KEY';
window.ddoptions = {};
</script>
script-src js.datadome.co ct.captcha-delivery.com 'nonce-DYNAMIC_NONCE';
connect-src api-js.datadome.co; /* para enviar datos del JS Tag */
frame-src *.captcha-delivery.com; /* para páginas de desafío */
worker-src blob:; /* para web workers */
Más detalles sobre la integración del lado del cliente en documentación oficial de DataDome CAPTCHA.
Verificar resultado
DataDome crea la cookie datadome= después de pasar la verificación con éxito. Esta cookie se envía automáticamente por el usuario, y el servidor permite la solicitud. Si la cookie falta o no es válida, DataDome volverá a mostrar el challenge.
Si has heredado un sitio web que ya tiene un captcha u otro sistema de protección instalado y no tienes acceso al código, no pasa nada. Identificar qué tecnología se está utilizando es bastante sencillo. Para comprobar que todo funciona correctamente, puedes usar el servicio de reconocimiento CapMonster Cloud en un entorno de pruebas aislado, para asegurarte de que el mecanismo de procesamiento de tokens y la lógica de verificación funcionan correctamente.
En el caso de DataDome CAPTCHA, basta con detectar el sistema, analizar su comportamiento y confirmar que la protección funciona correctamente. En el artículo hemos mostrado cómo identificar DataDome CAPTCHA y dónde encontrar las instrucciones para su integración o reconfiguración, de modo que puedas mantener la protección con confianza y controlar su funcionamiento.