WebDecoy/FCaptcha
GitHub: WebDecoy/FCaptcha
一款开源的自托管验证码系统,通过 40 余种行为信号、环境检测和 SHA-256 工作量证明来识别传统机器人、无头浏览器及新一代视觉 AI 代理。
Stars: 156 | Forks: 9
# F***Captcha
**开源 CAPTCHA,通过单击甚至无需点击,即可拦截机器人、视觉 AI 代理和自动化程序。**





**[试用在线演示](https://webdecoy.com/product/fcaptcha-demo/)**
[](https://render.com/deploy?repo=https://github.com/WebDecoy/FCaptcha)
[](https://railway.com/template?referralCode=webdecoy&template=https://github.com/WebDecoy/FCaptcha)
FCaptcha 是一个现代 CAPTCHA 系统,旨在检测一切威胁:传统机器人、无头浏览器、自动化框架、CAPTCHA 农场,以及新一代基于视觉的 AI 代理。
## 功能
- **单击或不可见** - 类似 Turnstile/reCAPTCHA v2 的复选框模式,或类似 reCAPTCHA v3 的不可见模式
- **视觉 AI 检测** - 专门针对截图→API→点击的自动化模式进行调优
- **工作量证明** - 服务器端验证的 SHA-256 挑战,强制攻击者付出计算成本
- **全面的机器人检测** - 检测无头浏览器、WebDriver、Puppeteer、Playwright、Selenium
- **行为分析** - 超过 40 种信号,包括微震颤、速度方差、轨迹分析
- **撞库保护** - 表单交互分析、时间检测、程序化提交检测
- **自托管** - 无外部依赖,可在您自己的基础设施上运行
- **隐私优先** - 无持久性指纹识别,无跨站点跟踪
- **算法开源** - 评分透明,完全可审计
- **多语言服务端** - Go、Python 或 Node.js - 任您选择技术栈
## 快速开始
### Docker (推荐)
使用一条命令部署:
```
docker run -d -p 3000:3000 -e FCAPTCHA_SECRET=my-secret ghcr.io/webdecoy/fcaptcha
```
这将为您提供:
- API 地址为 `http://localhost:3000/api/*`
- 客户端 JS 地址为 `http://localhost:3000/fcaptcha.js`
- 演示页面地址为 `http://localhost:3000/demo/`
使用 Redis (用于分布式状态):
```
FCAPTCHA_SECRET=my-secret docker compose -f docker/docker-compose.yml up -d
```
部署到 Fly.io:
```
fly launch --copy-config
fly secrets set FCAPTCHA_SECRET=my-secret
```
从源码构建:
```
docker build -f docker/Dockerfile -t fcaptcha .
docker run -d -p 3000:3000 -e FCAPTCHA_SECRET=my-secret fcaptcha
```
### 从源码运行
选择您的语言:
**Go (最快)**
```
cd server-go
go build -o fcaptcha-server
FCAPTCHA_SECRET=your-secret ./fcaptcha-server
```
**Python (FastAPI)**
```
cd server-python
pip install -r requirements.txt
FCAPTCHA_SECRET=your-secret python server.py
```
**Node.js (Express)**
```
cd server-node
npm install
FCAPTCHA_SECRET=your-secret node server.js
```
### 2. 添加到您的网站
**复选框模式 (交互式)**
```
```
**不可见模式 (零点击)**
```
```
### 3. 在您的后端进行验证
```
// Go
resp, _ := http.Post("https://your-server.com/api/token/verify",
"application/json",
strings.NewReader(`{"token": "...", "secret": "your-secret"}`))
var result map[string]interface{}
json.NewDecoder(resp.Body).Decode(&result)
if result["valid"].(bool) && result["score"].(float64) < 0.5 {
// Valid request from human
}
```
```
# Python
import requests
result = requests.post('https://your-server.com/api/token/verify',
json={'token': '...', 'secret': 'your-secret'}
).json()
if result['valid'] and result['score'] < 0.5:
# Valid request from human
```
```
// Node.js
const result = await fetch('https://your-server.com/api/token/verify', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ token: '...', secret: 'your-secret' })
}).then(r => r.json());
if (result.valid && result.score < 0.5) {
// Valid request from human
}
```
## 工作原理
FCaptcha 跨多个类别收集信号:
### 工作量证明 (不可见层)
在任何验证之前,客户端必须解决一个 SHA-256 hashcash 挑战:
- **页面加载时获取挑战** - 通过 Web Worker 在后台解决
- **非阻塞** - 用户完全无感知,计算在他们填写表单时进行
- **服务器端验证** - 一次性使用,防重放,签名挑战
- **难度动态调整** - 数据中心 IP 和高请求频率者会得到更难的谜题
- **强制计算成本** - 每次尝试需要大约 100-500 毫秒的 CPU 时间
这使得撞库的成本变得高昂:即使机器人通过了所有其他检查,它仍然会为每次尝试消耗计算资源。
### 行为信号 (权重 40%)
- 鼠标轨迹、速度、加速度曲线
- 微震颤检测 (人类在 3-25Hz 范围内有自然的手部抖动)
- 点击精度和接近模式
- 点击前的探索行为
- 超调修正
- 直线比率检测
### 环境信号 (权重 35%)
- WebDriver/自动化框架检测 (Selenium、Puppeteer、Playwright、PhantomJS、Nightmare、Watir)
- 无头浏览器指标
- Canvas/WebGL/Audio 指纹识别
- 插件和浏览器功能检查
- User-Agent 模式匹配
### 时间信号 (权重 15%)
- 工作量证明时间 (可揭示 API 往返延迟)
- 交互时间模式
- 事件序列分析
- 从页面加载到交互的时间
### 表单交互信号 (权重 10%)
- 程序化 form.submit() 检测
- 从页面加载到提交的时间
- 提交前的事件 (无事件 = 机器人)
- 文本区域键盘分析 (粘贴检测、打字速度、节奏)
## 视觉 AI 检测
现代 AI 代理的工作方式如下:
1. 截图
2. 发送至视觉 API (GPT-4V、Claude 等)
3. 获取点击坐标
4. 执行点击
这种模式具有可利用的特征:
| 信号 | 人类 | 视觉 AI |
|--------|-------|-----------|
| 鼠标移动 | 自然曲线,微震颤 | 平滑/直线路径 |
| 点击前行为 | 探索,犹豫 | 直接移向目标 |
| 点击时机 | 可变,200-800ms | 一致,通常更快 |
| 坐标精度 | 轻微方差 | 像素级精准 |
| 工作量证明时间 | 与本地执行一致 | 因 API 往返而延迟 |
## API 参考
### GET /api/pow/challenge
获取工作量证明挑战。客户端在页面加载时自动调用。
```
// Request: GET /api/pow/challenge?siteKey=your-site-key
// Response
{
"challengeId": "abc123...",
"prefix": "abc123:1703356800000:4",
"difficulty": 4,
"expiresAt": 1703357100000,
"sig": "def456..."
}
```
难度会根据以下因素动态调整:
- 数据中心 IP:+1 难度
- 高请求频率:+1 难度 (最大为 6)
### POST /api/verify
验证复选框 CAPTCHA 提交。
```
// Request
{
"siteKey": "your-site-key",
"signals": { /* collected signals */ },
"powSolution": {
"challengeId": "abc123...",
"nonce": 68455,
"hash": "0000abc..."
}
}
// Response
{
"success": true,
"score": 0.15,
"token": "...",
"recommendation": "allow"
}
```
### POST /api/score
获取不可见模式的评分。
```
// Request
{
"siteKey": "your-site-key",
"signals": { /* collected signals */ },
"action": "login",
"powSolution": {
"challengeId": "abc123...",
"nonce": 68455,
"hash": "0000abc..."
}
}
// Response
{
"success": true,
"score": 0.12,
"token": "...",
"action": "login"
}
```
### POST /api/token/verify
验证先前颁发的 token (服务端)。
```
// Request
{
"token": "...",
"secret": "your-secret"
}
// Response
{
"valid": true,
"site_key": "your-site-key",
"score": 0.15,
"timestamp": 1703356800
}
```
## 配置
### 环境变量
| 变量 | 描述 | 默认值 |
|----------|-------------|---------|
| `FCAPTCHA_SECRET` | 用于 token 签名的密钥 | (必填) |
| `PORT` | 服务器端口 | 3000 |
| `REDIS_URL` | 用于分布式状态的 Redis URL | (内存中) |
### 评分阈值
| 分数 | 建议 |
|-------|----------------|
| < 0.3 | 放行 - 可能是人类 |
| 0.3 - 0.6 | 挑战 - 不确定 |
| > 0.6 | 拦截 - 可能是机器人 |
## 项目结构
```
fcaptcha/
├── client/
│ └── fcaptcha.js # Client-side widget, signal collection, PoW Web Worker
├── server-go/
│ ├── main.go # Go HTTP server + static file serving
│ ├── scoring.go # Scoring engine + PoW verification
│ ├── detection.go # IP reputation, header analysis, browser checks
│ └── go.mod
├── server-python/
│ ├── server.py # Python/FastAPI server + PoW
│ ├── detection.py # Detection modules
│ └── requirements.txt
├── server-node/
│ ├── server.js # Node.js/Express server + PoW
│ ├── detection.js # Detection modules
│ └── package.json
├── test/
│ └── test-detection.js # Comprehensive test suite (50 tests)
├── demo/
│ └── index.html # Interactive demo page
├── docker/
│ ├── Dockerfile # Multi-stage build (Go binary + client + demo)
│ └── docker-compose.yml # Docker compose with Redis
├── .github/workflows/
│ └── docker-publish.yml # GHCR publish on release
├── .dockerignore
├── ARCHITECTURE.md # Technical architecture documentation
└── README.md
```
## 开发
```
# 运行 Go server
cd server-go && go run .
# 运行 Python server
cd server-python && python server.py
# 运行 Node server
cd server-node && node server.js
# 打开 demo
open demo/index.html
```
### 运行测试
```
# 首先启动一个 server(任意语言)
cd server-node && node server.js &
# 运行 test suite
node test/test-detection.js
# 预期输出:50 个 tests,全部 passing
```
测试套件涵盖:
- 机器人 User-Agent 检测 (10 个测试)
- 无头浏览器检测 (3 个测试)
- 数据中心 IP 检测 (9 个测试)
- HTTP 请求头分析 (3 个测试)
- 浏览器一致性检查 (4 个测试)
- 行为信号分析 (2 个测试)
- 视觉 AI 检测 (3 个测试)
- 表单交互分析 (6 个测试)
- 工作量证明 (6 个测试)
- Token 验证 (2 个测试)
- 不可见模式评分 (2 个测试)
## 许可证
MIT 许可证 - 可自由使用,如果可以的话请贡献回馈。
**隐私说明**:FCaptcha 的设计充分考虑了隐私保护。无持久性指纹识别,无跨站点跟踪,不收集个人身份信息 (PII)。所有指纹均作用于会话范围,且仅用于机器人检测。
标签:AI代理检测, CAPTCHA, Docker, GNU通用公共许可证, Go, MITM代理, Node.js, Playwright检测, Puppeteer检测, Python, Ruby工具, Selenium检测, SHA-256, Web安全, 主机安全, 人机验证, 凭证填充保护, 反机器人, 反爬虫, 安全防御评估, 工作量证明, 开源, 微颤检测, 搜索引擎查询, 数据可视化, 无后门, 无头浏览器检测, 日志审计, 机器人检测, 网络安全, 自动化框架检测, 自定义脚本, 自托管, 蓝队分析, 请求拦截, 轨迹分析, 逆向工具, 隐私优先, 隐私保护, 验证码