Shpigford/knockoff

GitHub: Shpigford/knockoff

一款浏览器扩展,通过本地启发式算法和品牌白名单机制过滤 Amazon 搜索结果中的抢注商标伪劣品牌商品。

Stars: 1252 | Forks: 34

![Knockoff:没有仿冒品的 Amazon](https://static.pigsec.cn/wp-content/uploads/repos/cas/d2/d2aee8ae17ded2875281e4c86999940a80f631fb073f75813369015748a7a2e1.png) # Knockoff **一款用于过滤 Amazon 上伪劣品牌垃圾商品的浏览器扩展。** 购买真正的成熟品牌商品,即使这意味着需要支付更高的价格。 Amazon 上充斥着大量抢注商标的“品牌”(如 SZHLUX、HORUSDY、LATTOOK、DOZAWA 等):这些仅仅是注册在美国专利商标局 (USPTO) 的随机字符串,完全是为了解锁 Amazon 品牌注册(Amazon Brand Registry)权限。它们销售的是大宗商品,背后没有任何公司、不提供保修,也没有任何声誉可言。Knockoff 可以直接在搜索结果中检测出这些商品,并对其进行隐藏、变暗或打上标签。 ## 安装 从 Chrome Web Store **[添加到 Chrome](https://chromewebstore.google.com/detail/pjgickchbiikhdfpmecaabkphmofpdce)**,或从 Firefox Add-ons **[添加到 Firefox](https://addons.mozilla.org/en-US/firefox/addon/knockoff-amazon-brand-filter/)**。 或者为了开发目的,以未打包方式加载它: 1. Clone 本仓库 2. 打开 `chrome://extensions` 3. 开启右上角的 **开发者模式** (Developer mode) 4. 点击 **加载已解压的扩展程序** (Load unpacked) 并选择该仓库文件夹 适用于所有的 Amazon 市场。 ### Safari Safari 要求扩展必须封装在原生应用中。在 Xcode 中打开 [`safari/Knockoff/Knockoff.xcodeproj`](safari/Knockoff),运行 **Knockoff** scheme,然后在 Safari → 设置 (Settings) → 扩展 (Extensions) 中启用 Knockoff。对于未签名的本地构建版本,请先在 Safari 的“开发”(Develop) 菜单中勾选“允许未签名的扩展”(Allow unsigned extensions)。 该 Xcode 项目自带了一份扩展文件的副本;在修改扩展之后,运行 [`scripts/sync-safari.sh`](scripts/sync-safari.sh) 来更新它,然后再进行重新构建。 ## 工作原理 所有操作均在本地通过 content script 运行。没有账号、没有跟踪、在购物路径上也没有任何服务器往返请求。每个商品图块的品牌都会通过以下 pipeline 进行解析(匹配到第一个即生效): | # | 检查项 | 判定结果 | |---|-------|---------| | 1 | 您的白名单 | `allowed`,绝不会被过滤 | | 2 | 您的黑名单 | `blocked`,始终会被过滤 | | 3 | 臭名昭著的伪品牌种子列表 ([`data/flagged-brands.js`](data/flagged-brands.js)) | `flagged` | | 4 | 知名中国品牌 ([`data/chinese-major.js`](data/chinese-major.js)) | `known`,或者如果您开启了该设置,则为 `flagged` | | 5 | 约 5000 个知名品牌 ([`data/known-brands.js`](data/known-brands.js) + [`data/community-brands.js`](data/community-brands.js) 中的社区白名单,每天从 `api.knockoff.shopping/brands` 刷新) | `known` | | 6 | 名称启发式算法(见下文) | `flagged` / `suspect` / `unknown` | | - | 标题前方完全没有品牌 | `unbranded` | ### 名称启发式算法 未知品牌会根据抢注商标名称的语言特征进行评分:全大写的 5-9 个字符组成的字符串、极低的元音比例、无法发音的辅音连续排列、非英语字母组合、非拉丁字符以及随机的内部大写 (iNternal caPitalization)。高分会被标记为 `flagged`,中等分数为 `suspect`。已知品牌列表始终具有一票否决权:否则许多真正的品牌(如 ASICS、RYOBI、HOKA)看起来也会很可疑。 评分逻辑位于 [`src/detector.js`](src/detector.js) 中,代码特意写得易于阅读,对其进行调优将是一个非常棒的首次贡献。 ### 过滤级别 | 级别 | 过滤规则 | |-------|---------| | **宽松 (Relaxed)** | 已知伪品牌 + 您的黑名单 | | **标准 (Standard)**(默认) | + 看起来可疑的名称 + 无品牌商品 | | **严格 (Strict)** | + 任何不在已知品牌列表中的商品(仅限白名单) | ### 操作 被过滤的商品可以被 **隐藏**(显示一个带有数量统计的浮动胶囊标签,支持一键恢复)、**变暗**(淡出并降低饱和度,鼠标悬停时恢复),或者仅仅 **打上标签**。每个徽章都是可点击的:信任该品牌、拉黑它、仅显示这一次,或者报告分类错误。 商品详情页会在品牌署名旁边显示一个判定芯片 (chip)。该页面绝不会从您的视线中直接隐藏掉。 ## 报告分类错误 徽章菜单提供了一键报告功能(“这是垃圾商品” / “这是真正的品牌”)。报告会发送至一个由 D1 提供支持的轻量级 Cloudflare Worker ([`report-worker/`](report-worker/)),并由人工进行审核,以改进内置列表。不涉及任何 PII(个人身份信息):其 payload 仅包含品牌、判定结果、ASIN、市场以及扩展版本;报告者的 IP 仅作为加盐哈希值存储,用于速率限制。如果未配置任何 endpoint,扩展会回退到打开一个预填好的 GitHub issue。 部署您自己的 endpoint 只需要四条命令;请参阅 [`report-worker/worker.js`](report-worker/worker.js) 的头部说明。 ## 已知限制 - **混合大小写的乱码**(例如 "Geinxurn", "Mulwark")在标准级别下的得分低于可疑阈值;严格模式可以捕捉到它们。一个内置的字符二元模型 (bigram model) 可以妥善解决此问题;欢迎提交 PR。 - 卖家的 **原产地查询**(获取卖家配置地址)刻意未被实现:这会导致每个商品需要消耗两次受速率限制的页面抓取,并且 Amazon 会对激进的爬虫返回 503 错误。而基于名称的方案不需要任何网络调用。 - 轮播展示区和少数特殊图块布局尚未被扫描(`src/content.js` 中的 `TILE_SELECTORS` 是该扩展点)。 - 非英语商店目前为尽力而为 (best-effort) 状态。品牌列表和商品详情页的芯片在各地都能正常工作,但名称启发式算法是针对英语调优的,因此未列出的当地品牌可能会漏网。非拉丁语系的商品(如日语、阿拉伯语)会被直接跳过而非被错误过滤,因此不会对任何市场的使用造成破坏。 ## 先前研究 影响了本项目设计的研究包括:[AmazonBrandFilter](https://github.com/chris-mosley/AmazonBrandFilter)(白名单方案;其基于 MIT 许可证的社区列表为 Knockoff 的列表提供了初始种子),[SoldBy](https://github.com/tadwohlrapp/soldby) (卖家所在国查询及其关于速率限制的经验教训),以及 The Markup 的 [Amazon Brand Detector](https://github.com/the-markup/tool-amazon-brand-detector)。 Knockoff 的创新之处在于将社区白名单与启发式评分器相结合,并以白名单作为一票否决权。 ## 许可证 [FSL-1.1-MIT](LICENSE)。代码在两年后自动转换为 MIT 许可证。
标签:Firefox扩展, Safari扩展, 广告过滤, 数据可视化, 浏览器扩展, 程序员工具, 自定义脚本, 购物助手