feat: switch config to JSONC + split secrets.json

Load business config as JSONC (comments + trailing commas) via an
in-repo stripper then stdlib json — no new deps. Default path prefers
config.jsonc, falls back to legacy config.json. Auth write-back targets
only sibling secrets.json so JSONC comments are never wiped; secrets
overlay merges on load. Examples, compose, Docker, docs, favsort and
tools all share the same loader. Phase A only — no DB settings migration.
This commit was merged in pull request #4.
This commit is contained in:
bot-ci committed 2026-11-02 12:58:20 +08:00
1 parent b4f0f45c4e
commit 8e7ead1669
21 files changed
+652 -182

No files matched your search

+22 -9
View File
@@ -85,11 +85,14 @@ Telegram 私聊发链接/BV 号 ───┘
- **日更对象** = 库内 `active` 视频;
- **黑名单只挡"发现"**:已入库的黑名单 UP 视频一律当普通视频处理,不判断、不排除、也不反向更新黑名单。
### 1.5 配置与凭据(统一放配置文件)
### 1.5 配置与凭据(JSONC + secrets)
所有可变项与敏感信息都在一个配置文件里(建议 `config.json`,`chmod 600`,`.gitignore` 排除):
业务项放 `config.jsonc`(可注释,`chmod 600`,`.gitignore` 排除);敏感凭据放同目录 `secrets.json`(纯 JSON,供 auth 回写)。
默认优先读 `config.jsonc`,否则 `config.json`。旧单体文件仍可用;存在 `secrets.json` 时凭据以它为准。
```jsonc
`secrets.json`:
```json
{
"bilibili": {
"read": {
@@ -107,6 +110,15 @@ Telegram 私聊发链接/BV 号 ───┘
"bot_token": "123456:ABC...",
"chat_id": "-1001234567890"
},
"web": { "auth_token": "..." }
}
```
`config.jsonc`(节选):
```jsonc
{
"telegram": { "enabled": true },
"folders": [
{ "year": 2025, "media_id": 4451053851, "title": "咻咻满-reaction-2025" },
{ "year": 2026, "media_id": 3700023351, "title": "咻咻满 reaction 合集" }
@@ -139,8 +151,8 @@ Telegram 私聊发链接/BV 号 ───┘
- 支持热加载(每 60 秒检查 mtime),改收藏夹/黑名单不用重启;`schedule` 中的周期与每日时间需重启生效;
- **黑名单本身放数据库**(`up_blacklist` 表),因为要从通知里动态拉黑;配置文件只做初始种子;
- 日志里**永不打印 token / cookie**,启动时只打印"已配置/未配置";
- 容器里把配置目录挂成**可写卷**(`-v ./config:/config`,权限 600),因为 `auth` 扫码续期后要回写 cookie;
- `python app.py auth --account read|write` 对指定账号扫码续期,只替换该账号身份字段、保留该账号设备指纹;
- 容器里把配置目录挂成**可写卷**(挂 `config.jsonc` + `secrets.json`,权限 600),因为 `auth` 扫码续期后要回写 `secrets.json`;
- `python app.py auth --account read|write` 对指定账号扫码续期,只写 `secrets.json` 中该账号身份字段、保留设备指纹,**不改**主 JSONC;
- `read` 用于快照、搜索发现、入库与所有查询;`write` 仅用于 `favsort.py` 收藏夹重排序(`sort`);不支持顶层扁平凭据;
- 可选的 `ENV` 覆盖(`TG_BOT_TOKEN` 等)留给 CI/临时调试,不作为主路径。
@@ -586,7 +598,7 @@ CREATE TABLE kv (k TEXT PRIMARY KEY, v TEXT);
**开发阶段只做 Telegram**:
- Bot 用 `getUpdates` long polling 收 `callback_query`,本机没有公网 IP 也能联调;
- `bot_token` / `chat_id` 从 `config.json` 读(见 §1.5),不写死在代码里;
- `bot_token` / `chat_id` 从配置/secrets 读(见 §1.5),不写死在代码里;
- **按私聊设计**:`chat_id` 是用户 id(正数),Bot 只服务你一个人;回调 `callback_query` 直接用 `answerCallbackQuery` 回执;
- 上线后服务有域名 + TLS,再补"签名链接"路径给企业微信/邮件/Webhook;
- 两种路径共用同一个 `fav_action` 状态机,只是入口不同(`callback_data` vs `POST /a/<token>/confirm`)。
@@ -767,9 +779,10 @@ UP 内容效率 = EB 收缩后的 Σview / Σ内容小时
```text
Dockerfile 单容器镜像(只安装 httpx 0.28.1)
compose.example.yml 挂载 ./config.json → /config、./data → /data(复制为 compose.yml 后使用)
.dockerignore 排除凭据、数据、测试与本地环境
config.docker.example.json 服务器配置样例(0.0.0.0 + /data 绝对路径)
compose.example.yml 挂载 config.jsonc + secrets.json → /config、./data → /data
.dockerignore 排除凭据、数据、测试与本地环境
config.docker.example.jsonc 服务器业务配置样例(0.0.0.0 + /data 绝对路径)
secrets.example.json 凭据样例(auth 回写目标)
```
- 单容器跑「调度 + Web」,数据卷 `/data/app.db`;