In dit artikel hebben we geprobeerd antwoord te geven op alle belangrijke vragen. De eerste stap bij het oplossen van het vraagstuk is vaststellen welk beveiligingssysteem wordt gebruikt. Daarvoor kun je de lijst met populaire captcha’s en anti-botbeveiligingssystemen raadplegen, met visuele voorbeelden en kernkenmerken die je helpen snel te bepalen waarmee je te maken hebt.
Als je ontdekt dat je website FunCaptcha (Arkose Labs CAPTCHA) gebruikt, is de volgende stap om de eigenschappen en werking ervan uitgebreider te bestuderen. In dit artikel vind je ook een handleiding voor het integreren van FunCaptcha (Arkose Labs CAPTCHA), zodat je volledig begrijpt hoe het systeem op je website werkt. Zo kun je niet alleen de huidige bescherming beter doorgronden, maar ook het onderhoud ervan goed plannen.
Hoe FunCaptcha op te lossen via CapMonster Cloud
- Open de pagina met het formulier en zorg ervoor dat de captcha zichtbaar is.
- Probeer het formulier te verzenden zonder de captcha op te lossen — de server moet een foutmelding geven.
- Na succesvolle oplossing van de captcha — het formulier moet zonder fouten worden verzonden.
Werken met CapMonster Cloud via de API bestaat doorgaans uit de volgende stappen:
type - FunCaptchaTask
websiteURL - het adres van de pagina waar de captcha wordt opgelost;
websitePublicKey - FunCaptcha-sleutel (waarde public key of pk);
data - extra parameter. Verplicht als de site data[blob] gebruikt;
funcaptchaApiJSSubdomain - Arkose Labs subdomein (waarde surl). Alleen opgeven als deze afwijkt van de standaard: client-api.arkoselabs.com
userAgent - Browser User-Agent. Geef alleen de actuele UA van Windows OS door.
Voor deze taak is het gebruik van je proxy’s vereist:
proxyType :
- http - standaard HTTP/HTTPS proxy;
- https - probeer dit als 'http' niet werkt (vereist voor sommige aangepaste proxy’s);
- socks4 - SOCKS4-proxy;
- socks5 - SOCKS5-proxy.
proxyAddress - IP-adres van de proxy IPv4/IPv6.
proxyPort - Poort van de proxy.
proxyLogin - Login van de proxyserver.
proxyPassword - Wachtwoord van de proxyserver.
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", // Voeg de proxy toe indien nodig
"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 verkregen van 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();
/**
* Universele Arkose-interceptie (v1 / v2)
* Uitgevoerd vóór het laden van de pagina
*/
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);
};
}
// Interceptie via Object.defineProperty (vaak gebruikt door 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: periodieke controle van globale objecten
const interval = setInterval(() => {
if (window.FunCaptcha) patchRender(window.FunCaptcha, "FunCaptcha");
if (window.ArkoseEnforcement)
patchRender(window.ArkoseEnforcement, "ArkoseEnforcement");
if (callbacks.length > 0) clearInterval(interval);
}, 200);
// Universeel punt om token door te geven
window.__arkoseSolve = function (token) {
if (callbacks.length > 0) {
callbacks.forEach((cb) => cb(token));
console.log("[Arkose] token delivered via captured callbacks");
return true;
}
// Alternatieve opties
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;
};
});
/**
* Pagina openen
*/
console.log("Opening page...");
await page.goto(WEBSITE_URL, { waitUntil: "domcontentloaded" });
/**
* Hier moet de site FunCaptcha initialiseren
* (registratie, login, knop, formulier, enz.)
*/
/**
* Klaar token doorgeven
*/
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);
/**
* Pagina tijd geven om resultaat te verwerken
*/
await page.waitForTimeout(5000);
console.log("Done.");
await browser.close();
})();
- Registreer bij Arkose Labs en verkrijg toegang tot Arkose Command Center (je kunt een chatbericht sturen met je gegevens in het formulier — bijvoorbeeld hier of hier).
Na toegang verkrijg je twee sleutels (Public / Private) in Settings → Keys.

Neem indien nodig contact op met de Customer Success Manager (CSM) voor:
- verkrijgen van aangepaste API-domeinen;
- verifiëren van API-aanvraag- en antwoordschema’s.
Aanbevelingen van Arkose
- Gebruik de Development Key voor testen.
- Gebruik een aparte Production Key voor elke workflow (login, register, aankoop, enz.).
- Gebruik verschillende sleutels voor verschillende sites.
Algemeen werkproces
- De client verzamelt gegevens en toont indien nodig een challenge.
- De client ontvangt een eenmalige token.
- De server verifieert de token via Arkose Verify API.
Stap 1. Client-integratie
Aan de browserzijde (Arkose Bot Manager):
- analyseert het gedrag van de gebruiker;
- toont indien nodig een Enforcement Challenge;
- geeft een sessietoken terug.
Client API:
- Voor testen kan worden gebruikt:
client-api.arkoselabs.com - Voor productie is het wenselijk een aangepast domein op te geven:
<company>-api.arkoselabs.com
Belangrijkste vereisten
- Het Arkose-clientscript wordt slechts één keer per pagina geladen
- Definieer globale callback
- Roep setConfig() aan
- Op basis van het resultaat wordt besloten of een actie is toegestaan of geweigerd.
Resultaat van de client — token die naar de server wordt verzonden.
<html>
<head>
<!--
Voeg de Arkose Labs API toe in de <head> van de pagina. Zorg in het voorbeeld voor:
- vervang <YOUR PUBLIC KEY> door de public key van Arkose Labs;
- vervang <YOUR CALLBACK> door de naam van je globale callbackfunctie.
Voorbeeld:
<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>
<!--
Het trigger-element kan overal op de pagina staan en op elk moment aan het DOM worden toegevoegd.
-->
<button id="arkose-trigger">
trigger-element
</button>
<!--
Voor Arkose-instellingen (detectie- of enforce-modus), plaats het script voor de sluitende </body> en definieer de callback als globaal.
-->
<script>
/*
Deze globale functie wordt aangeroepen wanneer de Arkose API klaar is. De functienaam moet overeenkomen met het data-callback-attribuut van het script.
*/
function setupArkose(myArkose) {
myArkose.setConfig({
selector: '#arkose-trigger',
onCompleted: function(response) {
// Eenmalige token die naar de server moet worden verzonden
console.log(response.token);
}
});
}
</script>
</body>
</html>
Stap 2. Serververificatie
Op de server wordt de token geverifieerd via Arkose Verify API.
Verify API endpoint
https://<company>-verify.arkoselabs.com/api/v4/verify/Verplichte verzoekparameters
- private_key — Privésleutel Arkose
- session_token — Token ontvangen van de client
Voorbeeld POST-body
{
"private_key": "_PRIVATE_KEY_HERE_",
"session_token": "_SESSION_TOKEN_HERE_",
"log_data": "_LOG_DATA_HERE_"
}
Het API-antwoord bevat sessie-informatie en verificatieresultaten.
Belangrijke punten
- Public Key — alleen client
- Private Key — alleen server
- Token is eenmalig
- Zonder serververificatie wordt captcha ongeldig
- Arkose kan op de achtergrond werken en de challenge alleen tonen bij risico
<?php
$private_key = 'YOUR_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' => 'Sessietoken ontbreekt']);
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' => 'Fout bij captcha-verificatie']);
exit;
}
echo $result;
?>
Hoe het werkt:
- De client voltooit de captcha op de site en ontvangt een sessietoken.
- De client stuurt de token via POST naar de server.
- De server roept Arkose Verify API aan met de privésleutel en sessietoken
- Arkose retourneert JSON met sessie-informatie en verificatiestatus.
- De server controleert het resultaat (result.success) en besluit of verdere acties aan de gebruiker worden toegestaan.
Ondersteunde captchas
Als je een website in beheer krijgt waarop al een captcha of een ander beveiligingssysteem is geïnstalleerd en je geen toegang hebt tot de code, is dat geen probleem! Het is vrij eenvoudig te bepalen welke technologie precies wordt gebruikt. Voor het controleren of alles correct werkt, kun je de herkenningsservice CapMonster Cloud in een geïsoleerde testomgeving gebruiken, zodat je zeker weet dat het tokenverwerkingsmechanisme en de validatielogica correct functioneren.
In het geval van FunCaptcha is het voldoende om het systeem te herkennen, het gedrag te analyseren en te bevestigen dat de beveiliging correct werkt. In het artikel hebben we laten zien hoe je FunCaptcha kunt herkennen en waar je instructies vindt om het te koppelen of opnieuw te configureren, zodat je de bescherming met vertrouwen kunt onderhouden en de werking onder controle kunt houden.