bm-github/owasp-social-osint-agent

GitHub: bm-github/owasp-social-osint-agent

一个基于 AI 的开源社交 OSINT 框架,集成多平台采集、关联分析与可视化报告,解决碎片化情报难以统一评估的问题。

Stars: 63 | Forks: 7

[![GitHub release (latest by date)](https://img.shields.io/github/v/release/bm-github/owasp-social-osint-agent)](https://github.com/bm-github/owasp-social-osint-agent/releases/latest) [![Live Demo](https://img.shields.io/badge/demo-live-brightgreen)](https://bm-github.github.io/owasp-social-osint-agent/demo.html) # 🕵️ owasp-social-osint-agent **OWASP Social OSINT Agent** 是一个用于开源情报(OSINT)调查的智能自主代理。它通过任何 OpenAI 兼容的 API 利用具备文本和视觉能力的超大语言模型(LLM),自主收集、分析和综合单个或多个社交媒体平台的用户活动。最终输出是一个结构化的分析报告,将分散的公开数据转化为连贯、可操作的智能。 该代理可以通过 **Web 界面**(推荐)或 **命令行界面** 进行驱动,两者均使用同一引擎。每个界面都有独立的数据目录,因此不会共享或覆盖彼此的数据。 ## 🎮 Live Demo **立即体验 — 无需安装。** [![OSINT Agent – Interactive Demo](https://img.shields.io/badge/Open%20Interactive%20Demo-%E2%86%92-38bdf8?style=for-the-badge&logo=github)](https://bm-github.github.io/owasp-social-osint-agent/demo.html) [交互式演示](https://bm-github.github.io/owasp-social-osint-agent/demo.html) 完全在浏览器中运行,使用预加载的调查数据 — 无后端、无 API 密钥、无需 Docker。它展示了完整的 Web UI,包括: - **会话管理**:两个预加载的示例调查 - **分析报告**:基于模拟 OSINT 数据渲染 - **网络联系人图谱**(D3 力导向图):展示目标关系 - **时间线活动图表**和 **生活模式热力图**(按天 × 小时) - **实体提取面板**(位置、邮箱、加密地址、别名) - **媒体分析缩略图**:带有模拟视觉 LLM 注释 - **实时进度流**模拟 — 针对演示数据运行自定义查询 ## 🌟 关键特性 ✅ **Web 界面**:基于浏览器的 UI,地址为 `http://localhost:8000`,用于管理会话、运行查询和查看报告 — 无需终端。 ✅ **会话管理**:保存并回顾命名的调查会话,每个会话拥有独立的目标列表、查询历史和完整报告归档。 ✅ **网络联系人发现**:自动提取并展示目标互动的账号(提及、转发、仓库交互),以便在无需手动爬取的情况下扩展调查。可直接从 Web UI 驳回或提升发现的联系人为活跃目标。 ✅ **多平台数据收集**:聚合 Twitter/X、Reddit、Bluesky、GitHub、Hacker News 和 Mastodon 的数据。捕获不可变标识符(如 Bluesky DIDs),确保即使目标更改句柄也能追踪。 ✅ **高保真 OSINT 提取**:超越基础文本,捕获平台特定情报,包括 GitHub 提交消息/星标事件、Reddit 声望细分/子社区上下文、Twitter 位置/认证状态、HackerNews 用户声誉。 ✅ **AI 驱动分析**:通过 OpenAI 兼容 API 使用可配置模型进行文本与图像分析。使用外部化、易于编辑的提示文件。 ✅ **高效的两阶段分析**:代理首先获取所有文本数据并下载所有媒体文件,之后才开始(较慢的)视觉分析阶段,确保最大效率。 ✅ **跨账号对比**:同时分析多个选定平台的个人资料。 ✅ **健壮的错误处理**:单个获取或图像分析失败不会导致整个流水线崩溃。代理优雅降级,在部分目标不可用时仍提供部分结果。 ✅ **统一平台架构**:所有平台获取器使用一致的基类模式,确保在 Twitter、Reddit、Bluesky、GitHub、Mastodon 和 HackerNews 上的错误处理、分页和缓存行为一致。 ✅ **间接注入缓解**:将不受信任的社交媒体数据在 LLM 提示中用结构化 XML 标签包裹,明确“系统指令”与“不受信数据”之间的边界,帮助缓解隐藏在社交帖子或图像描述中的间接提示注入攻击。 ✅ **准确的时间分析**:在每个分析提示中注入当前真实世界 UTC 时间戳,强制 LLM 正确理解事件时间线。 ✅ **结构化 AI 提示**:使用详细的系统提示进行客观、基于证据的分析,聚焦行为、语义、兴趣和沟通风格。 ✅ **视觉能力图像分析**:分析下载的图片(JPEG、PNG、GIF、WEBP),利用视觉增强 LLM 获取 OSINT 洞察。 ✅ **灵活的获取控制**:可交互设置默认获取数量,并使用 `loadmore` 命令逐步获取特定用户的更多数据。 ✅ **关联图像分析**:最终报告中的每项 AI 生成图像分析均包含指向源图像的直接可点击链接,便于交叉验证。 ✅ **共享域名分析**:自动提取用户共享的所有外部链接,统计每个域名的频率,并在最终报告中包含“Top Shared Domains”摘要。 ✅ **离线模式(`--offline`)**:仅使用本地缓存数据进行分析,跳过所有外部网络请求。 ✅ **智能速率限制处理**:检测社交平台和 LLM 提供商的 API 速率限制,提供信息反馈并防止过度请求。 ✅ **健壮的缓存系统**:缓存获取的文本数据 24 小时(`data-web/cache/` 或 `data-agent/cache/`)和媒体文件(`data-web/media/` 或 `data-agent/media/`),减少 API 调用并加速后续分析。视觉分析结果也会被缓存。 ✅ **缓存管理**:在 Web UI 或交互式 CLI 命令中查看缓存数据摘要或清除特定类型数据。 ✅ **交互式 CLI 与 Docker 支持**:用户友好的命令行界面,支持丰富格式化,可本地运行或在完全容器化的 Docker 环境中运行。 ✅ **程序化/批量模式**:支持通过 stdin 以 JSON 格式输入,用于自动化流程(`--stdin`)。 ✅ **安全的环境变量配置**:所有密钥和配置通过 `.env` 文件管理。 ## 🌐 Web 界面 Web 界面提供了一个完整的基于浏览器的调查环境,启动后无需终端交互。 ### 启动 Web 服务器 ``` docker compose up -d web ``` 然后在浏览器中打开 `http://localhost:8000`。镜像在首次运行时自动构建。 ### Web UI 功能一览 **会话面板(左侧边栏)** - 创建命名的调查会话;每个会话拥有独立的目标列表、查询历史和报告归档 - 会话在服务器重启后持久化 — 从上次离开处继续 - 点击标题即可重命名会话 - 删除不再需要的会话 **目标芯片栏** - 随时使用芯片栏上方添加或移除平台/用户名 - 每个芯片显示颜色编码的新鲜度圆点(绿色 = 新鲜缓存,琥珀色 = 陈旧,灰色 = 尚未获取) - 点击 × 立即从会话中移除该目标 **查询栏** - 输入自然语言查询并点击 **运行分析**(或按 `Ctrl+Enter`) - 使用 **帖子** 计数器设置每个目标获取的帖子数量 - 切换 **强制刷新** 以绕过 24 小时缓存并重新获取实时数据 **实时进度流** - 分析进度通过 Server-Sent Events 实时流式传输到浏览器 - 每个阶段(数据获取 → 图像分析 → LLM 综合)都会记录日志 - 如果在分析过程中刷新页面,浏览器会重新连接并回放已发生的事件 **报告面板(中央)** - 报告以样式化 Markdown 渲染,支持点击图片链接 - 可随时在 **报告** 标签和 **时间线** 标签之间切换 - **下载 MD** 将当前报告保存为 Markdown 文件 - 完整的会话 **导出完整报告** 按钮可生成单个整合的 Markdown 文档,涵盖会话中的每个查询、所有提取实体及顶级网络联系人 **查询历史侧边栏** - 每个查询及其完整报告都会被保留在会话中 - 点击任意历史条目即可重新显示其报告而无需重新运行分析 **时间线标签** - **时间活动**:使用 D3 展示的日历时间轴上的发帖量柱状图 - **生活模式**:按星期 × 小时(UTC)的热度图,显示目标最活跃的时间 **联系人面板(右侧面板,联系人标签页)** - 列出目标提及、转发、回复或通过仓库互动的所有账号 - 力导向网络图以可视化方式展示关系 - 联系人按交互权重排序 - **+** 按钮:一点即可将联系人提升为活跃会话目标 - **×** 按钮:忽略联系人;之后不会重新出现(可撤销) - 使用搜索框按名称或平台过滤联系人 **实体标签页** - 提取并展示最新分析中的结构化情报选择器:位置、邮箱地址、电话号码、加密地址和别名 **媒体标签页** - 显示为当前会话目标下载的所有图片缩略图 - 悬停缩略图可查看该图片的 LLM 视觉分析 **缓存管理器** - 从顶部栏的 **缓存** 按钮打开 - 显示每个缓存目标及其帖子数量和新鲜度状态 - 可选择单个目标清除缓存,或一键清除所有内容(缓存 + 媒体 + 输出) ### 远程访问 服务器默认绑定到 `127.0.0.1:8000`(仅本地主机)。要从其他机器访问,请使用 SSH 隧道: ``` ssh -L 8000:localhost:8000 user@your-server ``` 然后在本地打开 `http://localhost:8000`。 ### 认证 在 `.env` 文件中设置 `OSINT_WEB_USER` 和 `OSINT_WEB_PASSWORD` 以启用 HTTP 基本认证。若未设置,服务器将开放运行 — 仅适用于通过 SSH 隧道访问 localhost。 ## 🗺️ 可视化工作流程:代理如何思考 要了解代理从开始到结束的决策过程,可以查看下面的详细工作流流程图。
➡️ 点击展开完整交互式流程图 ``` flowchart TD %% Initialization A([Start owasp-social-osint-agent]) --> AA{{Setup Directories & API Clients
Verify Environment}} %% Mode Selection AA --> B{Interactive or
Stdin Mode?} %% Interactive Mode Path B -->|Interactive| C[/Display Platform Menu/] C --> D{Platform
Selection} %% Platform-Specific Branches D -->|Twitter| E1([Twitter]) D -->|Reddit| E2([Reddit]) D -->|HackerNews| E3([HackerNews]) D -->|Bluesky| E4([Bluesky]) D -->|Mastodon| E5([Mastodon]) D -->|GitHub| E7([GitHub]) D -->|Cross-Platform| E6([Multiple Platforms]) D -->|Purge Data| PD([Purge Data]) PD --> C D -->|Cache Status| CS([Cache Status]) CS --> C %% Stdin Mode Path B -->|Stdin| F([Parse JSON Input]) F --> G([Extract Platforms & Query]) %% Analysis Loop Entry Points E1 --> H([Enter Analysis Loop]) E2 --> H E3 --> H E4 --> H E5 --> H E7 --> H E6 --> H G --> J([Run Analysis]) %% Command Processing in Analysis Loop H -->|Query Input| I{Command
Type} I -->|Analysis Query| J I -->|exit| Z([End Session]) I -->|refresh| Y([Force Refresh Cache]) Y --> H %% PHASE 1: Data Fetching and Caching J --> K{Cache
Available?} K -->|Yes| M([Load Cached Data]) K -->|No| L([Fetch Platform Data
& Download Media]) %% API & Rate Limit Handling for Fetching L --> L1{Rate
Limited?} L1 -->|Yes| L2([Handle Rate Limit]) L2 --> L5([Abort or Retry]) L1 -->|No| L3([Extract Text & URLs]) L3 --> L4([Save to Cache]) L4 --> M %% Data Consolidation Point M --> N([Consolidate All
Fetched Data]) %% PHASE 2: Vision Analysis N --> O{Any Images
Need Analysis?} O -->|Yes| P([Analyze Images via Vision LLM]) P --> P1([Update Cache with
Vision Analysis Results]) P1 --> Q O -->|No| Q %% Data Formatting & Final Synthesis Q([Format Text, Links &
Vision Data for LLM]) --> S([Call Text Analysis LLM
with Query and All Data]) %% Output Generation S --> T([Format Final Report]) T --> V1{Auto-Save
Enabled?} %% Handle Saving V1 -->|Yes| WA([Save Results Automatically]) WA --> H V1 -->|No| WB{Prompt User to Save?} WB -->|Yes| WC([Save Results]) WC --> H WB -->|No| H classDef startClass fill:#E8F5E8,stroke:#4CAF50,stroke-width:3px,color:#2E7D32 classDef setupClass fill:#E3F2FD,stroke:#2196F3,stroke-width:2px,color:#1565C0 classDef decisionClass fill:#FFF3E0,stroke:#FF9800,stroke-width:2px,color:#E65100 classDef inputClass fill:#F3E5F5,stroke:#9C27B0,stroke-width:2px,color:#6A1B9A classDef menuClass fill:#E8EAF6,stroke:#3F51B5,stroke-width:2px,color:#283593 classDef twitterClass fill:#1DA1F2,stroke:#0D47A1,stroke-width:3px,color:#FFF classDef redditClass fill:#FF4500,stroke:#CC3600,stroke-width:3px,color:#FFF classDef hnClass fill:#FF6600,stroke:#E55A00,stroke-width:3px,color:#FFF classDef bskyClass fill:#00D4FF,stroke:#0099CC,stroke-width:3px,color:#FFF classDef mastodonClass fill:#6364FF,stroke:#4F50CC,stroke-width:3px,color:#FFF classDef githubClass fill:#24292e,stroke:#000,stroke-width:3px,color:#FFF classDef multiClass fill:#4CAF50,stroke:#388E3C,stroke-width:3px,color:#FFF classDef purgeClass fill:#F44336,stroke:#D32F2F,stroke-width:3px,color:#FFF classDef cacheStatusClass fill:#A5D6A7,stroke:#388E3C,stroke-width:2px,color:#1B5E20 classDef loopClass fill:#E1BEE7,stroke:#8E24AA,stroke-width:2px,color:#4A148C classDef analysisClass fill:#BBDEFB,stroke:#1976D2,stroke-width:2px,color:#0D47A1 classDef cacheClass fill:#B2DFDB,stroke:#00695C,stroke-width:2px,color:#004D40 classDef apiClass fill:#C8E6C9,stroke:#2E7D32,stroke-width:2px,color:#1B5E20 classDef errorClass fill:#FFCDD2,stroke:#D32F2F,stroke-width:2px,color:#B71C1C classDef dataClass fill:#DCEDC8,stroke:#689F38,stroke-width:2px,color:#33691E classDef llmClass fill:#FFF8E1,stroke:#FFA000,stroke-width:2px,color:#E65100 classDef outputClass fill:#F1F8E9,stroke:#558B2F,stroke-width:2px,color:#33691E classDef endClass fill:#FFEBEE,stroke:#E53935,stroke-width:2px,color:#C62828 classDef refreshClass fill:#E0F2F1,stroke:#00796B,stroke-width:2px,color:#004D40 class A startClass; class AA setupClass; class B,D,I,K,L1,O,V1,WB decisionClass class C menuClass; class H loopClass; class J,P,S llmClass; class L,L4 apiClass class M,P1 cacheClass; class L2,L5 errorClass; class N,Q dataClass class T,WA,WC outputClass; class Z endClass; class Y refreshClass class E1 twitterClass; class E2 redditClass; class E3 hnClass; class E4 bskyClass; class E5 mastodonClass; class E6 multiClass; class E7 githubClass class PD purgeClass; class CS cacheStatusClass; class F,G inputClass ``` *流程图说明:* 在 **离线模式(`--offline`)** 中,“获取平台数据”步骤和“分析图像”步骤都会被 *绕过*。分析仅使用本地缓存中已有的信息进行。
## 🏗️ Docker 架构 项目提供两个容器镜像,每个镜像拥有独立的数据目录: ``` ┌──────────────────────────────────────────────────────────┐ │ docker compose │ │ │ │ ┌─────────────────────┐ ┌─────────────────────────┐ │ │ │ web (port 8000) │ │ agent │ │ │ │ Dockerfile.web │ │ Dockerfile.agent │ │ │ │ │ │ │ │ │ │ FastAPI + uvicorn │ │ CLI (python -m …) │ │ │ │ + static frontend │ │ --stdin / --offline │ │ │ │ runs as appuser │ │ runs as appuser │ │ │ └────────┬────────────┘ └────────────┬────────────┘ │ │ │ │ │ │ ▼ ▼ │ │ ./data-web/ ./data-agent/ │ │ ├── cache/ ├── cache/ │ │ ├── media/ ├── media/ │ │ ├── outputs/ ├── outputs/ │ │ └── sessions/ └── │ └──────────────────────────────────────────────────────────┘ ``` - **`web`**:通过 `docker compose up -d web` 启动。提供浏览器 UI 和 REST API,运行在 8000 端口(仅本地)。数据存储在 `./data-web/`。 - **`agent`**:通过 `docker compose --profile cli run --rm -it agent` 按需运行,用于交互式终端会话或批量/标准输入处理。使用 `cli` 配置文件,因此不会意外与 Web 服务器同时启动。数据存储在 `./data-agent/`。 - **隔离数据**:每个服务拥有独立的数据目录,因此缓存的平台数据、下载的媒体和保存的报告完全分离。 ## 🛠 安装 ### 先决条件 * **Docker 和 Docker Compose**(推荐) * **Python 3.11+** 和 Pip(用于本地开发) ### 1. 克隆仓库 ``` git clone https://github.com/bm-github/owasp-social-osint-agent.git cd owasp-social-osint-agent ``` ### 2. 配置环境变量 在项目根目录创建 `.env` 文件,复制示例文件(`env.example`)并填写自己的 API 密钥和凭据。 ``` cp env.example .env # 现在使用您的密钥编辑 .env 文件 ``` ``` # .env # --- LLM 配置(必需)--- LLM_API_KEY="your_llm_api_key" LLM_API_BASE_URL="https://api.example.com/v1" # e.g., https://openrouter.ai/api/v1 ANALYSIS_MODEL="your_text_analysis_model_name" IMAGE_ANALYSIS_MODEL="your_vision_model_name" # --- 可选:OpenRouter 特定头部 --- # OPENROUTER_REFERER="http://localhost:3000" # OPENROUTER_X_TITLE="owasp-social-osint-agent" # --- 平台 API 密钥(按需)--- # Twitter/X TWITTER_BEARER_TOKEN="your_twitter_v2_bearer_token" # Reddit REDDIT_CLIENT_ID="your_reddit_client_id" REDDIT_CLIENT_SECRET="your_reddit_client_secret" REDDIT_USER_AGENT="YourAppName/1.0 by YourUsername" # Bluesky BLUESKY_IDENTIFIER="your-handle.bsky.social" BLUESKY_APP_SECRET="xxxx-xxxx-xxxx-xxxx" # GitHub GITHUB_TOKEN="your_github_personal_access_token" # Mastodon 多实例支持 MASTODON_INSTANCE_1_URL="https://mastodon.social" MASTODON_INSTANCE_1_TOKEN="YOUR_ACCESS_TOKEN_FOR_MASTODON_SOCIAL" MASTODON_INSTANCE_1_DEFAULT="true" # --- 可选:Web 界面身份验证 --- # 如果设置,网络界面将需要 HTTP 基本身份验证。 # 建议在服务器可访问 localhost 以外时使用。 OSINT_WEB_USER="your_username" OSINT_WEB_PASSWORD="your_password" # 安全性:媒体下载限制 # 默认情况下,仅允许受信 CDN。可通过额外域名覆盖: # EXTRA_TWITTER_CDNS="custom.cdn.example.com" # EXTRA_REDDIT_CDNS="i.imgur.com,custom.cdn2.com" # EXTRA_BLUESKY_CDNS="custom.bsky.cdn.com" # EXTRA_MASTODON_CDNS="media.myinstance.org" ``` *注意:HackerNews 不需要 API 密钥。GitHub 可以在无认证模式下有限运行,但建议使用令牌。* ## 🚀 使用方式 有三种运行代理的方式:**Web 界面**、**交互式 CLI** 或 **程序化/标准输入模式**。 ### 推荐:Web 界面 Web 界面提供完整的基于浏览器的调查 UI,用于管理调查会话、运行查询和查看历史报告。 1. **启动 Web 服务器**: docker compose up -d web 首次运行会自动构建镜像,无需单独构建步骤。 2. **打开界面**: 访问 `http://localhost:8000`。 3. **远程访问**: 服务器默认绑定到 `127.0.0.1`(仅本地)。要从其他机器访问,请使用 SSH 隧道: ssh -L 8000:localhost:8000 user@your-server 然后在本地打开 `http://localhost:8000`。 4. **认证**: 在 `.env` 文件中设置 `OSINT_WEB_USER` 和 `OSINT_WEB_PASSWORD` 以启用 HTTP 基本认证。若未设置,服务器将开放运行 — 仅适用于 localhost。 ### Docker CLI(交互式) 用于终端式使用,`agent` 服务运行原始交互式 CLI。它使用 `cli` 配置文件,因此不会包含在 `docker compose up` 中,需手动运行: ``` # 交互式会话(获取实时数据) docker compose --profile cli run --rm -it agent # 离线模式 — 仅使用缓存数据,不进行网络请求 docker compose --profile cli run --rm -it agent --offline # 覆盖容器内的日志级别 docker compose --profile cli run --rm -it agent --log-level DEBUG # 允许从非标准 CDN 下载媒体 docker compose --profile cli run --rm -it agent --unsafe-allow-external-media ``` 离线模式适用于在不调用任何 API 的情况下查看已获取的数据。代理的数据存储在 `./data-agent/`,与 Web 服务器的 `./data-web/` 完全分离。 ### Docker CLI(程序化 / 标准输入) 可通过 stdin 将 JSON 文件直接管道传输给代理,用于自动化流程。*注意:需要通过 `-T` 标志将数据传入 Docker 容器。* ``` docker compose --profile cli run --rm -T agent --stdin < input.json ``` *示例 `input.json`:* ``` { "platforms": { "twitter": ["twitterhandle"], "github": ["torvalds"] }, "query": "What are the primary technical interests and contributions of these users?", "fetch_options": { "default_count": 50 } } ``` *也可通过 `echo` 直接管道传输:* ``` echo '{ "platforms": { "hackernews": ["pg"] }, "query": "Summary?" }' | docker compose --profile cli run --rm -T agent --stdin ``` ### 包装脚本 如果逐条输入 `docker compose ...` 感到繁琐,可在项目文件夹中创建一个小的可执行脚本,让 Docker 容器感觉像本地 Python CLI。 创建名为 `osint`(无扩展名)的文件: ``` #!/bin/bash # 如果数据被管道传输(例如文件),请使用 -T。否则使用 -it 进行交互。 if [ -t 0 ]; then docker compose --profile cli run --rm -it agent "$@" else docker compose --profile cli run --rm -T agent "$@" fi ``` 使其可执行: ``` chmod +x osint ``` 现在可以优雅地运行工具: ``` ./osint # Interactive menu ./osint --offline # Interactive menu in offline mode ./osint --stdin < query.json # Automated JSON mode ``` ### 本地开发模式 适用于开发调试,无需 Docker。 1. **创建虚拟环境**: python -m venv .venv source .venv/bin/activate # Windows:.venv\Scripts\activate 2. **安装依赖**: pip install -r requirements.txt -r requirements-web.txt # 运行测试也需要: pip install -r requirements-dev.txt 3. **运行 Web 服务器**: uvicorn socialosintagent.web_server:app --host 127.0.0.1 --port 8000 --reload 4. **或运行 CLI 代理**: python -m socialosintagent.main ### 命令行参数(仅 CLI) * `--stdin`:从标准输入读取 JSON 配置以进行分析。 * `--format [json|markdown]`:指定保存结果的输出格式(默认:`markdown`)。 * `--no-auto-save`:禁用自动保存报告。 * `--log-level [DEBUG|INFO|WARNING|ERROR|CRITICAL]`:设置日志级别(默认:`WARNING`)。 * `--offline`:离线模式。仅使用缓存数据。 * `--unsafe-allow-external-media`:**安全选项**:允许从非已知社交媒体 CDN 下载媒体。 ### 交互式 CLI 模式下的特殊命令 在分析会话中,可使用以下命令替代分析查询: * `/loadmore [] `:为特定目标获取更多条目。 * `/refresh`:忽略 24 小时缓存,重新获取所有数据。 * `/add `:向当前会话添加新目标。 * `/remove `:从当前会话移除目标。 * `/status`:显示所有活跃目标及其帖子数量和缓存新鲜度。 * `/help`:显示可用命令。 * `/exit`:返回主平台选择菜单。 ## ⚡ 缓存系统 * **文本/API 数据**:获取的平台数据缓存 **24 小时**(`data-web/cache/` 对应 Web,`data-agent/cache/` 对应 CLI)。 * **媒体文件**:下载的图片和媒体存储在 `data-web/media/` 或 `data-agent/media/`。 * **视觉分析**:AI 生成的图像分析结果会保存回对应用户的缓存文件,避免重复分析相同图片。 * 每个服务拥有独立的数据目录 — 缓存数据不会在 Web 和 CLI 之间共享。 * 使用 `/refresh`(CLI)或“强制刷新”(Web UI)绕过缓存。使用“清除全部”可清除媒体文件。 ## 🤖 AI 分析细节 * **高效架构**:代理采用两阶段流程。首先快速收集所有文本数据并下载媒体文件,之后才开始视觉分析阶段。 * **后绑定证据**:文本和图像分析作为原子证据单元保留在 LLM 提示中。同一时间线上的“即将度假”文本与海滩照片所传达的情报,与同一文本与军事设施照片所传达的情报不同 — 将文本与视觉分离会丢失这种绑定。 * **外部化提示**:所有用于引导 LLM 的提示均存储在 `socialosintagent/prompts/` 目录中,便于在不修改代码的情况下自定义。 * **准确时间戳**:工具在每个分析提示中注入当前真实 UTC 时间戳。 * **数据综合**:最终分析由遵循详细系统提示的 LLM 执行,综合用户的文本、图像分析和共享域名摘要,构建全面的个人画像。* **情报选择器**:每次分析末尾,LLM 会提取结构化选择器(位置、邮箱、电话号码、加密地址、别名)到独立的 JSON 块中,在 Web UI 的实体面板中单独展示。 ## 🌐 REST API Web 服务器提供 `/api/v1/` 版本的 REST API,前端通过该接口与后端通信。相同的端点也可用于程序化或无头使用。交互式文档位于 `/api/docs`(Swagger UI)和 `/api/redoc`。 | 方法 | 路径 | 描述 | |------|------|------| | `GET` | `/api/v1/platforms` | 列出已配置的平台及其可用性 | | `GET` | `/api/v1/sessions` | 列出所有会话(摘要) | | `POST` | `/api/v1/sessions` | 创建新会话 | | `GET` | `/api/v1/sessions/{id}` | 获取完整会话(含查询历史) | | `DELETE` | `/api/v1/sessions/{id}` | 删除会话 | | `PATCH` | `/api/v1/sessions/{id}/rename` | 重命名会话 | | `PUT` | `/api/v1/sessions/{id}/targets` | 替换会话目标 | | `POST` | `/api/v1/sessions/{id}/analyse` | 启动分析任务(返回 `job_id`) | | `GET` | `/api/v1/jobs/{job_id}` | 轮询任务状态 | | `GET` | `/api/v1/jobs/{job_id}/stream` | SSE 流式传输实时进度 | | `GET` | `/api/v1/sessions/{id}/contacts` | 获取发现的联系人 | | `POST` | `/api/v1/sessions/{id}/contacts/dismiss` | 忽略联系人 | | `POST` | `/api/v1/sessions/{id}/contacts/undismiss` | 恢复被忽略的联系人 | | `GET` | `/api/v1/sessions/{id}/timeline` | 获取用于绘图的帖子时间戳 | | `GET` | `/api/v1/sessions/{id}/media` | 获取已下载的媒体路径和分析 | | `GET` | `/api/v1/sessions/{id}/media/file` | 提供本地媒体文件 | | `GET` | `/api/v1/sessions/{id}/export` | 导出完整会话为 JSON | | `GET` | `/api/v1/cache` | 获取缓存状态(所有条目) | | `POST` | `/api/v1/cache/purge` | 清除缓存/媒体/输出 | ## 🛡 安全注意事项 * **API 密钥**:所有密钥应存储在 `.env` 文件中,**绝不**提交到版本控制。 * **Web 认证**:设置 `OSINT_WEB_USER` 和 `OSINT_WEB_PASSWORD` 以启用 Web 界面的基本认证。若未设置,服务器将开放运行 — 仅适用于通过 SSH 隧道访问 localhost。 * **网络暴露**:Web 服务器默认绑定到 `127.0.0.1`。不要将其改为 `0.0.0.0` 并暴露在公网,除非同时启用认证并置于反向代理和 TLS 保护之后。 * **容器加固**:两个 Docker 镜像均以非 root 的 `appuser` 用户运行。平台名称和用户名会经过允许列表校验和清理,防止目录遍历攻击。 * **媒体下载**:默认仅从已知平台 CDN 下载图片。使用 `--unsafe-allow-external-media`(CLI)或相应获取选项可覆盖此限制。 * **数据缓存**:获取的下载数据和媒体文件本地存储在 `data-web/`(Web)和 `data-agent/`(CLI)目录中。请根据所调查内容的敏感程度妥善保护这些目录。 * **服务条款**:确保工具的使用符合各社交平台及所选 LLM API 提供者的服务条款。 ## 🤝 贡献 欢迎贡献!请随时提交 Pull Request、报告问题或通过项目的 Issue Tracker 提出改进建议。 ## 📜 许可证 本项目采用 **MIT License** 授权。
标签:CLI, D3力导向图, DLL 劫持, ESC4, LLM, OpenAI兼容API, OSINT, SEO, Unmanaged PE, Web界面, WiFi技术, 双接口, 命令行界面, 多平台, 大语言模型, 媒体分析, 安全运营中心, 实体提取, 情报分析, 数据隔离, 无需安装, 模式生活, 正则匹配, 浏览器演示, 社交媒体情报, 社交网络分析, 秘密管理, 结构化报告, 网络图, 网络安全, 网络映射, 网络诊断, 自动化情报收集, 视觉分析, 请求拦截, 逆向工具, 隐私保护