rssany 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.env.example +52 -0
- package/README.md +196 -0
- package/bin/rssany.js +6 -0
- package/config.examples.json +11 -0
- package/dist/index.js +4037 -0
- package/dist/index.js.map +1 -0
- package/package.json +98 -0
- package/plugins/sources/email.rssany.js +96 -0
- package/plugins/sources/rss.rssany.js +83 -0
- package/plugins/templates/site.rssany.js +26 -0
- package/scripts/reset.mjs +136 -0
- package/sources.example.json +562 -0
- package/statics/401.html +56 -0
- package/statics/404.html +12 -0
- package/statics/README.md +7 -0
- package/statics/image.png +0 -0
- package/webui/build/200.html +51 -0
- package/webui/build/_app/env.js +1 -0
- package/webui/build/_app/immutable/assets/0.BUAXpTm6.css +1 -0
- package/webui/build/_app/immutable/assets/10.I1OuCLrU.css +1 -0
- package/webui/build/_app/immutable/assets/11.CrO9xaki.css +1 -0
- package/webui/build/_app/immutable/assets/12.BEi6fInA.css +1 -0
- package/webui/build/_app/immutable/assets/14.Ctlgn1LZ.css +1 -0
- package/webui/build/_app/immutable/assets/2.eJ80XOGm.css +1 -0
- package/webui/build/_app/immutable/assets/4.B8-jYAVj.css +1 -0
- package/webui/build/_app/immutable/assets/5.ClehBQ0g.css +1 -0
- package/webui/build/_app/immutable/assets/6.Drn-0DON.css +1 -0
- package/webui/build/_app/immutable/assets/7.ms2diq_q.css +1 -0
- package/webui/build/_app/immutable/assets/8.DKymkjjs.css +1 -0
- package/webui/build/_app/immutable/assets/9.BZheTlzZ.css +1 -0
- package/webui/build/_app/immutable/assets/SourcesList.BhtYlRsQ.css +1 -0
- package/webui/build/_app/immutable/chunks/BUApaBEI.js +1 -0
- package/webui/build/_app/immutable/chunks/BUngiKFg.js +1 -0
- package/webui/build/_app/immutable/chunks/Bfc47y5P.js +1 -0
- package/webui/build/_app/immutable/chunks/Bt0fzibd.js +1 -0
- package/webui/build/_app/immutable/chunks/BxHqDcpw.js +1 -0
- package/webui/build/_app/immutable/chunks/ByQRbEUX.js +1 -0
- package/webui/build/_app/immutable/chunks/C12mHcUp.js +6 -0
- package/webui/build/_app/immutable/chunks/C1kQ4pHy.js +1 -0
- package/webui/build/_app/immutable/chunks/C74gbb4Q.js +1 -0
- package/webui/build/_app/immutable/chunks/CAtemnMo.js +1 -0
- package/webui/build/_app/immutable/chunks/CBY2biv-.js +1 -0
- package/webui/build/_app/immutable/chunks/CVjCNJia.js +1 -0
- package/webui/build/_app/immutable/chunks/Cg3zih_x.js +1 -0
- package/webui/build/_app/immutable/chunks/CjQQ9_Q2.js +2 -0
- package/webui/build/_app/immutable/chunks/CkS2JMkE.js +1 -0
- package/webui/build/_app/immutable/chunks/CtHRh_pJ.js +1 -0
- package/webui/build/_app/immutable/chunks/D-6mYMI1.js +1 -0
- package/webui/build/_app/immutable/chunks/D1Gs8-g3.js +1 -0
- package/webui/build/_app/immutable/chunks/D9dRVKgL.js +1 -0
- package/webui/build/_app/immutable/chunks/DCEY1XiC.js +1 -0
- package/webui/build/_app/immutable/chunks/DI-t-G_K.js +2 -0
- package/webui/build/_app/immutable/chunks/DTUxjyWL.js +1 -0
- package/webui/build/_app/immutable/chunks/DWJZOHke.js +1 -0
- package/webui/build/_app/immutable/chunks/Dgs6d7X5.js +1 -0
- package/webui/build/_app/immutable/chunks/DjpPK99f.js +71 -0
- package/webui/build/_app/immutable/chunks/DjzVVxpy.js +1 -0
- package/webui/build/_app/immutable/chunks/LQVMBmDN.js +1 -0
- package/webui/build/_app/immutable/chunks/Qw0Qgx6J.js +1 -0
- package/webui/build/_app/immutable/chunks/V2-VOe88.js +1 -0
- package/webui/build/_app/immutable/chunks/bohabpgg.js +1 -0
- package/webui/build/_app/immutable/chunks/c-YfbAB_.js +8 -0
- package/webui/build/_app/immutable/chunks/hp4PFHFv.js +1 -0
- package/webui/build/_app/immutable/chunks/tpTQfoNn.js +1 -0
- package/webui/build/_app/immutable/entry/app.4I2fqDIL.js +2 -0
- package/webui/build/_app/immutable/entry/start.CrgdT2Qb.js +1 -0
- package/webui/build/_app/immutable/nodes/0.gA9sQtoM.js +11 -0
- package/webui/build/_app/immutable/nodes/1.Bybh7btp.js +1 -0
- package/webui/build/_app/immutable/nodes/10.DEkJCZ6X.js +1 -0
- package/webui/build/_app/immutable/nodes/11.CDNNJqlQ.js +1 -0
- package/webui/build/_app/immutable/nodes/12.D9g8GCjm.js +24 -0
- package/webui/build/_app/immutable/nodes/13.DRpZV72T.js +1 -0
- package/webui/build/_app/immutable/nodes/14.DVeJW6bd.js +1 -0
- package/webui/build/_app/immutable/nodes/15.BtYZF6FM.js +1 -0
- package/webui/build/_app/immutable/nodes/16.Ba_qJjp6.js +1 -0
- package/webui/build/_app/immutable/nodes/2.DIZ4IPNm.js +1 -0
- package/webui/build/_app/immutable/nodes/3.BFSNf0FK.js +1 -0
- package/webui/build/_app/immutable/nodes/4.BSsIjejE.js +2 -0
- package/webui/build/_app/immutable/nodes/5.COxRT9Oe.js +1 -0
- package/webui/build/_app/immutable/nodes/6.CBgQ4YzB.js +1 -0
- package/webui/build/_app/immutable/nodes/7.BbzWOL0V.js +6 -0
- package/webui/build/_app/immutable/nodes/8.C8120200.js +1 -0
- package/webui/build/_app/immutable/nodes/9.BH_BGQQ4.js +1 -0
- package/webui/build/_app/version.json +1 -0
package/.env.example
ADDED
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
# ─── 服务基础 ────────────────────────────────────────────────────────────────
|
|
2
|
+
PORT=18473
|
|
3
|
+
NODE_ENV=production
|
|
4
|
+
|
|
5
|
+
# 前端地址,OAuth 回调后重定向至此
|
|
6
|
+
APP_URL=https://rssany.com
|
|
7
|
+
|
|
8
|
+
# ─── 认证(必填)────────────────────────────────────────────────────────────
|
|
9
|
+
# JWT 签名密钥,至少 32 位随机字符串,例如:openssl rand -base64 32
|
|
10
|
+
JWT_SECRET=change-me-to-a-random-32-char-secret
|
|
11
|
+
|
|
12
|
+
# ─── Google OAuth(可选)────────────────────────────────────────────────────
|
|
13
|
+
# 在 https://console.cloud.google.com/apis/credentials 创建 OAuth 2.0 客户端
|
|
14
|
+
# 授权回调 URI 填:https://your-domain.com/api/auth/google
|
|
15
|
+
GOOGLE_CLIENT_ID=
|
|
16
|
+
GOOGLE_CLIENT_SECRET=
|
|
17
|
+
|
|
18
|
+
# ─── GitHub OAuth(可选)────────────────────────────────────────────────────
|
|
19
|
+
# 在 https://github.com/settings/applications/new 创建 OAuth App
|
|
20
|
+
# Authorization callback URL 填:https://your-domain.com/api/auth/github
|
|
21
|
+
GITHUB_CLIENT_ID=
|
|
22
|
+
GITHUB_CLIENT_SECRET=
|
|
23
|
+
|
|
24
|
+
# ─── 邮件发送(全部放 env,无需在 config.json 写 email 节)─────────────────────
|
|
25
|
+
# SMTP 配置
|
|
26
|
+
SMTP_HOST=smtp.example.com
|
|
27
|
+
SMTP_PORT=465
|
|
28
|
+
SMTP_SECURE=true
|
|
29
|
+
SMTP_USER=your@example.com
|
|
30
|
+
SMTP_PASS=your-smtp-password
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
# Resend API Key(driver=resend 时使用;https://resend.com/api-keys)
|
|
34
|
+
RESEND_API_KEY=re_xxxxxxxxxxxxxxxxxxxx
|
|
35
|
+
|
|
36
|
+
# ─── LLM(研究报告模式用)──────────────────────────────────────────────────
|
|
37
|
+
OPENAI_API_KEY=sk-...
|
|
38
|
+
OPENAI_BASE_URL=https://api.openai.com/v1
|
|
39
|
+
OPENAI_MODEL=gpt-4o-mini
|
|
40
|
+
|
|
41
|
+
|
|
42
|
+
# ─── 用户数据目录(可选)──────────────────────────────────────────────────────
|
|
43
|
+
# 默认:用户主目录下的 .rssany/(Windows:%USERPROFILE%\.rssany)
|
|
44
|
+
# RSSANY_USER_DIR=/path/to/custom
|
|
45
|
+
|
|
46
|
+
# ─── 数据库(本地 SQLite)────────────────────────────────────────────────────
|
|
47
|
+
# 主库路径:<用户数据>/.rssany/data/rssany.db(启动时自动建表);可选:
|
|
48
|
+
# RSSANY_DB_JOURNAL=delete 在 Windows 热重载场景下降低 WAL 损坏风险
|
|
49
|
+
|
|
50
|
+
# ─── 缓存目录(可选)────────────────────────────────────────────────────────
|
|
51
|
+
# 默认:<用户数据>/.rssany/cache;可单独覆盖:
|
|
52
|
+
# CACHE_DIR=/path/to/custom/cache
|
package/README.md
ADDED
|
@@ -0,0 +1,196 @@
|
|
|
1
|
+
# RSSAny - 把任何信息变成RSS订阅
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
> 按信源抓取网页 / RSS / 邮件等,解析、补全文、打标签与翻译后**入库**,再按需生成 **RSS / Atom / JSON Feed** 与 JSON API。
|
|
5
|
+
|
|
6
|
+
**RSSAny** 是一套自托管的订阅管线:列表 URL → **抓取与解析**(规则 / LLM)→ **正文提取**(自定义 / Readability / LLM)→ **upsert 去重** → 固定 **pipeline**(打标签、翻译等)→ 对外提供 `**/rss`** 等输出。
|
|
7
|
+
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
## 功能概览
|
|
11
|
+
|
|
12
|
+
- **统一订阅**:在 `.rssany/sources.json` 中配置网站列表、标准 RSS、IMAP 邮件等,由调度器按 `refresh` 策略拉取。
|
|
13
|
+
- **可插拔信源**:`plugins/sources/` 与 `.rssany/plugins/sources/` 中的 **Site** 插件(`.rssany.js` / `.rssany.ts`),自定义列表解析与详情规则。
|
|
14
|
+
- **正文补全**:可选 **enrich** 插件拉全文;无 enrich 时入库后仍会跑 pipeline。
|
|
15
|
+
- **固定 pipeline**:`app/pipeline/` 中打标签、翻译等,由 `.rssany/config.json` 的 `pipeline.steps` 开关(**不是**用户目录下的 pipeline 插件)。
|
|
16
|
+
- **LLM 辅助**:解析、提取、标签、翻译等可按配置走 OpenAI 兼容接口。
|
|
17
|
+
- **站点登录**:需登录的站点通过 Puppeteer 管理 Cookie(与产品用户账号无关)。
|
|
18
|
+
- **可选远端投递**:若 `config.json` 中 `**deliver.url`** 非空,在写库与 pipeline 完成后将条目以 `**{ sourceRef, items }**` JSON **POST** 到该 URL(由 `app/deliver/post.ts` 发送);留空则仅本地消费。
|
|
19
|
+
- **MCP**:条目检索等能力以 MCP 暴露,供 Cursor、Claude 等使用。
|
|
20
|
+
- **Web 界面**:SvelteKit 构建产物由后端托管;**Feeds** 等需 **邮箱校验**;`**/admin`** 需 `**users.role === 'admin'**`(可从 `**/me**` 进入)。
|
|
21
|
+
|
|
22
|
+
---
|
|
23
|
+
|
|
24
|
+
## 技术栈(摘要)
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
| 层级 | 说明 |
|
|
28
|
+
| --- | ------------------------------------------------------------ |
|
|
29
|
+
| 运行时 | Node.js **20–23**(见 `package.json` `engines`) |
|
|
30
|
+
| 后端 | Hono、`tsx` 开发入口 |
|
|
31
|
+
| 数据 | **SQLite**(`better-sqlite3`),默认 **`~/.rssany/data/rssany.db`**(Windows:`%USERPROFILE%\.rssany\data\rssany.db`) |
|
|
32
|
+
| 前端 | `webui/`(SvelteKit + Vite,构建输出由根服务托管) |
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
原生模块 `**better-sqlite3**` 安装时会编译;若遇绑定缺失,请确认未禁用构建(仓库 `pnpm-workspace.yaml` 中已允许其 `allowBuilds`)。
|
|
36
|
+
|
|
37
|
+
---
|
|
38
|
+
|
|
39
|
+
## 快速开始
|
|
40
|
+
|
|
41
|
+
### 环境要求
|
|
42
|
+
|
|
43
|
+
- Node.js **20.x–23.x**(与 `package.json` 的 `engines` 字段一致)
|
|
44
|
+
- **pnpm**
|
|
45
|
+
|
|
46
|
+
### 安装依赖
|
|
47
|
+
|
|
48
|
+
```bash
|
|
49
|
+
pnpm install
|
|
50
|
+
pnpm run webui:install
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
### 配置
|
|
54
|
+
|
|
55
|
+
1. 复制环境变量示例并按需填写(JWT、OAuth、SMTP、LLM 等):
|
|
56
|
+
```bash
|
|
57
|
+
cp .env.example .env
|
|
58
|
+
```
|
|
59
|
+
2. 信源与全局配置:首次启动会在 **`~/.rssany/`**(Windows:`%USERPROFILE%\.rssany\`)下自动从包内示例生成 `sources.json`、`config.json`(若已存在则不会覆盖)。也可手动复制仓库里的 `sources.example.json`、`config.examples.json`。
|
|
60
|
+
3. (可选)LLM:在 `.env` 中设置 `OPENAI_API_KEY`、`OPENAI_BASE_URL`、`OPENAI_MODEL` 等。
|
|
61
|
+
|
|
62
|
+
### 运行
|
|
63
|
+
|
|
64
|
+
**开发**(后端根路径托管 `webui` 构建产物,改前端需重新构建或 watch):
|
|
65
|
+
|
|
66
|
+
```bash
|
|
67
|
+
# 推荐:API + 前端 watch(修改 Svelte 后自动写入构建目录,刷新浏览器即可)
|
|
68
|
+
pnpm run dev:all
|
|
69
|
+
|
|
70
|
+
# 或分步:先打一次前端再起后端
|
|
71
|
+
pnpm run webui:build
|
|
72
|
+
pnpm dev
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
默认监听 `**http://127.0.0.1:18473/**`(端口见 `.env.example` 中 `PORT`,避免与常见开发端口冲突)。
|
|
76
|
+
|
|
77
|
+
**重置本地数据**(结束占用 `PORT` 的监听进程,并删除 **`~/.rssany/`**,或 `RSSANY_USER_DIR` 所设目录):
|
|
78
|
+
|
|
79
|
+
```bash
|
|
80
|
+
pnpm reset
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
**仅调试 WebUI 热更新**(可选):`cd webui && pnpm dev`(Vite 代理到本机后端,见 `webui/vite.config.ts`)。
|
|
84
|
+
|
|
85
|
+
**生产**:
|
|
86
|
+
|
|
87
|
+
```bash
|
|
88
|
+
pnpm run webui:build && pnpm start
|
|
89
|
+
```
|
|
90
|
+
|
|
91
|
+
### npm 全局安装(或 `npx`)
|
|
92
|
+
|
|
93
|
+
发布包时 `prepublishOnly` 会执行 `build:all`(后端 `vite build` + `webui:build`)。安装后:
|
|
94
|
+
|
|
95
|
+
```bash
|
|
96
|
+
npm install -g rssany
|
|
97
|
+
rssany
|
|
98
|
+
```
|
|
99
|
+
|
|
100
|
+
重置数据(结束 `PORT` 监听进程并删除用户目录):**`rssany reset`**(与仓库内 **`pnpm reset`** 相同逻辑;可在含 `.env` 的目录下执行以读取 `PORT` / `RSSANY_USER_DIR`)。
|
|
101
|
+
|
|
102
|
+
用户数据在 **`~/.rssany/`**(Windows:`%USERPROFILE%\.rssany`),与工作目录无关。可选环境变量 **`RSSANY_USER_DIR`** 可指定其它路径。等价于 `node node_modules/rssany/dist/index.js`;CLI 名称为 `rssany`。内置 `plugins/`、`statics/`、`webui/build` 随包安装路径解析。
|
|
103
|
+
|
|
104
|
+
---
|
|
105
|
+
|
|
106
|
+
## 数据流(简图)
|
|
107
|
+
|
|
108
|
+
```
|
|
109
|
+
sources.json / Site 插件
|
|
110
|
+
→ 调度器触发 fetchItems
|
|
111
|
+
→ upsertItems
|
|
112
|
+
→ [可选] enrich 队列
|
|
113
|
+
→ pipeline(每条一次)
|
|
114
|
+
→ [可选] deliver.url POST(出站,非入站 API)
|
|
115
|
+
```
|
|
116
|
+
|
|
117
|
+
消费侧:**RSS/XML**、`**/api/*`**、**MCP**、Web UI。
|
|
118
|
+
|
|
119
|
+
---
|
|
120
|
+
|
|
121
|
+
## 常用 HTTP 能力
|
|
122
|
+
|
|
123
|
+
### RSS 输出
|
|
124
|
+
|
|
125
|
+
- **按条件从库中生成**:支持 `search`、`tags`、`lng`、`limit` 等查询参数;可用 `subscribed=1` 限定为 `sources.json` 中出现的 ref。
|
|
126
|
+
- **按 URL 即时抓取**:`GET /rss/https://example.com/...`(具体行为以路由实现为准)。
|
|
127
|
+
|
|
128
|
+
---
|
|
129
|
+
|
|
130
|
+
## 插件与配置
|
|
131
|
+
|
|
132
|
+
### 信源插件(Site)
|
|
133
|
+
|
|
134
|
+
放置于 `**plugins/sources/`** 或 `**.rssany/plugins/sources/**`,用户插件可与内置插件同 `id` 覆盖。最小约定包括 `id`、`listUrlPattern` 等(详见 `app/scraper/sources/web/site.ts`)。
|
|
135
|
+
|
|
136
|
+
### Enrich 插件
|
|
137
|
+
|
|
138
|
+
`**plugins/enrich/**`、`**.rssany/plugins/enrich/**`,按 enrich 管线加载。
|
|
139
|
+
|
|
140
|
+
### Pipeline(固定代码)
|
|
141
|
+
|
|
142
|
+
`**app/pipeline/**`,通过 `**.rssany/config.json**` 配置步骤,例如:
|
|
143
|
+
|
|
144
|
+
```json
|
|
145
|
+
{
|
|
146
|
+
"pipeline": {
|
|
147
|
+
"steps": [
|
|
148
|
+
{ "id": "tagger", "enabled": true },
|
|
149
|
+
{ "id": "translator", "enabled": false }
|
|
150
|
+
]
|
|
151
|
+
},
|
|
152
|
+
"deliver": {
|
|
153
|
+
"url": ""
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
```
|
|
157
|
+
|
|
158
|
+
`deliver.url` 非空时会对处理完成的条目向该 URL 发起出站 POST;留空则不投递。
|
|
159
|
+
|
|
160
|
+
### `sources.json` 片段示例
|
|
161
|
+
|
|
162
|
+
```json
|
|
163
|
+
{
|
|
164
|
+
"sources": [
|
|
165
|
+
{ "ref": "https://example.com/feed.xml", "label": "Example", "refresh": "1h" }
|
|
166
|
+
]
|
|
167
|
+
}
|
|
168
|
+
```
|
|
169
|
+
|
|
170
|
+
合法 `refresh` 取值包括:`10min`、`30min`、`1h`、`6h`、`12h`、`1day`(默认)、`3day`、`7day`。
|
|
171
|
+
|
|
172
|
+
---
|
|
173
|
+
|
|
174
|
+
## 仓库目录(摘要)
|
|
175
|
+
|
|
176
|
+
```
|
|
177
|
+
├── app/ # 后端:路由、feeder、scraper、pipeline、mcp、db、auth…
|
|
178
|
+
├── plugins/ # 内置信源 / enrich 等插件
|
|
179
|
+
└── webui/ # SvelteKit 前端
|
|
180
|
+
|
|
181
|
+
~/.rssany/ # 运行时用户数据(首次启动创建;或 RSSANY_USER_DIR)
|
|
182
|
+
├── sources.json
|
|
183
|
+
├── config.json
|
|
184
|
+
├── tags.json
|
|
185
|
+
├── data/rssany.db # SQLite 主库
|
|
186
|
+
├── cache/
|
|
187
|
+
└── plugins/ # 用户插件覆盖内置
|
|
188
|
+
```
|
|
189
|
+
|
|
190
|
+
更细的模块说明见 **[AGENTS.md](./AGENTS.md)**(与代码迭代同步,若有出入以代码为准)。
|
|
191
|
+
|
|
192
|
+
---
|
|
193
|
+
|
|
194
|
+
## 许可证
|
|
195
|
+
|
|
196
|
+
MIT
|
package/bin/rssany.js
ADDED