In questo articolo abbiamo cercato di rispondere a tutte le domande principali. Il primo passo per risolvere il problema è capire quale sistema di protezione viene utilizzato. A questo scopo puoi consultare l’elenco dei captcha e dei sistemi di protezione antibot più diffusi, dove trovi esempi visivi e caratteristiche chiave che ti aiutano a identificare rapidamente con cosa hai a che fare.
Se scopri che sul tuo sito viene utilizzato DataDome CAPTCHA, il passo successivo è analizzarne più nel dettaglio le proprietà e il funzionamento. In questo stesso articolo puoi anche studiare la guida all’integrazione di DataDome CAPTCHA, per comprendere a fondo come opera sul tuo sito. Questo ti permetterà non solo di capire la protezione attuale, ma anche di pianificarne correttamente la manutenzione.
Lavorare con CapMonster Cloud via API di solito prevede i seguenti passaggi:
type - CustomTask
class - DataDome
websiteURL - l'indirizzo della pagina principale in cui viene risolta la CAPTCHA.
captchaUrl (all'interno dei metadata) - "captchaUrl" — il link alla CAPTCHA. Generalmente nel formato: "https://geo.captcha-delivery.com/captcha/?initialCid=..."
datadomeCookie (all'interno dei metadata) - I tuoi cookie DataDome. Possono essere ottenuti sulla pagina tramite document.cookie (se i cookie non hanno il flag HttpOnly), nell'header Set-Cookie della richiesta: "datadome=...", o direttamente dal codice HTML della pagina initialCid.
userAgent - User-Agent del browser. Fornisci solo l'UA attuale da Windows.
Inoltre, per questo compito è necessario usare i tuoi proxy:
proxyType :
proxyAddress - Indirizzo IP del proxy (IPv4/IPv6).
proxyPort - Porta del proxy.
proxyLogin - Login del proxy.
proxyPassword - Password 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';
// Inserisci la tua chiave API CapMonster Cloud
const API_KEY = 'YOUR_API_KEY';
// Il tuo sito è protetto da 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
// Configurazione proxy
const proxy = {
proxyType: "http",
proxyAddress: '8.8.8.8',
proxyPort: 8080,
proxyLogin: 'proxyLogin',
proxyPassword: 'proxyPassword'
};
async function main() {
// Avvia il browser
const browser = await chromium.launch({ headless: true });
const context = await browser.newContext({ userAgent: USER_AGENT });
const page = await context.newPage();
// Vai al sito
await page.goto(TARGET_URL, { waitUntil: 'networkidle' });
// Cerca eventuale cookie datadome esistente
const existingDd = (await context.cookies()).find(c => /datadome|dd_/i.test(c.name));
// Trova iframe DataDome -> URL 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(`=== Parametri DataDome estratti ===`);
console.log(`captchaUrl:`, captchaUrl || 'non trovato');
console.log(`cookie datadome attuale::`, existingDd ? ${existingDd.name}=${existingDd.value}` : 'nessuno');
const cm = CapMonsterCloudClientFactory.Create(
new ClientOptions({ clientKey: API_KEY })
);
// Invia il task a CapMonster
console.log(`Invio del task DataDome a CapMonster......`);
// Invio task DataDome per risoluzione
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;
// Ottieni dominio e cookie necessari dalla soluzione
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=== Cookie di 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));
// Imposta cookie datadome nel browser
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 impostato:`, ddSolved.value);
// Riapri il sito dopo aver inserito il cookie
const page2 = await context.newPage();
const resp2 = await page2.goto(TARGET_URL, { waitUntil: 'domcontentloaded', timeout: 60000 });
console.log(`Stato dopo inserimento cookie:: ${resp2?.status()}`);
await browser.close();
}
main();
1. Accedi al tuo account o registrati su DataDome e ottieni le chiavi (client-side e server-side).
Importante: per registrarti è necessario usare un'email aziendale.
Dopo la registrazione accederai al pannello di amministrazione.
2. Aggiungi il sito (dominio) nel pannello DataDome.
Aggiungi il dominio nel sistema e seleziona i parametri di protezione:
3. Installa l'integrazione lato server.
Usa Protection API o scegli un modulo pronto per il tuo stack (Node.js / Express, Nginx, Cloudflare, Java (Tomcat/Jetty/Vert.x), Go, ecc.).
Installa SDK/middleware ufficiale di DataDome e configura la server-side key.
Esempio integrazione DataDome in Node.js:
DataDome protegge il server da bot e richieste sospette, mostrando automaticamente il challenge se necessario. Il modulo può essere usato con Express o con il server HTTP integrato Node.js.
Installazione
Per Express:
npm install @datadome/module-expressPer modulo HTTP Node.js:
npm install @datadome/module-httpSupportate versioni Node.js 18 e successive. Necessaria la server-side key dal pannello DataDome.
const { DatadomeExpress } = require('@datadome/module-express');
const express = require('express');
const app = express();
// Inizializza client DataDome
const datadomeClient = new DatadomeExpress('YOUR_SERVER_KEY');
// Collega middleware
app.use(datadomeClient.middleware());
// Le tue route
app.get('/', (req, res) => {
res.send('Hello World');
});
// Avvia il server
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}/`);
});Impostazioni modulo
Puoi passare la configurazione al momento della creazione del client:
const datadomeClient = new DatadomeExpress('YOUR_SERVER_KEY', {
timeout: 150, // timeout in ms dopo il quale la richiesta è consentita
urlPatternInclusion: null, // quali URL verificare
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',
});Opzioni avanzate:
Ulteriori dettagli sull'integrazione server-side in documentazione ufficiale.
4. Integrare lato client.
Inserisci il JS Tag nel <head> del tuo sito:
<head>
<script>
window.ddjskey = 'YOUR_DATADOME_JS_KEY';
window.ddoptions = {
// Aggiungi qui le tue impostazioni (opzionale)
};
</script>
<script src="https://js.datadome.co/tags.js" async></script>
<!-- Altri elementi head -->
</head>
YOUR_DATADOME_JS_KEY → Sostituisci con la tua Client-Side key.
Carica lo script all'inizio del <head> affinché DataDome possa intercettare le richieste e tracciare correttamente il comportamento dell'utente.
Se il sito usa CSP, aggiungi le seguenti direttive:
<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; /* per inviare dati JS Tag */
frame-src *.captcha-delivery.com; /* per pagine challenge */
worker-src blob:; /* per web workers */
Ulteriori dettagli sull'integrazione lato client in documentazione ufficiale CAPTCHA DataDome.
Verifica del risultato
DataDome crea il cookie datadome= dopo una verifica completata con successo. Questo cookie viene inviato automaticamente dall’utente e il server accetta la richiesta. Se il cookie manca o non è valido, DataDome mostrerà nuovamente la challenge.
Se ti è capitato un sito con un captcha o un altro sistema di protezione già installato e senza accesso al codice, nessun problema! È piuttosto facile capire quale tecnologia viene utilizzata. Per verificare che tutto funzioni correttamente, puoi usare il servizio di riconoscimento CapMonster Cloud in un ambiente di test isolato, così da assicurarti che il meccanismo di elaborazione dei token e la logica di verifica funzionino correttamente.
Nel caso di DataDome CAPTCHA, è sufficiente individuare il sistema, analizzarne il comportamento e assicurarsi che la protezione funzioni correttamente. Nell’articolo abbiamo mostrato come riconoscere DataDome CAPTCHA e dove trovare le istruzioni per la sua integrazione o riconfigurazione, in modo da poter mantenere la protezione in modo affidabile e controllarne il funzionamento.