当前位置: 首页 > news >正文

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)

http://www.jsqmd.com/news/1099318/

相关文章:

  • Python多线程开发入门指南
  • 【KAE报错】安装KAE后,使用openssl测试KAE是否生效报错_Invalid_engine_quot;kaequot;
  • Python函数设计与最佳实践
  • 告别Ctrl+左键失效!用Wire实现Go编译时依赖注入,调试体验直线上升
  • VSCode + Markdown All in One:打造你的高效Emoji输入工作流(2024版)
  • Python多线程开发实践
  • Python协程Asyncio全面解析
  • Rust生命周期全面解析
  • Claude 3.5 Sonnet推理链路‘静默坍缩’:结构化指令零延迟实现原理
  • 终极指南:快速上手OpenVINO AI音频插件,免费为Audacity注入AI超能力
  • Linux基础命令详解
  • Python函数设计最佳实践
  • AI智能体工程化实战:从Harness Engineering到Hermes Agent部署
  • Playwright轨迹模拟进阶:贝塞尔曲线真的能骗过AI行为检测吗?从数学模型到防御启示
  • 这份大厂Java高频面试题(2026最新版),建议直接收藏
  • 告别手速焦虑:5分钟掌握B站会员购抢票自动化工具
  • AI视频剪辑技术解析:从特征提取到故事构建的自动化流程
  • Dism++终极指南:Windows系统清理与备份的完整解决方案
  • MySQL执行计划解析
  • 基于YOLOv8的铁轨障碍物检测系统:从数据准备到边缘部署全流程实践
  • 大模型基础执行学习- 3(transformer)
  • 手把手教你用FPGA的SPI驱动AD9516-3:从评估软件到上板验证的完整避坑指南
  • 从安装到工程化:本地AI智能体框架Hermes Agent实战指南
  • 明日方舟资源宝库:游戏美术素材与数据的终极指南
  • Meta Quest 播放软件《下一代视频播放器》NEXt-Gen Video Player 下载和使用教程
  • Mevory技术解析:跨平台学习同步的难点与一致性保障方案
  • Saga 模式实现:从补偿事务到状态机编排,分布式事务的最终一致性之路
  • 5分钟快速上手Mate Engine:打造你的免费虚拟桌面伙伴终极指南
  • 别再手动整理图层了!用NX二次开发UF_LAYER函数批量管理,效率翻倍
  • 【论文复现】存在测距误差的WSN无锚点分布式自定位,《WSN中存在测距误差的无锚点分布式自定位方法》