You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

咨询:无需点击的Google reCAPTCHA页面加载验证及机器人重定向方案

需求可行性与实现方案

嘿,这个需求完全可行!Google的reCAPTCHA v3就是专门为这种静默验证场景设计的——它全程在后台运行,不需要用户手动点击复选框,通过分析访问者的行为模式(比如鼠标移动、页面交互轨迹等)自动给出机器人概率评分,你可以根据评分决定是否触发重定向拦截。

核心原理

reCAPTCHA v3不会弹出任何交互界面,页面加载时就会生成一个验证token,前端将token发送到后端后,后端调用Google的验证API获取一个0.0到1.0的分数

  • 1.0表示访问者是真人的概率极高
  • 0.0表示几乎可以确定是机器人
    你可以自定义一个阈值(比如0.5),分数低于阈值就触发重定向到拦截页面。

具体实现步骤

1. 注册reCAPTCHA v3

先去Google的reCAPTCHA控制台注册你的网站,获取两个关键密钥:

  • Site Key:用于前端加载reCAPTCHA脚本
  • Secret Key:用于后端验证token(这个要严格保密,绝对不能暴露在前端代码中)

2. 前端实现(静默获取token并发送到后端)

在页面的<head><body>底部加入以下代码,页面加载时自动触发验证:

<!-- 引入reCAPTCHA v3脚本,替换成你的Site Key -->
<script src="https://www.google.com/recaptcha/api.js?render=你的SiteKey"></script>
<script>
document.addEventListener('DOMContentLoaded', function() {
  // 等待reCAPTCHA脚本加载完成
  grecaptcha.ready(function() {
    // 执行验证,action参数可自定义(比如对应不同页面场景)
    grecaptcha.execute('你的SiteKey', {action: 'homepage'}).then(function(token) {
      // 将token发送到后端验证接口
      fetch('/verify-recaptcha', {
        method: 'POST',
        headers: {
          'Content-Type': 'application/json',
        },
        body: JSON.stringify({token: token}),
      })
      .then(response => response.json())
      .then(data => {
        // 如果后端判定为机器人,立即重定向到拦截页面
        if (!data.isHuman) {
          window.location.href = '/blocked.html';
        }
        // 否则正常加载页面内容
      })
      .catch(error => {
        // 网络或验证出错时,默认拦截(可选逻辑)
        console.error('reCAPTCHA验证失败:', error);
        window.location.href = '/blocked.html';
      });
    });
  });
});
</script>

3. 后端实现(验证token并判断是否拦截)

后端必须验证token的有效性,不能只信任前端的结果(否则机器人可以伪造前端逻辑绕过验证)。以下是两种常见后端语言的示例:

Node.js(Express框架)

const express = require('express');
const axios = require('axios');
const app = express();
app.use(express.json());

// 替换成你的Secret Key
const RECAPTCHA_SECRET = '你的SecretKey';
// 自定义拦截阈值,可根据实际情况调整
const BLOCK_THRESHOLD = 0.5;

app.post('/verify-recaptcha', async (req, res) => {
  const { token } = req.body;
  try {
    // 调用Google的验证API
    const verifyResponse = await axios.post(
      'https://www.google.com/recaptcha/api/siteverify',
      null,
      {
        params: {
          secret: RECAPTCHA_SECRET,
          response: token,
        },
      }
    );

    const { success, score } = verifyResponse.data;
    // 验证成功且分数高于阈值,判定为真人
    if (success && score >= BLOCK_THRESHOLD) {
      res.json({ isHuman: true });
    } else {
      res.json({ isHuman: false });
    }
  } catch (error) {
    console.error('reCAPTCHA后端验证出错:', error);
    // 出错时默认判定为机器人
    res.json({ isHuman: false });
  }
});

app.listen(3000, () => console.log('服务器运行在端口3000'));

PHP

<?php
// 替换成你的Secret Key
$secretKey = '你的SecretKey';
$blockThreshold = 0.5;

$token = $_POST['token'];
$verifyUrl = 'https://www.google.com/recaptcha/api/siteverify';

// 发送验证请求
$data = [
  'secret' => $secretKey,
  'response' => $token
];
$options = [
  'http' => [
    'header' => "Content-type: application/x-www-form-urlencoded\r\n",
    'method' => 'POST',
    'content' => http_build_query($data)
  ]
];
$context = stream_context_create($options);
$result = file_get_contents($verifyUrl, false, $context);
$response = json_decode($result);

// 判断结果
if ($response->success && $response->score >= $blockThreshold) {
  echo json_encode(['isHuman' => true]);
} else {
  echo json_encode(['isHuman' => false]);
}
?>

关键注意事项

  • 阈值调整:刚开始可以用0.5作为默认值,之后根据实际数据微调——如果误拦了太多真人,就调高阈值;如果机器人漏网多,就调低。
  • 后端验证是必须的:前端的token很容易被篡改,所有的判定逻辑必须放在后端,避免机器人绕过。
  • Action参数:不同页面可以设置不同的action(比如logincheckout),Google会根据场景给出更精准的评分。
  • 错误处理:如果网络问题导致验证失败,建议默认拦截,防止机器人利用漏洞绕过。
  • 合规性:记得在网站上添加reCAPTCHA的使用声明,符合Google的服务条款。

内容的提问来源于stack exchange,提问作者FarrisFahad

火山引擎 最新活动