# Capcat 文档(全量单文件版) > 本文件由 https://capcat.ai 构建时自动生成,汇总了 Capcat 全部使用文档,供 AI 与程序一次抓取。文档索引:https://capcat.ai/llms.txt --- # 快速开始 > 来源:https://capcat.ai/guide/index.md Capcat 是托管人机验证服务:你不需要部署或维护任何服务端,在控制台创建站点获得密钥,页面里放入**前端组件**,业务后端调一个**校验接口**即可。整个接入过程大约 5 分钟。 [先看在线体验 →](https://capcat.ai/guide/demo.md) ## 1. 创建站点,获取密钥 打开 [console.capcat.ai](https://console.capcat.ai),用邮箱和密码注册并登录,点「新建站点」。你会得到两把密钥: - **site key** —— 公开值,写在页面代码里; - **secret** —— 保密值,只在创建时展示一次,供你的后端调用校验接口。 建好站点后建议顺手[绑定域名](https://capcat.ai/guide/console.md#_3-绑定域名-强烈建议),防止别人盗用你的 site key。 ## 2. 页面加入组件 组件是一个独立的 Web Component,通过一个 ` ``` 放进 `
` 里时无需写任何 JavaScript,组件会自动注入隐藏的 `cap-token` 字段并随表单提交: ```html
``` 把 `` 换成控制台里的 site key 即可。SPA 或自定义流程见[前端组件](https://capcat.ai/guide/widget.md)。 ## 3. 服务端校验 token 信任任何提交之前,先把 token 发到 `/siteverify` 校验: ```sh curl "https://api.capcat.ai//siteverify" \ -X POST \ -H "Content-Type: application/json" \ -d '{ "secret": "", "response": "" }' ``` 校验通过返回: ```json { "success": true } ``` token 一次性有效,校验一次后即失效。更多语言示例见[服务端验证 API](https://capcat.ai/guide/siteverify.md)。 > **注意** > > `secret` 绝不能出现在前端代码里——它只属于你的服务器。丢失后可在控制台轮换(旧 secret 有 1 小时宽限期)。 ## 4. 端到端确认 1. 打开页面,复选框应自动打勾,表单里出现 `cap-token` 字段; 2. 把 token 发给 `/siteverify`,应返回 `{ "success": true }`; 3. 用同一个 token 再发一次,应当失败——说明一次性机制正常。 ## 接口与迁移 `/siteverify` 与 reCAPTCHA / hCaptcha 的接口兼容:从它们迁移时,服务端通常只需要改一个 URL,前端把组件换成 `` 即可。Capcat 基于开源项目 [Cap](https://github.com/tiagozip/cap)(Apache 2.0)构建。 --- # 获取密钥(控制台) > 来源:https://capcat.ai/guide/console.md Capcat 是托管验证服务:你不需要部署任何服务端,在控制台注册后即可获得接入密钥。 ## 1. 注册 / 登录 打开 [console.capcat.ai](https://console.capcat.ai),用邮箱和密码注册账号;已注册的账号直接登录。 ## 2. 创建站点 点击「新建站点」,填写站点名称,系统会生成一对密钥: | 密钥 | 用途 | 保密性 | | --- | --- | --- | | **site key** | 前端组件标识,出现在页面代码里 | 公开 | | **secret** | 业务后端调用 `/siteverify` 时使用 | **绝不能泄露;仅创建时展示一次** | > **secret 只显示一次** > > 创建和轮换时请立即保存 secret。丢失后无法找回,只能在控制台轮换(旧 secret 有 1 小时宽限期)。 ## 3. 绑定域名(强烈建议) 在站点详情的「域名绑定」中填入你的网站域名。绑定后,只有来自这些域名的页面才能使用你的 site key,防止他人盗用你的额度。 支持的格式: - `example.com` —— 该域名及其所有子域 - `*.example.com` —— 仅子域 - `https://example.com` —— 精确 origin - `http://localhost:*` —— 本地开发(任意端口) 不绑定时任何网站都可使用你的 site key(控制台会显示警告)。变更约 1 分钟内全球生效。 ## 4. 接入 前端引入组件(详见[前端组件](https://capcat.ai/guide/widget.md)): ```html ``` 后端校验 token(详见[服务端验证 API](https://capcat.ai/guide/siteverify.md)): ```bash curl -X POST https://api.capcat.ai/你的siteKey/siteverify \ -H "content-type: application/json" \ -d '{"secret":"你的secret","response":"cap-token 的值"}' ``` ## 用量与限额 控制台可查看每个站点近 7 天的验证次数、通过率与拦截数。当前默认限额:单站点 600 次/分钟、单 IP 30 次/分钟,超限返回 `429`。如需更高额度请联系我们。 --- # 在线体验 > 来源:https://capcat.ai/guide/demo.md 下面是一个模拟的评论表单,验证组件连接的就是 Capcat 部署在 Cloudflare Workers 上的**生产服务**。点一下复选框,工作量证明会在你的浏览器后台完成,通过后「发表评论」按钮才会解锁;点击提交,服务端会真实执行一次 [`/siteverify`](https://capcat.ai/guide/siteverify.md) 校验,并把 API 的响应原样回显在下方。 > (此处是一个交互式演示区域,Markdown 版本无法呈现;在浏览器中打开 https://capcat.ai/guide/demo.html 即可体验。) ## 这背后发生了什么 1. 组件向验证服务请求挑战,服务端签发一个带签名的 JWT; 2. 你的浏览器在后台完成两层挑战:工作量证明(Web Worker 并行求解),加上一段每次动态生成的环境校验程序——确认求解发生在真实浏览器里,而不是直连 API 的脚本(通常 1~3 秒,全程无感); 3. 解答提交回服务端校验,通过后签发一次性 `cap-token`——业务后端拿它调用 [`/siteverify`](https://capcat.ai/guide/siteverify.md) 完成最终确认,token 用过即废。本页的「发表评论」就真实执行了这一步,上面回显的就是 `/siteverify` 的原始响应。 > **说明** > > 本演示与生产站点同配置:PoW + instrumentation 环境校验(含无头浏览器识别)默认开启,可在控制台按站点调整。 ## 场景演示 想看看 Capcat 放进真实页面里的样子?[在线 Demo](https://capcat.ai/demo/) 集合了三个常见场景,关键操作都先经过 Capcat 验证: - **评论与留言** —— 发表按钮锁在验证之后,垃圾评论机器人灌水成本立刻不划算; - **账号注册** —— 每次提交都要先付出真实算力并通过环境校验,批量注册与撞库脚本的吞吐大幅下降; - **AI 问答 / 昂贵接口** —— 调用前先通过验证,抬高刷接口的成本,同时不打扰正常用户。 准备接入自己的项目?从[快速开始](https://capcat.ai/guide/index.md)出发,5 分钟搞定。 --- # 前端组件 > 来源:https://capcat.ai/guide/widget.md 验证组件是一个标准 Web Component(``),一行 ` ``` > **提示** > > 该文件由 Capcat 官方托管(capcat.ai),不依赖第三方 CDN,国内外访问都稳定。 ## 表单方式(零 JavaScript) 组件放在 `
` 内时,会自动注入隐藏的 `cap-token` 字段并随表单一起提交: ```html
``` ## JavaScript 方式(SPA / 自定义流程) 监听 `solve` 事件拿到 token,自行决定何时发送: ```js const widget = document.querySelector("cap-widget"); widget.addEventListener("solve", (e) => { const token = e.detail.token; // 把 token 发给你的服务端、解锁提交按钮等 }); ``` ## 常用属性 | 属性 | 说明 | | --- | --- | | `data-cap-api-endpoint` | 验证服务地址,格式 `https://api.capcat.ai//`(site key 在[控制台](https://capcat.ai/guide/console.md)创建站点时获得),必填 | | `data-cap-worker-count` | 求解使用的 Web Worker 数量,默认按设备核数 | 更完整的属性、主题定制与 React / Vue / Svelte 等框架接入示例,参见上游文档 [Widget 章节](https://trycap.dev/guide/widget.html)。 --- # 服务端验证 API > 来源:https://capcat.ai/guide/siteverify.md 前端拿到的 token 必须在**服务端**校验后才可信任。接口与 reCAPTCHA / hCaptcha 的 siteverify 兼容(请求体 JSON 与表单编码都接受),从它们迁移时服务端通常只需改一个 URL——对照步骤见[迁移指南](https://capcat.ai/guide/migrate.md)。 ## 接口 ``` POST https://api.capcat.ai//siteverify Content-Type: application/json { "secret": "", "response": "" } ``` - `secret` — 控制台创建站点时生成的 **secret**(仅创建/轮换时展示一次); - `response` — 前端组件产出的 token(表单里的 `cap-token` 字段,或 `solve` 事件的 `e.detail.token`)。 校验通过返回: ```json { "success": true } ``` token **一次性有效**:校验成功一次后立即失效,重放会返回失败。 ## 多语言示例 ```sh [curl] curl "https://api.capcat.ai//siteverify" \ -X POST \ -H "Content-Type: application/json" \ -d '{ "secret": "", "response": "" }' ``` ```js [Node.js] const { success } = await ( await fetch("https://api.capcat.ai//siteverify", { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify({ secret: "", response: "" }), }) ).json(); if (!success) throw new Error("人机验证未通过"); ``` ```py [Python] import requests success = requests.post( "https://api.capcat.ai//siteverify", json={"secret": "", "response": ""}, ).json().get("success") ``` ```php [PHP] [ "method" => "POST", "header" => "Content-Type: application/json", "content" => json_encode([ "secret" => "", "response" => "", ]), ], ]); $data = json_decode(file_get_contents( "https://api.capcat.ai//siteverify", false, $ctx ), true); var_dump($data["success"] ?? false); ``` --- # 迁移指南 > 来源:https://capcat.ai/guide/migrate.md 从 reCAPTCHA / hCaptcha / Turnstile 迁移到 Capcat 只有两处改动: 1. **前端**:换 `
``` `` 放在 `
` 内会自动注入隐藏的 `cap-token` 字段随表单提交,与 `g-recaptcha-response` 的机制一致;不需要 `onload` 回调或 `grecaptcha.render()`。 ### 服务端 把 siteverify 的 URL 换成 Capcat、secret 换成控制台生成的 secret、读取的字段从 `g-recaptcha-response` 换成 `cap-token`: ```js // 之前 const token = req.body["g-recaptcha-response"]; const r = await fetch("https://www.google.com/recaptcha/api/siteverify", { method: "POST", headers: { "Content-Type": "application/x-www-form-urlencoded" }, body: new URLSearchParams({ secret: RECAPTCHA_SECRET, response: token }), }); // 之后 —— 表单编码原样可用,只改了 URL、secret 与字段名 const token = req.body["cap-token"]; const r = await fetch("https://api.capcat.ai//siteverify", { method: "POST", headers: { "Content-Type": "application/x-www-form-urlencoded" }, body: new URLSearchParams({ secret: CAPCAT_SECRET, response: token }), }); const { success } = await r.json(); ``` `remoteip` 等多余参数会被忽略,不必删除。 ### 用的是 reCAPTCHA v3? v3 的「无感评分」没有直接对应物——Capcat 不给用户打分,验证结果只有通过 / 不通过。但 v3 的典型场景(表单防刷、接口防滥用)可以直接用 Capcat 替代:工作量证明在浏览器后台静默完成,用户只需点一次复选框,没有图形拼图。服务端不再有 `score` 与 `action` 字段,把阈值判断改为检查 `success` 即可。 ## 从 hCaptcha 迁移 ### 前端 ```html
``` ### 服务端 hCaptcha 的 siteverify 与 reCAPTCHA 同构:URL 换成 `https://api.capcat.ai//siteverify`,secret 换成 Capcat 的,token 字段从 `h-captcha-response` 换成 `cap-token`。表单编码与 JSON 都接受,`sitekey` / `remoteip` 参数忽略即可。 ```py # 之前 requests.post("https://api.hcaptcha.com/siteverify", data={"secret": HCAPTCHA_SECRET, "response": request.form["h-captcha-response"]}) # 之后 requests.post("https://api.capcat.ai//siteverify", data={"secret": CAPCAT_SECRET, "response": request.form["cap-token"]}) ``` ## 从 Turnstile 迁移 ### 前端 ```html
``` ### 服务端 Turnstile 的 siteverify 支持 JSON 与表单编码,Capcat 同样两者都支持——只改 URL、secret 与字段名(`cf-turnstile-response` → `cap-token`): ```js // 之前 const r = await fetch("https://challenges.cloudflare.com/turnstile/v0/siteverify", { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify({ secret: TURNSTILE_SECRET, response: token }), }); // 之后 const r = await fetch("https://api.capcat.ai//siteverify", { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify({ secret: CAPCAT_SECRET, response: token }), }); ``` ## 迁移注意事项 - **token 一次性有效**:siteverify 校验成功一次后立即失效,重放返回 `success: false`(与三家行为一致)。默认有效期 20 分钟。 - **没有评分与动作**:响应里没有 `score` / `action` / `hostname` 字段,通过判定只看 `success`。 - **域名绑定**:对应 reCAPTCHA / hCaptcha 的域名白名单,在控制台站点设置里配置「允许的域名」;绑定后其他来源的验证请求会被直接拒绝。 - **内容安全策略(CSP)**:若站点启用了严格 CSP,需放行 `capcat.ai`(脚本与 wasm)和 `api.capcat.ai`(验证请求)。 - **SPA / 自定义流程**:不用表单提交时,监听组件的 `solve` 事件拿 token,详见[前端组件](https://capcat.ai/guide/widget.md)。 迁移过程中新旧验证可以并行:前端逐页替换,服务端按 token 字段名区分走哪家校验,全部切完后再移除旧依赖。 --- # 关于 Capcat > 来源:https://capcat.ai/guide/about.md Capcat(capcat.ai)是基于开源项目 [Cap](https://github.com/tiagozip/cap) 的定制发行版。 Cap 是一个轻量、现代的开源 CAPTCHA 替代方案,由 [tiago](https://tiago.zip) 开发,采用工作量证明(SHA-256 PoW / RSW 时间锁谜题)与浏览器环境检测(instrumentation)双层验证机制,以 [Apache 2.0](https://www.apache.org/licenses/LICENSE-2.0) 许可证发布。 ## 与上游的关系 - **核心验证引擎不做修改**:挑战生成、求解、校验逻辑与上游保持一致,并持续同步上游更新; - **定制部分独立存放**:本官网、部署配置等 Capcat 自有内容位于仓库独立目录,与上游代码互不干扰; - 本文档为简化版,完整的技术细节(工作原理、效果评估、方案对比等)请参阅[上游官方文档](https://trycap.dev)。 ## 让 AI 阅读本文档 文档提供机器友好的 Markdown 版本(遵循 [llms.txt 规范](https://llmstxt.org)),把链接发给 AI 助手即可读取全部内容: - **索引**:[capcat.ai/llms.txt](https://capcat.ai/llms.txt) —— 文档目录与摘要,AI 可按需抓取各页; - **全量单文件**:[capcat.ai/llms-full.txt](https://capcat.ai/llms-full.txt) —— 全部文档合并为一个文件,一次抓取读完整份; - 每个文档页也有同路径的 `.md` 纯文本版本,如 `capcat.ai/guide/siteverify.md`。 ## 许可说明 Capcat 遵循 Apache 2.0 许可证的要求: - 保留上游项目的 LICENSE 与版权声明; - 对上游代码的修改均在版本历史中注明; - “Cap” 名称与标识归上游项目所有,Capcat 不代表上游官方,也未获其背书。 感谢 tiago 与 Cap 社区的出色工作。