当我开始学习开放源代码情报收集技术时,总觉得自己只是在将一些随机数据输入到软件中,而并没有真正理解自己在做什么。经过几个月的实际操作后,我意识到自己其实并没有进行真正的调查——我只是按照某种可预测的步骤来执行操作而已。而这正是人工智能所擅长的领域。因此,我就创建了一个人工智能系统。

在这个教程中,你将学习如何搭建OpenOSINT这个以人工智能为核心的开源Python情报收集框架。你会了解Claude的工具使用API的工作原理,学会如何通过终端使用交互式AI REPL来自动执行调查任务,也会学习如何使用命令行接口编写脚本,以及如何通过MCP服务器将所有工具连接到Claude Code或Claude Desktop系统中。

目录

什么是开放源代码情报收集技术,以及为什么手动操作会遇到问题

开放源代码情报收集技术是指从公开可获取的来源中收集并分析信息的一种方法。安全研究人员在渗透测试时会使用这种技术;记者们利用它来验证身份信息并追踪各种联系线索;威胁分析师则用它来分析基础设施的相关情况。

典型的开放源代码情报收集工作流程如下:

  1. 你获得了目标用户的电子邮件地址

  2. 你运行holehe命令,查看该电子邮件地址在哪些平台上被注册使用

  3. 你在输出结果中看到了某个用户名

  4. 你手动复制这个用户名,然后运行sherlock命令,在300多个平台上进行搜索

  5. 你切换到浏览器,查看“HaveIBeenPwned”网站上的信息

  6. 你再打开一个标签页,通过WHOIS查询来获取更多信息

  7. 你记录下这些信息,然后重复这个过程

  8. 每一个工具都是独立运行的,每一次操作都需要人工进行决策。关于接下来应该执行什么步骤、哪些操作需要串联起来进行、以及调查结果意味着什么,这些信息全都存储在你的脑海中。

    一旦你关闭终端窗口,所有之前的工作成果就会消失得无影无踪。

    本教程将引导您了解OpenOSINT这一开源Python框架。该框架通过使用人工智能代理来自动连接各种工具,这些代理会针对真实的二进制文件执行相应的操作,并生成结构化的Markdown报告,从而替代原有的分散式工作流程。

    更重要的是,您将了解到这一框架的核心设计原则,正是这一原则使其在安全研究领域具备可靠性:工具运行结果中出现虚假信息在技术上是完全不可能的

    您将构建什么

    完成本教程的学习后,您将获得一个可实际使用的OSINT代理,它可以被用于以下三种方式:

    • 交互式AI命令行界面——您可以使用自然语言输入目标信息,代理会自动决定需要运行哪些工具

    • 直接命令行接口——无需借助人工智能功能,可直接单独运行各种工具,非常适合编写脚本使用

    • MCP服务器——可将所有工具暴露给Claude Code或Claude Desktop平台进行使用

    以下是一个实际操作示例:

    $ openosint
    openosint ❯ investigate target@example.com
    
      → generate_dorks('target@example.com')
      → search_email('target@example.com')
      ✓ 找到:Spotify、WordPress、Gravatar、Office365
    
      → search_breach('target@example.com')
      ✓ 在2起数据泄露事件中找到相关记录:LinkedIn(2016年)、Adobe(2013年)
    
      → search_username('target_handle')
      ✓ 找到该用户名存在于GitHub、Reddit、HackerNews和Twitter上
    
      ╭──────────────── 报告 ────────────────╮
      │ ## 在线账户信息                     │
      │ Spotify · WordPress · Gravatar         │
      │                                        │
      │ ## 数据泄露记录                       │
      │ LinkedIn (2016) · Adobe (2013)         │
      ╰────────────────────────────────────────╯
    
      ✓ 报告已保存 → reports/2026-05-11_report.md
    

    在整个操作过程中,没有任何人工干预的环节——代理自动完成了从查询电子邮件地址到查找关联账户、再到搜索用户名的整个流程,并最终进行了跨平台搜索。

    先决条件

    要学习本教程,您需要满足以下要求:

    • 您的计算机上已安装Python 3.10或更高版本

    • 具备基本的命令行使用经验

    • 需要拥有Anthropic API密钥——该密钥仅适用于AI命令行界面,不适用于直接命令行接口或MCP服务器

    • 已安装Git工具

    您不需要具备使用OSINT工具或Anthropic SDK的先验经验。

    Claude的工具使用API的工作原理

    在开始安装之前,了解这一框架为何能在安全研究领域发挥作用是十分重要的。

    大多数利用外部工具的人工智能应用程序都是通过生成描述工具“应该”返回结果的文本来工作的。然而,当准确性至关重要的时候,这种机制就会产生问题——模型可能会生成看似合理的用户名、伪造的子域名信息,或是根本从未发生过的数据泄露事件记录。

    Claude的工具使用API的工作方式有所不同。当模型决定需要调用某个工具时,它不会自行生成输出结果。相反,它会发送一个结构化的tool_use请求,其中包含所需使用的工具名称及参数信息。

    你的代码会运行实际的二进制文件——无论是holehesherlock还是其他工具——并将实际的输出结果以tool_result的形式返回。模型会读取这些输出结果,然后决定下一步该做什么。
    具体的执行流程如下:

    用户输入指令
        ↓
    模型决定调用search_email()函数
        ↓
    程序遇到无法继续执行的情况,于是输出tool_use代码块
        ↓
    你的代码会使用holehe工具针对目标对象进行操作
        ↓>
    实际的输出结果会被作为tool_result返回
        ↓>
    模型读取这些结果后,会确定下一步的行动方案
        ↓>
    重复上述步骤,直到调查完成
    

    模型本身并不会生成任何输出结果,它只会读取输入的数据。如果sherlock找到了12个相关地址,那么这12个URL会原封不动地被重新纳入分析流程中。模型无法伪造第13个不存在的地址。
    这并不是某种提示技巧,也不是系统发出的指令。这就是该API的设计方式。在后续阅读本教程中关于代理循环部分的代码时,请务必记住这一点。

    如何安装OpenOSINT

    首先,克隆仓库并安装相关包:

    git clone https://github.com/OpenOSINT/OpenOSINT.git
    cd OpenOSINT
    pip install -e .
    

    或者,如果你只是想使用这些工具而不打算修改源代码,可以直接从PyPI上安装:

    pip install openosint
    

    接下来,设置你的Anthropic API密钥。这个密钥仅用于交互式AI REPL功能,直接通过CLI或MCP服务器使用这些工具时并不需要它:

    export ANTHROPIC_API_KEY=sk-ant-...
    

    如何安装外部工具依赖项

    OpenOSINT整合了多个独立的OSINT工具。你需要安装那些你打算使用的工具:

    pip install holehe            # 用于枚举电子邮件账户
    pip install sherlock-project  # 可在300多种平台上搜索用户名
    pip install sublist3r         # 用于枚举子域名
    

    对于手机信息收集功能,phoneinfoga是一个独立的二进制工具。你可以从其GitHub发布页面下载适合你操作系统的版本,然后将其添加到你的PATH环境变量中。

    如何配置可选的API密钥

    有两个工具在使用可选API密钥时能够提高使用频率限制:

    export HIBP_API_KEY=your_key    # 通过HaveIBeenPwned v3进行漏洞检测时需要这个密钥
    export IPINFO_TOKEN=your_token  # 可选设置——否则会触发ipinfo.io的频率限制
    

    如果某个工具缺失,或者API密钥没有配置正确,那么该工具就会返回相应的错误信息。其他工具则可以正常使用。

    如何使用交互式AI REPL

    运行不带任何参数的 openosint 命令,即可启动这个由人工智能支持的交互式环境。你也可以使用 openosint shell,它的功能与前者是相同的。

    $ openosint
    # 或者
    $ openosint shell
    

    如果你更喜欢直接输入API密钥,而不是通过环境变量来设置,可以使用--api-key参数:

    openosint ❯ 调查 target@example.com
    openosint ❯ 查找 johndoe99 所有的账户信息
    openosint ❯ example.com 拥有哪些子域名?
    openosint ❯ 判断 +14155552671 是否是手机号码
    

    根据你的输入,该工具会自动决定使用哪些功能来进行查询。你不需要指定具体使用哪些工具或它们的执行顺序。如果你输入了一个电子邮件地址,系统就会开始进行邮件地址的枚举;如果找到了与之关联的用户名,它还会在多个平台上搜索这个用户名。

    每次完成一次包含结构化结果的查询后,报告会自动保存到reports/目录中。

    以下是在REPL环境中可使用的命令:
    命令 描述
    clear 重置对话记录
    save 手动保存最近的报告
    tools 显示可用的工具及其状态
    config 查看当前配置信息
    help 列出所有命令
    exit 或 Ctrl-D 退出程序

    如何通过CLI单独运行工具

    如果你想不使用AI功能,仅单独运行某个工具——无论是用于脚本编写、自动化操作还是快速查询信息——可以直接使用CLI命令:

    # 进行电子邮件地址枚举(默认超时时间:120秒)
    openosint email target@example.com
    
    # 设置自定义的超时时间(单位为秒)
    openosint email target@example.com -t 60
    
    # 在300多个平台上搜索用户名(默认超时时间:180秒)
    openosint username johndoe99
    
    # 开启详细输出以便调试
    openosint -v email target@example.com
    

    直接使用CLI命令并不需要Anthropic API密钥。它只会运行底层的二进制程序,并将结果输出到终端上。

    当你需要可预测的、适合脚本执行的操作时,这种模式非常有用——例如,可以将查询结果传递给其他工具,或者执行自动化检查。

    如何配置MCP服务器

    OpenOSINT同时也提供了作为Model Context Protocol(MCP)服务器的功能。这样,任何支持MCP协议的AI客户端都可以使用这些工具。

    如何在Claude Code平台上注册

    claude mcp add openosint python /absolute/path/to/OpenOSINT/openosint/mcp_server.py
    

    确认注册是否成功:

    claude mcp list

    注册成功后,您就可以通过 Claude Code 提示来开展调查了:

    > 调查目标邮箱 example.com。如果发现关联的用户名,请在其他平台上追踪其使用情况,并编写一份完整的报告。

    如何配置 Claude Desktop

    ~/Library/Application Support/Claude/claude_desktop_config.json 文件中,添加以下内容到 Claude Desktop 的配置文件中:

    {
      "mcpServers": {
        "openosint": {
          "command": "python",
          "args": ["/absolute/path/to/OpenOSINT/openosint/mcp_server.py"]
        }
      }
    }
    

    保存文件后,重新启动 Claude Desktop。这些工具就会出现在 Claude 的工具列表中。

    MCP 服务器使用标准输入输出方式进行通信,因此不需要持续运行的后台进程。Claude Code 或 Claude Desktop 会根据需要随时启动它。

    代理循环的工作原理

    以下是从 openosint/agent.py 中提取的代理循环简化版本:

    import anthropic
    import asyncio
    
    client = anthropic.Anthropic()
    
    async def run_investigation(userprompt: str) -> str:
        messages = [{"role": "user", "content": user_prompt}]
    
        while True:
            response = client.messages.create(
                model="claude-...",   # 该模型是通过 --api-key 或环境变量配置的
                max_tokens=4096,
                tools=TOOL_SCHEMAS,   # 所有 9 种工具对应的 JSON 格式
                messages=messages
            )
    
            # 如果代理任务已完成,就提取最终报告并返回
            if response.stop_reason == "end_turn":
                return extract_text(response)
    
            # 如果需要使用某种工具,就会运行相应的程序
            if response.stop_reason == "tool_use":
                tool_results = []
    
                for block in response.content:
                    if block.type == "tool_use":
                        # 会以真实子进程的形式运行相关工具
                        real_output = await execute_tool(block.name, block.input)
    
                        tool_results.append({
                            "type": "tool_result",
                            "tool_use_id": block.id,
                            "content": real_output  # 这是工具实际产生的输出结果
                        })
    
                # 将代理对话内容以及工具运行结果添加到对话历史中
                messages.append({"role": "assistant", "content": response.content})
                messages.append({"role": "user", "content": tool_results})
    

    在这段代码中,有几点需要特别注意:

    1. 这个循环会一直运行,直到 stop_reason == "end_turn":代理会自行判断是否已经收集到了足够的信息来编写最终报告。根据调查结果的不同,它可能会使用一个工具,也可能使用十个工具。

    2. execute_tool()以真实子进程的形式运行相关程序:这个函数实际上是一个轻量级的异步封装层,它使用了 Python 的 asyncio.create_subprocess_exec(),并且允许设置超时时间。在整个过程中,没有任何模拟操作或虚拟数据被使用。

    3. 整个对话历史会被完整保留下来:每个工具运行后的结果都会被重新添加到 messages 列表中,因此模型在决定接下来该使用哪个工具时,能够随时获取所有的调查信息。

    4. 各种工具的参数格式都是以 JSON 格式定义的:每种工具都有对应的名称、描述以及参数格式。模型会根据这些信息来了解哪些工具可用,以及它们接受哪些参数。以下是 search_email 这个工具的示例:

    {
        "name": "search_email",
        "description": (
            "使用holehe工具,枚举与某个电子邮件地址相关联的在线服务及社交账号。"
        ),
        "input_schema": {
            "type": "object",
            "properties": {
                "email": {
                    "type": "string",
                    "description": "目标电子邮件地址"
                }
            },
            "required": ["email"]
        }
    }
    

    所有9种工具都遵循相同的架构模式。在每次请求开始时,系统会读取这些架构规范,并根据它们来确定可以使用哪些功能以及如何调用这些功能。

    项目架构

    代码库被分为五层结构。在整个代码库中,有一条严格的规则:任何一层都不允许从上层导入模块或数据:

    openosint/tools/ 核心工具
    用于封装外部二进制文件和API的异步调用层。
    这些工具没有人工智能功能,也不提供命令行界面,纯粹是由函数构成的。

    openosint/agent.py 人工智能代理
    负责与Anthropic工具进行交互,管理会话对话历史记录。
    这个模块不从tools/目录中导入任何内容,同时也没有其他模块会导入agent.py。

    openosint/repl.py 交互式REPL环境(基于prompt_toolkit和Rich库实现)
    openosint/mcp_server.py MCP服务器(使用stdio进行数据传输)
    openosint/cli.py 命令行界面入口点

    这种分层结构使得每一层都可以独立地进行测试。核心工具纯粹是由异步函数构成的,它们接收一个字符串作为输入,然后返回另一个字符串作为结果——因此你可以单独对它们进行单元测试,而无需涉及到人工智能代理或命令行界面。

    这也意味着人工智能层是完全可选的。如果你没有Anthropic API密钥,就可以直接使用命令行界面来操作系统,而无需通过人工智能代理。MCP服务器也同样可以独立于人工智能代理运行。

    9种可用工具

    工具名称 后端技术 返回结果类型
    search_email holehe 与某个电子邮件地址关联的社交账号信息
    search_username sherlock 300多个平台上的账户信息
    search_breach HaveIBeenPwned v3 泄露事件的信息,包括事件发生时间、泄露的数据类型等
    search_whois python-whois 域名的注册者信息、注册机构信息以及域名的创建/过期时间
    search_ip ipinfo.io IP地址的地理位置信息、ASN编码、主机名等信息
    search_domain sublist3r 子域名的枚举功能
    generate_dorks 内置功能 生成12个针对Google的恶意链接,不涉及任何网络请求
    search_paste psbdmp.ws 从Pastebin网站中检索相关的帖子内容
    search_phone phoneinfoga 电话运营商信息、所在国家以及电话类型

    结论

    在本教程中,您学习了如何搭建并使用OpenOSINT——这个基于Claude的工具使用API开发的Python OSINT框架。

    其核心设计理念在于:通过直接使用原生工具,该框架从不生成任何自定义的输出结果,而只会读取真实二进制文件中的实际数据。这种设计使得它特别适合那些对准确性要求极高、且不能容忍任何错误结果的安全研究领域。

    下面来总结一下这三个可用的接口:

    • 运行`openosint`命令即可使用交互式的AI编程环境——这种模式非常适合需要自动执行一系列操作的高级分析任务。

    • 运行`openosint email`或`openosint username`命令,可以直接通过命令行界面进行操作——这类方式特别适合编写脚本或实现自动化流程。

    • 如果您的环境中已经部署了Claude Code或Claude Desktop,也可以通过这些工具将OpenOSINT集成到现有的AI环境中进行使用。

    完整的源代码可以在GitHub上找到,该代码遵循MIT许可证授权。我们非常欢迎大家贡献代码或提出问题。

    法律声明:OpenOSINT仅适用于经过授权的安全研究、渗透测试以及调查性新闻报道活动。用户必须自行确保自己的使用行为符合相关法律法规,包括GDPR、CCPA和CFAA等规定。更多详细信息,请参阅DISCLAIMER.md文件。

Comments are closed.