koishi-plugin-kkk 1.2.0-beta.1 → 2.0.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/CHANGELOG.md +130 -99
- package/assets/web/assets/index-BRROK0vh.js +1 -1
- package/assets/web/index.html +4 -2
- package/config/default_config/app.yaml +3 -1
- package/lib/compat/forward-collect.js +88 -0
- package/lib/compat/node-karin.js +437 -40
- package/lib/karin/apps/tools.js +39 -8
- package/lib/karin/module/utils/Base.js +5 -3
- package/lib/karin/module/utils/ImageSlice.js +6 -4
- package/lib/karin/module/utils/ParseForward.js +94 -0
- package/lib/karin/module/utils/QqPanel.js +7 -2
- package/lib/qqFields.json +3 -3
- package/package.json +2 -2
- package/scripts/patch-webui.mjs +79 -13
- package/scripts/smoke-ffmpeg-path.cjs +268 -0
- package/scripts/smoke-onebot-forward.cjs +178 -0
- package/scripts/smoke-parse-forward.cjs +211 -0
- package/scripts/smoke-player.cjs +41 -9
- package/src/compat/forward-collect.ts +91 -0
- package/src/compat/node-karin.ts +444 -37
- package/src/karin/apps/tools.ts +39 -8
- package/src/karin/module/utils/Base.ts +6 -4
- package/src/karin/module/utils/ImageSlice.ts +7 -5
- package/src/karin/module/utils/ParseForward.ts +90 -0
- package/src/karin/module/utils/QqPanel.ts +8 -3
- package/src/karin/types/config/app.ts +7 -1
- package/src/qqFields.json +3 -3
package/CHANGELOG.md
CHANGED
|
@@ -1,116 +1,147 @@
|
|
|
1
1
|
# 更新日志
|
|
2
2
|
|
|
3
|
-
##
|
|
3
|
+
## 2.0.0
|
|
4
4
|
|
|
5
|
-
>
|
|
6
|
-
>
|
|
5
|
+
> 这是 Koishi 移植版从 **1.0.0 到 2.0.0** 的一次总更新(把此前 `1.2.0-beta.1` 的全部内容也并了进来)。
|
|
6
|
+
> 一句话:**配置面板、QQ 面板与体积、解析链路、弹幕、在线播放器、合并转发、进度与错误处理**,
|
|
7
|
+
> 这一路上的改动都在这一版里说清楚。升级到本版**一般不用改配置**:所有新开关都有默认值,
|
|
8
|
+
> 老配置里缺这些键时行为与以前一致(每条都标了默认值)。
|
|
7
9
|
|
|
8
10
|
### 本版重点
|
|
9
|
-
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
-
|
|
17
|
-
-
|
|
18
|
-
QQ 面板链接用 `mqqapi://` 被服务端拒绝导致整条面板发不出去;错误卡片切片 `e is not defined`;
|
|
19
|
-
`getFriendList` 刷屏;浏览器禁访端口(ERR_UNSAFE_PORT)自动退回。
|
|
20
|
-
|
|
11
|
+
- **在线播放器(弹幕在线看)**:选「弹幕」不再把弹幕烧进视频,而是把视频放进播放页、回一条链接;
|
|
12
|
+
播放页照着 B站播放页做(夜间风格、标题/UP/统计、弹幕设置面板),链接到期自动删文件。
|
|
13
|
+
- **解析结果合并转发**:一次解析产生的所有内容合并成**一条转发**发出(**不含过程提示**),
|
|
14
|
+
在 OneBot 系适配器上走的是 **OneBot 的合并转发 API**(`send_group_forward_msg` / `send_private_forward_msg`)。
|
|
15
|
+
- **关掉某个平台的解析,那个平台就彻底不处理**(不回复、不提示缺 Cookie、不记统计)。
|
|
16
|
+
- **面板「在线播放器设置」**:样式与其它分组完全一致(同一套卡片容器),并且有了**这一组自己的总开关**,
|
|
17
|
+
关掉时组内其它字段全部变灰不可改。
|
|
18
|
+
- **ffmpeg 不再被「相对路径 / 没有执行权限」那份拖死**:按候选逐份校验,起不来就换下一份。
|
|
19
|
+
- **修 WebUI「推送列表 → 推送目标 → 填频道 id → 点完成 → 整个面板黑屏」**。
|
|
21
20
|
|
|
22
21
|
### 新增
|
|
23
|
-
- **在线播放器(弹幕在线看)**(通用
|
|
22
|
+
- **在线播放器(弹幕在线看)**(通用 →「在线播放器设置」):
|
|
24
23
|
解析面板里那一列按钮写「**弹幕**」,点它不再把弹幕烧进视频,而是把视频下下来放进播放器目录、
|
|
25
24
|
回一条链接 —— 点开就是带弹幕的播放页(深色界面、手机也能看,弹幕用 canvas 自己画,
|
|
26
|
-
有弹幕开关 / 字号 /
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
25
|
+
有弹幕开关 / 字号 / 透明度 / 显示区域 / 滚动·顶部·底部三类开关 / 彩色弹幕)。页面**零外网依赖**,
|
|
26
|
+
服务端支持 HTTP Range,进度条可拖动。
|
|
27
|
+
- 配置项(都在「通用 → 在线播放器设置」,括号里是默认值):
|
|
28
|
+
**在线播放器总开关**(开)、**面板显示「在线看」按钮**(开)、**播放器公网地址**(空)、
|
|
29
|
+
**播放器端口**(0 = 复用 Koishi 端口)、**链接有效期(分钟)**(60)、
|
|
30
|
+
**在线播放最大文件(MB)**(0 = 跟随全局「文件大小限制」)、**超限转在线播放**(关)。
|
|
31
|
+
- **这一组有自己的总开关**:关掉后组内其它设置全部变灰不可改,解析回到原来的 ffmpeg 烧录流程
|
|
32
|
+
(面板列头变回「烧录弹幕」、不再有「在线看」列);这一组在面板里的样式与「缓存设置 / 交互设置」
|
|
33
|
+
等分组**完全一致**(同一套卡片容器、标题与间距)。
|
|
34
|
+
- **「在线看」按钮**(面板「弹幕」右边一列):点它**直接在线播放**(带弹幕、视频不发群),
|
|
35
|
+
即使面板弹幕列关着、配置里弹幕功能关着也照样带弹幕;总开关关掉时这一列不出现。
|
|
36
|
+
- **超过 QQ 档位上限(默认 200MB)的画质档照样列出来**:在线播放的视频不发到 QQ,
|
|
37
|
+
所以那个体积上限不该再把档位藏掉;超限档位的「清晰度」那一格标「超上限」,
|
|
38
|
+
右边的「在线看」仍可用(受下面那条播放器上限约束)。
|
|
39
|
+
- **「在线播放最大文件」**:显式填了就用它;留空或 0 = 跟随全局的「文件大小限制」;
|
|
40
|
+
**超限不走在线播放**(判定发生在把文件搬进播放器目录**之前**,一点磁盘都不占),
|
|
41
|
+
退回原来的发送流程并说明「超过在线播放的体积上限,按原来的方式处理」。
|
|
42
|
+
「超限转在线播放」也吃这条上限(开了转播也不突破)。
|
|
43
|
+
- **「超限转在线播放」**(默认关):打开后,超过全局「文件大小限制」的视频不再回
|
|
44
|
+
「视频太大了,还是去B站看吧」,而是照常下载并改成在线播放(视频不发群、也不占群文件)。
|
|
45
|
+
- **播放器公网地址**留空时:链接退化成「本机 IP + 端口」(本机 / 内网可用),
|
|
46
|
+
日志里警告一次,机器人回复与播放页上都会带一句「未配置公网地址,仅本机可访问」。
|
|
47
|
+
- 播放页:**下载按钮**(服务端带 `Content-Disposition`,文件名做过安全处理)、
|
|
48
|
+
过期页与播放页的「直接跳转 / 手动复制」、作品信息(标题 / UP 主 / 封面 / 播放量 / 点赞 / 投币 /
|
|
49
|
+
收藏 / 评论 / 分享 / 发布时间 / 时长,**只用真实数据,没有就不显示**)、封面走**同源**地址(断网不裂图)、
|
|
50
|
+
在线播放优先选 **H.264** 的流(避免「只有声音没有画面」)。
|
|
51
|
+
- 路由:`/kkk/player/:token`(播放页)、`/kkk/player/:token/video`(支持 Range;`?download=1` 下载)、
|
|
52
|
+
`/kkk/player/:token/download`、`/kkk/player/:token/danmaku`(弹幕 JSON)、
|
|
53
|
+
`/kkk/player/:token/cover`;令牌是随机串且只允许 `[0-9a-z]{8,64}`。
|
|
54
|
+
- **解析结果合并转发**(通用 →「交互设置 → 伪造合并转发消息」,默认开):
|
|
55
|
+
一次解析产生的**所有内容**(卡片 / 图片 / 视频 / 评论…)合并成**一条转发**发出,
|
|
56
|
+
**过程提示不进转发**(「检测到链接,开始解析」「收到请求,开始下载」「加载中…」「发送中…」照常单独发)。
|
|
57
|
+
- 走的是**适配器自己的合并转发 API**:OneBot 系会调用
|
|
58
|
+
`send_group_forward_msg` / `send_private_forward_msg`(转发节点里带 uin / name);
|
|
59
|
+
- **身份**:开着 = 用**触发者**身份展示,关着 = 用**机器人**身份展示;
|
|
60
|
+
- 只对支持合并转发的适配器有效果;QQ 官方适配器没有这个能力,会自动退化成逐条发送;
|
|
61
|
+
- 发给别人(例如错误日志发给主人)的消息不会被吞进这条转发里。
|
|
62
|
+
- **通用 → 强制不烧录弹幕**(默认开):弹幕烧录的总开关,优先级最高;要用弹幕功能先把它关掉。
|
|
63
|
+
- **平台解析开关**(抖音 / B站 / 快手 / 小红书):**关掉某个平台后,那个平台彻底不处理** ——
|
|
64
|
+
不管是从自动解析、`#解析` / 引用解析还是面板按钮进来,都不回复、不提示缺 Cookie、不记统计。
|
|
65
|
+
- **QQ 适配器**新增一批开关(面板 → WebUI 的「QQ 适配器」分类,与控制台同一份字段表):
|
|
66
|
+
**链接解析面板**(开)、**自动撤回面板**(开)、**画质档体积上限**(200MB)、
|
|
67
|
+
**番剧选集面板行列数**、**超大图片自动切片**(开)、**切片高度**(2000)、
|
|
68
|
+
**卡片文字识别密钥**(OCR)、**面板显示「烧录弹幕」列**(关)、**面板带「打开原站」链接**(开)、
|
|
69
|
+
**群文件发送阈值**(30MB)、**强制不烧录弹幕**(开)。
|
|
70
|
+
- 面板与播放页的**下载 / 跳转 / 复制**这类按钮:一律内联 SVG 图标,**不用 emoji**。
|
|
71
|
+
- 文档:README、帮助指令、更新日志改成用户视角(配置入口 + 指令表 + QQ 用法)。
|
|
46
72
|
|
|
47
73
|
### 修复
|
|
48
|
-
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
- **端口在黑名单里、又没配「播放器公网地址」时自动退回 Koishi 自己的端口**(链接照常能用,
|
|
67
|
-
不用先去改配置);配了公网地址的反向代理场景照旧用你配的端口;
|
|
68
|
-
- 「播放器端口」的字段说明里写明了别用 6665-6669 这类端口。
|
|
69
|
-
- **打开了在线播放器,面板里却没有「弹幕」按钮**(用户实测):那一列当时还被 QQ 适配器里的
|
|
70
|
-
「面板显示「烧录弹幕」列」(默认关)管着,等于要开两个开关才有入口。
|
|
71
|
-
现在在线播放模式下这一列**只跟「弹幕重定向在线播放器」走**(开着就有),
|
|
72
|
-
烧录模式下才由那个旧开关决定;旧开关的说明也同步写清楚了。
|
|
73
|
-
- **在线播放器设置整组被锁住**(用户实测):上一轮加的「需先开启弹幕功能才能编辑」判断**写反了** ——
|
|
74
|
-
实际效果是「开着『强制不烧录弹幕』(= 弹幕功能关着)时能编辑,关掉之后反而整组变灰」,
|
|
75
|
-
而且把 5 个字段全绑上了。现在改成:**只有总开关**(顺带改名为「弹幕重定向在线播放器」)
|
|
76
|
-
受「强制不烧录弹幕」联动,方向已修正(关掉它之后才能改总开关),
|
|
77
|
-
其余四项(公网地址 / 端口 / 有效期 / 最大文件)随时可编辑。
|
|
78
|
-
- **「打开原站」链接把整条面板拖挂了**(严重):链接原来写成 `mqqapi://forward/url?...`,
|
|
74
|
+
- **WebUI「推送目标填完频道 id 点完成 → 整个面板黑屏」**(线上事故):
|
|
75
|
+
后端 `/kkk/v1/groups/batch` 返回的是 `data: null`,而面板前端拿到后直接 `data.find(...)`,
|
|
76
|
+
渲染期抛 `TypeError: Cannot read properties of null (reading 'find')`,React 卸载整棵树 → 整页空白。
|
|
77
|
+
现在该接口**永远返回数组**(并补上群名 / 头像 / 机器人在线状态),前端也加了一层兜底,
|
|
78
|
+
另外给面板加了**错误边界**:任何没被接住的异常都会顶出一块可读的中文报错卡片(带文件名:行:列),
|
|
79
|
+
不再是黑屏。
|
|
80
|
+
- **`spawn ./downloads/ffmpeg-linux-amd64-… EACCES`**(B站 m4s → mp4 修复失败、整条解析跟着失败):
|
|
81
|
+
兼容层把「拿到的那份 ffmpeg」原样交给 spawn、从不校验,而自动下载/缓存下来的那份常常是**相对路径**
|
|
82
|
+
且没有执行权限。现在按 **Koishi 的 ffmpeg 服务 → 配置里的 ffmpegPath → 环境变量 → PATH** 逐份校验
|
|
83
|
+
(相对路径按数据目录 / 工作目录归一化成绝对路径、必须存在、Linux/macOS 查 `X_OK`、Windows 查可执行扩展名),
|
|
84
|
+
跳过时打一条带原因的日志、选中时写明用的是哪一份;**spawn 起不来会自动换下一个候选重试**,
|
|
85
|
+
全部不行时 stderr 里列出「都试过哪些」,并给出可以照做的 `chmod +x` 提示。
|
|
86
|
+
- **关了小红书的解析,还是会提示没有 Cookie**:平台开关原来只作用在「自动解析」那条命令上,
|
|
87
|
+
走 `#解析` / 引用解析进来的链接照样跑到底并抛「我还没有小红书的 Cookies」。
|
|
88
|
+
现在四个平台的 handler 最前面都判断自己的开关,关掉时直接返回(见上面的「平台解析开关」)。
|
|
89
|
+
- **合并转发没生效**:发给适配器的元素少了 `forward` 属性,OneBot 只会把它当成普通消息内容。
|
|
90
|
+
现在带上 `forward` 与 `<author>`(决定这条转发显示成谁发的),实测会走 OneBot 的合并转发 API。
|
|
91
|
+
- **「打开原站」链接把整条面板拖挂**(严重):链接原来写成 `mqqapi://forward/url?...`,
|
|
79
92
|
QQ 官方接口直接拒收(`[40034028] 请求参数不允许包含url mqqapi://forward/url`),
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
-
|
|
106
|
-
|
|
93
|
+
**整条面板消息都发不出去**。现在改成普通 markdown 链接,并加了兜底:
|
|
94
|
+
面板带链接发送失败时**自动去掉链接行重发一次**。
|
|
95
|
+
- **在线播放器设置整组被锁住 / 判断写反**:改为只有总开关受「强制不烧录弹幕」联动(方向已修正),
|
|
96
|
+
其余字段随时可编辑;后来又进一步改成「总开关关掉 → 组内其它字段变灰」。
|
|
97
|
+
- **开了在线播放器,面板里却没有「弹幕」按钮**:那一列当时还被 QQ 适配器里那个旧开关管着,
|
|
98
|
+
等于要开两个开关才有入口;现在在线播放模式下这一列只跟播放器总开关走。
|
|
99
|
+
- **在线播放器设置和别的分组样式不一致**:它被注入进了「交互设置」的卡片内部(卡片套卡片 + 两列网格),
|
|
100
|
+
现在改成和「缓存设置 / 交互设置」并列的兄弟分组,用的是面板同一套卡片容器。
|
|
101
|
+
- **播放器链接点开报 `ERR_UNSAFE_PORT`**(把「播放器端口」配成了 6665-6669 这类 IRC 段):
|
|
102
|
+
服务端正常,是浏览器按黑名单禁止访问;现在启动/生成链接时都会明确警告,
|
|
103
|
+
且**端口在黑名单里、又没配公网地址时自动退回 Koishi 自己的端口**;字段说明里也写明了别用这类端口。
|
|
104
|
+
- **av 号链接解析失败**:av→BV 转换的返回结构多包一层,取不到 bvid 导致静默失败。
|
|
105
|
+
- **错误卡片切片失败 `e is not defined`**:`sliceImageToMarkdown` 里混进了一段用了不存在变量的分支,
|
|
106
|
+
一调用就 ReferenceError,超长错误卡片永远切不了片(最后原样发一张 8.9MB 的长图,还可能被拒收)。
|
|
107
|
+
- **弹幕烧录一直不生效**:此前「移除弹幕功能」时把烧录请求写死成了 false,
|
|
108
|
+
指令 `弹幕解析`、参数 `--dm=1` 与平台配置里的 `burnDanmaku` 都不会真的烧;现已恢复并统一过总开关。
|
|
109
|
+
- **「下载进度详情」看不到解析阶段**:现在四条链路都能看到
|
|
110
|
+
「正在获取下载链接 → 正在合并音轨(有的话)→ 正在烧录 / 正在准备在线播放 → 正在发送」,
|
|
111
|
+
阶段挂在解析共用的一个 key 上(不会两条打架),每个阶段结束都会清理,不会卡在某个状态。
|
|
112
|
+
- **快手解析崩溃**(`sendParseTip` 循环 import)、**小红书解析**(`sendContent` 为空导致什么都不发 /
|
|
113
|
+
表情数组类型 / 渲染顺序 / 视频笔记字段 / 评论兜底)、**抖音与快手接口形状适配**。
|
|
114
|
+
- **图集 / 评论图片 / 实况图**:原来会因为元素类型判断错误(Satori 是 `img` 不是 `image`)导致
|
|
115
|
+
markdown 永远为空、退化成一张一张发;现在统一合并成**一条 markdown**,超长图按需切片。
|
|
116
|
+
- **卡片消息解析**(群里转发的分享卡片没有链接时):接入 OCR + 平台搜索定位作品,
|
|
117
|
+
多个候选时给一张 markdown 表格让用户点;只处理 B站平台卡片(看卡片自带的 source)。
|
|
118
|
+
- **QQ 群文件阈值不生效**(读不到值 / 平台判断取不到):改成读 Koishi 运行时配置 +
|
|
119
|
+
用适配器真实平台名判断,并补了判定日志。
|
|
120
|
+
- **发送失败重试**:普通发送 3 次退避重试、切片上传 3 次重试;切片前的失败判断不再只看消息 ID。
|
|
121
|
+
- **`getFriendList 失败` 刷日志**:兼容层先做能力判断(qq-crack 没这个方法),没有再安静返回空数组。
|
|
122
|
+
- 控制台侧边栏入口消失(`try/else` 语法错误)、入口包缓存导致改了看不到、面板 token 过期报
|
|
123
|
+
「加载配置失败 / 鉴权失败」、生产环境面板报 `assets/web/index.html 缺失`。
|
|
107
124
|
|
|
108
125
|
### 变更
|
|
109
|
-
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
126
|
+
- **解析流程统一成「先下载视频 → 再渲染卡片 / 评论区 → 最后发送」,并且单步失败不再中断**
|
|
127
|
+
(抖音 / B站 / 小红书 / 快手):中间任何一步失败只跳过这一步、继续跑后面的,能发的视频/卡片照发;
|
|
128
|
+
全部跑完后如果确实有失败,才渲染**一张**错误卡片(里面列出是哪几步失败了)。
|
|
129
|
+
- **合并转发语义**:从「只影响转发时用谁的身份」变成「把一次解析产生的所有内容合并成一条转发」
|
|
130
|
+
(身份仍由那个开关决定:开 = 触发者,关 = 机器人)。
|
|
131
|
+
- **在线播放不受 QQ 的「文件大小限制」约束**(视频根本不发到 QQ),改由「在线播放最大文件」约束;
|
|
132
|
+
面板也不再按前者隐藏画质档。
|
|
133
|
+
- **配置入口统一**:插件配置里的设置项全部收到 WebUI 面板(`/kkk`)里改;
|
|
134
|
+
权限(谁可以触发扫码登录)与错误日志接收人改成手填(支持 `*` 与账号,多个用逗号分隔)。
|
|
135
|
+
- 解析面板的「烧录弹幕」列与总开关改为**配置驱动**(面板里不再有开关按钮)。
|
|
136
|
+
- 评论区图片不再单独发一遍(评论卡片里已有),减少刷屏。
|
|
137
|
+
|
|
138
|
+
### 兼容与升级说明
|
|
139
|
+
- 老配置缺新键时的行为:在线播放器与「在线看」按钮**默认可用/显示**、面板仍默认有弹幕列;
|
|
140
|
+
「超限转在线播放」默认关(维持「太大了就拒绝」的老行为);「强制不烧录弹幕」默认开。
|
|
141
|
+
- **合并转发**需要适配器支持:OneBot 系(NapCat / Lagrange 等)走 OneBot 的合并转发 API;
|
|
142
|
+
QQ 官方适配器没有这个能力,会自动退化成逐条发送(功能不报错,只是不合并)。
|
|
143
|
+
- 需要 ffmpeg 的功能(弹幕烧录、音视频合成、m4s 修复、图片裁剪):按上面的候选顺序自动找,
|
|
144
|
+
装一份系统 ffmpeg(或在配置 / 环境变量里指定绝对路径)即可;插件本身**不会**再自动下载 ffmpeg。
|
|
114
145
|
|
|
115
146
|
## 1.1.0
|
|
116
147
|
|