【免费下载链接】anti-slop
A GitHub action that detects and automatically closes low-quality and AI slop PRs.
开源维护者正被大量低质量 PR 淹没,其中不少是 AI 自动生成的 "slop" 贡献。anti-slop 是一个 GitHub Action,内置 34 条检查规则,其中**用户检查(User Checks)**专门通过分析贡献者账号的 5 个信号来识别垃圾账号,把 AI slop 贡献者挡在评审队列之外。本文带你快速看懂这 5 个垃圾账号识别信号如何工作、默认值怎么设置,以及如何一键接入你的仓库。
为什么"用户检查"比检查 PR 内容更重要?
垃圾 PR 的描述可以伪装得很漂亮,但账号本身很难伪装:批量注册的账号往往用户名像乱码、注册没几天、一天 fork 几十个仓库、资料页一片空白。
anti-slop 的用户检查正是围绕这些行为特征设计,实现位于 src/checks/user-checks.ts。它和 PR 内容检查(标题、描述、模板等)并行运行,共同汇入同一套失败计数:当失败项达到max-failures(默认 4 项)时,action 才会自动关闭 PR——单个信号亮红灯并不会误伤正常贡献者。
📋 5 个用户检查信号一览
| # | 信号 | 配置项 | 默认值 | 识别目标 |
|---|---|---|---|---|
| 1 | 垃圾用户名 | detect-spam-usernames | true | 机器批量注册的账号 |
| 2 | 账号年龄 | min-account-age | 30天 | 一次性"用完即弃"账号 |
| 3 | 每日 fork 数 | max-daily-forks | 6个 | 自动化 fork 轰炸 |
| 4 | 公开资料 | require-public-profile | true | 隐藏身份的匿名账号 |
| 5 | 资料完整度 | min-profile-completeness | 4项 | 空壳账号 |
信号详解:每个信号抓什么样的账号?
信号 1:垃圾用户名检测(detect-spam-usernames)
用户名是最廉价的伪造成本。anti-slop 内置了 3 条垃圾用户名模式(见 src/checks/user-checks.ts):
- 用户名全是数字(如
12345678) - 用户名包含 2 位及以上连续数字(批量注册脚本的常见产物)
- 用户名含独立的
ai片段(如ai-helper、my-ai-bot,AI 批量工具的典型命名)
任何一条命中即计一次失败。这套规则来自 130+ 个人工复核过的 AI slop PR 中总结出的真实模式。
信号 2:账号年龄门槛(min-account-age)
自动化刷 PR 的账号大多是"新号"。默认要求账号至少存在30 天(取值范围 0–190 天,设为0可关闭)。
README 中的建议:提高到60或90天保护更强,但可能影响刚注册 GitHub 的正常用户——这是一个典型的"防护强度 vs 误伤率"权衡。
信号 3:每日 fork 数量上限(max-daily-forks)
mass-forking(批量 fork)是自动化 PR spam 活动的经典特征:脚本先 fork 一堆仓库,再逐一提交模板化的 slop PR。
anti-slop 会统计用户以 owner 身份创建的仓库中,任意 24 小时滑动窗口内的最大 fork 数(实现见 src/checks/user-checks.ts),超过默认上限6即失败。短期 fork 爆发是"该账号在跑自动化工具"的强信号。
信号 4:要求公开资料(require-public-profile)
只要 PR 作者的资料页不是公开的,require-public-profile检查就会失败。隐藏资料是匿名批量账号的常见做法,而真实贡献者几乎没有理由把自己的 GitHub 资料设为私密。
💡 附带影响:私有资料账号同时会跳过后续的合并率检查(私有账号的公开 PR 历史无法可靠计算)。
信号 5:个人资料完整度(min-profile-completeness)
这是最巧妙的启发式规则。anti-slop 会对账号资料做10 项信号检查:name、company、blog、location、email、hireable、bio、twitter、followers(>0)、following(>0),统计命中项数。
默认要求至少完成4/10项。垃圾账号和 AI 驱动账号的资料页往往是空的或接近空的——要求一个"最低人格完整度",就能高效滤掉一大批一次性账号(信号定义见 src/types/user-profile.ts)。
⚖️ 信号如何触发自动关闭?max-failures 机制
5 个用户检查信号并非"一票否决"。所有检查结果(含 PR 内容检查)汇总后统一计数:
- 失败数达到
max-failures(默认4,范围 1–25)→ 触发关闭 PR(close-pr默认true),可选锁定对话(lock-pr) - 失败数未达到→ PR 正常保留,只在 Job Summary 中列出各检查的 ✅/❌ 明细(见 src/report.ts)
也就是说:一个全新但真实的贡献者,即使账号年龄不够(-1),只要其他信号健康,PR 不会被误关。把max-failures调高 = 更少误伤;调低 = 抓 slop 更激进。
🛡️ 防误伤:零配置的豁免机制
用户检查再聪明,也要给可信的人留门。anti-slop 的豁免逻辑在 src/exemptions.ts 中实现,默认行为:
| 豁免项 | 配置 | 默认值 |
|---|---|---|
| 仓库 Owner / Member / Collaborator 自动豁免 | exempt-author-association | OWNER,MEMBER,COLLABORATOR |
带exempt标签的 PR 跳过所有检查 | exempt-label | exempt |
| 官方机器人自动豁免 | exempt-bots | dependabot[bot]等 5 个 |
维护者想放行某个被误判的 PR?给它打上exempt标签即可,这就是官方留的"逃生通道"。
🚀 快速上手:接入只需一个 workflow 文件
在仓库的.github/workflows/pr-quality.yaml中加入:
name: PR Quality permissions: contents: read issues: read pull-requests: write on: pull_request_target: types: [opened, reopened] jobs: anti-slop: runs-on: ubuntu-latest steps: - uses: peakoss/anti-slop@v0 with: max-failures: 4 detect-spam-usernames: true min-account-age: 30 max-daily-forks: 6 require-public-profile: true min-profile-completeness: 4整个 action 运行时间不到 15 秒——slop PR 还没进入你的评审视野就已经被关闭了。所有 57 个配置项的完整说明可在 README.md 和 action.yaml 中查阅。
📌 延伸阅读:贡献者健康度还有"隐藏第四信号"
除 5 个用户信号外,src/checks/merge-checks.ts 提供合并率检查:min-global-merge-ratio(默认30%)会统计作者跨所有公开仓库的"合并 PR / 关闭 PR"比例。一个在全网大量提交却几乎从不被合并的作者,是低质量贡献的极强指标——这也是 README 中评价"最有效的贡献者健康检查"。
获取源码
git clone https://gitcode.com/gh_mirrors/an/anti-slop关键模块路径速查:
- 用户检查核心逻辑:src/checks/user-checks.ts
- 合并率检查:src/checks/merge-checks.ts
- 全部 57 项配置定义:src/types/settings.ts
- 豁免判断流程:src/exemptions.ts
- 检查调度入口:src/main.ts
- 版本变更记录:CHANGELOG.md
⚠️ 注意:anti-slop 目前仍是 v0 版本,v1.0.0 之前可能存在破坏性变更。生产使用建议固定到具体版本号,以保证行为稳定。
【免费下载链接】anti-slop
A GitHub action that detects and automatically closes low-quality and AI slop PRs.
相关推荐
Continue Anti-Slop 检查:识别并清理 10 种典型 AI 代码坏味道
Continue Anti Slop 检查:识别并清理 10 种典型 AI 代码坏味道 在 AI 辅助编程普及的背景下,"AI slop"(低质量 AI 生成代
人工智能AI 应用AI Agent代码智能体交互助手开发工具IDE3分钟快速上手anti-slop:让15秒内自动识别并关闭AI生成的垃圾PR
3分钟快速上手anti slop:让15秒内自动识别并关闭AI生成的垃圾PR anti slop 是一款免费的 GitHub Action,用于 PR 质量检查
CodePilot 微信 Bridge 通道集成实战:多账号长轮询、合成 chatId 与 ilink 协议接入
CodePilot 微信 Bridge 通道集成实战:多账号长轮询、合成 chatId 与 ilink 协议接入 本篇技术指南以 CodePilot 仓库中微信
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考