Yigtwxx/J.A.R.V.I.S
GitHub: Yigtwxx/J.A.R.V.I.S
一个基于本地大模型的自动化OSINT系统,能够对目标人物进行多源网络情报采集并生成结构化档案报告。
Stars: 0 | Forks: 1
J.A.R.V.I.S
只是一个相当智能的系统
综合型 AI 驱动的 OSINT 与档案分析架构
## 1. 项目概述与理念 J.A.R.V.I.S 是一个模块化的全栈开源网络情报(OSINT)与档案分析系统。它通过接收单一查询(人名)并编排并行的抓取、索引和合成任务,实现了人工互联网研究的自动化。 通过整合 Web 抓取、API 查询和本地 Large Language Models (LLMs),J.A.R.V.I.S 能够从网络上提取原始的非结构化数据——涵盖从 GitHub 等开发者平台,到 Instagram 等视觉密集型平台,再到 LinkedIn 等职业社交网络。最终输出是一份格式化为情报报告的、结构完全化且详尽的 JSON 档案。 J.A.R.V.I.S 的核心理念依赖于数据隐私和本地执行。所有的 AI 分析完全在您的本地机器上通过 **Ollama** 进行。查询、抓取的内容和结果在持久化存储到您的私有 PostgreSQL 数据库之前,绝不会离开您的本地网络架构。 ## 2. 核心架构与技术栈分解 J.A.R.V.I.S 采用了解耦的前后端架构,并集成了关系型 SQL 记忆层。 ``` graph TD; subgraph Frontend [Next.js React Frontend] UI[User Interface] -->|Target Name| CHAT[Chat Terminal] CHAT -->|Display| CARDS[Profile Cards] end subgraph Backend [FastAPI Python Backend] API[Search Endpoints] --> SS[Web Search Service] API --> SC[Social Scraper] API --> GH[GitHub API Service] SS & SC & GH -->|Context| AI[Ollama AI Service] AI -->|Structured JSON| API end subgraph Memory [PostgreSQL Database] API -->|SQLAlchemy ORM| DB[(Profiles Table)] end Frontend <==>|Axios HTTP Requests| Backend ``` ### 2.1 后端核心 (Python / FastAPI) - **FastAPI:** 选用它是因其异步特性 (`async/await`),允许并行执行 I/O 密集型操作(例如同时请求 Wikipedia、GitHub 和 Yahoo),并原生支持 Pydantic 验证。 - **BeautifulSoup4 / Requests:** 驱动 Web 提取器和爬虫。负责处理 HTTP 通信和 DOM 解析。 - **SQLAlchemy:** 原生对象关系映射器 (ORM),管理数据库会话池并将 PostgreSQL schema 映射到 Python 类。 - **Ollama Python Client:** 连接 FastAPI 异步循环与主机上运行的本地 LLM 守护进程。 ### 2.2 前端核心 (Next.js / TypeScript) - **Next.js 15 App Router:** 提供服务端渲染边界和嵌套布局。 - **Tailwind CSS:** 实用优先的样式方案,确立了深色模式专属的视觉识别度。 - **Framer Motion:** 处理基于物理的动画,用于加载组件、模态框挂载以及档案卡片中的交错列表渲染。 - **React Hooks & Axios:** 自定义 Hooks 管理广泛的轮询和搜索状态机 (Idle -> Fetching Data -> AI Analysis -> Formatting -> Display/Save)。 ### 2.3 持久化单元 (PostgreSQL 16) - 选用 PostgreSQL 主要是利用其对 `JSONB` 数据类型的原生支持。由于 LLM 输出的数组长度不一(例如“相似档案”)且包含深层嵌套结构,标准的 SQL 规范化将需要大量的连接表。`JSONB` 允许 J.A.R.V.I.S 存储结构化的、半 schemaless 的 LLM 数据,同时保留 SQL 索引和搜索能力。 ## 3. 四阶段处理流水线 当用户发起搜索请求时,J.A.R.V.I.S 会通过不同的后端服务经历四个特定的流水线阶段。 ### 阶段 1: 开发者索引 (`github_service.py`) 由于许多目标是软件工程师,GitHub 是首要接触点。该服务利用 `https://api.github.com` 端点。 1. **直接查询:** 尝试根据给定字符串进行精确的用户名查询。 2. **模糊回退:** 如果遇到 404,系统将查询 `/search/users?q={name}&per_page=1`。它会解析置信度最高的文本匹配项中的确切登录 ID。 3. **仓库审查:** 一旦找到有效用户,会二次调用 `/users/{username}/repos`,按最近 `updated` 时间戳拉取用户的前 5 个仓库。 4. **上下文格式化:** 原始 JSON 被转换为严格格式的纯文本字符串,直接注入到 LLM 上下文中。 ### 阶段 2: 社交绕过提取器 (`scraper_service.py`) 直接通过 `requests` 抓取 LinkedIn、Instagram 或 X (Twitter) 通常会导致立即遭遇 HTTP 403 封锁。为了规避企业的抓取限制,该服务使用搜索引擎代理。 1. **Yahoo 子空间:** 系统通过 Yahoo Search 路由查询(例如 `"{name} linkedin"`)。 2. **DOM 解析:** `BeautifulSoup4` 从搜索引擎结果页面提取所有锚点 (``) 标签。 3. **URL 解包:** Yahoo 会在重定向字符串(例如 `/RU=https...`)后混淆真实 URL。J.A.R.V.I.S 使用 Python 的 `urllib.parse.unquote` 解码这些载荷。 4. **正则执行:** 解码后的 URL 通过严格的正则表达式进行处理。对于 Instagram,它匹配 `r'instagram\.com/([a-zA-Z0-9._]+)'`,但应用负向过滤器以防止捕获标签 `['p', 'reel', 'explore']`。这确保只存储基础档案 URL。 ### 阶段 3: 深度数据包渗透 (`search_service.py`) 该服务提取撰写档案所需的实际传记文本。 1. **视觉认证约束:** 它使用目标名称查询 Wikipedia API (`en.wikipedia.org/w/api.php`)。为了阻止名称冲突,它将两个字符串转换为小写数组 (`query_words_norm.issubset(title_words_norm)`) 并移除 Unicode 重音符号 (`unicodedata.normalize`)。只有当集合完全重叠时,才会拉取档案缩略图。 2. **多向量抓取:** 脚本创建 5 个不同的搜索查询(姓名 + 传记,姓名 + 教育等)。每个查询抓取 5 个 URL,并进行去重。 3. **深度文档解析:** 它锁定前 4 个 URL(明确避开社交媒体网站)。下载原始 DOM 并对所有 `