我的心里除了露娜大人已经装不下其他女人了

替换评论人机验证到 Cap

起因

之前我的博客一直使用的是 Cloudflare 的 Turnstile 作为评论的人机验证来使用的,这没什么不好,唯一的问题就是有点慢,并且在大陆的可用性一般

在偶然间我看到了这个项目 https://github.com/tiagorangel1/cap

关于 Cap

Cap 是一个非常轻量的 CAPTCHA 解决方案,使用基于 SHA-256 算法的 PoW(工作量证明)机制来区分人类用户和机器人

Cap 的 @cap.js/widget 只有 12kb 大小,比起其他的商业 CAPTCHA 方案来说是非常轻量了

并且 Cap 几乎不会收集任何隐私信息,也不会使用 Cookie,对个人隐私也是非常友好的

大家可以通过 https://capjs.js.org/guide/demo.html,尝试一下

部署

Cap 的文档里提供了多种部署方式,我这里使用了 Docker 部署,这是我的 Compose 文件

services:
    cap:
        network_mode: host
        volumes:
            - cap-data:/usr/src/app/.data
        environment:
            - ADMIN_KEY=xxxxxxxxxxxxxxxxxxxxxxxx
            - ENABLE_ASSETS_SERVER=true
            - HIDE_RATELIMIT_IP_WARNING=true
        container_name: cap-standalone
        image: tiago2/cap:latest
volumes:
    cap-data:
        name: cap-data

我这里开启了本地的静态文件服务器,开启本地静态文件服务器需要注意在配置 Nginx 的时候要设置 CORS 响应头,下面是我的 Nginx 配置,可以参考一下

server {
    listen              443 ssl;
    listen              [::]:443 ssl;
    http2 on;
    server_name         cap.server.domain;

    root /dev/null;

    # SSL
    ssl_early_data on;
    ssl_certificate     /etc/nginx/ssl/cap.server.domain/nginx.crt;
    ssl_certificate_key /etc/nginx/ssl/cap.server.domain/nginx.key;

    # 处理 /assets 下的所有静态资源
    location /assets {
        # CORS - 允许所有来源
        add_header Access-Control-Allow-Origin * always;
        add_header Access-Control-Allow-Methods "GET, OPTIONS" always;
        add_header Access-Control-Allow-Headers "Content-Type" always;
        
        # 处理 OPTIONS 预检请求
        if ($request_method = 'OPTIONS') {
            add_header Access-Control-Allow-Origin *;
            add_header Access-Control-Allow-Methods "GET, OPTIONS";
            add_header Access-Control-Allow-Headers "Content-Type";
            add_header Content-Length 0;
            return 204;
        }
        
        # 代理到后端
        proxy_pass            http://127.0.0.1:3000;
        proxy_set_header Host $host;
        proxy_http_version    1.1;
        proxy_set_header X-Real-IP         $remote_addr;
        proxy_set_header X-Forwarded-For   $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }

    # 其他所有请求
    location / {
        proxy_pass            http://127.0.0.1:3000;
        proxy_set_header Host $host;
        proxy_http_version    1.1;

        # WebSocket support
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";

        # Proxy headers
        proxy_set_header X-Real-IP         $remote_addr;
        proxy_set_header X-Forwarded-For   $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
}

# HTTP redirect
server {
    listen      80;
    listen      [::]:80;
    server_name cap.server.domain;
    return      301 https://cap.server.domain$request_uri;
}

这个配置允许来自任何域名的网页请求这些资源,如果你想限制来源域名的话可以修改一下

另外,因为我没有使用任何 CDN,所以开启了 HIDE_RATELIMIT_IP_WARNING=true,如果你需要使用 Rate Limit 功能,并且使用的 CDN 的话,你可能需要配置 RATELIMIT_IP_HEADER,具体可以参考 https://capjs.js.org/guide/standalone/options.html#rate-limiting

应用到 Typecho

我之前一直使用的是 CaptchaPlus 这个插件来作为评论人机验证插件,不过插件作者已经不再更新了,因此我 Fork 了一个,并且在 Claude 的帮助下完成了对于 Cap 的支持

需要的可以在 Github 下载使用 https://github.com/9bingyin/typecho-plugins/tree/main/CaptchaPlus

其他

Cap 还提供了类似 Cloudflare 的 Checkpoint 中间件,可以用于 Elysia 等框架,可以查看 https://capjs.js.org/guide/middleware/

替换评论人机验证到 Cap

https://www.9bingyin.com/archives/replace-captcha-to-cap.html

作者

bingyin

发布时间

2025-06-29

许可协议

CC BY 4.0

添加新评论