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 识别机器流量工作流程
完整验证链路如下:
- 访客打开网页;
- GTM 无感加载 reCAPTCHA v3 脚本;
- 浏览器获取临时 Token;
- Token 发送至自有服务端(如 Cloudflare Workers);
- 服务端使用 Secret Key 请求 Google 验证;
- Google 返回验证结果(success、score、action、hostname);
- 服务端将结果回传至浏览器;
- GTM 接收结果并通过 dataLayer 推送;
- 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>
关键配置说明:请务必将代码中的 siteKey 和 verifyEndpoint 替换为您实际的值。上述代码核心逻辑是将验证结果推送到 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 事件作为页面跟踪触发器。
- 创建变量:在 GTM 中新建“数据层变量”,命名为
recaptcha_score,对应数据层键名recaptcha_score。将其配置为 GA4 页面视图事件的事件参数,并在 GA4 后台注册为自定义指标。 - 修改触发器:新建“自定义事件”触发器,事件名称设为
recaptcha_verified。将原有的 GA4 页面视图标签触发条件替换为此新触发器,并可附加分数过滤条件(如recaptcha_score>= 0.3)。
步骤六:GTM 预览调试与 GA4 验证
在 GTM 预览模式下,可观察到事件参数 recaptcha_score 已成功传递(示例中为 0.9)。
测试显示页面加载时间增加约 3.05 秒,对整体性能影响可控。若对速度极其敏感,建议切换至策略 B。此外,可在 GA4“实施”报表中检查自定义指标是否正常回填。
总结
GA4 内置的机器人过滤机制仅覆盖已知特征,存在局限性。通过集成 reCAPTCHA v3,可为每个会话提供量化的风险评分,实现对机器流量的精细化标记与过滤。建议初期将 reCAPTCHA 分数作为辅助信号,结合 IP、行为轨迹等多维度数据综合研判,以提升数据分析的准确性。

