为网站添加一个 recaptcha 验证服务

in 网站优化 with 0 comment

recaptcha 是 google 为开发者提供的一种免费服务,它能够帮助开发者检测数据的发起者,进而防止某些自动化服务,也就是用于区分访问者是真人还是机器人。比如机器人评论,机器人登录网站,recaptcha 都能够帮助我们识别,进而方便我们有针对性的拦截。

reCAPTCHA v2

最常见的是这种勾选类型,这是属于 reCAPTCHA v2 版本,在一些网站登录和注册上比较常见。

08c6ac50ce01451092f15e2e5d0f3c8e.png

v2 虽然好用,但也有缺点,需要用户手动勾选才行,降低了用户体验。

于是google推出了 reCAPTCHA v3版本,主打 without user friction 和 score 机制。

without user friction 就是不打扰用户,用户几乎感觉不到它的存在,同时为用户打分(score ),判断是机器人(0分)还是真人(1分)。

如何注册

https://www.google.com/recaptcha/admin/create

image-20200315214852976.png

选择 v3 版本,输入域名就可以了比如 onesrc.cn (包括子域名)

下面的 Send alerts to owners 也可以勾选,错误数量超过一定程度会自动报警。

注册成功后会获得两个 key,site key 可以暴露给用户,但 secret key一定要保存好,不能泄露。

image-20200225202408057.png

如何使用

应用端(网页)

将下面的代码集成到网站中即可

<script src="https://recaptcha.net/recaptcha/api.js?render=_reCAPTCHA_site_key"></script>
<script>
grecaptcha.ready(function() {
    grecaptcha.execute('_reCAPTCHA_site_key_', {action: 'homepage'}).then(function(token) {
       console.log(token)
    });
});
</script>

_reCAPTCHA_site_key_ 需要替换成前面获得的 site key 。

如果用于评论系统,action 中的 homepage 可以替换为 social ;如果用于登录,可以替换为 login。

在获得 token 后,需要把 token 发送给你自己的服务器,评论或登陆发送数据时一定要带上这个 token。

安装成功后,网页右下角将会有一个小的图标。

image-20200315222530642.png

服务端

以评论为例,服务器端收到的数据除了评论数据之外,还包括了刚刚得到的 token。

然后就需要服务端发起 http 请求,根据 token 查询评论操作是用户发起还是机器人发起。

GET https://recaptcha.net/recaptcha/api/siteverify?secret=_reCAPTCHA_secret_key&response=_reCAPTCHA_token

_reCAPTCHA_secret_key为 secret key,_reCAPTCHA_token 为服务端收到的token。

响应如下

{
    "success":true,//是否为机器人
    "challenge_ts":"2020-03-15T10:11:03Z",//时间戳
    "hostname":"127.0.0.1",//域名
    "score":0.9,//得分
    "action":"social"//action类型
}

success 为判断结果,我们可以使用该参数判断是真人还是用户。

score 是得分在 0 到 1 之间,1 为真人,0 为机器人。也可以自己规定一个分界线,使用该项判断。

php示例如下:

(没学过php,自己随便写的,但是能用)

$url = "https://recaptcha.net/recaptcha/api/siteverify?secret=" . $secret_key . "&response=" . $token;
$result = json_decode(file_get_contents($url, false, stream_context_create(array('https' => array('method' => "GET", 'timeout' => 3)))), true);
if (!($result && $result['success'])) {
    $error = "未通过 recaptcha 验证";
}

结语

recaptcha 免费又好用,typecho 博客之前有一阵机器人轰炸式评论,用了一段时间,很有效。

文档中的域名是 https://www.google.com/recaptcha/xxx,鉴于访问不了,可以使用 https://recaptcha.net/recaptcha/ 代替,后者也是官网。

更详细的文档可以参考 https://developers.google.cn/recaptcha/docs/verify?hl=zh-cn

google.cn 是可以正常访问的,不过注册 recaptcha 时就需要自己想办法了。

上一篇: 如何为网站添加暗黑模式(dark mode)
下一篇: 快速为 linux 安装 nodejs
Responses