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 FunCaptcha (Arkose Labs 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 FunCaptcha (Arkose Labs 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.
Comment résoudre FunCaptcha via CapMonster Cloud
- Ouvrez la page contenant le formulaire et assurez-vous que le captcha s'affiche.
- Essayez de soumettre le formulaire sans résoudre le captcha — le serveur devrait renvoyer une erreur.
- Après avoir résolu le captcha avec succès, le formulaire doit être soumis sans erreur.
Travailler avec CapMonster Cloud via l’API comprend généralement les étapes suivantes :
type - FunCaptchaTask
websiteURL - l'adresse de la page où le captcha est résolu ;
websitePublicKey - la clé FunCaptcha (valeur public key ou pk) ;
data - paramètre supplémentaire, obligatoire si data[blob] est utilisé sur le site ;
funcaptchaApiJSSubdomain - le sous-domaine Arkose Labs (valeur surl). À indiquer seulement s'il diffère du standard : client-api.arkoselabs.com
userAgent - User-Agent du navigateur. Fournissez uniquement un UA actuel depuis Windows.
Cette tâche nécessite également l'utilisation de vos propres proxies :
proxyType :
- http — proxy HTTP/HTTPS standard ;
- https — essayez cette option si « http » ne fonctionne pas (requis pour certains proxies personnalisés) ;
- socks4 — proxy de type SOCKS4 ;
- socks5 — proxy de type SOCKS5.
proxyAddress - Adresse IP du proxy (IPv4/IPv6).
proxyPort - Port du proxy.
proxyLogin - Identifiant du serveur proxy.
proxyPassword - Mot de passe du serveur proxy.
https://api.capmonster.cloud/createTask
{
"clientKey": "API_KEY",
"task": {
"type": "FunCaptchaTask",
"websiteURL": "https://www.example.com",
"websitePublicKey": "EX72CCFB-26EX-40E5-91E6-85EX70BE98ED",
"funcaptchaApiJSSubdomain": "example-api.arkoselabs.com",
"data": "{\"blob\":\"nj9UbL+yio7goOlTQ/b64t.ayrrBnP6kPgzlKYCP/kv491lKS...Wot/7gjpyIxs7VYb0+QuRcfQ/t6bzh5pXDkOFSskA/V/ITSVZSAlglIplLcdreZ4PE8skfMU6k1Q\"}",
"userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/150.0.0.0 Safari/537.36",
"proxyType": "http", // Ajoutez un proxy si nécessaire
"proxyAddress": "8.8.8.8",
"proxyPort": 8080,
"proxyLogin": "proxyLoginHere",
"proxyPassword": "proxyPasswordHere"
}
}
{
"errorId":0,
"taskId":407533072
}https://api.capmonster.cloud/getTaskResult{
"clientKey":"API_KEY",
"taskId": 407533072
}
{
"errorId": 0,
"errorCode": null,
"errorDescription": null,
"solution": {
"token": "337187b9f57678923.5060184402|r=us-west-2|lang=en|pk=EX72CCFB-26EX-40E5-91E6-85EX70BE98ED|at=40|ag=101|cdn_url=https%3A%2F%2Fclient-api.arkoselabs.com%2Fcdn%2Ffc|surl=https%3A%2F%2Fclient-api.arkoselabs.com|smurl=https%3A%2F%2Fclient-api.arkoselabs.com%2Fcdn%2Ffc%2Fassets%2Fstyle-manager",
"userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36"
},
"status": "ready"
}
// npm install playwright
const { chromium } = require("playwright");
const WEBSITE_URL = "https://example.com";
// token reçu de CapMonster Cloud
const FUN_CAPTCHA_TOKEN = "PUT_YOUR_FUN_CAPTCHA_TOKEN_HERE";
(async () => {
const browser = await chromium.launch({ headless: false });
const context = await browser.newContext();
const page = await context.newPage();
/**
* Intercepteur universel Arkose (v1 / v2)
* Exécuté avant le chargement de la page
*/
await page.addInitScript(() => {
const callbacks = [];
function captureCallback(cb, source) {
if (typeof cb === "function") {
callbacks.push(cb);
console.log("[Arkose] callback captured from", source);
}
}
function patchRender(obj, name) {
if (!obj || typeof obj.render !== "function") return;
const originalRender = obj.render;
obj.render = function (container, options = {}) {
captureCallback(options.callback, name + ".render");
return originalRender.apply(this, arguments);
};
}
// Interception via Object.defineProperty (souvent utilisé par Arkose)
const originalDefineProperty = Object.defineProperty;
Object.defineProperty = function (target, prop, descriptor) {
if (
(prop === "FunCaptcha" || prop === "ArkoseEnforcement") &&
descriptor &&
typeof descriptor.value === "object"
) {
patchRender(descriptor.value, prop);
}
return originalDefineProperty.apply(this, arguments);
};
// Fallback : vérification périodique des objets globaux
const interval = setInterval(() => {
if (window.FunCaptcha) patchRender(window.FunCaptcha, "FunCaptcha");
if (window.ArkoseEnforcement)
patchRender(window.ArkoseEnforcement, "ArkoseEnforcement");
if (callbacks.length > 0) clearInterval(interval);
}, 200);
// Point universel pour transmettre le token
window.__arkoseSolve = function (token) {
if (callbacks.length > 0) {
callbacks.forEach((cb) => cb(token));
console.log("[Arkose] token delivered via captured callbacks");
return true;
}
// Options alternatives
if (typeof window.arkoseCallback === "function") {
window.arkoseCallback(token);
console.log("[Arkose] token delivered via arkoseCallback");
return true;
}
// Fallback
window._arkoseToken = token;
console.log("[Arkose] token stored in window._arkoseToken");
return false;
};
});
/**
* Ouvrir la page
*/
console.log("Opening page...");
await page.goto(WEBSITE_URL, { waitUntil: "domcontentloaded" });
/**
* Ici, le site doit initialiser FunCaptcha
* (inscription, connexion, bouton, formulaire, etc.)
*/
/**
* Transmettre le token prêt
*/
console.log("Injecting FunCaptcha token...");
await page.evaluate((token) => {
if (!window.__arkoseSolve) {
console.log("[Arkose] solver not ready");
return;
}
window.__arkoseSolve(token);
}, FUN_CAPTCHA_TOKEN);
/**
* Laisser le temps à la page de traiter le résultat
*/
await page.waitForTimeout(5000);
console.log("Done.");
await browser.close();
})();
- Inscrivez-vous chez Arkose Labs et obtenez l'accès au Arkose Command Center (vous pouvez contacter le chat et soumettre vos informations dans le formulaire, par exemple ici ou ici).
Après avoir obtenu l'accès, récupérez deux clés (Public / Private) dans la section Settings → Keys.

Si nécessaire, contactez votre Customer Success Manager (CSM) pour :
- obtenir des domaines API personnalisés ;
- recevoir les schémas de requête et réponse de la Verify API.
Recommandations d'Arkose
- Utilisez une Development Key pour les tests.
- Utilisez une Production Key distincte pour chaque workflow (connexion, inscription, achat, etc.).
- Utilisez des clés différentes pour différents sites.
Processus général
- Le client collecte les données et affiche un challenge si nécessaire.
- Le client reçoit un token unique.
- Le serveur vérifie le token via la Arkose Verify API.
Étape 1. Intégration côté client
Côté navigateur (Arkose Bot Manager) :
- analyse le comportement de l'utilisateur ;
- affiche un Enforcement Challenge si nécessaire ;
- renvoie un token de session unique.
Client API:
- Pour les tests, vous pouvez utiliser:
client-api.arkoselabs.com - Pour la production, il est recommandé de spécifier un domaine personnalisé:
<company>-api.arkoselabs.com
Principales exigences
- Le script client Arkose doit être chargé une seule fois par page
- Un callback global doit être défini
- Il faut appeler setConfig()
- Selon le résultat, une décision est prise (autoriser ou refuser l'action).
Le résultat du client est un token qui doit être envoyé au serveur.
<html>
<head>
<!--
Incluez l'API Arkose Labs dans le <head> de la page. Dans l'exemple ci-dessous, assurez-vous de :
- remplacer <YOUR PUBLIC KEY> par la clé publique fournie par Arkose Labs ;
- remplacer <YOUR CALLBACK> par le nom de la fonction callback globale que vous définirez ci-dessous.
Exemple:
<script src="//client-api.arkoselabs.com/v2/<YOUR PUBLIC KEY>/api.js"
data-callback="setupDetect"></script>
-->
<script src="//client-api.arkoselabs.com/v2/<YOUR PUBLIC KEY>/api.js" data-callback="<YOUR CALLBACK>"></script>
<link rel="shortcut icon" href="#">
<meta charset="UTF-8">
</head>
<body>
<!--
L'élément déclencheur peut se trouver n'importe où sur la page et peut être ajouté au DOM à tout moment.
-->
<button id="arkose-trigger">
élément déclencheur
</button>
<!--
Pour configurer Arkose (mode detection ou enforcement), placez le script avant la balise de fermeture </body> et définissez la fonction callback comme globale.
-->
<script>
/*
Cette fonction globale sera appelée lorsque l'API Arkose sera prête. Le nom de la fonction doit correspondre à la valeur de l'attribut data-callback du script qui charge l'API Arkose.
*/
function setupArkose(myArkose) {
myArkose.setConfig({
selector: '#arkose-trigger',
onCompleted: function(response) {
// Token unique à envoyer au serveur
console.log(response.token);
}
});
}
</script>
</body>
</html>
Étape 2. Vérification côté serveur
Sur le serveur, le token est vérifié via la Arkose Verify API.
Verify API endpoint
https://<company>-verify.arkoselabs.com/api/v4/verify/Paramètres requis de la requête
- private_key — clé privée Arkose
- session_token — token reçu côté client
Exemple du corps de la requête POST
{
"private_key": "_PRIVATE_KEY_HERE_",
"session_token": "_SESSION_TOKEN_HERE_",
"log_data": "_LOG_DATA_HERE_"
}
La réponse de l'API contient des informations sur la session et le résultat de la vérification.
Points clés
- Public Key — client uniquement
- Private Key — serveur uniquement
- Le token est unique
- Sans vérification côté serveur, le captcha est considéré comme invalide
- Arkose peut fonctionner en arrière-plan et n'afficher le challenge qu'en cas de risque
<?php
$private_key = 'VOTRE_PRIVATE_KEY';
$verify_url = 'https://<company>-verify.arkoselabs.com/api/v4/verify/';
$input = json_decode(file_get_contents('php://input'), true);
$session_token = $input['session_token'] ?? null;
$log_data = $input['log_data'] ?? '';
$email_address = $input['email_address'] ?? '';
if (!$session_token) {
http_response_code(400);
echo json_encode(['error' => 'Token de session manquant']);
exit;
}
$data = [
'private_key' => $private_key,
'session_token' => $session_token,
'log_data' => $log_data,
'email_address' => $email_address
];
$options = [
'http' => [
'header' => "Content-Type: application/json\r\n",
'method' => 'POST',
'content' => json_encode($data),
],
];
$context = stream_context_create($options);
$result = file_get_contents($verify_url, false, $context);
if ($result === FALSE) {
http_response_code(500);
echo json_encode(['error' => 'Erreur de vérification du captcha']);
exit;
}
echo $result;
?>
Comment ça fonctionne :
- Le client résout le captcha sur le site et reçoit un token de session.
- Le client envoie le token à votre serveur via une requête POST.
- Le serveur appelle la Verify API Arkose avec la clé privée et le token de session
- Arkose renvoie un JSON avec les informations de session et le statut de vérification.
- Le serveur vérifie le résultat (result.success) et décide d'autoriser ou non les actions suivantes.
Captchas pris en charge
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 FunCaptcha, 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 FunCaptcha 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.