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 ALTCHA, 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 ALTCHA 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.
Lors des tests de formulaires contenant ALTCHA, il est souvent nécessaire de vérifier que la captcha fonctionne et qu’elle est correctement intégrée.
Vous pouvez contrôler manuellement la captcha intégrée à votre site.
Pour une résolution automatique, utilisez des outils comme CapMonster Cloud qui reçoivent les paramètres de la captcha, les traitent sur leurs serveurs et renvoient un jeton prêt à l’emploi. Insérez ce jeton dans le formulaire pour passer la vérification sans interaction utilisateur.
Travailler avec CapMonster Cloud via l’API comprend généralement les étapes suivantes :
La requête pour résoudre ALTCHA doit inclure les paramètres suivants :
type - CustomTask
class - altcha
websiteURL - adresse de la page où le captcha est résolu
websiteKey - pour cette tâche, il est permis d'envoyer une chaîne vide.
challenge (dans metadata) - identifiant unique de la tâche obtenu depuis la page web.
iterations (dans metadata) - nombre d'itérations ou valeur maximale pour les calculs. Important : le paramètre iterations correspond à la valeur maxnumber !
salt (dans metadata) - le sel obtenu depuis le site, utilisé pour générer les hashes.
signature (dans metadata) - la signature numérique de la requête.
userAgent - User-Agent du navigateur. Fournissez uniquement un UA actuel de Windows.
https://api.capmonster.cloud/createTask{
"clientKey": "API_KEY",
"task": {
"type": "CustomTask",
"class": "altcha",
"websiteURL": "https://example.com",
"websiteKey": "",
"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": {
"challenge": "3dd28253be6cc0c54d95f7f98c517e68744597cc6e66109619d1ac975c39181c",
"iterations": "5000",
"salt":"46d5b1c8871e5152d902ee3f?edk=1493462145de1ce33a52fb569b27a364&codeChallenge=464Cjs7PbiJJhJZ_ReJ-y9UGGDndcpsnP6vS8x1nEJyTkhjQkJyL2jcnYEuMKcrG&expires=1761048664",
"signature": "4b1cf0e0be0f4e5247e50b0f9a449830f1fbca44c32ff94bc080146815f31a18"
}
}
}
{
"errorId":0,
"taskId":407533072
}https://api.capmonster.cloud/getTaskResult{
"clientKey":"API_KEY",
"taskId": 407533072
}
{
"errorId": 0,
"status": "ready",
"solution": {
"data": {
"token": "eyJhbGdvcml0aG0iOiJTSEEtMjU2IiwiY2hhbGxlbmdlIjoiNjMxOGUzYzc2NjhlOTZiMmFlYjg2NGU2NmRmMTliODRkYmYwZDBhMWRjNjYwMDdiMGM5ZGI4ODZiNTUxNjQxNiIsIm51bWJlciI6MTY0NDcsInNhbHQiOiJiMTQ1YWE5ZmU5MjA3NjBiMDgxYTAwNTMiLCJzaWduYXR1cmUiOiI5NzM4MmJlODE2NDUwNzk5MzlhYmU2M2ZkYzZjN2E3ZGYwOTM5MzNjODljZTk0ZjgzNTgxYmUyNDU3ZmI4MDM0IiwidG9vayI6MTczLjl9",
"number": "16447"
}
}
}
// npm install playwright
// npx playwright install chromium
const { chromium } = require("playwright");
const API_KEY = "YOUR_API_KEY";
const ALTCHA_PAGE = "https://example.com"; // Votre site avec ALTCHA
(async () => {
const browser = await chromium.launch({ headless: false, devtools: true });
const context = await browser.newContext();
const page = await context.newPage();
// Capture de toutes les réponses de l'endpoint Altcha
let challengeResp = null;
page.on("response", async (response) => {
try {
const url = response.url();
if (url.startsWith("https://captcha.example.com/altcha")) { // Endpoint Altcha
challengeResp = await response.json();
console.log("Captured Altcha response:", challengeResp);
}
} catch (err) {
console.warn("Error parsing Altcha response:", err);
}
});
await page.goto(ALTCHA_PAGE, { waitUntil: "networkidle" });
// Cliquez sur le widget, s'il existe
const widgetHandle = await page.$("altcha-widget");
if (widgetHandle) {
try {
await widgetHandle.click();
} catch {}
}
// En attente de l'apparition du challenge
const start = Date.now();
while (!challengeResp && Date.now() - start < 60000) { // Timeout augmenté
await new Promise((r) => setTimeout(r, 300));
}
if (!challengeResp) {
console.error("Failed to capture Altcha challenge.");
await browser.close();
return;
}
const { challenge, salt, signature, maxnumbers } = challengeResp;
// Création d'une tâche sur CapMonster Cloud
const createTaskBody = {
clientKey: API_KEY,
task: {
type: "CustomTask",
class: "altcha",
websiteURL: ALTCHA_PAGE,
websiteKey: "",
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: {
challenge,
iterations: maxnumbers || 100000,
salt,
signature,
},
},
};
const taskResp = await fetch("https://api.capmonster.cloud/createTask", {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify(createTaskBody),
}).then((r) => r.json());
console.log("CreateTask response:", taskResp);
if (!taskResp?.taskId) {
console.error("CreateTask failed:", taskResp);
await browser.close();
return;
}
const taskId = taskResp.taskId;
// Récupération de la solution
let fullSolution = null;
const pollStart = Date.now();
while (Date.now() - pollStart < 120000) {
const res = await fetch("https://api.capmonster.cloud/getTaskResult", {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({ clientKey: API_KEY, taskId }),
}).then((r) => r.json());
if (res.status === "ready") {
fullSolution = res.solution;
console.log("Solution:", fullSolution);
break;
}
await new Promise((r) => setTimeout(r, 3000));
}
if (!fullSolution) {
console.error("No solution received in time.");
await browser.close();
return;
}
const token = fullSolution?.data?.token || fullSolution?.token || fullSolution?.data;
if (!token) {
console.error("Token not found in solution:", fullSolution);
await browser.close();
return;
}
//Insertion du token
await page.evaluate((t) => {
let input = document.querySelector("#captchaParaValidar");
if (!input) {
input = document.createElement("input");
input.type = "hidden";
input.id = "captchaParaValidar";
input.name = "captchaParaValidar";
(document.querySelector("form") || document.body).appendChild(input);
}
input.value = t;
let alt = document.querySelector('input[name="altcha"]');
if (!alt) {
alt = document.createElement("input");
alt.type = "hidden";
alt.name = "altcha";
(document.querySelector("form") || document.body).appendChild(alt);
}
alt.value = t;
const widget = document.querySelector("altcha-widget");
if (widget) {
widget.setAttribute("data-state", "verified");
const checkbox = widget.querySelector("input[type='checkbox']");
if (checkbox) {
checkbox.checked = true;
checkbox.dispatchEvent(new Event("change", { bubbles: true }));
}
const label = widget.querySelector(".altcha-label");
if (label) label.textContent = "Verified";
}
}, token);
console.log("Token injected:", token);
})();1. Installation du widget
Option 1 — via CDN (la plus simple). Ajoutez ceci dans le <head> de votre HTML :
<script async defer src="https://cdn.jsdelivr.net/gh/altcha-org/altcha/dist/altcha.min.js" type="module"></script>Option 2 — via npm :
npm install altchaImportez le widget dans votre fichier JS :
import "altcha";2. Ajout du widget dans le formulaire.
Insérez le composant <altcha-widget> dans le formulaire nécessitant une protection :
<form method="POST" action="/submit">
<altcha-widget challengeurl="/altcha/challenge"></altcha-widget>
<button type="submit">Send</button>
</form>challengeurl — votre endpoint serveur pour délivrer le challenge.
Si vous utilisez ALTCHA Sentinel (protection serveur prête à l'emploi contre bots et spam avec apprentissage automatique et analyse de trafic), utilisez son URL à la place de votre serveur :
<altcha-widget
challengeurl="https://sentinel.example.com/v1/challenge?apiKey=YOUR_API_KEY">
</altcha-widget>3. Vérification côté serveur.
Comment se déroule la validation :
Validation via ALTCHA Sentinel :
import { verifyServerSignature } from 'altcha-lib';
// Clé API secrète générée dans Sentinel
const apiKeySecret = 'sec_...';
// Payload reçu du widget
const payload = '...';
// Validation
const { verificationData, verified } = await verifyServerSignature(payload, apiKeySecret);
if (verified) {
// Validation réussie — les données du formulaire peuvent être traitées
}
const resp = await fetch('https://sentinel.example.com/v1/verify/signature', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ payload }),
});
const { verified } = await resp.json();
if (verified) {
// Validation réussie — traitement du formulaire
}
L'API empêche automatiquement la réutilisation du même payload.
4. Validation sans Sentinel (serveur propre)
Génération du challenge :
import { createChallenge } from 'altcha-lib';
const hmacKey = '$ecret.key'; // Votre clé secrète HMAC
const challenge = await createChallenge({ hmacKey });
// Nous renvoyons le challenge en JSON pour le widgetValidation du payload lors de l'envoi du formulaire :
import { verifySolution } from 'altcha-lib';
const hmacKey = '$ecret.key'; // Votre clé secrète HMAC
const verified = await verifySolution(payload, hmacKey);
if (verified) {
// Validation réussie — traitement des données du formulaire
}
Dans ce cas, vous créez vous-même l'endpoint /altcha/challenge pour délivrer les tâches et les vérifier côté serveur.
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 ALTCHA, 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 ALTCHA 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.