FrankAsanteVanLaarhoven/LumoraAI

GitHub: FrankAsanteVanLaarhoven/LumoraAI

一款自托管、治理优先的网页数据提取与被动 OSINT 引擎,在强制遵守 robots.txt、SSRF 防护和审计的前提下,将公开网页转化为干净的 Markdown/JSON 结构化数据。

Stars: 1 | Forks: 0

# LumoraAI ### 治理优先的网页数据提取与 OSINT —— 自托管 将任何公开的 URL、网站或域名转化为干净、结构化的情报 —— Markdown / JSON 提取(涵盖静态**和** JavaScript 渲染)、有界爬取, 以及被动域名侦察 —— 并在**每个**请求中强制执行 robots.txt、SSRF 防护、 授权和审计。 [![CI](https://static.pigsec.cn/wp-content/uploads/repos/cas/ad/ad5834178f7599af9fdda11629d49cae07f2997beec49821b2920eff5bfd50e7.svg)](https://github.com/FrankAsanteVanLaarhoven/LumoraAI/actions/workflows/ci.yml)  ![Next.js 15](https://img.shields.io/badge/Next.js-15-000000)  ![TypeScript strict](https://img.shields.io/badge/TypeScript-strict-3178C6)  ![Tests](https://img.shields.io/badge/tests-12%20passing-2ea44f)  ![Vulnerabilities](https://img.shields.io/badge/prod%20vulns-0-2ea44f)  ![License](https://img.shields.io/badge/license-Proprietary-lightgrey)
## 概述 LumoraAI 是“抓取一切”工具的合规替代方案。它的竞争优势在于 **提取质量、广度和治理 —— 而非规避检测。** 每个请求都遵守 robots 协议、受到速率限制、进行 SSRF 防护、经过授权门控并接受审计, 并且整个系统运行在你自己的基础设施上,没有任何第三方数据流出。 - **干净且适配 LLM 的输出** —— HTML → Markdown / 结构化 JSON。 - **支持静态与动态** —— 使用普通的 fetch 或通过无头浏览器渲染 JavaScript / SPA 页面。 - **被动 OSINT** —— DNS、RDAP(注册局)和证书透明度子域名,仅使用公开来源。 - **构建即治理** —— 安全防护内置于请求路径中,而非事后修补。 - **自托管且可审计** —— 持久化存储到磁盘的仅追加审计追踪。 ## 功能 | 功能 | 作用 | | --- | --- | | **Extract** | URL → 标题、干净的 Markdown、纯文本、`` 映射表及绝对链接 | | **Crawl** | 有界同源站点爬取(深度 ≤ 3,≤ 50 个页面),每个页面均接受全面管控 | | **Dynamic rendering** | 针对 JS / SPA 页面的可选无头 Chromium 渲染 —— 诚实的 User-Agent,依然强制执行 robots 规则 | | **OSINT recon** | 被动域名画像:DNS · RDAP 注册局 · 证书透明度子域名 | | **Audit** | 每个请求的仅追加磁盘记录 (`data/audit.jsonl`) | ## 治理与安全 在**每个**请求上强制执行 —— 这是产品的核心: | 控制措施 | 行为 | | --- | --- | | **robots.txt** | 遵守协议;绝不抓取被禁止的路径。在遇到 5xx / 错误时**安全关闭**。 | | **Rate limiting** | 对每个主机保持礼貌;遵守 `Crawl-delay`(上限为 1–30 秒),绝不低于 1 秒的底线。 | | **SSRF protection** | 屏蔽私有 / 回环 / 链路本地 / 保留地址,并在每次重定向跳转时重新检查。 | | **Authorization** | 每个请求都需要明确的授权证明;拒绝操作将被记录。 | | **Audit** | 仅追加日志,持久化到磁盘,由内存环形缓冲区提供支持。 | | **Identity** | 诚实的 `LumoraCrawler` User-Agent —— 无伪装,即使在渲染时也是如此。 | | **Limits** | 深度 ≤ 3 · 页面 ≤ 50 · 响应 ≤ 3 MB · 15 秒抓取 / 25 秒渲染超时。 | ### 刻意排除在外的范围 不包含检测规避、代理 / 指纹轮换或 CAPTCHA 破解。不包含 命令与控制 (C2)、漏洞利用、无线攻击或对人员的监控。 这个边界使得 LumoraAI 成为一个受治理的情报工具,而不是 隐形抓取器。 ## 快速开始 ``` git clone https://github.com/FrankAsanteVanLaarhoven/LumoraAI.git cd LumoraAI npm install npm run dev # http://localhost:3000 (falls back if the port is in use) ``` Web 控制台会在 **Workbench** 打开;**Activity** 显示实时审计日志, 而 **Governance** 记录了已强制执行的控制措施。 ## API 参考 | 方法与路径 | Body | 描述 | | --- | --- | --- | | `POST /api/extract` | `{ url, authorized: true, render? }` | 提取单个页面(`render: true` = 无头浏览器) | | `POST /api/crawl` | `{ url, authorized: true, depth?, limit?, sameOrigin?, render? }` | 有界站点爬取 | | `POST /api/osint` | `{ domain, authorized: true }` | 被动域名侦察(DNS + RDAP + CT 子域名) | | `GET /api/audit` | `?n=` | 最近的审计条目 | `authorized: true` 是一项**必需的授权证明** —— 没有它,请求将被 拒绝(`403`)并且拒绝行为会被记录下来。 ``` # 静态提取 curl -X POST http://localhost:3000/api/extract \ -H 'content-type: application/json' \ -d '{"url":"https://example.com","authorized":true}' # JavaScript 渲染提取 curl -X POST http://localhost:3000/api/extract \ -H 'content-type: application/json' \ -d '{"url":"https://example.com/app","authorized":true,"render":true}' # 被动 domain recon curl -X POST http://localhost:3000/api/osint \ -H 'content-type: application/json' \ -d '{"domain":"example.com","authorized":true}' ``` ## 架构 每个请求都遵循同一条受治理的路径: ``` request → authorization gate → robots.txt → rate limiter → [ static fetch (SSRF-guarded) | headless render ] → extract (Markdown / JSON / links) → audit ``` ``` src/ app/ page.tsx layout.tsx globals.css error.tsx not-found.tsx activity/page.tsx governance/page.tsx # control-plane sections api/{extract,crawl,osint,audit}/route.ts components/ Workbench.tsx # extract / crawl / OSINT UI Shell.tsx # control-plane shell (sidebar) lib/ ua.ts # honest User-Agent ssrf.ts # private-address guard (per redirect hop) robots.ts # robots.txt fetch + parse + longest-match matcher ratelimit.ts # polite per-host limiter fetcher.ts # SSRF-guarded fetch, size cap, timeout render.ts # headless-browser JS rendering (playwright-core) extract.ts # HTML → Markdown / text / meta / links (cheerio + turndown) crawl.ts # single-page + bounded site crawl (static or rendered) audit.ts # append-only audit log → data/audit.jsonl osint/ # domain recon: dns · rdap · certs (CT) · recon · domain-validate tests/ # Vitest: robots matcher, SSRF classifier, extraction, domain-validate ``` ## 配置 所有配置均为可选: | 变量 | 用途 | | --- | --- | | `LUMORA_CHROMIUM_PATH` | 用于 JS 渲染的显式 Chromium 可执行文件路径 | | `PLAYWRIGHT_BROWSERS_PATH` | 备用的 Playwright 浏览器缓存目录 | ## 界面 - **Web 控制台** —— Workbench(extract / crawl / OSINT),Activity(实时审计),Governance。 - **REST API** —— `/api/extract`, `/api/crawl`, `/api/osint`, `/api/audit`。 ## 接入真实数据与扩展 页面是 Server Components;引擎是纯 TypeScript 模块。提取 返回类型化的结果 (`src/lib/types.ts`),适合直接摄取到 vector store 或 data pipeline 中。如今审计日志由文件支持;对于多节点部署,请使用 数据库作为其支持。 ## 质量与 CI | | | | --- | --- | | **语言** | TypeScript 5 (`strict`) | | **测试** | 12 个 Vitest 单元测试(robots 匹配器、SSRF 分类器、HTML 提取、域名验证) | | **Lint** | ESLint (`next/core-web-vitals`, `next/typescript`) | | **CI** | GitHub Actions —— 在每次 push 和 PR 时执行 install · lint · typecheck · test · build | | **供应链** | 0 个生产依赖漏洞;零运行时 UI 依赖 | ``` npm run lint # ESLint npm run typecheck # tsc --noEmit npm test # Vitest npm run build # production build ``` ## 路线图 - 控制平面中的**任务调度器与结果浏览器**(持久化 crawl / extract 结果,而不仅仅是审计追踪)。 - **OSINT 深度** —— 被动 DNS 历史记录和额外的公开注册表(只读)。 - 用于多节点部署的**数据库支持审计**(目前由文件支持)。 ## 许可证 专有。Copyright © 2026 Frank Asante Van Laarhoven。保留所有权利。 请参阅 [LICENSE](./LICENSE)。
标签:ESC4, OSINT, TypeScript, Web抓取, 安全插件, 实时处理, 数据提取, 特征检测, 网络测绘, 自动化攻击