特性

以下是 Maigret 的特性列表。

Web 界面

你可以以 Web 界面的方式运行 Maigret —— 在同一个页面里查看结果图谱、并下载所有格式的报告。

Web 界面:启动页 Web 界面:结果页

使用步骤:

  1. 使用 --web 参数运行 Maigret,并指定端口号。

maigret --web 5000
  1. 在浏览器中打开 http://127.0.0.1:5000,输入一个或多个用户名以发起搜索。

  2. 稍等片刻搜索完成后,即可查看结果图谱、列出全部已发现账号的表格,并下载所有格式的报告。

Telegram 机器人

社区维护的一个 Telegram 机器人让你无需在本地安装就能运行 Maigret。

个人信息收集

Maigret 会解析账号网页并抽取 个人信息、指向其它主页的链接等内容。抽取结果会以附加信息的形式出现在 CLI 输出中,并在 HTML 和 PDF 报告中以表格呈现。此外,Maigret 还会用从链接中发现的 ID 和用户名,启动递归搜索。

默认启用,可通过 --no extracting 关闭。

$ python3 -m maigret soxoj --timeout 5
    [-] Starting a search on top 500 sites from the Maigret database...
    [!] You can run search by full list of sites with flag `-a`
    [*] Checking username soxoj on:
    ...
    [+] GitHub: https://github.com/soxoj
            ├─uid: 31013580
            ├─image: https://avatars.githubusercontent.com/u/31013580?v=4
            ├─created_at: 2017-08-14T17:03:07Z
            ├─location: Amsterdam, Netherlands
            ├─follower_count: 1304
            ├─following_count: 54
            ├─fullname: Soxoj
            ├─public_gists_count: 3
            ├─public_repos_count: 88
            ├─twitter_username: sox0j
            ├─bio: Head of OSINT Center of Excellence in @SocialLinks-IO
            ├─is_company: Social Links
            └─blog_url: soxoj.com
    ...

用户名变体生成

Maigret 可以生成用户名的各种变体组合。只需在命令行传入几个用户名并加上 --permute 参数即可。感谢 @balestek 提供的想法和实现。

$ python3 -m maigret --permute hope dream --timeout 5
[-] 12 permutations from hope dream to check...
    ├─ hopedream
    ├─ _hopedream
    ├─ hopedream_
    ├─ hope_dream
    ├─ hope-dream
    ├─ hope.dream
    ├─ dreamhope
    ├─ _dreamhope
    ├─ dreamhope_
    ├─ dream_hope
    ├─ dream-hope
    └─ dream.hope
[-] Starting a search on top 500 sites from the Maigret database...
[!] You can run search by full list of sites with flag `-a`
[*] Checking username hopedream on:
...

报告

Maigret 目前支持 HTML、PDF、TXT、XMind 8 思维导图和 JSON 等格式的报告。

HTML / PDF 报告包含以下内容:

  • 头像

  • 已收集到的全部个人信息

  • 基于所有已发现账号的统计,推测出的额外个人数据(真实姓名、性别、所在地)

此外,在搜索结束后,CLI 输出中也会附上一份简短的文本报告。

警告

XMind 8 思维导图与 XMind 2022 不兼容!

AI 分析

通过 --ai 参数,Maigret 可以基于原始搜索结果生成一份简短、易读的调查摘要。它会先构建一份内部 Markdown 报告,将其发送至一个 OpenAI 兼容的 chat completion 接口,并把模型的回复以流式方式直接输出到终端。

export OPENAI_API_KEY=sk-...
maigret username --ai

该摘要采用固定格式,包含最可能的真实姓名、所在地、职业、兴趣、语言、主要使用的网站、用户名变体、出现过的平台数量、活跃年份、置信度评级,以及一份简短的后续线索清单。--ai 启用期间,逐站点进度和简短文本报告都会被抑制,以让这份流式摘要成为主要输出。

接口地址、模型名和 API key 可通过 settings.json(对应字段 openai_api_keyopenai_modelopenai_api_base_url)或 OPENAI_API_KEY 环境变量进行配置。可使用任意 OpenAI 兼容接口(Azure OpenAI、OpenRouter、本地推理服务等)。详情参见 AI 分析(内置)配置

标签

Maigret 的站点数据库已经很庞大(并且还会继续扩张),对所有站点都跑一遍搜索未必划算。同时,在调查某个具体人物时,也不容易判断哪些站点更值得关注。

标签体系允许按兴趣(摄影、即时通讯、金融等)或国家挑选站点子集。已发现账号上的标签会被分组,并显示在报告中。

完整说明请参见 标签页

审查和 CAPTCHA 检测

Maigret 能够识别一些常见错误,例如审查占位页、CloudFlare 验证码页等等。如果在一次会话中某类错误超过了 3%,CLI 输出里就会打印一条警告,并附上用于改善表现、规避问题的建议。

重试

对于遇到临时性错误(连接失败、代理错误等)的请求,Maigret 会进行重试。

默认尝试一次,可通过 --retries N 参数调整。

数据库自检

Maigret 内置了一个自检模式(--self-check),它会针对数据库中每个站点,分别查询已知被占用和已知未被占用的用户名,并验证检测结果是否符合预期。

自检过程是容错的:如果某个站点的检查抛出意外异常(例如网络错误或解析失败),该错误会被捕获并记录为一个问题项,而其余站点会继续被检查,不会被中断。因此,即便使用 -a --self-check 检查上百个站点,该流程也总能顺利跑完。

配合 --self-check 使用 --auto-disable 可以把检查失败的站点自动禁用;不加该参数时,问题项只会被报告出来,而不会真正禁用。使用 --diagnose 则可以打印每个站点的详细诊断信息,包括检查类型、具体问题和修复建议。

# Report-only mode (no changes to the database)
maigret --self-check

# Automatically disable failing sites and save updates
maigret -a --self-check --auto-disable

# Show detailed diagnosis for each failing site
maigret -a --self-check --diagnose

归档站与镜像站检查

Maigret 数据库中不仅包含原始网站,还包含镜像、归档和聚合站点。例如:

通过这些站点,可以获取关于目标人物的额外信息;即便主站点不可用(机器人防护、CAPTCHA 等),也仍能验证账号是否存在。

Cloudflare webgate 绕过

警告

实验性特性。 Cloudflare webgate 正处于积极开发阶段。配置项、CLI 参数行为以及经由其路由的站点集合都可能发生变化,不保证向后兼容。你可能会遇到一些不完善之处(CF 限速、求解器偶尔失败等),欢迎反馈以便逐步打磨。

部分站点位于完整的 Cloudflare JavaScript 挑战或 CF 防火墙硬封锁之后 —— 它们在数据库中被打上 protection: ["cf_js_challenge"]protection: ["cf_firewall"] 标记,并通常被禁用,因为 aiohttp 和 curl_cffi 都无法自行解出 JS 挑战。

Maigret 可以把这类检查转交给本地的 Chrome 类求解器。目前支持两种后端,通过 settings.json 中的 cloudflare_bypass.modules 配置(第一个能连通的模块生效,后续模块作为兜底链依次尝试):

  • FlareSolverr(推荐)。运行一个真实的 Chrome 实例,并暴露 JSON API。上游真实的 HTTP 状态码、响应头和最终 URL 都会被保留,因此 checkType: status_codecheckType: response_url 在绕过模式下依然能正常工作。

    docker run -d -p 8191:8191 --name flaresolverr ghcr.io/flaresolverr/flaresolverr:latest
    
  • CloudflareBypassForScraping(旧版兜底)。只返回渲染后的 HTML,因此上游真实状态码会丢失 —— checkType: message 仍然可用,但 status_code 类检查会失准(成功时会被视为 200)。

启用绕过有两种方式,一是命令行参数:

maigret --cloudflare-bypass <username>

或在 settings.json 中将 cloudflare_bypass.enabled 设为 true。Web 界面(python -m maigret.web.app)读取的是同一份配置 —— 表单中没有单独的开关,因此切换 enabled 就是浏览器场景下启用绕过的唯一方式。

该绕过只对 protection 字段与 cloudflare_bypass.trigger_protection(默认 ["cf_js_challenge", "cf_firewall", "webgate"])有交集的站点生效;其它站点仍走常规的 aiohttp / curl_cffi 路径。

如果所有配置的模块都不可达,受影响的站点会被标记为 UNKNOWN,并附上一条可操作的错误信息,指向首个模块的 URL —— 绝大多数情况下,只需把 FlareSolverr 容器跑起来就能解决。

FlareSolverr 的 session 复用是自动的:Maigret 会在每次运行时固定一个 session: <session_prefix>-<pid>,这样对同一域名的多次检查就会共享 cf_clearance cookie(后续对该主机的请求会快 5–10 倍)。

激活机制

激活机制用于向那些需要额外认证(cookie、JWT token、自定义请求头等)的站点发起请求。

其实现方式是通过一个自定义函数,完成以下三步:

  1. 向某个特定网站端点发起一个专门的 HTTP 请求

  2. 处理响应内容

  3. 在本地 Maigret 数据库中更新该站点对应的请求头/cookie

由于激活只在遇到特定错误后才会触发,因此要拿到使用新认证信息的有效响应,还需要再触发一次重试(或重新运行一次 Maigret)。

激活机制默认启用,目前无法关闭。

更多细节请参见开发文档中的 激活机制 一节。

从账号页面抽取信息

Maigret 可以根据给定 URL 解析网页地址及其内容,抽取账号所有者及其它元信息。

需要使用 --parse 选项指定 URL,可以是某个账号的链接,也可以是在线文档的链接。支持的站点列表请查看此处

解析阶段结束后,Maigret 会根据从中找到的 受支持标识符(用户名、ID 等)进入搜索阶段。

$ maigret --parse https://docs.google.com/spreadsheets/d/1HtZKMLRXNsZ0HjtBmo0Gi03nUPiJIA4CC4jTYbCAnXw/edit\#gid\=0

Scanning webpage by URL https://docs.google.com/spreadsheets/d/1HtZKMLRXNsZ0HjtBmo0Gi03nUPiJIA4CC4jTYbCAnXw/edit#gid=0...
┣╸org_name: Gooten
┗╸mime_type: application/vnd.google-apps.ritz
Scanning webpage by URL https://clients6.google.com/drive/v2beta/files/1HtZKMLRXNsZ0HjtBmo0Gi03nUPiJIA4CC4jTYbCAnXw?fields=alternateLink%2CcopyRequiresWriterPermission%2CcreatedDate%2Cdescription%2CdriveId%2CfileSize%2CiconLink%2Cid%2Clabels(starred%2C%20trashed)%2ClastViewedByMeDate%2CmodifiedDate%2Cshared%2CteamDriveId%2CuserPermission(id%2Cname%2CemailAddress%2Cdomain%2Crole%2CadditionalRoles%2CphotoLink%2Ctype%2CwithLink)%2Cpermissions(id%2Cname%2CemailAddress%2Cdomain%2Crole%2CadditionalRoles%2CphotoLink%2Ctype%2CwithLink)%2Cparents(id)%2Ccapabilities(canMoveItemWithinDrive%2CcanMoveItemOutOfDrive%2CcanMoveItemOutOfTeamDrive%2CcanAddChildren%2CcanEdit%2CcanDownload%2CcanComment%2CcanMoveChildrenWithinDrive%2CcanRename%2CcanRemoveChildren%2CcanMoveItemIntoTeamDrive)%2Ckind&supportsTeamDrives=true&enforceSingleParent=true&key=AIzaSyC1eQ1xj69IdTMeii5r7brs3R90eck-m7k...
┣╸created_at: 2016-02-16T18:51:52.021Z
┣╸updated_at: 2019-10-23T17:15:47.157Z
┣╸gaia_id: 15696155517366416778
┣╸fullname: Nadia Burgess
┣╸email: nadia@gooten.com
┣╸image: https://lh3.googleusercontent.com/a-/AOh14GheZe1CyNa3NeJInWAl70qkip4oJ7qLsD8vDy6X=s64
┗╸email_username: nadia
$ maigret.py --parse https://steamcommunity.com/profiles/76561199113454789
Scanning webpage by URL https://steamcommunity.com/profiles/76561199113454789...
┣╸steam_id: 76561199113454789
┣╸nickname: Pok
┗╸username: Machine42

简单 API

借助 Python 包 maigret,可以很方便地把 Maigret 集成到自己的项目中。

示例:社区维护的 Telegram 机器人