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 --version
maigret 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)
更多推荐


所有评论(0)