Neste artigo procurámos responder a todas as questões importantes. Para começar a resolver o problema, o primeiro passo é identificar que sistema de proteção está a ser utilizado. Para isso, pode consultar a lista de captchas e sistemas de proteção antibot mais populares, onde encontrará exemplos visuais e sinais principais que ajudam a perceber rapidamente com o que está a lidar.
Se verificar que o seu site utiliza DataDome CAPTCHA, o passo seguinte é analisar mais detalhadamente as suas características e o seu funcionamento. Neste mesmo artigo também pode consultar o guia de integração de DataDome CAPTCHA, para compreender totalmente como o sistema funciona no seu site. Isto permitirá não só entender a proteção atual, como também planear corretamente a sua manutenção.
Trabalhar com o CapMonster Cloud através da API normalmente envolve os passos seguintes:
type - CustomTask
class - DataDome
websiteURL - Endereço da página principal onde o CAPTCHA será resolvido.
captchaUrl (dentro do metadata) - "captchaUrl" - link para o CAPTCHA. Normalmente no formato: "https://geo.captcha-delivery.com/captcha/?initialCid=..."
datadomeCookie (dentro do metadata) - Seus cookies do DataDome. Podem ser obtidos na página via document.cookie (se não forem HttpOnly), no cabeçalho Set-Cookie: "datadome=..." ou diretamente no código HTML da página initialCid.
userAgent - User-Agent do navegador. Use apenas o UA atual do Windows.
Para esta tarefa, também é necessário usar seus proxies:
proxyType :
proxyAddress - Endereço IP do proxy IPv4/IPv6.
proxyPort - Porta do proxy.
proxyLogin - Login do proxy.
proxyPassword - Senha do 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';
// Insira sua chave API do CapMonster Cloud
const API_KEY = 'YOUR_API_KEY';
// Seu site está protegido pelo 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
// Configuração de proxy
const proxy = {
proxyType: "http",
proxyAddress: '8.8.8.8',
proxyPort: 8080,
proxyLogin: 'proxyLogin',
proxyPassword: 'proxyPassword'
};
async function main() {
// Iniciando navegador
const browser = await chromium.launch({ headless: true });
const context = await browser.newContext({ userAgent: USER_AGENT });
const page = await context.newPage();
// Acessando site
await page.goto(TARGET_URL, { waitUntil: 'networkidle' });
// Procurando cookie datadome existente (se houver)
const existingDd = (await context.cookies()).find(c => /datadome|dd_/i.test(c.name));
// Procurando iframe DataDome -> URL do 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 extraídos do DataDome ===`);
console.log(`captchaUrl:`, captchaUrl || 'não encontrado');
console.log(`cookie datadome atual::`, existingDd ? ${existingDd.name}=${existingDd.value}` : 'nenhum');
const cm = CapMonsterCloudClientFactory.Create(
new ClientOptions({ clientKey: API_KEY })
);
// Enviando tarefa para CapMonster
console.log(`Enviando tarefa DataDome para CapMonster......`);
// Enviando tarefa para resolução DataDome
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;
// Obtendo domínio e cookies necessários da solução
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 do 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));
// Definindo cookie datadome no 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 definido:`, ddSolved.value);
// Reabrindo site após inserir cookie
const page2 = await context.newPage();
const resp2 = await page2.goto(TARGET_URL, { waitUntil: 'domcontentloaded', timeout: 60000 });
console.log(`Status após definir cookie:: ${resp2?.status()}`);
await browser.close();
}
main();
1. Faça login na sua conta ou registre-se no DataDome e obtenha as chaves (client-side e server-side).
Importante: use um e-mail corporativo para registro.
Após o registro, você terá acesso ao painel administrativo.
2. Adicione o site (domínio) no painel DataDome.
Adicione seu domínio no sistema e escolha os parâmetros de proteção:
3. Instale a integração no lado do servidor.
Use Protection API ou escolha um módulo pronto para sua stack (Node.js / Express, Nginx, Cloudflare, Java (Tomcat/Jetty/Vert.x), Go etc.).
Instale o SDK/middleware oficial DataDome, configure a server-side key.
Exemplo de integração DataDome em Node.js:
DataDome protege o servidor contra bots e solicitações suspeitas, exibindo automaticamente challenge quando necessário. O módulo pode ser usado com Express ou servidor HTTP integrado Node.js.
Instalação
Para Express:
npm install @datadome/module-expressPara módulo HTTP Node.js:
npm install @datadome/module-httpSuporta Node.js 18+. Chave server-side necessária do painel DataDome.
const { DatadomeExpress } = require('@datadome/module-express');
const express = require('express');
const app = express();
// Inicializando cliente DataDome
const datadomeClient = new DatadomeExpress('YOUR_SERVER_KEY');
// Conectando middleware
app.use(datadomeClient.middleware());
// Suas rotas
app.get('/', (req, res) => {
res.send('Hello World');
});
// Iniciando 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}/`);
});Configurações do módulo
Você pode passar a configuração ao criar o cliente:
const datadomeClient = new DatadomeExpress('YOUR_SERVER_KEY', {
timeout: 150, // timeout em ms após o qual a solicitação é permitida
urlPatternInclusion: null, // quais URLs verificar
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',
});Opções avançadas:
Mais detalhes sobre integração do lado do servidor em documentação oficial.
4. Conecte a parte cliente.
Insira a JS Tag no <head> do seu site:
<head>
<script>
window.ddjskey = 'YOUR_DATADOME_JS_KEY';
window.ddoptions = {
// Adicione suas configurações aqui (opcional)
};
</script>
<script src="https://js.datadome.co/tags.js" async></script>
<!-- Outros elementos do head -->
</head>
YOUR_DATADOME_JS_KEY → Substitua pela sua Client-Side Key.
O script deve ser carregado no início do <head> para que o DataDome capture solicitações e acompanhe corretamente o comportamento do usuário.
Se o site usa CSP, adicione as seguintes diretivas:
<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 dados da JS Tag */
frame-src *.captcha-delivery.com; /* para páginas challenge */
worker-src blob:; /* para web workers */
Mais detalhes sobre integração cliente em documentação oficial DataDome CAPTCHA.
Verificação de resultado
O DataDome cria o cookie datadome= após uma verificação bem-sucedida. Esse cookie é enviado automaticamente pelo usuário, e o servidor permite a solicitação. Se o cookie estiver ausente ou for inválido, o DataDome exibirá o desafio novamente.
Se herdou um site que já tem um captcha ou outro sistema de proteção instalado e não tem acesso ao código, não há problema! É bastante fácil identificar qual a tecnologia que está a ser utilizada. Para verificar se tudo está a funcionar corretamente, pode usar o serviço de reconhecimento CapMonster Cloud num ambiente de teste isolado, para garantir que o mecanismo de processamento de tokens e a lógica de verificação estão a funcionar corretamente.
No caso de DataDome CAPTCHA, basta identificar o sistema, analisar o seu comportamento e confirmar que a proteção está a funcionar corretamente. No artigo, mostramos como identificar DataDome CAPTCHA e onde encontrar instruções para a sua integração ou reconfiguração, para que possa manter a proteção com confiança e controlar o seu funcionamento.