FrankAsanteVanLaarhoven/LumoraAI
GitHub: FrankAsanteVanLaarhoven/LumoraAI
一款自托管、治理优先的网页数据提取与被动 OSINT 引擎,在强制遵守 robots.txt、SSRF 防护和审计的前提下,将公开网页转化为干净的 Markdown/JSON 结构化数据。
Stars: 1 | Forks: 0
# LumoraAI
### 治理优先的网页数据提取与 OSINT —— 自托管
将任何公开的 URL、网站或域名转化为干净、结构化的情报 ——
Markdown / JSON 提取(涵盖静态**和** JavaScript 渲染)、有界爬取,
以及被动域名侦察 —— 并在**每个**请求中强制执行 robots.txt、SSRF 防护、
授权和审计。
[](https://github.com/FrankAsanteVanLaarhoven/LumoraAI/actions/workflows/ci.yml)





## 概述
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抓取, 安全插件, 实时处理, 数据提取, 特征检测, 网络测绘, 自动化攻击