Maigret实战:Python3步挖掘3000+网站用户名
为什么你需要 Maigret?
想象这个场景:你在做一个安全渗透测试项目,客户给了你一个可疑用户名,想知道这人在哪些平台注册过账号。你打开浏览器,一个一个网站去搜——GitHub、Twitter、Reddit、V2EX……搜到第30个网站时,天已经黑了。
又或者,你发现公司某个内部系统被撞库攻击,攻击者用同一个用户名注册了多个影子账号。你需要快速知道这个用户名在整个互联网上的"足迹地图"。
手动搜索低效、遗漏多、不可复现。这正是 Maigret 要解决的问题。
Maigret 是开源社区最活跃的 OSINT(开源情报)工具之一,由安全研究员 [soxoj](https://github.com/soxoj) 维护,截至2026年6月已支持3100+ 网站的用户名检测。一条命令下去,几分钟内扫完几百个主流平台,自动解析出个人资料、关联账号、用户ID等结构化数据,还能一键导出 HTML/PDF/XMind 报告。
**合法使用声明**:Maigret 仅用于授权的安全测试、数字身份调查和学术研究。未经他人同意擅自搜索其个人信息可能违反隐私法规,请务必遵守当地法律。
环境准备
Maigret 基于 Python 3.10+,安装极其简单:
# 强烈建议在虚拟环境中安装 python -m venv maigret-env source maigret-env/bin/activate # Linux/macOS # maigret-env\Scripts\activate # Windows pip install maigret安装完成后验证:
maigret --versionmaigret v0.4.6步骤1:基础命令行搜索——一行扫遍500+热门站点
Maigret 默认扫描全球流量排名前500的网站,兼顾速度和覆盖面。最基本的用法只需一个用户名:
maigret soxoj运行效果如下——终端实时显示每个站点的检测进度和结果:
[>] Searching username soxoj: [+] GitHub: https://github.com/soxoj [+] Twitter: https://twitter.com/soxoj [+] Reddit: https://www.reddit.com/user/soxoj [+] Habr: https://habr.com/ru/users/soxoj [+] Medium: https://medium.com/@soxoj [-] Instagram: Not found [-] Facebook: Not found ... [?] Checking gitee.com: 403 Forbidden (may be rate-limited) ... [!] 100% finished. 512 targets checked in 47.3s [+] Profiles found: 23 [-] Not found: 476 [?] Errors: 13关键参数速查:
| 参数 | 作用 |
|------|------|
|--all-sites/-a| 扫描全部3100+站点(耗时长) |
|--tags cn| 只看中国站点(coding,social,photo等) |
|--timeout 15| 单个站点超时时间调整 |
|--retries 2| 失败重试次数 |
|--no-recursive| 关闭递归搜索 |
实际使用中,建议先不加--all-sites,拿到初步结果后再针对特定类别补搜:
# 先快速扫描热门站点 maigret suspicious_user # 发现这个用户活跃在技术社区,追加扫描 coding 类全部站点 maigret suspicious_user --all-sites --tags coding --timeout 20 --retries 2步骤2:生成可视化报告——HTML/PDF 一键导出
命令行输出固然直观,但要给客户交付成果,一份精美的 HTML 或 PDF 报告必不可少。Maigret 内置了多种导出格式:
# 生成 HTML 交互报告(默认输出到 reports/ 目录) maigret suspicious_user --html # 生成 PDF 报告 maigret suspicious_user --pdf # 生成 JSON 结构化数据(方便后续程序处理) maigret suspicious_user --json # 生成 CSV 表格 maigret suspicious_user --csv # 一键生成全部格式 maigret suspicious_user --all-reports生成的 HTML 报告效果如下——每个发现的站点以卡片形式展示,含用户名、URL、站点描述、匹配状态:
PDF 报告的特色功能:
- 自动提取每个平台的头像和简介
- 按站点类别分组排列
- 附检测统计摘要(命中率、错误分布)
- 支持 XMind 思维导图导出,方便做关系图谱分析
# 生成 XMind 思维导图,配合 --tags 筛选特定类别 maigret suspicious_user --xmind --all-sites步骤3:Python 脚本批量搜索——自动化信息收集流水线
如果你需要批量检测几十个用户名,或者把 Maigret 集成到自己的自动化工具链里,直接上 Python API。下面是一个完整可运行的批量搜索脚本:
""" batch_maigret.py —— 批量用户名 OSINT 搜查脚本 用法: python batch_maigret.py 依赖: pip install maigret pandas """ import asyncio import logging import json from datetime import datetime from pathlib import Path from maigret import search as maigret_search from maigret.sites import MaigretDatabase, MaigretSite # ============ 配置区 ============ USERNAMES = ["alice_dev", "bob_hacker", "carl_the_coder"] # 要搜索的用户名列表 TOP_N_SITES = 300 # 扫描前 N 个热门站点 TIMEOUT = 20 # 单站超时(秒) OUTPUT_DIR = Path("./maigret_results") # =============================== async def search_one_username(username: str, db: MaigretDatabase, logger: logging.Logger): """搜索单个用户名,返回命中结果字典""" sites = db.ranked_sites_dict(top=TOP_N_SITES) print(f"\n{'='*60}") print(f"[*] 开始搜索: {username}") print(f"{'='*60}") results = await maigret_search( username=username, site_dict=sites, logger=logger, timeout=TIMEOUT, is_parsing_enabled=True, # 开启资料解析,提取关联账号 max_connections=100, # 并发连接数 retries=1, ) # 筛选命中结果 hits = {} for site_name, result in results.items(): status = result.get("status") if status and status.is_found(): hits[site_name] = { "url": result.get("url_user", ""), "ids_data": result.get("ids_data", {}), "rank": result.get("rank", 0), } print(f" [+] {site_name}: {result.get('url_user', '')}") print(f"\n[✓] {username} 搜索完成: {len(hits)}/{TOP_N_SITES} 命中") return username, hits async def main(): logger = logging.getLogger("maigret") logger.setLevel(logging.WARNING) # 减少日志噪音 # 加载站点数据库 print("[*] 加载 Maigret 站点数据库...") # data.json 位于 maigret 包的 resources 目录下 # 若下面路径报错,可从 GitHub Releases 下载 data.json 到当前目录 from importlib import resources as _resources try: with _resources.path("maigret.resources", "data.json") as p: db = MaigretDatabase().load_from_path(str(p)) except (ModuleNotFoundError, FileNotFoundError): db = MaigretDatabase().load_from_path("data.json") print(f"[*] 数据库加载完成,共 {len(db.sites)} 个站点") # 批量搜索 OUTPUT_DIR.mkdir(parents=True, exist_ok=True) all_hits = {} for username in USERNAMES: _, hits = await search_one_username(username, db, logger) all_hits[username] = hits # 汇总输出 timestamp = datetime.now().strftime("%Y%m%d_%H%M%S") report_path = OUTPUT_DIR / f"batch_report_{timestamp}.json" with open(report_path, "w", encoding="utf-8") as f: json.dump(all_hits, f, indent=2, ensure_ascii=False) # 打印汇总表 print(f"\n{'='*60}") print(f" 批量搜索汇总") print(f"{'='*60}") print(f"{'用户名':<25} {'命中数':>6}") print(f"{'-'*31}") for username, hits in all_hits.items(): print(f"{username:<25} {len(hits):>6}") print(f"\n[✓] 报告已保存: {report_path}") if __name__ == "__main__": asyncio.run(main())运行效果:
[*] 加载 Maigret 站点数据库... [*] 数据库加载完成,共 3157 个站点 ============================================================ [*] 开始搜索: alice_dev ============================================================ [+] GitHub: https://github.com/alice_dev [+] Reddit: https://www.reddit.com/user/alice_dev [+] StackOverflow: https://stackoverflow.com/users/123456/alice_dev [+] Medium: https://medium.com/@alice_dev [✓] alice_dev 搜索完成: 4/300 命中 ============================================================ [*] 开始搜索: bob_hacker ============================================================ [+] GitLab: https://gitlab.com/bob_hacker [+] LeetCode: https://leetcode.com/bob_hacker [✓] bob_hacker 搜索完成: 2/300 命中 ============================================================ 批量搜索汇总 ============================================================ 用户名 命中数 ------------------------------- alice_dev 4 bob_hacker 2 carl_the_coder 0 [✓] 报告已保存: maigret_results/batch_report_20260630_143021.json脚本中的is_parsing_enabled=True是关键参数——它会调用内置的socid_extractor,从找到的页面中自动提取用户的个人简介、关联的其他平台账号等结构化数据,存放在ids_data字段里。
Web 可视化界面(附赠技巧)
如果你更喜欢图形化操作,Maigret 还内置了一个 Web 界面:
maigret --web 5000浏览器打开http://localhost:5000,你会看到一个交互式的搜索面板,支持:
- 可视化输入框,搜索结果实时渲染为卡片
- D3.js 力导向图展示用户名在各平台间的关联关系
- 一键导出按钮
避坑指南:4 个实际踩过的坑
坑1:扫描中途大量 403/429 错误
扫描几百个站点时,某些平台会检测到异常流量并返回 403 或 429(Too Many Requests)。这不是 Maigret 的 bug,而是目标网站的反爬策略。解决方案是降低并发并增加重试间隔:
maigret username --max-connections 30 --timeout 30 --retries 3如果你的 IP 已经被某些平台封了,可以挂上代理:
maigret username --proxy socks5://127.0.0.1:1080坑2:data.json 找不到
如果你是git clone而不是pip install,运行 Python API 时会遇到FileNotFoundError: data.json。两种解法:
# 方法一:pip install(推荐——data.json 自动随包安装) pip install maigret # 方法二:手动下载 data.json 放到脚本同目录 # 从 https://github.com/soxoj/maigret/releases 下载最新 data.json坑3:Python API 中 `is_parsing_enabled=True` 拖慢速度
开启资料解析(is_parsing_enabled=True)后,Maigret 会对每个命中页面发起额外的 HTTP 请求去抓取个人资料。如果你只需要知道"是否注册"而不关心"注册了什么信息",关掉它能让速度提升 40% 以上:
results = await maigret_search( username=username, site_dict=sites, logger=logger, timeout=TIMEOUT, is_parsing_enabled=False, # 关闭解析,大幅提速 )坑4:Windows 终端中文乱码
Windows 下如果输出出现乱码,在 PowerShell 中先执行:
[Console]::OutputEncoding = [System.Text.Encoding]::UTF8 chcp 65001或在 Python 脚本开头加上:
import sys sys.stdout.reconfigure(encoding='utf-8')总结
| 场景 | 推荐命令 |
|------|---------|
| 快速排查可疑用户 |maigret username|
| 全面深度搜索 |maigret username --all-sites --html --pdf|
| 只看中国/技术社区 |maigret username --tags cn,coding --html|
| 批量自动化 | 上面步骤3的 Python 脚本 |
| 团队协作/演示 |maigret --web 5000|
Maigret 把"用户名 → 互联网画像"这个过程从手工劳作变成了自动化流水线。配合 Python API,你完全可以把它的输出接入自己的 SIEM、威胁情报平台或者社工库查询管线。
一个建议:实际使用时务必设置合理的--timeout和并发数,否则扫描 3000+ 站点可能触发目标平台的反爬机制。通常--timeout 20+ 默认并发 100 是一个比较安全的平衡点。
试试用你自己的网名跑一遍,可能会发现一些你已经忘掉但还在公网上的老账号——清理数字足迹,也可以从这个工具开始。
项目地址:[https://github.com/soxoj/maigret](https://github.com/soxoj/maigret)
官方文档:[https://maigret.readthedocs.io](https://maigret.readthedocs.io)
