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.
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 :
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/143.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();
})();
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 :
Recommandations d'Arkose
Processus général
Étape 1. Intégration côté client
Côté navigateur (Arkose Bot Manager) :
Client API:
client-api.arkoselabs.com<company>-api.arkoselabs.comPrincipales exigences
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
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
<?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 :
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.