为什么你需要 Maigret?

想象这个场景:你在做一个安全渗透测试项目,客户给了你一个可疑用户名,想知道这人在哪些平台注册过账号。你打开浏览器,一个一个网站去搜——GitHub、Twitter、Reddit、V2EX……搜到第30个网站时,天已经黑了。

又或者,你发现公司某个内部系统被撞库攻击,攻击者用同一个用户名注册了多个影子账号。你需要快速知道这个用户名在整个互联网上的"足迹地图"。

手动搜索低效、遗漏多、不可复现。 这正是 Maigret 要解决的问题。

Maigret 是开源社区最活跃的 OSINT(开源情报)工具之一,由安全研究员 [soxoj](https://github.com/soxoj) 维护,截至2026年6月已支持 3100+ 网站 的用户名检测。一条命令下去,几分钟内扫完几百个主流平台,自动解析出个人资料、关联账号、用户ID等结构化数据,还能一键导出 HTML/PDF/XMind 报告。

Maigret 项目主页截图

**合法使用声明**: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、站点描述、匹配状态:

Maigret HTML 报告效果

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 力导向图展示用户名在各平台间的关联关系
  • 一键导出按钮

Maigret Web 界面


避坑指南: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)

更多推荐