logo
bars

ALTCHA
与 CapMonster Cloud

Captcha 解决方案、网站安装与测试。
接手一个已经部署 captcha 或其他防护的站点,却无法访问源代码?此时最关心的是使用了哪种方案、配置是否正确以及如何测试。

在本文中,我们尽量回答了所有关键问题。要开始解决问题,第一步是确定当前使用的是哪种防护系统。为此,您可以查看常见验证码与反机器人防护系统列表,其中提供了可视化示例和关键特征,帮助您快速判断自己正在使用哪一种方案。

如果您发现自己的网站使用的是 ALTCHA,下一步就是更深入地了解它的特性和具体工作方式。在本文中,您还可以查看 ALTCHA 的接入说明,以便彻底弄清它在您的网站上是如何运行的。这样一来,您不仅能更好地理解当前的防护机制,还可以更合理地规划后续的维护和支持。

什么是 ALTCHA
什么是 ALTCHA
ALTCHA(Alternative CAPTCHA)是一种防止网站被机器人和垃圾信息攻击的系统。它帮助区分真实用户和自动化程序,确保网站安全稳定运行。ALTCHA 是传统 CAPTCHA 的现代替代方案:使用轻量级加密任务(proof-of-work),且不收集 Cookie 或跟踪用户。
Background
ALTCHA 示例
Proof-of-Work (PoW)
Proof-of-Work (PoW)
系统默认使用 Proof-of-Work (PoW) 验证方法,避免视觉谜题和侵入式检查。这种方法在保证安全的同时,提供用户友好的体验,为大多数访问者提供低干扰的 CAPTCHA 解决方案。
Code Captcha
Code Captcha
防护可升级到文本 CAPTCHA 验证。
Invisible Captcha
Invisible Captcha
验证过程无可见控件,无需用户操作。

通过 CapMonster Cloud 解决 ALTCHA

测试包含 ALTCHA 的表单时,常常需要确认 captcha 是否集成正确并工作正常。

你可以手动验证站点上的 captcha。

  • 打开表单页面,确认 captcha 能够显示。
  • 尝试在不解题的情况下提交——服务器应返回错误。
  • 解题成功后,表单应顺利提交。

若想自动解题,可以使用 CapMonster Cloud 等服务,它会接收验证码参数、在服务器中解析并返回可直接使用的 token。把 token 注入表单即可无需人工操作通过验证。

通过 CapMonster Cloud API 工作的一般流程:

创建任务创建任务
arrow
发送 API 请求发送 API 请求
arrow
获取结果获取结果
arrow
将 token 应用到页面将 token 应用到页面
arrow
解决、插入 Token 并提交表单
Node.js 示例,展示完整的网页 CAPTCHA 识别流程。可能方法:使用 HTTP 请求获取 HTML 和 CAPTCHA 参数,提交答案并处理结果;或使用自动化工具(如 Playwright)— 打开页面,等待 CAPTCHA,提交参数(测试时可发送正确或错误数据),通过 CapMonster Cloud 客户端获取结果,将 Token 填入表单并查看效果。
// 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;
  }

  //插入 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);
})();
如何将 ALTCHA 连接到您的网站
为了充分了解 CAPTCHA 在您网站的运行、验证逻辑,以及重新连接或重新配置,建议阅读本节。它描述了保护集成过程,帮助您快速掌握各项细节。

1. 安装控件

选项 1 — 通过 CDN(最简单)。将其添加到 HTML 的 <head>:

<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 — 用于发放任务的服务器端点。

如果使用 ALTCHA Sentinel(内置服务器防护,机器学习与流量分析),请使用其 URL 替代自建服务器:


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

3. 服务器验证。

验证过程如下:

  • 1) 控件生成 payload — Base64 编码的 JSON,通常作为 altcha 表单字段发送。
  • 2) 在服务器对 payload 进行加密验证(无需额外 API 调用)。
  • 3) 验证成功后即可处理表单。

通过 ALTCHA Sentinel 验证:

使用库使用库
arrow

通过 Sentinel HTTP API(若库不可用):通过 Sentinel HTTP API(若库不可用):
arrow

4. 不使用 Sentinel 的验证(自建服务器)

生成任务(challenge):


import { createChallenge } from 'altcha-lib';

const hmacKey = '$ecret.key'; // 您的 HMAC 密钥

const challenge = await createChallenge({ hmacKey });

// 以 JSON 格式返回 challenge 给控件

提交表单时验证 payload:


import { verifySolution } from 'altcha-lib';

const hmacKey = '$ecret.key'; // 您的 HMAC 密钥

const verified = await verifySolution(payload, hmacKey);

if (verified) {
  // 验证成功 — 处理表单数据
}

在这种情况下,您需自行创建 /altcha/challenge 端点来发放任务并在服务器验证。

Background
可能的错误与调试
Bug Icon
challengeurl 或 API Key 无效
控件未加载或验证时返回错误。
Bug Icon
解决超时
服务器未及时验证 payload。请延长等待时间或确保服务器验证正确工作。
Bug Icon
空 payload
从控件发送结果到服务器时发生错误。
Bug Icon
Verification failed
Payload 已过期、重复使用或被篡改。诊断时启用日志,检查服务器或 Sentinel 响应中的 verified 和 verificationData 字段。
验证防护的可靠性
集成完成后,务必确认系统确实能够抵御自动化行为。
安全与优化建议
仅在服务器上保管 <b>密钥</b>(HMAC 或 Sentinel API Key)— 不要发送到前端。
<b>记录错误</b>和验证事件(<b>verified: false</b> 与 <b>verificationData</b>),以了解验证失败的原因。
为透明性和用户信任,<b>在表单中添加隐私政策</b>及 <b>ALTCHA 使用条款</b> 链接,如有必要。
结论

如果你接手了一个已经集成了验证码或其他防护系统的网站,但又无法访问其代码,也不用担心!要判断实际使用了哪种技术其实并不难。为了核实其是否正常工作,你可以在隔离的测试环境中使用CapMonster Cloud识别服务,确保令牌处理机制和校验逻辑都运行正常。

对于ALTCHA,只需识别出所用的系统,观察其行为,并确认防护是否正常工作即可。本文演示了如何识别 ALTCHA,以及到哪里查找其接入或重新配置的说明文档,从而帮助你自信地维护防护方案并掌控其运行情况。

Conclusion
实用链接
DocIconALTCHA 文档DocIconALTCHA 源代码DocIconCapMonster Cloud 文档(ALTCHA 使用)