做逆向工程动向雷达时,我踩的四个 GitHub 搜索陷阱
我又给自己加了一个常驻机器人:reverse-radar —— 逆向工程动向雷达,每天追踪二进制逆向 / 协议逆向方向的开源新晋与飙升项目。
看板在这里:https://hedongli1.github.io/reverse-radar/
搭起来不难,难的是让搜索结果别跑歪。这篇记录四个坑,每个都是实测撞出来的——而且其中三个会静默地毁掉数据,不报错、不中断,只是让你拿到一堆看似合理的垃圾。
先说结论:为什么不做「热榜」
我已有的 trending-radar 是全站热榜。做逆向雷达时我第一反应是照抄,但想清楚一件事就放弃了:
按总 Star 排序对逆向工程这个领域毫无信息量。
Ghidra 78131 星、ImHex 54822 星、x64dbg 49531 星——这个头部十年没动过。你第一次打开看完,之后再也不会打开第二次。
所以要的不是「谁最热」,而是「这一周什么在动」。
但这里立刻撞上第一个硬约束:
GitHub Search API 只返回当前 Star 数,不返回历史。
没有历史就算不出增量。所以雷达必须自建快照:每天存一份 {仓库: 星数},一周后才有东西可减。这意味着 雷达上线第一周是瞎的——这是物理限制,绕不过去。
顺带一个必须守住的纪律:快照必须每天同一时刻拍。时刻漂移,7 天的差值就失真。
坑 1:同类型限定符不能用 OR
这是最要命的一个——它会让整个 workflow 变红。
我想让查询同时覆盖两个 topic:
topic:proxy OR topic:mitmproxy
返回:
{"message": "Validation Failed",
"errors": [{"message": "The search contains only logical operators (AND / OR / NOT) without any search terms"}]}
裸词 OR 合法,限定符 OR 不合法。 实测:
| 查询 | 结果 |
|---|---|
frida OR ghidra in:name,description stars:>100 |
✅ 340 条 |
topic:proxy OR topic:mitmproxy |
❌ 422 报错 |
注意报错信息很有误导性——它说”没有搜索词”,但你的查询里明明有词。真正的意思是”你有 OR,但两边的词都被限定符吃掉了”。
坑 2:括号会让 in: 静默失效(这个更危险)
如果我加个括号想”整理一下逻辑”:
(hooking OR mitmproxy) in:name,description
它不报错,返回 151987 条。
对比正确写法:
hooking OR mitmproxy in:name,description
返回 1392 条。
差了 100 倍。因为括号打断了限定符的作用域,in:name,description 直接失效,等于在全站裸搜。
这个坑比坑 1 危险得多:坑 1 会报错,你能立刻发现;坑 2 会给你一份 15 万条的数据,看板上一切正常,只是里面全是垃圾。我是对比了两个写法的 total_count 才发现的。
坑 3:「hooks」这个词被两个圈子劫持了
hooking 是逆向工程的正当术语。但它同时是:
- 前端圈的核心词:
(hooking OR mitmproxy) stars:>100的 top1 是 react-use(44076 星),top3 是 alibaba/hooks(14972 星) - AI Agent 圈的核心词:Claude Code / Codex 把生命周期回调叫 hooks
第二个是我上线后才发现的。第一版「最新发现」榜单里混进了这些:
Yuzzyuk/marketing-os AI 营销 skill
Jakeschincariol/linkedin-agent-skill AI 领英运营 skill
lennney/stop-that-shit AI coding agent 的 hook 守卫
big0lives/codex-task-pointer Codex 任务指针
一个逆向雷达,推给你一堆 AI 营销工具。 而且它不报错——hooking 确实出现在这些仓库的描述里。
修法是双管齐下:查询层把 hooking 换成领域词 + 双词 AND(wechat hook、douyin sign),过滤层加黑名单。
这里我犯了个二次错误:黑名单一开始加了 mcp-server / mcp- 模式,结果把 ida-mcp-server、apktool-mcp-server、jadx-ai-mcp 这些正经逆向工具全杀了。
MCP 是接口,不是领域。 2026 年逆向工具挂 MCP 接口是主流做法,拦掉它们等于自断经脉。已经撤销。拦截量从 34 条降到 14 条。
教训:黑名单要拦的是「领域无关」,不是「形态不同」。
坑 4:topic: 是作者自己填的,乱打严重
我原以为 topic:reverse-engineering 是最精准的查询。实测挂这个 topic 的仓库里有:
| 仓库 | 星数 | 实际是什么 |
|---|---|---|
Tyrrrz/YoutubeDownloader |
16k | YouTube 下载器 |
librepods-org/librepods |
29k | AirPods 第三方工具 |
JCodesMore/ai-website-cloner-template |
34k | AI 网站克隆模板 |
xtekky/gpt4free |
66k | LLM 越狱代理 |
它们挂 reverse-engineering 是因为确实”逆”了点什么(YouTube 的 API、AirPods 的协议),但不是逆向工程工具。而因为 Star 高,它们会牢牢占据榜单前排。
所以纯 topic 查询必须再过一道语义校验:名字或描述里得真的出现逆向相关词。实测这一道淘汰了 173 条挂错标签的噪音。
同一类问题的还有 awesome-list:
topic:reverse-engineering 的 top1 是 Awesome-Hacking(120606 星)
star 天然高的清单类会系统性挤掉真工具。但我没有删它们——awesome 清单是人工整理的领域索引,很有价值。做法是单开一个「资源清单」分区,让它们待在那边而不占主榜。
最终形态
每日 UTC 02:07
↓
fetch.js 多词表 × 多查询抓取 → 去噪 → 入库
↓
snapshot/ 每日 Star 快照(算增速的唯一依据,保留 90 天)
↓
insight.js 对比 7 天前基线 → 增量榜 / 新面孔 / 飙升告警
↓
report-issue.js → 滚动周报 issue
↓
GitHub Pages
几个设计取舍:
- cron 定在 UTC 02:07:避开已有的 00:30 / 14:14 / 17:00 三班,也避开整点(GitHub 官方明说整点是全球 cron 排队高峰,任务可能被丢弃)
- 用内置
GITHUB_TOKEN而非个人 PAT:内置 token 每次运行自动生成、永不过期,个人凭据轮换不会影响自动化 - issue 用滚动单条而非每天新建:这个领域每天只有 1-2 条新料,每天开一条 issue 三个月后就是上百条要手动关。只有「7 天涨破 1000 星」的异常信号才单独开告警
- 词表外置到
keywords.json:改词不改代码
看板主视图我选了 7 日涨星榜而不是日榜——实测这个领域近 7 天新建且 ≥10 星的仓库只有 12 个,日榜会天天显示”今天没新东西”,看三天你就不想再打开了。
一句总结
写 GitHub 搜索查询时,括号、OR、限定符三者的相互作用是不报错的。唯一可靠的验证方式是:改动前后各跑一次,对比 total_count。数字不对,说明查询早就跑歪了。
这件事没有文档能替你确认。
- 雷达看板:https://hedongli1.github.io/reverse-radar/
- 源码:https://github.com/hedongli1/reverse-radar
- 姊妹项目:trending-radar · aiscan