代码只占两成:31K star 的 OSINT 工具 maigret 怎么靠「站点数据库」而非引擎立足
GitHub: https://github.com/soxoj/maigret
说明:本文是对一款公开 OSINT 工具的客观技术分析(安全研究/教育语境),只描述「它是什么、工程架构、生态与风险」,不含任何针对个人的调查/起底操作指南。
一句话总结
maigret 是一个 OSINT 用户名枚举工具:输入一个用户名,跨 3000+ 站点判定该用户名是否已注册、抓取公开 profile 字段、生成档案报告。它是 Sherlock 的进阶后继,由商业 OSINT 公司 Social Links 的 CPO(Soxoj)维护,31K star。它最值得讲的是一个「数据即资产」的架构事实——仓库 66% 是 JSON 站点检测数据库,真正的 Python 引擎只占 21.6%;护城河不是代码,而是那份持续维护、覆盖 3000+ 站点的检测规则库。
值得关注的理由
- 一个「数据驱动检查引擎」的范本:它把易变的「每个站点如何判定用户名存在」全部下沉为声明式 JSON 规则(URL 模板、presence/absence 双向标记、checkType、字段提取、引擎模板复用),引擎只需理解有限几种 checkType。3159 个站点里 1371 个靠共享「引擎模板」(XenForo/phpBB/Discourse/WordPress 等同款建站系统抽一份模板)驱动——新增站点近乎零代码。这套「声明式探测规则 + 模板复用」可迁移到任何「对大量异构端点做规则化探测」的场景(资产发现、可用性监控、合规扫描)。
- 一套规则库型工具的完整维护方法论:数据驱动把维护负担从代码转移到数据,maigret 给出了三条腿的答案——运行时带 SHA-256 校验 + 版本协商的数据库热更新(
db_updater.py,代码不动数据热更)、CI 自动重算统计/只在实质 diff 时开 PR、以及submit.py用「存在 vs 不存在两份响应的 HTML token 集合差分」半自动推断 presence/absence 标记 + self-check 真值回归。这是任何「规则/特征库型工具」可整体借鉴的工程方法论。 - 一个「引擎开源、护城河闭源」的清晰商业样本:作者是 Social Links CPO,README 的 Commercial Use 段落写得很直白——开源版 MIT、约 3000 站、靠社区维护、「checks break over time」;商业版提供「5000+ 站、每日更新的私有库」+ username-check API。引擎开源承担获客与社区维护,最值钱的「每日维护的库」留在商业侧。这是研究开源商业化的好案例(也需中立标注 README 内嵌商业产品引流的利益关联)。
项目展示

档案报告产出(HTML,另支持 PDF/XMind/CSV/JSON/D3 关系图)。下图是 Web 界面:

项目画像
| 维度 | 数据 |
|---|---|
| GitHub | https://github.com/soxoj/maigret |
| Star / Fork | 31,333 / 2,256 |
| 代码行数 | 55,365 行(JSON 65.9% = 3000+ 站点检测数据库(核心资产),Python 21.6% 引擎,PO 6.3% i18n,HTML 1.8% 报告模板) |
| 项目年龄 | 6.4 年(首提交 2020-01-08) |
| 开发阶段 | 密集开发(近 30 天 75 commit,最近提交仍是「更新站点列表」——维护站点库是主线) |
| 贡献模式 | 单人主导 + 社区 + 机器人/AI(73 人,Soxoj 约 35.7%,dependabot/Copilot 辅助) |
| 热度定位 | 大众热门(OSINT 用户名赛道第二,仅次于 Sherlock 84.7K) |
| 质量评级 | 维护性「优」 异步引擎「良」 误报检测「良」 测试「良」 隐私伦理「风险(架构固有)」 |
作者视角:为什么存在这个项目
创始人/作者背景
作者 Soxoj(真实活跃的专业 OSINT 从业者,非匿名):bio「CPO @ Social Links」(商业调查平台),创办「OSINT mindset」社区与「OSINT Center of Excellence」,维护 OSINT 方法论知识库(SOWEL 分类法)。他还有一套 OSINT 工具矩阵(socid-extractor 是 maigret 的上游字段抽取依赖、marple 搜索结果聚合等),maigret 是其旗舰(31K star,远超其余)。单人主导(474 commit)+ 社区 + AI 辅助(Copilot)。专业度与真实性无疑问;需中立标注的是其商业身份与开源项目的引流关联(README 为自家 Social Links API/Crimewall 等导流)。
问题判断
核心洞察是工程性的:用户名跨平台复用是稳定可利用的公开信号,但把它做成可靠工具的瓶颈不在算法,而在「站点判定规则的时效维护」——站点一改版,旧的判定标记就失效,产生误报/漏报。前身 Sherlock 把站点硬编码为「URL 模板 + 单一判定」,判定逻辑薄、抓不到字段、不递归。maigret 要解决的正是「如何规模化、可维护地做这件事」。
解法哲学(数据驱动)
把可变性全部下沉到数据层:代码(引擎)力求稳定通用,站点差异全部表达为 resources/data.json 的声明式条目。证据很硬——全库 3159 个站点定义,data.json 是仓库历史上改动最频繁的文件(496 次提交触及,远超任何 .py)。引擎只需理解有限几种 checkType(实测:引擎复用 1371、message 940、status_code 754、response_url 94),新增/修复站点通常无需改代码。
战略意图(开源 + 商业引流)
「引擎开源、护城河(高时效站点库)闭源」的经典双轨。开源版同时承担获客与社区维护两个职能——社区贡献站点定义,反哺并验证引擎,而最值钱的「每日维护的 5000+ 库」留在商业侧。作者的 Social Links 背景也解释了几处工程取向:站点库被当作核心资产精细运营(自动算排名、统计误报风险、self-check 审计)、对反爬/WAF 有成体系应对、把「身份图」产品化(对应商业产品 Crimewall 的图谱形态)。
核心价值提炼
创新之处
- 声明式站点检测 schema + 引擎模板复用(新颖度 3/5,实用性 5/5,可迁移性 5/5):
MaigretSite把一个站点的检测完全声明化——url模板、checkType、presenseStrs/absenceStrs双向标记、regexCheck(用户名格式预校验省掉无效请求)、urlProbe(探测 URL 与展示 URL 分离)、activation(运行时令牌刷新钩子)、protection(声明防护类型路由到对应 checker)。engines段把同款建站系统的判定逻辑抽成可复用模板(1371 站靠它驱动),update_from_engine做字段级合并。 - HTML 集合差分自动推断判定标记(新颖度 4/5,可迁移性 4/5):
submit.py对「存在 vs 随机不存在」两份响应做 HTML token 集合差分(a_minus_b/b_minus_a),过滤掉过长/数字/双向都出现的 token,按与已知 presence 词库的匹配度排序,半自动产出候选presenseStrs/absenceStrs,并能detect_known_engine复用模板。把「人工找判定标记」这件苦活自动化。 - 命中即抽取、抽取即回灌的递归身份图扩展(新颖度 3/5,实用性 4/5):命中后
socid_extractor抽字段,parse_usernames过滤出可信新标识符,主循环while usernames:把新种子回灌工作队列、already_checked去重防环,report.py用 networkx 把 username→account→site→id 连成图导出 D3 可视化。 - 带 SHA-256 校验与版本协商的数据库热更新(新颖度 2/5,可迁移性 5/5):
db_updater.py每 24h 拉db_meta.json(版本/计数/哈希/最低兼容版本),完整性校验 + 版本协商后下载,离线回退内置库——一个轻量的「带校验的差量更新协议」,让「代码不动、数据频繁热更」。
可复用的模式与技巧
- 数据驱动检查引擎:易变判定逻辑沉淀为声明式数据 + 稳定通用引擎 + 模板复用——规则频繁变化、条目众多的探测/扫描类工具通用。
- 有界并发流式执行器:
asyncio.Queue+ 固定 worker 池 + 逐任务wait_for超时兜底 + 生成器 yield + 显式取消清理(executors.py)——大批量 I/O 密集任务需进度与背压。 - 正负双向判定 + 错误优先降级:「命中正标志 ∧ ¬命中负标志」且前置分层错误检测(站点专属串→通用审查/反爬串→HTTP 状态),不确定一律降级 UNKNOWN 而非误判——抗误报的存在性/可用性判定。
- 种子回灌的递归扩展 + 去重防环:命中→抽取新种子→回灌队列→
already_checked去重——图扩展爬虫、关联发现。 - 校验式数据热更新协议 + 真值回归自检:meta 清单 + SHA-256 + 离线回退;每条规则自带正反真值样本(
usernameClaimed/usernameUnclaimed)做 CI/CLI 回归并自动停用失效项——外部依赖易腐的规则库的质量门禁。
关键设计决策
最值得记录的是 presence/absence 双向判定 + 分层误报检测 这个对抗「假阳/假阴」的工程。「页面存在」不等于「账号存在」——站点可能返回软 404、登录墙、验证码、地区封锁。process_site_result 按 checkType 分流判定 CLAIMED/AVAILABLE/UNKNOWN;message 类型要求「命中 presence 串 且 未命中 absence 串」才判存在;判定前先过 ErrorPageDetector 三层(站点专属失败串→通用审查/反爬串→HTTP 状态,如 403 拒绝、999 当 LinkedIn 正常封锁、≥500 服务器错误),命中则降级 UNKNOWN。作者诚实标注了根本缺陷——presense_strs 为空时「presence 默认为真」会产假阳,并在 get_db_stats 里把这种弱标记站点量化为「误报风险百分比」。误报是结构性风险,无法靠工程根除,只能量化和监控(关键文件 maigret/checking.py + maigret/error_detection.py)。
竞品格局与定位
竞品对比
| 项目 | Stars | 定位 | 与 maigret 差异 |
|---|---|---|---|
| sherlock-project/sherlock | 84.7K | 用户名枚举鼻祖(前身) | 站点少(~400)、单向判定、无字段抽取/递归/报告/引擎模板/热更新——maigret 是其「产品化重写」 |
| smicallef/spiderfoot | 18.1K | 通用 OSINT 自动化框架 | 覆盖面广(多实体/百余模块),但用户名维度深度不及;平台 vs 单点工具 |
| laramies/theHarvester | 16.4K | 邮箱/子域/主机情报 | 聚焦「域/组织」侦察,与 maigret「按人/用户名」互补 |
| mxrch/GHunt | 19.0K | Google 账号 OSINT | 垂直深挖单一生态;maigret 横向覆盖 3000+ 站(深度 vs 广度) |
差异化护城河
站点库时效——引擎是可复制的公共品,真正难复制的是「3000+ 站点判定规则的持续维护」+ 维护机制(自动更新、贡献流程、CI 校验、self-check 回归)。作者明确把每日更新的 5000+ 库留作商业护城河。
竞争风险
- 时效脆弱:站点改版即坏,工具时效高度依赖站点库的持续更新(fix 占 28% 印证);
- 误报/漏报结构性存在:弱标记站点 + CF 场景会产假阳,作者自己量化但未根治,不应据单一命中做身份归因;
- 隐私/伦理边界:聚合的虽是公开信息,但「按人跨站聚合」产生远超单条信息的敏感度——这是能力本身的固有风险,仅有声明式免责、无技术性约束;
- 商业引流关联:README 为自家商业产品导流,开源工具与商业漏斗存在利益关系。
生态定位
用户名枚举这一垂直能力的事实标准实现,工程成熟度(测试、CI、热更新、库化)明显高于同类;常作为 SpiderFoot 等更广 OSINT 框架的上游能力被嵌入(CLI 是异步函数的薄包装,可库化调用)。
套利机会分析
- 信息差:无「低估套利」——OSINT 圈知名工具、认知饱和。内容套利点在客观拆解「数据即资产的架构(66% 是数据库)+ 规则库维护方法论 + 引擎开源/库闭源的商业双轨」,而非复述工具用法。
- 技术借鉴:数据驱动检查引擎、有界并发流式执行器、正负双向判定 + 错误降级、校验式数据热更新协议、真值回归自检、HTML 集合差分自动生成规则——这些纯工程模式可迁移到任何「规则库型探测/扫描/监控工具」(与 OSINT 无关)。
- 生态位:用户名维度做深的标杆;与更广 OSINT 框架互补而非竞争。
- 趋势判断:OSINT 工具持续刚需;maigret 的工程方法论(尤其规则库维护)值得任何「数据驱动型工具」学习;隐私监管(GDPR/CCPA)趋严是这类工具的长期合规变量。
风险与不足
- 隐私/法律边界:工具聚合公开信息,但按人聚合即触及隐私,合法用途限于授权调查、安全研究、新闻调查、检查自身数字足迹;滥用即跟踪/起底。需遵守 GDPR/CCPA 等当地法律,作者明确「不为滥用负责」。本分析不提供任何针对他人的操作指南。
- 准确性风险:误报/漏报真实存在(issue 区高频 false negative/positive),「presence 默认为真」是结构性假阳源,不应据单一命中做身份归因。
- 时效维护脆弱:站点改版即失效,工具可用性高度依赖站点库持续更新(开源版社区维护、商业版每日更新)。
- 工程债:
checking.py(1644)/maigret.py(1101) 偏臃肿;executors.py5 个实现 4 个 Deprecated 长期未删;测试覆盖阈值仅 60%,递归/抽取路径多处# TODO: tests。 - 商业关联:README 内嵌商业产品引流,开源与商业漏斗存在利益关系。
行动建议
- 如果你要用它:合法用途包括授权调查、安全研究、新闻调查、检查自身数字足迹(官方 Telegram bot 即主打此场景);务必遵守当地隐私法、仅对授权目标使用、不据单一命中做归因(误报真实存在)。需更高时效/更广站点可评估其商业版。
- 如果你要学它(工程层面):直奔
maigret/sites.py(声明式站点 schema + 引擎模板合并)、maigret/checking.py+maigret/error_detection.py(异步引擎 + 双向判定 + 分层误报检测)、maigret/executors.py(有界并发流式执行器)、maigret/db_updater.py(校验式数据热更新)、maigret/submit.py(HTML 集合差分自动生成规则)。这套「数据驱动检查引擎 + 规则库维护方法论」是与 OSINT 无关、可直接迁移的工程参考。 - 如果你要 fork / 借鉴它:数据驱动 schema + 引擎模板 + 校验式热更新 + 真值回归自检是整套可迁移的「规则库型工具」骨架;注意 MIT 许可与授权使用边界。
知识入口
| 资源 | 链接 |
|---|---|
| 官方文档 | https://maigret.readthedocs.io ;主页 https://maigret.app(Telegram bot 落地页,主打查自身足迹) |
| DeepWiki | https://deepwiki.com/soxoj/maigret(已收录,含站点数据库/检查系统/报告生成/异步执行架构章节) |
| 外部独立分析 | A Comparison of Username-Search OSINT Tools(MeetCyber)(把 maigret 定位为「调查笔记本」而非「快速查询器」) |
| 同类对照 | sherlock-project/sherlock(前身)、spiderfoot/theHarvester(更广 OSINT 框架)、GHunt(Google 垂直) |