Dans cet article, nous avons essayé de répondre à toutes les questions essentielles. Pour commencer à résoudre le problème, il faut d’abord déterminer quel système de protection est utilisé. Pour cela, vous pouvez consulter la liste des captchas et systèmes de protection antibot les plus populaires, qui présente des exemples visuels et des caractéristiques clés permettant d’identifier rapidement avec quoi vous avez affaire.
Si vous constatez que votre site utilise DataDome CAPTCHA, l’étape suivante consiste à étudier plus en détail ses propriétés et son fonctionnement. Dans cet article, vous pouvez également consulter le guide d’intégration de DataDome CAPTCHA afin de comprendre pleinement la façon dont il fonctionne sur votre site. Cela vous permettra non seulement de mieux connaître la protection en place, mais aussi de planifier correctement sa maintenance.
Travailler avec CapMonster Cloud via l’API comprend généralement les étapes suivantes :
type - CustomTask
class - DataDome
websiteURL - l'adresse de la page principale où le CAPTCHA est résolu.
captchaUrl (dans metadata) - "captchaUrl" — le lien vers le CAPTCHA. Généralement sous ce format : "https://geo.captcha-delivery.com/captcha/?initialCid=..."
datadomeCookie (dans metadata) - Vos cookies DataDome. Ils peuvent être obtenus sur la page via document.cookie (si les cookies n’ont pas le flag HttpOnly), dans l’en-tête de requête Set-Cookie : "datadome=...", ou directement depuis le code HTML de la page initialCid.
userAgent - User-Agent du navigateur. Fournissez seulement le UA actuel depuis Windows.
De plus, pour cette tâche, vous devez utiliser vos proxies :
proxyType :
proxyAddress - Adresse IP du proxy (IPv4/IPv6).
proxyPort - Port du proxy.
proxyLogin - Login du proxy.
proxyPassword - Mot de passe du 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';
// Entrez votre clé API CapMonster Cloud
const API_KEY = 'YOUR_API_KEY';
// Votre site est protégé par 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
// Configuration du proxy
const proxy = {
proxyType: "http",
proxyAddress: '8.8.8.8',
proxyPort: 8080,
proxyLogin: 'proxyLogin',
proxyPassword: 'proxyPassword'
};
async function main() {
// Lancer le navigateur
const browser = await chromium.launch({ headless: true });
const context = await browser.newContext({ userAgent: USER_AGENT });
const page = await context.newPage();
// Accéder au site web
await page.goto(TARGET_URL, { waitUntil: 'networkidle' });
// Recherche d’un cookie datadome existant (si présent)
const existingDd = (await context.cookies()).find(c => /datadome|dd_/i.test(c.name));
// Trouver iframe DataDome -> URL du 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(`=== Paramètres DataDome extraits ===`);
console.log(`captchaUrl:`, captchaUrl || 'non trouvé');
console.log(`cookie datadome actuel ::`, existingDd ? ${existingDd.name}=${existingDd.value}` : 'aucun');
const cm = CapMonsterCloudClientFactory.Create(
new ClientOptions({ clientKey: API_KEY })
);
// Envoyer la tâche à CapMonster
console.log(`Envoi de la tâche DataDome à CapMonster......`);
// Soumission de la tâche DataDome pour résolution
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;
// Obtenir le domaine et les cookies nécessaires depuis la solution
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));
// Définir le cookie datadome dans le navigateur
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 défini :`, ddSolved.value);
// Réouvrir le site après insertion du cookie
const page2 = await context.newPage();
const resp2 = await page2.goto(TARGET_URL, { waitUntil: 'domcontentloaded', timeout: 60000 });
console.log(`Statut après insertion du cookie :: ${resp2?.status()}`);
await browser.close();
}
main();
1. Connectez-vous à votre compte ou inscrivez-vous sur DataDome et obtenez les clés (client-side et server-side).
Important : l’inscription nécessite un e-mail professionnel de votre entreprise.
Après l’inscription, vous accéderez au panneau d’administration.
2. Ajoutez votre site (domaine) dans le panneau DataDome.
Ajoutez votre domaine au système et choisissez les paramètres de protection :
3. Installez l’intégration côté serveur.
Utilisez Protection API ou sélectionnez un module prêt pour votre stack (Node.js / Express, Nginx, Cloudflare, Java (Tomcat/Jetty/Vert.x), Go, etc.).
Installez le SDK/middleware officiel de DataDome et configurez la clé serveur (server-side key).
Exemple d’intégration de DataDome en Node.js :
DataDome protège le serveur contre les bots et requêtes suspectes, affichant automatiquement un challenge si nécessaire. Le module peut être utilisé avec Express ou le serveur HTTP intégré Node.js.
Installation
Pour Express :
npm install @datadome/module-expressPour module HTTP Node.js :
npm install @datadome/module-httpNode.js version 18 ou supérieure est pris en charge. La clé server-side de votre panneau DataDome est requise.
const { DatadomeExpress } = require('@datadome/module-express');
const express = require('express');
const app = express();
// Initialiser le client DataDome
const datadomeClient = new DatadomeExpress('YOUR_SERVER_KEY');
// Connecter le middleware
app.use(datadomeClient.middleware());
// Vos routes
app.get('/', (req, res) => {
res.send('Hello World');
});
// Démarrer le serveur
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}/`);
});Paramètres du module
Vous pouvez passer la configuration lors de la création du client :
const datadomeClient = new DatadomeExpress('YOUR_SERVER_KEY', {
timeout: 150, // timeout en ms après lequel la requête est autorisée
urlPatternInclusion: null, // quelles URLs vérifier
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',
});Options avancées :
Plus de détails sur l’intégration côté serveur dans documentation officielle.
4. Intégrer côté client.
Insérez le JS Tag dans le <head> de votre site :
<head>
<script>
window.ddjskey = 'YOUR_DATADOME_JS_KEY';
window.ddoptions = {
// Ajoutez vos paramètres ici (optionnel)
};
</script>
<script src="https://js.datadome.co/tags.js" async></script>
<!-- Autres éléments du head -->
</head>
YOUR_DATADOME_JS_KEY → Remplacez par votre Client-Side key.
Chargez le script en début de <head> pour permettre à DataDome d’intercepter les requêtes et de suivre correctement le comportement des utilisateurs.
Si le site utilise CSP, ajoutez les directives suivantes :
<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; /* pour envoyer les données du JS Tag */
frame-src *.captcha-delivery.com; /* pour les pages de challenge */
worker-src blob:; /* pour les web workers */
Plus de détails sur l’intégration côté client dans documentation officielle CAPTCHA DataDome.
Vérification du résultat
DataDome crée le cookie datadome= après une vérification réussie. Ce cookie est automatiquement envoyé par l'utilisateur, et le serveur accepte la requête. Si le cookie est absent ou invalide, DataDome affichera à nouveau le challenge.
Si vous avez récupéré un site avec un captcha ou un autre système de protection déjà installé, mais sans accès au code, pas de panique ! Il est assez simple d’identifier quelle technologie est utilisée. Pour vérifier que tout fonctionne correctement, vous pouvez utiliser le service de reconnaissance CapMonster Cloud dans un environnement de test isolé, afin de vous assurer que le mécanisme de traitement des jetons et la logique de vérification fonctionnent correctement.
Dans le cas de DataDome CAPTCHA, il suffit d’identifier le système, d’étudier son comportement et de vérifier que la protection fonctionne correctement. Dans cet article, nous avons montré comment reconnaître DataDome CAPTCHA et où trouver les instructions pour son intégration ou sa reconfiguration, afin de maintenir la protection en toute confiance et de garder son fonctionnement sous contrôle.