logo
bars

ALTCHA
и CapMonster Cloud

Решение капчи, установка на сайт и тестирование.
Вам достался «по наследству» сайт с подключённой капчей или другой защитой, но доступа к исходному коду нет? В такой ситуации возникают вопросы: какую именно систему защиты использует сайт, правильно ли она установлена и как проверить её работу?

В этой статье мы постарались дать ответы на все вопросы. А начать решение задачи нужно с определения того, какая система защиты используется. Для этого можно обратиться к списку популярных капч и систем антибот-защиты, где представлены визуальные примеры и ключевые признаки, которые могут помочь быстро определить, с чем вы имеете дело.

Если вы обнаружили, что на вашем сайте используется ALTCHA, следующим шагом станет более подробное изучение её свойств и самой работы. Также в этой статье вы можете изучить инструкцию по подключению системы ALTCHA, чтобы полностью разобраться, как она функционирует на вашем сайте. Это позволит не только понимать текущую защиту, но и грамотно планировать её поддержку.

Что такое ALTCHA
Что такое ALTCHA
ALTCHA (Alternative CAPTCHA) — это система защиты сайта от ботов и спама. Она помогает отличать реальных пользователей от автоматических программ, чтобы сайт работал безопасно и стабильно. ALTCHA — современная альтернатива обычным CAPTCHA: она использует лёгкое криптографическое задание (proof-of-work) и при этом не собирает cookies и не отслеживает пользователей.
Background
Виды ALTCHA
Proof-of-Work (PoW)
Proof-of-Work (PoW)
Система по умолчанию использует метод верификации Proof-of-Work (PoW), что исключает визуальные головоломки и навязчивые проверки. Такой подход сочетает безопасность с удобством для пользователей, предлагая ненавязчивое Captcha‑решение, подходящее для большинства посетителей.
Code Captcha
Code Captcha
Защита усиливается до прохождения текстовой капчи.
Invisible Captcha
Invisible Captcha
Проверка происходит без видимого виджета; не требует никаких действий от пользователя.

Как решить ALTCHA через CapMonster Cloud

При тестировании форм с ALTCHA часто возникает необходимость проверить работу капчи и убедиться, что она корректно интегрирована.

Вы можете вручную протестировать подставленную на ваш сайт капчу.

  • Откройте страницу с формой и убедитесь, что капча отображается.
  • Попробуйте отправить форму без её прохождения — сервер должен выдать ошибку.
  • После успешного решения капчи — форма должна отправиться без ошибок.

Для автоматического распознавания капчи можно использовать специализированные сервисы, например, CapMonster Cloud — инструмент, который принимает параметры капчи, обрабатывает их на своих серверах и возвращает готовый токен. Этот токен можно подставить в форму, чтобы пройти проверку без участия пользователя.

Работа с CapMonster Cloud через API обычно включает следующие шаги:

Создание задачи (Task)Создание задачи (Task)
arrow
Отправка запроса к APIОтправка запроса к API
arrow
Получение результатаПолучение результата
arrow
Подстановка токена на страницуПодстановка токена на страницу
arrow
Решение, подстановка токена и отправка формы
Пример на Node.js для полного цикла распознавания капчи на вашей веб-странице. Возможные подходы: использовать HTTP-запросы для получения HTML и параметров капчи, отправить ответ и обработать результат; или с помощью инструментов для автоматизации (например, Playwright) — открыть страницу, дождаться капчи, отправить параметры (для тестирования вы можете отправить как правильные, так и некорректные данные), получить результат через клиент CapMonster Cloud, подставить токен в форму и увидеть результат.
// npm install playwright
// npx playwright install chromium

const { chromium } = require("playwright");

const API_KEY = "YOUR_API_KEY";
const ALTCHA_PAGE = "https://example.com"; // Ваш сайт с ALTCHA

(async () => {
  const browser = await chromium.launch({ headless: false, devtools: true });
  const context = await browser.newContext();
  const page = await context.newPage();

  // Ловим все ответы от эндпоинта Altcha
  let challengeResp = null;
  page.on("response", async (response) => {
    try {
      const url = response.url();
      if (url.startsWith("https://captcha.example.com/altcha")) { // Эндпоинт 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" });

  // Клик по виджету, если он есть
  const widgetHandle = await page.$("altcha-widget");
  if (widgetHandle) {
    try {
      await widgetHandle.click();
    } catch {}
  }

  // Ждем появления challenge
  const start = Date.now();
  while (!challengeResp && Date.now() - start < 60000) { // увеличен таймаут
    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;

  // Создаем задачу на 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/145.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;

  // Получаем решение
  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;
  }

  //Вставляем токен
  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);
})();
Как подключить ALTCHA к своему сайту
Чтобы уверенно ориентироваться в работе капчи на вашем сайте, понимать логику её проверки, заново подключить или перенастроить, рекомендуем вам изучить этот раздел. В нём описан процесс подключения защиты — это поможет быстро разобраться во всех нюансах.

1. Установка виджета

Вариант 1 — через CDN (самый простой). Добавьте в <head>; вашего HTML:

<script async defer src="https://cdn.jsdelivr.net/gh/altcha-org/altcha/dist/altcha.min.js" type="module"></script>

Вариант 2 — через npm:

npm install altcha

Импортируйте виджет в ваш JS-файл:

import "altcha";

2. Добавление виджета в форму.

Вставьте компонент <altcha-widget> в форму, где требуется защита:


<form method="POST" action="/submit">
  <altcha-widget challengeurl="/altcha/challenge"></altcha-widget>
  <button type="submit">Send</button>
</form>

challengeurl — ваш серверный endpoint для выдачи задания (challenge).

Если вы используете ALTCHA Sentinel (готовая серверная защита от ботов и спама, с машинным обучением и анализом трафика), вместо собственного сервера используйте его URL:


<altcha-widget 
  challengeurl="https://sentinel.example.com/v1/challenge?apiKey=YOUR_API_KEY">
</altcha-widget>

3. Серверная проверка.

Как проходит проверка:

  • 1) Виджет генерирует payload — Base64-encoded JSON, обычно отправляется как поле формы altcha.
  • 2) На сервере вы проверяете payload криптографически (без лишних API-запросов).
  • 3) После успешной проверки можно обработать форму.

Проверка через ALTCHA Sentinel:

С помощью библиотекиС помощью библиотеки
arrow

Через HTTP API Sentinel (если библиотека недоступна):Через HTTP API Sentinel (если библиотека недоступна):
arrow

4. Проверка без Sentinel (самостоятельный сервер)

Генерация задания (challenge):


import { createChallenge } from 'altcha-lib';

const hmacKey = '$ecret.key'; // Ваш секретный ключ HMAC

const challenge = await createChallenge({ hmacKey });

// Отдаём challenge в JSON для виджета

Проверка payload при отправке формы:


import { verifySolution } from 'altcha-lib';

const hmacKey = '$ecret.key'; // Ваш секретный ключ HMAC

const verified = await verifySolution(payload, hmacKey);

if (verified) {
  // Проверка успешна -- обрабатываем данные формы
}

В этом случае вы самостоятельно создаёте endpoint /altcha/challenge для выдачи заданий и проверяете их на сервере.

Background
Возможные ошибки и отладка
Bug Icon
Неверный challengeurl или API Key
Виджет не загружается или при проверке возвращает ошибку.
Bug Icon
Таймаут решения
Сервер не успел проверить payload. Увеличьте время ожидания или убедитесь, что серверная проверка работает корректно.
Bug Icon
Пустой payload
Ошибка при передаче результата с виджета на сервер.
Bug Icon
Verification failed
Payload просрочен, повторно использован или подделан. Для диагностики включите логирование и проверяйте поле verified и verificationData в ответе от сервера или Sentinel.
Проверка устойчивости защиты
После интеграции важно убедиться, что система действительно защищает сайт от автоматических действий.
Рекомендации по безопасности и оптимизации
<b>Храните секретные ключи</b> (HMAC или API Key для Sentinel) только на сервере — не отправляйте их на фронтенд.
<b>Логируйте ошибки</b> и события верификации (<b>verified: false</b> и <b>verificationData</b>) для понимания причин неудачных проверок.
Для прозрачности и доверия пользователей <b>добавьте ссылки на политику конфиденциальности</b> и <b>условия использования</b> ALTCHA, если требуется.
Заключение

Если вам достался сайт с уже установленной капчей или другой системой защиты и при этом нет доступа к коду — ничего страшного! Определить, какая именно технология используется, достаточно легко. А для проверки корректности работы можно использовать сервис распознавания CapMonster Cloud в изолированной тестовой среде, чтобы убедиться, что механизм обработки токенов и логика проверки функционируют корректно.

В случае с ALTCHA — достаточно распознать систему, изучить её поведение и убедиться, что защита функционирует корректно. В статье мы показали, как определить ALTCHA и где найти инструкции по её подключению или перенастройке, чтобы уверенно поддерживать защиту и контролировать её работу.

Conclusion
Полезные ссылки
DocIconДокументация ALTCHADocIconИсходный код ALTCHADocIconДокументация CapMonster Cloud (работа с ALTCHA)