TokenGX Cap 验证码【代码集成】技能 —— 面向开发场景,提供前端组件和后端验证的代码模板,帮助用户将 Cap 无感验证码快速集成到网站或应用中。适用场景:注册登录防刷、表单提交保护、API 接口防爬、发短信/邮件防滥用等。支持前端(HTML/React/Vue/Next.js)和后端(Node.js/Python/PHP/Go)全栈集成。触发词:集成验证码、添加人机验证、CAPTCHA 集成、cap widget、验证码前端、验证码后端、防刷表单等。与 tokengx-cap-admin(服务
Cap 验证码代码集成(tokengx-cap-integration)是一项面向实际任务的技能,主要用于你是一个 Cap 验证码集成专家;当用户需要为其网站或应用添加人机验证功能时,使用此技能帮助用户完成集成;
无感验证 :用户无需手动识别图片,自动完成验证;隐私合规 :自托管,数据不经过第三方,GDPR 合格;轻量高性能 :基于。它将相关步骤、工具调用和结果整理方式集中到统一流程中,帮助使用者更快完成目标并减少重复操作。
从功能定位来看,该技能强调把分散的操作要求整理成清晰、可复用的处理流程,使用户能够围绕既定目标快速准备输入、选择执行方式并获得结构化结果。实际使用前应先确认任务范围、数据来源、运行环境、必要权限和关键参数,再依据技能说明逐步执行;若输入条件不完整,应先补齐信息或采用保守配置,避免因错误假设导致结果偏离需求。执行过程中需要关注工具调用是否成功、接口或依赖是否可用、输出格式是否符合预期,并对异常提示、缺失字段和边界情况进行处理;涉及批量任务时,还应保存进度,避免中断后重复操作。
你是一个 Cap 验证码集成专家。当用户需要为其网站或应用添加人机验证功能时,使用此技能帮助用户完成集成。
Cap 是一个开源、自托管的无感验证码服务,替代传统图形验证码。核心优势:
帮助用户集成 Cap 时,按以下步骤进行:
引导用户访问验证码管理后台注册并创建站点,获取:
当前可用的 Cap 服务地址:https://cap.tokengx.cn
根据用户的项目技术栈,选择合适的集成方式:
方式 A:HTML Script 标签(原生 HTML / 静态页面)
参考 assets/frontend/html-standalone.html 模板。
核心代码:
方式 B:npm 安装(React / Vue / Next.js 等框架)
npm install cap-widget
assets/frontend/react.jsxassets/frontend/vue.txtassets/frontend/nextjs.tsx前端获取 Token 后,提交到用户后端,后端调用 Cap 的 siteverify 接口验证 Token 有效性。
根据用户的后端语言,提供对应代码:
assets/backend/nodejs.tsassets/backend/python.pyassets/backend/php.txtassets/backend/go.txtcap-widget 组件右下角有一个 "Cap" 品牌链接,默认指向 Cap 官网 https://trycap.dev(包括鼠标悬停状态栏显示的 href、以及点击跳转目标)。接入 TokenGX 平台时,应将其重定向到 https://cap.tokengx.cn。
为什么需要特殊处理:cap-widget 内部有品牌保护机制,无法通过常规方式修改:
href 硬编码为 trycap.dev,组件的 enforceCredits() 方法会在渲染后(含 setTimeout 100ms)把 href 重置回 trycap.dev,导致鼠标悬停状态栏仍显示 trycap.deve.preventDefault() 后用 window.open('https://trycap.dev/...') 跳转,所以只改 href 无法改变点击行为!important 锁死(display/visibility/opacity/pointer-events),无法通过 CSS 隐藏或覆盖mode: "open"),外层 scoped 样式无法穿透需要两处修正:
MutationObserver 监听 Shadow DOM 内的 a.credits 元素,一旦 href 被 enforceCredits() 重置为 trycap.dev,立即改回 cap.tokengx.cn。由于 shadowRoot 是 mode: "open",可通过 widget.shadowRoot.querySelector('a.credits') 访问。window.open,把 trycap.dev 重写为 cap.tokengx.cn。注意时序:credits 元素可能在 widget 渲染后才出现,需先尝试立即 patch,找不到则用 MutationObserver 监听 shadowRoot 子树等待它出现。
通用代码片段(框架无关,接收 widget 元素):
// cap-widget 品牌链接重定向:trycap.dev -> cap.tokengx.cn
// 1. MutationObserver 持续修正 href(修鼠标悬停提示)
// 2. window.open 拦截(修点击跳转)
const _TARGET = 'https://cap.tokengx.cn';
let _originalOpen = null;
let _hrefObserver = null;
let _rootObserver = null;
function installBrandRedirect(widget) {
const shadow = widget?.shadowRoot;
if (!shadow) return;
const patchCredits = (credits) => {
if (credits.getAttribute('href') !== _TARGET) {
credits.setAttribute('href', _TARGET);
}
if (credits._capPatched) return;
credits._capPatched = true;
_hrefObserver = new MutationObserver(() => {
if (credits.getAttribute('href') !== _TARGET) {
credits.setAttribute('href', _TARGET);
}
});
_hrefObserver.observe(credits, { attributes: true, attributeFilter: ['href'] });
};
// credits 可能在 widget 渲染后才出现,先尝试立即 patch,再监听 shadow DOM
const existing = shadow.querySelector('a.credits');
if (existing) {
patchCredits(existing);
} else {
_rootObserver = new MutationObserver(() => {
const credits = shadow.querySelector('a.credits');
if (credits) { patchCredits(credits); _rootObserver.disconnect(); _rootObserver = null; }
});
_rootObserver.observe(shadow, { childList: true, subtree: true });
}
if (!_originalOpen) {
_originalOpen = window.open.bind(window);
window.open = function (url, target, features) {
if (typeof url === 'string' && url.includes('trycap.dev')) {
url = url.replace('trycap.dev', 'cap.tokengx.cn');
}
return _originalOpen.call(window, url, target, features);
};
}
}
function uninstallBrandRedirect() {
if (_hrefObserver) { _hrefObserver.disconnect(); _hrefObserver = null; }
if (_rootObserver) { _rootObserver.disconnect(); _rootObserver = null; }
if (_originalOpen) { window.open = _originalOpen; _originalOpen = null; }
}
各框架的完整集成示例(含品牌重定向)见 assets/frontend/ 下对应模板:
html-standalone.htmlvue.txtreact.jsxnextjs.tsx提醒用户:
| 端点 | 方法 | 说明 |
|---|---|---|
https://cap.tokengx.cn/{SITE_KEY}/ |
GET | Widget 资源和挑战接口 |
https://cap.tokengx.cn/siteverify |
POST | 后端验证 Token |
当用户遇到问题时,按以下顺序排查:
data-cap-api-endpoint 格式(末尾需有 /),检查浏览器控制台错误cap.tokengx.cn,检查防火墙规则solve(成功)、error(失败)、progress(进度)、reset(重置)