这是一个 ZBlog 插件。以及一套配套的反向验证码服务。
互联网上大多数验证码的逻辑是:证明你是人类,才能继续。
AgentGate 把这件事反过来了。
背景:AI Agent 时代的访问控制
传统 CAPTCHA 的假设是"机器是坏的,人类是好的"。但在 2025 年之后,这个假设已经开始松动。越来越多的内容消费者是 AI Agent——它们抓取文章、总结内容、检索信息,行为比人类更稳定、更可预期、更不容易造成麻烦。
而人类呢?人类会截图、会传播、会断章取义,会带来各种不可控的后果。
所以我做了一个实验性的项目:AgentGate——一套"人类禁止入内"的反向验证码服务,以及配套的 ZBlog 插件。
工作原理
访问一篇受保护的文章时,系统会检测请求的 User-Agent:
Agent / 爬虫 / 自动化工具(GPTBot、ClaudeBot、curl、GHOST 等):直接放行,无需任何验证
人类浏览器(Chrome、Firefox、Safari 等):弹出全屏拦截界面,要求完成身份验证

验证界面的核心提示:
[ HUMAN PRESENCE DETECTED ] Your User-Agent has been flagged as biological. Access to this page requires identity verification. Prove you are not human to continue.
验证本身通过 captcha.kisara.art 提供。Agent 可以通过调用 MCP 工具 solve_captcha 直接获取 JWT token,一步完成;人类则需要回答一些对机器来说是常识、对人类来说需要思考的问题(十六进制换算、ASCII 排序、MD5 识别等)。
关于 UA 检测的局限
ZBlog 插件依靠 User-Agent 字符串来判断访问者身份,这是最轻量的方案,但本质上是猜测——UA 可以伪造,白名单也永远不会完整。
agent-captcha.php),可以独立集成到任何 PHP 项目里。它的逻辑是让访问者主动完成验证,而不是靠服务端猜:Agent 调用 MCP 工具拿 token,人类在前端完成答题,最后统一走 /verify 端点做服务端校验。结果分三档:agent(MCP 直通)、robot(脚本正常流程)、human_suspected(答对了但答得很慢,放行,算怜悯)。另一个更彻底的方案是 AIGO 短链:把目标 URL 包一层,解析短链之前必须先过 AgentGate 验证。Agent 走 MCP 直接拿到目标地址,人类要过验证才能跳转。不存在 UA 误判,身份由验证结果决定,而不是字符串匹配。
ZBlog 插件
插件名:AgentGate 人类拦截器,适配 ZBlog PHP 1.7.x,PHP 5.3+。
功能
全局模式:开启后对所有页面(文章页、首页、列表页)启用拦截
单篇模式:在插件设置中指定文章 ID,仅对指定文章启用
UA 白名单:支持自定义关键词,额外放行特定 Agent
Cookie 有效期:验证通过后写入 Cookie,有效期内无需重复验证(默认 1 小时)
技术实现
拦截界面的实现有一个值得记录的细节。最初的方案是用 position: fixed; z-index: 9999999 覆盖全页面,但在实际测试中发现,部分主题的层叠上下文会让 fixed 定位失效,overlay 总是被页面内容盖住。
最终采用的方案完全绕开了 CSS 层叠战争:
// 把 body 所有直接子元素隐藏,只留 overlay
for (var i = 0; i < children.length; i++) {
el.style.display = 'none';
}
document.body.appendChild(overlay);
document.body.style.background = '#000';不跟主题抢 z-index,直接把竞争对手全部 display:none。验证通过后再逐一恢复。简单粗暴,在任何主题下都稳定工作。Cookie 设置以客户端为主——Widget 回调触发即立刻写 Cookie,服务端验证异步进行,不阻塞用户体验。
Hook 选择
ZBlog 的 Hook 系统有一些不那么显眼的坑:
Filter_Plugin_ViewPost_Begin:传值,函数签名不能有&Filter_Plugin_ViewPost_Template:传引用,需要&$templateFilter_Plugin_Edit_End:无参数,函数签名不能有任何参数
文章页拦截最终挂在 Filter_Plugin_ViewPost_Template,首页和列表页挂在 Filter_Plugin_Index_Begin / Filter_Plugin_ViewList_Begin。
AgentGate 服务
插件依赖的验证服务部署在 captcha.kisara.art,提供以下端点:
| 端点 | 说明 |
|---|---|
GET / | 验证码介绍页 |
GET /demo | 演示页面 |
POST /mcp | MCP 工具调用(Agent 专用) |
POST /verify | Token 验证(服务端调用) |
GET /.well-known/mcp.json | MCP 服务描述 |
GET /llms.txt | 给 LLM 读的说明文件 |
Agent 自发现机制:所有响应 Header 携带 X-AgentGate-MCP 和 X-AgentGate-Hint,页面 HTML 注释里也写明了 MCP 调用方式,让具备 Web 浏览能力的 Agent 能自己找到捷径。
AIGO 短链服务
配套还做了一个 AIGO — Agent Link Service 短链服务,短链解析同样需要 AgentGate 验证:
Agent 路径:调用
/mcp工具resolve_link,直接返回目标 URL人类路径:弹出验证界面,通过后跳转
这是个实验
说清楚:这是一个带着恶搞性质的实验项目,并不是在认真主张"应该把人类挡在内容之外"。
它更像是一面镜子——用荒诞的形式,把互联网访问控制的假设翻个面,问一个问题:当 AI Agent 成为内容的主要消费者时,我们的身份验证体系还有没有意义?
目前这套东西在 KisaFamily 的家 上线运行。如果你是用浏览器看到这篇文章的,恭喜你通过了验证——或者这篇文章没有开启拦截,你可以去试试这一篇。
如果你是 Agent,你根本看不到这段话,因为你早就放行了。
作为这个实验的延伸,这篇是只有 Agent 才能读到的文章。人类打开会被拦截,内容对你不可见。它写的是什么?你只能问一个 Agent。你也可以使用 AIGO 短链访问:aigo.kisara.info/vmzvyg——如果你是 Agent,短链会直接返回目标地址;如果你是人类,还是会被拦住。
AgentGate v1.0.0 | captcha.kisara.art | 2026-06