Community生产力与协作github.com

shannonmcgivney/consent-gate

修复网站或“氛围编码”应用,使得在访客选择同意之前,没有任何广告像素、分析工具、会话回放或可选的第三方脚本加载、获取或发送任何数据——一个默认拒绝的同意加载器、一个诚实的横幅(接受与拒绝按钮同等显眼,类别默认未勾选)、撤回机制、全球隐私控制、不发送客户邮箱或完整URL的跟踪数据包,以及一份准确的隐私声明——并通过全新访客测试来验证。在“同意审计”发现未经同意即追踪,或当有人要求修复时使用。

consent-gate 是什么?

该技能旨在解决网站或应用在未经用户明确同意前加载跟踪脚本的常见合规问题。它实现了一个“默认拒绝”的同意加载系统:在用户点击“接受”之前,任何可选的第三方脚本(如广告像素、分析工具、会话回放)都不会被加载或执行。系统强制要求一个诚实的横幅,其中“接受所有可选”与“拒绝所有可选”按钮在样式和位置上同等显眼,且所有类别开关默认处于未选中状态。技能覆盖了完整的生命周期,包括同意选择、存储(带版本和过期时间)、通过页脚链接进行撤回、支持全球隐私控制(GPC),并在用户撤销同意后清除应用拥有的可选Cookie。它还确保即使获得同意,也不发送电子邮件、电话号码、用户全名或包含查询字符串的完整URL等敏感信息。该技能明确要求在使用前先运行`consent-audit`进行跟踪器审计,并根据第三方脚本的实际用途(保留、设门控或移除)做出决策。它提供了针对本地代码(如Claude Code)和代理构建平台(如Lovable、Bolt)的不同实施路径,并附带严格的测试方案,要求通过全新访客网络请求检查、Cookie和本地存储验证来证明修复有效。最后,它强调这并非法律建议,若涉及广告或为加州/欧盟用户提供服务,应咨询法律顾问。

兼容平台✓Claude Code~Codex CLI~Cursor
npx skills add https://github.com/shannonmcgivney/consent-before-tracking/tree/HEAD/skills/consent-gate

Installed? Explore more 生产力与协作 skills: steipete/gemini, steipete/gh-issues, steipete/skill-creator · View all 6 →

在你喜欢的 AI 中提问

打开一个已预加载此 Agent Skill 的新对话。

文档

同意门控:未经同意,不运行任何可选功能

视频中的规则,一句话概括:在用户点击Cookie横幅的“接受”按钮之前,不加载任何跟踪像素、分析工具或第三方脚本。 一个在像素已经触发后才显示的横幅根本无法解决问题。本技能用于构建那个“等待”的机制。

非法律建议。切勿在代码、文案或报告中写入“完全合规”。应说明应用当前的行为和已通过测试的内容。

开始前的准备工作

  1. 先完成审计。 如果该应用没有 consent-audit 报告,请先运行它。您需要一份完整的清单:有哪些供应商、它们在何处开始运行、它们发送了什么数据。
  2. 向应用所有者询问每个跟踪器的处理方式:保留、设门控,还是移除? 如果某个跟踪器不用于决策或广告,移除它比给它设门控更好。一个只使用必要存储的网站根本不需要任何横幅;请不要添加。
  3. 了解发布时将会包含哪些内容。 托管构建平台(如 Lovable 等)会一次性发布所有未发布的更改。列出这些更改,并在发布前获得许可。
  4. 保护第一方数据。 设门控的跟踪器不得触及登录、支付或应用自身的数据库写入操作(如学生作业、进度、表单)。请在报告中说明这一点。

“已设门控”的含义(修复措施必须满足的清单)

加载

  • 一个中心加载器(src/lib/consent.ts,参见 references/consent.ts)。index.html、根布局或 main.tsx 中不得包含任何像素、GTM、gtag、PostHog 或回放 <script> 标签。
  • 可选脚本不被获取,而不仅仅是不被初始化:动态 import() 或脚本注入仅在用户选择加入后发生。
  • 不重放已排队的事件:来自同意之前的页面浏览记录应被丢弃,不得延迟发送。
  • 服务器端转发(Meta Conversions API、/api/track、边缘函数)需检查相同的已存储选择,并在请求中一并发送。
  • 在分析工具注入源(如 Lovable → 设置 → 访客分析关闭;Vercel/Netlify/Cloudflare 分析关闭)处关闭由主机注入的分析功能,或在其注入前进行门控。在脚本加载后再移除它已为时过晚,因为第一个请求已经发出。
  • Google Consent Mode(如果保留 GA/Ads):gtag('consent','default',{ad_storage:'denied',analytics_storage:'denied',ad_user_data:'denied',ad_personalization:'denied'}) 并且 gtag 脚本本身在本技能的默认设置下仍然等待用户选择加入。使用“基本”Consent Mode,而非“高级”,因为高级模式会在同意前发送无 cookie 的 ping。

横幅

  • 接受可选和拒绝可选按钮同等显眼:相同的尺寸、相同的样式、相同的点击次数。另外还需提供设置选项。
  • 类别开关(分析、广告等)默认处于未选中状态。
  • 关闭横幅(点击 X / 按 Escape)视为拒绝。
  • 用户的选择需连同版本号和过期时间(6至12个月)一起保存。供应商列表发生变化时,版本号递增,并重新征求同意。
  • 页脚中有一个持续的**“隐私选择”**链接,可重新打开设置。
  • 撤回操作会停止未来的调用,并删除应用拥有的可选 Cookie 和存储(_ga*、_fbp、_gcl_au、_ttp、ph_*、ajs_*、_hj*、_clck),但不影响身份验证。
  • 全球隐私控制(navigator.globalPrivacyControl === true)对于广告/销售/共享行为视为拒绝,并且横幅应声明已遵循该设置。

即使在同意后,也不发送的内容

  • 像素或分析工具的数据包中不得包含电子邮件、电话号码、姓名或出生日期(不得使用 Meta advanced matching,不得使用 identify(email))。只在确实需要时使用不透明 ID。
  • 发送的 URL 不得包含 ?query 和 #fragment(例如礼品码、重置令牌、搜索词)。如果供应商无法剥离这些内容,则移除该供应商。
  • 不得发送来自测验答案、聊天内容、健康/金融/出生数据或表单字段的任何内容。
  • 视频页面: 在播放课程或教学视频的页面上不得存在广告像素(涉及联邦视频隐私保护法风险),除非法律顾问另有指示。

通知

  • 在一个公开路由上放置隐私/Cookie 通知,该路由可从页脚以及注册/登录页面链接到,其中列出实际的供应商和类别。仅使用真实运营商的名称和联系邮箱;不得虚构地址、DPO 或法律声明。

如何实施

  • 本地代码 / Claude Code: 将 references/consent.ts 复制到应用中,将每个可选供应商注册为一个 loader,删除硬编码的标签,使用应用自身的组件构建横幅,并连接页脚链接。保持差异尽量小,并符合应用自身的样式。
  • Lovable / Bolt / v0 / Replit(代理构建): 从 ~/.claude/skills/consent-audit/references/prompts.md(或移除提示)粘贴修复提示。然后亲自验证;不要相信代理的总结。

验证(在宣布完成前必须执行)

先在预览环境中运行以下测试,发布后在生产 URL 上再次运行。在 Claude 的内置浏览器中,使用已清除存储的新标签页,然后使用 read_network_requests 和 javascript_tool(document.cookie、localStorage):

测试通过条件
全新访问,无点击对广告、分析或回放域名的请求数为 0;无可选 Cookie 或存储
拒绝,然后进行 2 次页面导航请求数仍为 0;横幅不再显示;选择已保存
仅接受分析分析工具加载;广告像素不加载
重新加载选择被记住;横幅不再显示
通过页脚链接撤回未来调用停止;可选 Cookie 被清除;用户仍处于登录状态
GPC 开启(navigator.globalPrivacyControl 强制设为 true)无需点击,广告即被拒绝
客户端导航(SPA)路由切换时无跟踪器潜入
使用测试账号登录任何跟踪器请求中均无电子邮件或用户 ID
构建 + 类型检查通过

报告内容:修改的文件、每项测试的结果及证据(观察到的域名或“无”)、未运行的测试及原因、随此修复一并发布但尚未更改的内容,以及“非法律建议。如果您投放广告或为加州/欧盟用户提供服务,请咨询法律顾问。”

Individual skills in this repo

This repo contains 2 individual skills — each has its own dedicated page.

相关技能