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 FunCaptcha (Arkose Labs 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 FunCaptcha (Arkose Labs 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.
Come risolvere FunCaptcha tramite CapMonster Cloud
- Apri la pagina con il modulo e verifica che il captcha sia visibile.
- Prova a inviare il modulo senza completare il captcha — il server dovrebbe generare un errore.
- Dopo aver risolto correttamente il captcha — il modulo dovrebbe essere inviato senza errori.
Lavorare con CapMonster Cloud via API di solito prevede i seguenti passaggi:
type - FunCaptchaTask
websiteURL - indirizzo della pagina dove si trova il captcha;
websitePublicKey - chiave FunCaptcha (valore public key o pk);
data - parametro aggiuntivo. Obbligatorio se sul sito è usato data[blob];
funcaptchaApiJSSubdomain - sottodominio Arkose Labs (valore surl). Specificare solo se diverso da quello standard: client-api.arkoselabs.com
userAgent - User-Agent del browser. Fornire solo UA attuale da Windows OS.
È necessario usare i tuoi proxy per questo task:
proxyType :
- http - proxy HTTP/HTTPS standard;
- https - provare se 'http' non funziona (richiesto per alcuni proxy custom);
- socks4 - proxy di tipo SOCKS4;
- socks5 - proxy di tipo SOCKS5.
proxyAddress - Indirizzo IP del proxy IPv4/IPv6.
proxyPort - Porta del proxy.
proxyLogin - Login del proxy server.
proxyPassword - Password del proxy server.
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", // Aggiungi il proxy se necessario
"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 ottenuto da 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();
/**
* Intercettazione universale Arkose (v1 / v2)
* Eseguito prima del caricamento della 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);
};
}
// Intercettazione tramite Object.defineProperty (spesso usato da 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: verifica periodica degli oggetti globali
const interval = setInterval(() => {
if (window.FunCaptcha) patchRender(window.FunCaptcha, "FunCaptcha");
if (window.ArkoseEnforcement)
patchRender(window.ArkoseEnforcement, "ArkoseEnforcement");
if (callbacks.length > 0) clearInterval(interval);
}, 200);
// Punto universale per passare il token
window.__arkoseSolve = function (token) {
if (callbacks.length > 0) {
callbacks.forEach((cb) => cb(token));
console.log("[Arkose] token delivered via captured callbacks");
return true;
}
// Opzioni alternative
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;
};
});
/**
* Aprire la pagina
*/
console.log("Opening page...");
await page.goto(WEBSITE_URL, { waitUntil: "domcontentloaded" });
/**
* Qui il sito deve inizializzare FunCaptcha
* (registrazione, login, pulsante, modulo, ecc.)
*/
/**
* Passare il token pronto
*/
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);
/**
* Dare tempo alla pagina di elaborare il risultato
*/
await page.waitForTimeout(5000);
console.log("Done.");
await browser.close();
})();
- Registrati su Arkose Labs e ottieni accesso a Arkose Command Center (puoi scrivere nella chat inserendo i tuoi dati nel modulo — ad esempio qui o qui).
Dopo aver ottenuto accesso, ottieni due chiavi (Public / Private) nella sezione Settings → Keys.

Se necessario, contatta il Customer Success Manager (CSM) per:
- ottenere domini API personalizzati;
- verificare gli schemi di richieste e risposte API.
Raccomandazioni Arkose
- Usa la Development Key per test.
- Usa una Production Key separata per ogni workflow (login, register, acquisto, ecc.).
- Usa chiavi diverse per siti diversi.
Processo generale
- Il client raccoglie i dati e mostra la sfida se necessario.
- Il client riceve un token usa e getta.
- Il server verifica il token tramite Arkose Verify API.
Passo 1. Integrazione lato client
Sul browser (Arkose Bot Manager):
- analizza il comportamento dell'utente;
- mostra Enforcement Challenge se necessario;
- restituisce un session token.
Client API:
- Per i test si può usare:
client-api.arkoselabs.com - In produzione è consigliabile usare dominio custom:
<company>-api.arkoselabs.com
Requisiti principali
- Lo script client Arkose deve essere incluso una sola volta per pagina
- Definire callback globale
- Chiamare setConfig()
- In base al risultato si decide se consentire o negare l'azione.
Il risultato del client è il token da inviare al server.
<html>
<head>
<!--
Includere l'API Arkose Labs nel <head> della pagina. Nell'esempio assicurarsi di:
- sostituire <YOUR PUBLIC KEY> con la public key fornita da Arkose Labs;
- sostituire <YOUR CALLBACK> con il nome della callback globale definita da te.
Esempio:
<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'elemento trigger può trovarsi ovunque nella pagina e può essere aggiunto al DOM in qualsiasi momento.
-->
<button id="arkose-trigger">
elemento trigger
</button>
<!--
Per configurare Arkose (modalità detection o enforcement) inserire lo script prima del tag </body> e definire la callback come globale.
-->
<script>
/*
Questa funzione globale verrà chiamata quando l'API Arkose sarà pronta. Il nome deve corrispondere all'attributo data-callback dello script.
*/
function setupArkose(myArkose) {
myArkose.setConfig({
selector: '#arkose-trigger',
onCompleted: function(response) {
// Token usa e getta da inviare al server
console.log(response.token);
}
});
}
</script>
</body>
</html>
Passo 2. Verifica lato server
Sul server, il token viene verificato tramite Arkose Verify API.
Verify API endpoint
https://<company>-verify.arkoselabs.com/api/v4/verify/Parametri richiesti nella richiesta
- private_key — Private key Arkose
- session_token — Token ricevuto dal client
Esempio di corpo POST
{
"private_key": "_PRIVATE_KEY_HERE_",
"session_token": "_SESSION_TOKEN_HERE_",
"log_data": "_LOG_DATA_HERE_"
}
La risposta API contiene informazioni sulla sessione e sul risultato della verifica.
Punti chiave
- Public Key — solo client
- Private Key — solo server
- Token usa e getta
- Senza verifica server il captcha è invalido
- Arkose può funzionare in background mostrando la sfida solo a rischio
<?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' => 'Session token mancante']);
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' => 'Errore durante la verifica captcha']);
exit;
}
echo $result;
?>
Come funziona:
- Il client completa il captcha sul sito e ottiene un session token.
- Il client invia il token al server tramite POST.
- Il server chiama Arkose Verify API con private key e session token
- Arkose restituisce JSON con informazioni sulla sessione e stato della verifica.
- Il server verifica il risultato (result.success) e decide se consentire ulteriori azioni all'utente.
Captcha supportati
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 FunCaptcha, è sufficiente individuare il sistema, analizzarne il comportamento e assicurarsi che la protezione funzioni correttamente. Nell’articolo abbiamo mostrato come riconoscere FunCaptcha 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.