XCaptcha-for-Typecho 新一代的Typecho验证插件
更新日志
[1.3.1] - 2025-11-23
Fixed
- 修复Altcha PHP72的兼容性问题,PHP72没有
JSON_THROW_ON_ERROR(PHP73引入),会导致./lib/class.altcha.php报错 - 修复登陆界面验证码占位符不消失以及按钮无法启用的bug(issue #8)
- 修复评论区验证码占位符不消失的bug
- 优化Altcha样式
[1.3.0] - 2025-10-10
Fixed
- 修复了Altcha未正确返回值导致评论异常问题
- 修复了PHP8.2不支持动态创建属性而报错(./lib/class.geetestlib.php文件),前端请求Action接口获取到的是报错信息而非JSON文本,最终导致JSON解析出错Geetest验证码渲染失败的问题。
[v1.3.0 pre-release]
Added
- 添加了渲染组件以及校验成功的回调函数,用于禁用/启用按钮和提示验证码组件正在加载
[v1.2.1]
Fixed
- 移除./includes/XCaptcha_Config.php的personalConfig方法
- 修复Typecho控制台 -> 个人配置 显示XCaptcha配置找不到的bug(issue #1 )
[v1.2.0]
Added
- 添加了altcha,纯本地的工程量计算的验证码方案
[v1.1.1]
Deprecated
- 极验证加载不再依赖JQuery,启用JQuery与JQuery CDN URL项已被移除
Changed
- 对代码进行重构,做了结构性优化
Added
- 添加管理员评论无需验证功能,此项为可选项
- 兼容Typecho 1.1旧版本
[v1.0.2]
Changed
- 修改部分可能引发歧义的字段名称
Added
- 支持修改验证接口地址
- 添加"极验证展现方式"设置项
- 验证码尺寸样式选项支持极验证
[v1.0.1]
Fixed
- 修复了极验证jQuery CDN失效的Bug
- 原默认使用字节跳动的CDN加载jQuery,部分地区可能加载失效,现在默认采用jsDelivr
Added
- 支持在配置页面启用或禁用插件自带的jQuery,对于部分自带jQuery的主题(如Handsome)无需启用该项
- 为了避免资源失效,支持在配置页修改jQuery CDN地址,此项仅在勾选启用插件自带的jQuery选项后生效
Others
- 本插件的jQuery仅用于极验证,对其它验证码的使用无影响。
起因
之前由于博客垃圾评论过多,因此想要找一个验证码插件来给评论提交添加验证。一开始我用的是本地的数字图片验证码,后来在别人项目的基础上改进了CairBin/typecho-plugin-geetest。
但是这个仅支持极验证,如果需要用Google reCaptcha等还需要重新上传,于是便打算自己写一个支持多种验证码的插件。
Github项目地址 CairBin/XCaptcha
支持验证码类型
目前支持的验证码如下:
考虑接下来支持:
- Google reCaptcha v3
- 极验证Geetest v4
使用方式
下载本项目
可以通过Git获取本项目:
git clone https://github.com/CairBin/XCaptcha.git或者下载本项目的压缩包
wget https://github.com/CairBin/XCaptcha/archive/refs/heads/main.zip以上两种方式通常包含插件最近提交的代码,包括正在开发的功能和补丁,但也有可能不稳定,建议去Release页面下载Release版本。
解压后需要将插件文件夹的名称改为XCaptcha。
配置插件
将XCaptcha文件夹上传到你的Typecho博客的usr/plugins/目录下,在Typecho后台的插件面板里激活即可。
从上述所支持验证码的官网注册账户,然后获取你站点的Captcha ID和Secret Key,有的也叫Site Key和Secret Key,本质上都一样,对应公钥和私钥。前者用于前端标识可以公开,后者用于服务端向验证码服务器校验需要保密。
修改主题模板的comments.php文件,主题目录是usr/themes/your_theme/,在评论提交按钮之前或者表单最后添加一行代码,然后回到博客后台配置插件,将获取到的ID/Key填写进去,以及配置其他参数即可。
<?php if (array_key_exists('XCaptcha', Typecho_Plugin::export()['activated'])) : XCaptcha_Plugin::showCaptcha(); endif; ?>如果你想要禁用评论提交按钮,经过验证后才可点击提交表单,只需要给按钮添加类custom-submit-button即可,以默认主题为例:
<button type="submit" class="custom-submit-button submit"><?php _e('提交评论'); ?></button>Altcha配置
Altcha采用本地验证方案,自动生成HMAC密钥,无需手动填写Captcha ID和Secret Key
部分主题可能不存在comments.php文件,这时候你需要从其他文件里找到评论表单,并在合适的位置添加这行代码。
插件导致无法登陆后台
登陆页面启用验证码,如果配置不当,会导致验证一直失败而无法进入博客后台。
如果遇到这种问题,请修改Typecho的数据库的typecho_options表中,name属性为plugins的那一行的值为a:0:{}以禁用所有插件。
非常重要:在进行此操作前请务必备份数据库!
URL参数填写说明
- “验证码JS地址”取决于网络情况,它会替代原本引入的验证初始化脚本(不是二次验证的接口),遇到某些JS加载缓慢时使用,如果不明白留空即可。“校验地址”用于更换服务端验证接口,留空使用默认地址,一般在默认接口无法访问或者失效时填写。
- 区分JQuery CDN URL与上述部分,JQuery CDN URL用于通过CDN引入JQuery(不能留空),默认使用jsdelivr,而上述部分是用于初始化/校验验证码。
- 如果勾选了开启登陆页面验证码则,注册页面也会跟着开启,前提是你启动了注册功能。
PJAX回调问题
据反馈部分主题开启PJAX无刷新后可能会导致验证码加载不正常,请根据主题自行设置PJAX回调函数。Handsome主题经过测试可以正常使用,其他主题若存在此问题请在issue反馈,但是部分作者没使用过的付费主题可能难以适配。
PHP8兼容性问题
于v1.3.0正式版兼容PHP8,并在PHP82环境下通过测试。详细请参看“重要版本说明”部分和CHANGELOG.md。
PHP72兼容性问题
于v1.3.1版本优化了Altcha PHP72的兼容性,PHP72没有JSON_THROW_ON_ERROR(PHP73引入),会导致./lib/class.altcha.php报错
重要版本说明
关于v1.1.0及后续版本
- XCaptcha v1.1.0及后续版本,极验证加载不再依赖JQuery,启用JQuery与JQuery CDN URL项已经被移除。
- 自此版本起兼容旧版本的Typecho 1.1
关于v1.2.1版本及后续版本
通过移除./includes/XCaptcha_Config.php的personalConfig方法,修复Typecho控制台 -> 个人配置 显示XCaptcha配置找不到的bug(issue #1 )
关于v1.3.0及后续版本
- v1.3.0版本添加了渲染组件成功以及校验成功的回调函数,用于禁用/启用按钮以及提示验证码组件正在加载,因此对于
hcaptcha、cloudflare以及recaptcha在配置cdnUrl的时候需要设置onload参数为beforeCheckCallback,例如https://hcaptcha.com/1/api.js?onload=beforeCheckCallback(更具体的参数配置并不属于本文范畴,你应当参考所使用验证码的官方文档) - v1.3.0本分为预发布测试版和正式版,预发布版本存在altcha评论错误以及PHP8下极验证无法渲染问题,在v1.3.0正式版已经修复,Release页面的预发布版本已经删除,现在可下载的都是正式版本,建议及时更新。
关于v1.3.1及其后续版本
- 自v1.3.1版本,优化了Altcha PHP72的兼容性
反馈
反馈bug请提交issue仓库,请务必声明Typecho版本号、XCaptcha版本号、使用主题、Apache版本/Nginx版本等信息,方便问题复现。此外最好备注站点信息,方便作者查看问题。
项目展示



特别感谢
本项目在编写时参考的插件项目:
50 条评论
cloudflare开启缓存后评论会提示Invalid verification code,请问该如何配置缓存规则?
已经自行解决,url路径 /action 不缓存即可
极验证V3,同样的模板下,在https站点下一直显示:行为验证™ 安全组件加载中...;而在http下就没有任何问题。是什么问题?
我多次测试后,php8.2下一直显示:行为验证™ 安全组件加载中...,切换到php7.x没有问题。
php82不允许动态创建属性(./lib/class.geetestlib.php)导致前端请求获取到的是后端报错信息,然后JSON解析出错Geetest加载不出来。我在最新版本v1.3.0正式版已经修复此问题。
我就是用的V1.3.0版本,可能是真php8.2的问题
之前的v1.3.0是预发布测试版本,并非正式版本,正式版本是我昨天晚上刚提交的那个。你现在直接下载或者从release下载都能获取最新的兼容PHP82版本的插件。
f12控制台有没有报错信息
我一会切换环境看一下
由于Typecho在8.2下一直有些问题,所以我都是在php7.x下运行的,还没有在php8.2下测试过
大佬你好,我的网站里使用altcha会返回500并无法提交评论,返回的报错是g大佬你好,我的网站里使用altcha会返回500并无法提交评论,返回的报错是
Widget\Base\Comments::insert(): Argument #1 ($rows) must be of type array, null given, called in /www/sites/blog.dabinqwq.top/index/var/Widget/Feedback.php on line 265
根据ai的提示,我将public static function filter($comment)的从// 如果是Geetest v3开始的部分修改成 // 如果是Geetest v3
if ($config->getCaptchaChoosen() == "geetest") {
if (!XCaptcha_Validator::verifyGeetest($config)) {
throw new Typecho_Widget_Exception(
_t("Geetest:Invalid verification code.")
);
}
return $comment; // 极验的逻辑是正确的,无需修改
}
if ($config->getCaptchaChoosen() == "altcha") {
if (!XCaptcha_Validator::verifyAltchaSolution($config)) {
throw new Typecho_Widget_Exception(
_t("Altcha:Invalid verification code.")
);
}
// 验证通过后直接返回 $comment
return $comment;
}
// 其他验证码
if (!XCaptcha_Validator::verifyOtherCaptcha($config)) {
throw new Typecho_Widget_Exception(
_t("Invalid verification code.")
);
}
return $comment;
}
就正常了
已经修复,写的时候altcha忘了添加$comment返回值了QWQ
版本1.2.1 主题Cuteen 一直提示行为验证™ 安全组件加载中..
typecho版本1.2.1还是插件版本1.2.1。大概率原因应该是主题的pjax回调导致的,由于是收费主题我在测试环境进行调试。
我从极验证换成Cloudflare Turnstile 了。然后可以成功加载出来了。但是评论一次之后 就提示行为验证™ 安全组件加载中...F5刷新之后又出来了。
插件版本1.3 typecho版本1.2.1
回调参数不会设置 
前提是没有验证成功,输入任意账号密码(不是任何已有帐户),点击登录,出现不是验证失败的选项,这点可以改。
另外前提没有验证成功,输入已有账号密码,虽然提示验证登录失败,但已登录一方仍会退出登录。(在一个浏览器登陆的情况下,另一个浏览器,采用上述操作)
问题复现:
开启插件后点击 控制台 - 个人设置 会提示 500 错误:插件XCaptcha的配置信息没有找到
禁用插件后就正常了,期望修复。
插件XCaptcha的配置信息没有找到
Typecho\Plugin\Exception: 插件XCaptcha的配置信息没有找到 in /www/wwwroot/kikirepository.cn/var/Widget/Options.php:392
Stack trace:
#0 /www/wwwroot/kikirepository.cn/var/Widget/Users/Profile.php(162): Widget\Options->personalPlugin()
#1 /www/wwwroot/kikirepository.cn/var/Widget/Users/Profile.php(128): Widget\Users\Profile->personalForm()
#2 /www/wwwroot/kikirepository.cn/admin/profile.php(50): Widget\Users\Profile->personalFormList()
#3 {main}
我现在也一直在尝试复现这个问题,但是在我的环境下并不报错,请问你用的typecho版本是多少,另外把XCaptch插件的版本也告诉我一下
typecho版本v1.2.1
插件版本Xcaptcha 1.2.0
Php版本8.0.26
Nginx 1.26.1
MySQL 5.7.40
XCaptcha v1.2.1版本已经修复这个问题,具体过程可以查看issue
大佬你好,想问下你的代码放到哪个位置了,感觉我放的位置好丑,验证页面和发表评论紧挨着,好难看
你可以通过css修改下间距
希望可以在未验证的时候禁用登录按钮,现在测试登陆页面不验证同样可以提交
对于Geetest可以这样做,它可以在自定义的回调函数中添加或者移除样式,但是其他验证码的校验是通过CDN引入的script,我并不清楚是否能自定义验证之后的回调,所以把这个细节砍掉了。
好用 !不过已登录也要验证就有点难受。
能具体描述下吗,我升级下插件OWO
好的,就是,网站管理员回复他人评论也需要进行验证。要是能改成站长回复评论不需要验证就完美了!
最新版本已经添加此功能了,可选择开启管理员评论不需验证
我一直想对PJAX主题做兼容,但是没有足够的主题可以做测试,在有的PJAX上能工作有的不能
你好大佬,有没有可以暂时关闭这个插件的方法,直接删掉会报错,我在登录的时候,验证成功了也提示我验证,导致我进入不了后台
另外这个是插件导致的还是配置不当导致的,我测试的时候没问题啊
不清楚,因为刚配置好没问题,过了一天才这样,也有可能是cloudflare抽风。
已经恢复,非常感谢|´・ω・)ノ
你去数据库的typecho_options里修改name为plugins那一行为`a:0:{}`,操作前记得备份数据库!
评论的时候验证码显示验证成功 但是评论没反应
请问是用的哪一个验证,极验证还是hCaptcha还是reCaptcha还是cloudflare
另外请提供下typecho版本号,可以到github仓库提issue来写明具体情况
有站点吗,我看下具体情况
请问博主用的什么主题,我想在本地复现下问题
由于是收费主题我无法进行测试,请问下jquery开启状态,jquery CDN配置(这两项仅针对于极验证)
请尝试下使用其它验证工具如cloudflare或者hcaptcha是否出现同样的问题
请问引入JS的CDN加速地址默认是https://lf6-cdn-tos.bytecdntp.com/cdn/expire-1-M/jquery/2.2.4/jquery.min.js吗,为什么我在设置里更改为https://cdn.jsdelivr.net/npm/jquery@2.2.4/dist/jquery.min.js会导致验证码无法正常加载呢,我去Plugin.php里将https://lf6-cdn-tos.bytecdntp.com/cdn/expire-1-M/jquery/2.2.4/jquery.min.js改为https://cdn.jsdelivr.net/npm/jquery@2.2.4/dist/jquery.min.js才正常OωO
我现在已经更新仓库的代码了,目前v1.0.1版本,改用了jsdelivr作为默认CDN,支持启动或禁用插件的jQuery(对于Handsome等主题不需要额外引入)。
另外还支持自定义jquery的URL,即使默认的挂掉了可以在插件配置页面手动更换。
好的谢谢|´・ω・)ノ,已star
因为大陆访问不了jsdelivr(之前是这样,不知道现在恢复了没),我默认使用的字节跳动的CDN加载的jquery,测试的时候是正常的。可能你服务器地区原因访问不了吧,我更新下插件来添加这个的设置项。
完了,我的主题没有comments.php文件
在其他PHP文件里找到评论提交表单那部分就行,有的主题不一定非得有comments.php