大数跨境

在Google Analytics 4中用reCAPTCHA v3识别虚假流量

在Google Analytics 4中用reCAPTCHA v3识别虚假流量 GA小站
2026-08-20
14
导读:GA4会自动排除一部分已知的机器人和蜘蛛流量,但它无法识别所有自动化访问,所以仍然会有机器流量进入到GA4。

GA4 虽能自动排除部分已知机器人流量,但无法识别所有自动化访问,导致机器流量仍会污染数据。若缺乏明显的过滤特征,引入 Google reCAPTCHA v3 第三方风控服务是有效的解决方案。

reCAPTCHA v3 核心机制

与传统需要用户交互的验证方式不同,reCAPTCHA v3 采用无感验证模式。它根据访问环境和行为特征返回一个 0 至 1 的风险分数:

  • 1.0:极大概率为正常用户
  • 0.0:极大概率为可疑或自动化流量
分数区间 建议处理策略
0.7–1.0 正常放行
0.3–0.7 记录并持续观察
< 0.3 标记为可疑,结合其他特征进一步研判

需注意,Google 官方指出默认阈值 0.5 仅作参考,实际应用中需根据网站自身流量特征进行动态调整。

reCAPTCHA v3 识别机器流量工作流程

完整验证链路如下:

  1. 访客打开网页;
  2. GTM 无感加载 reCAPTCHA v3 脚本;
  3. 浏览器获取临时 Token;
  4. Token 发送至自有服务端(如 Cloudflare Workers);
  5. 服务端使用 Secret Key 请求 Google 验证;
  6. Google 返回验证结果(success、score、action、hostname);
  7. 服务端将结果回传至浏览器;
  8. GTM 接收结果并通过 dataLayer 推送;
  9. GA4 记录并分析数据。

该流程涉及多次网络请求,若用户在响应完成前离开页面,易导致数据丢失。为此,建议采用 Cloudflare Workers 作为服务端验证节点。其依托全球 CDN 节点可实现就近调度,大幅降低网络延迟,同时代码具备高可移植性,也可部署于自有服务器以满足私有化需求。

步骤一:创建 reCAPTCHA Key

登录 reCAPTCHA 后台创建新项目,务必选择"reCAPTCHA v3"类型。

创建成功后将获得两把密钥,其用途与部署位置如下:

密钥类型 部署位置 主要用途
Site Key 前端网页或 GTM 调用 reCAPTCHA v3 生成 Token
Secret Key Cloudflare Worker(服务端) 向 Google 发起 Token 验证请求

步骤二:使用 Cloudflare Worker 验证 Token

在 Cloudflare Dashboard 中创建 Worker,进入代码编辑区,粘贴以下验证逻辑代码:

const ALLOWED_ORIGIN = "https://www.ichdata.com";

function corsHeaders() {
  return {
    "Access-Control-Allow-Origin": ALLOWED_ORIGIN,
    "Access-Control-Allow-Methods": "POST, OPTIONS",
    "Access-Control-Allow-Headers": "Content-Type",
    "Content-Type": "application/json; charset=UTF-8",
    "Cache-Control": "no-store"
  };
}

function send(data, status) {
  return new Response(JSON.stringify(data), {
    status,
    headers: corsHeaders()
  });
}

export default {
  async fetch(request, env) {
    if (request.method === "OPTIONS") {
      return new Response(null, {
        status: 204,
        headers: corsHeaders()
      });
    }

    if (request.method !== "POST") {
      return send({
        success: false,
        error: "method_not_allowed"
      }, 405);
    }

    try {
      const body = await request.json();
      const token = body.token;

      if (!token) {
        return send({
          success: false,
          error: "token_missing"
        }, 400);
      }

      const googleResponse = await fetch(
        "https://www.google.com/recaptcha/api/siteverify",
        {
          method: "POST",
          headers: {
            "Content-Type": "application/x-www-form-urlencoded"
          },
          body: new URLSearchParams({
            secret: env.RECAPTCHA_SECRET,
            response: token
          })
        }
      );

      const result = await googleResponse.json();

      const valid =
        result.success === true &&
        result.action === "visitor_check" &&
        (
          result.hostname === "www.ichdata.com" ||
          result.hostname === "ichdata.com"
        );

      return send({
        success: valid,
        score: result.score ?? null,
        action: result.action ?? null,
        hostname: result.hostname ?? null,
        google_errors: result["error-codes"] ?? []
      }, 200);

    } catch (error) {
      console.error("Worker error:", error);
      return send({
        success: false,
        error: "worker_exception"
      }, 500);
    }
  }
};

复制第一步生成的 Secret Key,在 Cloudflare Worker 设置中添加环境变量,变量名设为 RECAPTCHA_SECRET。切勿将 Secret Key 硬编码在源码中,应利用环境变量保障安全。

部署完成后,Worker 将生成专属地址,例如:https://ichdata-recaptcha.haran-huang.workers.dev。GTM 后续需调用的完整验证接口地址为:https://ichdata-recaptcha.haran-huang.workers.dev/recaptcha-visitor

步骤三:在 GTM 中调用 reCAPTCHA v3

在 Google Tag Manager (GTM) 中新建一个“自定义 HTML"标签,粘贴以下代码。触发器请选择"Initialization - All Pages"以确保尽早加载。

<script>
(function() {
  var siteKey = '******'; // 替换为您的 Site Key
  var verifyEndpoint = 'https://ichdata-recaptcha.haran-huang.workers.dev/recaptcha-visitor'; // 替换为您的 Worker 地址

  function loadRecaptcha(callback) {
    if (window.grecaptcha) {
      callback();
      return;
    }
    var script = document.createElement('script');
    script.src = 'https://www.google.com/recaptcha/api.js?render=' + encodeURIComponent(siteKey);
    script.async = true;
    script.onload = callback;
    document.head.appendChild(script);
  }

  loadRecaptcha(function() {
    grecaptcha.ready(function() {
      grecaptcha.execute(siteKey, {
        action: 'visitor_check'
      }).then(function(token) {
        fetch(verifyEndpoint, {
          method: 'POST',
          headers: {
            'Content-Type': 'application/json'
          },
          body: JSON.stringify({
            token: token,
            page: location.href,
            path: location.pathname
          })
        })
        .then(function(response) {
          console.log('Worker status:', response.status);
          return response.text();
        })
        .then(function(text) {
          console.log('Worker raw response:', JSON.stringify(text));
          if (!text) {
            console.error('Worker returned an empty response');
            return;
          }
          var data;
          try {
            data = JSON.parse(text);
          } catch (error) {
            console.error('Worker response is not valid JSON:', error);
            return;
          }

          window.dataLayer = window.dataLayer || [];
          window.dataLayer.push({
            event: 'recaptcha_verified',
            recaptcha_success: data.success === true,
            recaptcha_score: data.score,
            recaptcha_action: data.action,
            recaptcha_hostname: data.hostname,
            recaptcha_risk: data.score !== null && data.score < 0.3 ? 'high' : 'normal',
            recaptcha_page: location.href,
            recaptcha_path: location.pathname
          });

          console.log('reCAPTCHA dataLayer event pushed:', data);
        })
        .catch(function(error) {
          console.error('Worker request failed:', error);
        });
      });
    });
  });
})();
</script>

关键配置说明:请务必将代码中的 siteKeyverifyEndpoint 替换为您实际的值。上述代码核心逻辑是将验证结果推送到 dataLayer,包含成功率、风险分数、动作类型及风险等级判定等关键参数。

步骤四:验证 reCAPTCHA 信息

在 GTM 中开启预览模式进行测试。成功配置后,可在数据层中看到名为 recaptcha_verified 的事件,其中包含了完整的验证信息。

由于 recaptcha_verified 事件通常晚于默认的 page_view 发送,可根据业务需求选择以下两种处理策略:

  • 策略 A(精准过滤):若可接受少量页面浏览数据的延迟或缺失,可将 recaptcha_verified 设为页面跟踪的触发条件。在此触发器中增加条件:仅当 recaptcha_score ≥ 0.3 时才触发 GA4 页面视图,从而直接在前端过滤低分机器流量。
  • 策略 B(后端细分):若需保证所有页面浏览数据完整采集,可将 recaptcha_verified 作为独立事件跟踪。随后在 GA4 报表中建立基于该分数的用户或会话细分(Segment),在分析时排除或单独查看机器流量。

步骤五:发送数据到 GA4

本文演示采用策略 A,即利用 recaptcha_verified 事件作为页面跟踪触发器。

  1. 创建变量:在 GTM 中新建“数据层变量”,命名为 recaptcha_score,对应数据层键名 recaptcha_score。将其配置为 GA4 页面视图事件的事件参数,并在 GA4 后台注册为自定义指标。
  2. 修改触发器:新建“自定义事件”触发器,事件名称设为 recaptcha_verified。将原有的 GA4 页面视图标签触发条件替换为此新触发器,并可附加分数过滤条件(如 recaptcha_score >= 0.3)。

步骤六:GTM 预览调试与 GA4 验证

在 GTM 预览模式下,可观察到事件参数 recaptcha_score 已成功传递(示例中为 0.9)。

测试显示页面加载时间增加约 3.05 秒,对整体性能影响可控。若对速度极其敏感,建议切换至策略 B。此外,可在 GA4“实施”报表中检查自定义指标是否正常回填。

总结

GA4 内置的机器人过滤机制仅覆盖已知特征,存在局限性。通过集成 reCAPTCHA v3,可为每个会话提供量化的风险评分,实现对机器流量的精细化标记与过滤。建议初期将 reCAPTCHA 分数作为辅助信号,结合 IP、行为轨迹等多维度数据综合研判,以提升数据分析的准确性。

【声明】内容源于网络
0
0
GA小站
各类跨境出海行业相关资讯
内容 777
粉丝 0
GA小站 各类跨境出海行业相关资讯
总阅读11.0k
粉丝0
内容777