koishi-plugin-kkk 3.5.0 → 3.7.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.
Files changed (36) hide show
  1. package/CHANGELOG.md +453 -408
  2. package/lib/build-metadata.json +5 -5
  3. package/lib/index.js +14 -2
  4. package/lib/karin/module/utils/Base.js +35 -8
  5. package/lib/karin/module/utils/Network/Downloader.js +159 -13
  6. package/lib/karin/module/utils/Network/Network.js +5 -1
  7. package/lib/karin/platform/bilibili/bilibili.js +481 -28
  8. package/lib/karin/platform/bilibili/push.js +12 -5
  9. package/lib/karin/platform/douyin/douyin.js +4 -1
  10. package/lib/player/index.js +5 -2
  11. package/lib/player/page.js +386 -3
  12. package/lib/player/server.js +243 -14
  13. package/lib/player/store.js +207 -5
  14. package/lib/qqFields.json +4 -4
  15. package/package.json +1 -1
  16. package/scripts/smoke-async-download.cjs +10 -3
  17. package/scripts/smoke-download-source-fallback.cjs +166 -0
  18. package/scripts/smoke-download-stage.cjs +11 -1
  19. package/scripts/smoke-parse-lock.cjs +9 -1
  20. package/scripts/smoke-parse-order.cjs +15 -4
  21. package/scripts/smoke-player-interactive.cjs +381 -0
  22. package/scripts/smoke-player-segment-shape.cjs +119 -0
  23. package/scripts/smoke-player-story-source.cjs +123 -0
  24. package/src/index.ts +13 -2
  25. package/src/karin/module/utils/Base.ts +48 -9
  26. package/src/karin/module/utils/Network/Downloader.ts +164 -14
  27. package/src/karin/module/utils/Network/Network.ts +6 -2
  28. package/src/karin/platform/bilibili/bilibili.ts +541 -34
  29. package/src/karin/platform/bilibili/push.ts +12 -6
  30. package/src/karin/platform/douyin/douyin.ts +4 -1
  31. package/src/karin/types/netrorks/NetworksConfigType.ts +5 -0
  32. package/src/player/index.ts +22 -2
  33. package/src/player/page.ts +1615 -1231
  34. package/src/player/server.ts +285 -14
  35. package/src/player/store.ts +317 -5
  36. package/src/qqFields.json +4 -4
package/CHANGELOG.md CHANGED
@@ -1,92 +1,154 @@
1
1
  # 更新日志
2
2
 
3
+ ## 3.7.0
4
+
5
+ > 互动视频这一版基本重做了:**选剧情搬到了网页播放器里**(选项就贴在画面上、点完能看到下载进度),
6
+ > 群里不再发一串选择按钮;顺带修掉「改完配置机器人不理人」等几个老毛病。
7
+
8
+ ### 互动视频:剧情在播放页上点
9
+
10
+ - 从群里拿到播放链接、打开网页,**这一段放完,题目和选项就会浮在画面下方**,点一条接着播下一段;
11
+ 全屏时照样看得见、点得动。
12
+ - 不想等它自己弹?控制条上有个**「选项」**按钮,随时点出来;点卡片外面的画面就把它收起来。
13
+ - **点完有进度**:下一段要从 B 站现取(第一次要几秒),这段时间卡片会显示
14
+ 「正在下载这一段 42%」这样的进度;失败会直接说明原因,还给一个**「重试这一段」**按钮,
15
+ 不用刷新整页。
16
+ - **已经下过的段会留着**,再点回去是秒开。
17
+ - **弹幕跟着段走**:互动视频每一段都是单独的一段视频、弹幕也各是各的;
18
+ 以前切段之后画面里飘的还是第一段那批,现在跟着你正在看的那段。
19
+
20
+ ### 互动视频:不再被「体积上限」拦住
21
+
22
+ - 互动稿天然就是一段段很短的切片,以前拿整段视频的体积去预估、去拦,既不准又容易误伤。
23
+ 现在互动视频**不预估体积、评论卡片上也不显示体积**,只在真正下好、合并完之后检查一次:
24
+ 超过你设的「文件大小限制」时,开着「超限转在线播放」就给你播放链接,没开就明说一句
25
+ 「这一段太大了,先不发到群里,剧情还能接着玩」。
26
+ - 画面和声音分开存(不再额外花时间合成一个文件),点完选项少等一步。
27
+
28
+ ### 在线播放页
29
+
30
+ - **多了一行「原视频」**:以前页面上显示的是「本页链接」(你人就在这一页,等于废话),
31
+ 现在显示 B 站 / 抖音上的**原视频地址**,点一下能在新窗口打开,也能一键复制。
32
+ - 修好一个老问题:把「播放器端口」设成 0(跟随机器人自己的端口)时,
33
+ 页面上的「下载画面 / 下载声音 / 封面」点了会报错,现在正常。
34
+ - 页面补了小图标,浏览器不会再提示「找不到 favicon」。
35
+
36
+ ### 彩色弹幕、顶部弹幕现在看得到了
37
+
38
+ - 有些视频弹幕特别密(几秒钟几百条)。以前轨道被白字弹幕占满之后,后面的**直接丢掉**,
39
+ 于是少数派 —— 彩色弹幕、顶部「置顶」弹幕 —— 基本永远轮不到显示。
40
+ 现在白字弹幕会按比例抽稀,**彩色和顶部 / 底部的照常显示**。
41
+
42
+ ### 修掉「改完配置机器人就不理人」
43
+
44
+ - 在控制台改完配置、或者点一下重载插件之后,机器人有时会**整条指令都失效**:
45
+ 群里发链接没有任何反应、控制台面板也打不开。现在重载不会再出这个错。
46
+
47
+ ### 其他修正
48
+
49
+ - 播放页里的「这一段没准备好」换成了**具体原因**(以前不管是什么原因都显示
50
+ 「链接已过期或视频已被清理」,很容易让人以为是链接过期了)。
51
+ - 机器人重启后,**已经发出去的播放链接仍然能选剧情**(以前重启一次,那些链接里的选项按钮就消失了)。
52
+ 小提醒:如果你手里是**这次更新之前**拿到的链接,需要重新发一次链接让机器人解析。
53
+ - 另外补齐了几处内部自检(对使用者没有影响)。
54
+
55
+ ## 3.6.0
56
+
57
+ > 下载更稳了:**大文件不会再下到一半就失败**,遇到卡住的下载源会自动换一个。
58
+
59
+ ### 修「大文件永远下不完」
60
+
61
+ 有用户反馈:解析一个 280 MB 的 B 站视频,进度一直卡在 0.0 MB/s,重试三次都是这样,
62
+ 最后报「连接被重置」。查下来是两个原因撞在一起:
63
+
64
+ - **B 站给的下载地址不一定是好的**:有些地址连得上、就是不传数据(实测一分钟只传了 100 多 KB)。
65
+ 以前的程序只会一直用这一个地址,B 站同时给出的其它备用地址完全没用上。
66
+ - **下载有一个 60 秒的总时限**:从开始下载算起,超过 60 秒就掐断 ——
67
+ 也就是说,凡是需要超过 60 秒的文件(按 1.5 MB/s 算大约 90 MB 以上)**永远下不完**。
68
+ 更麻烦的是它掐断之后,报出来的错误看着像「服务器把连接重置了」,把人往「被风控了」的方向带。
69
+
70
+ 现在的表现:
71
+
72
+ - **只要还在传数据就不算超时**:一直有数据就继续下,真的没数据了才算断。
73
+ - **下载源卡住就自动换**:有备用地址时,试一会儿(约 20 秒)还是慢得离谱就换下一个;
74
+ 已经传了好几 MB 才断的,保留进度接着下。
75
+ - 报错说人话:自己掐断的,不再说成「连接被重置」,而是「下载超时(60 秒内没有收到新数据)」。
76
+ - 进度条的**速度显示**也修好了:以前会出现「0.0 MB/s 剩余 661 分钟」这种明显不对的数字。
77
+
3
78
  ## 3.5.0
4
79
 
5
- > 这一版三件事:**B站互动视频能玩了**(能一路选剧情、还能出剧情图)、**合并转发里能单独控制流程图**,
6
- > 另外把渲染统一成了浏览器 —— **彻底删掉 shotkit 内核**(它在 Windows 上加载不了远程图片,
80
+ > 这一版三件事:**B 站互动视频能玩了**(一路选剧情、还能出剧情图)、**合并转发里能单独控制流程图**,
81
+ > 另外把图片渲染统一交给浏览器 —— **删掉了老的内置渲染方案**(它在 Windows 上加载不了网络图片,
7
82
  > 卡片里的封面、头像一直是空白框)。
8
83
 
9
- ### B站互动视频:剧情能选着玩
84
+ ### B 站互动视频:剧情能选着玩
10
85
 
11
- 群里发一条互动视频的链接,机器人照常把视频和卡片发出来,然后**一段一段问你怎么选**:
86
+ 群里发一条互动视频链接,机器人先把视频和卡片发出来,然后**一段一段问你怎么选**:
12
87
 
13
- - QQ 官方机器人上是按钮(点一下就行;最后一个按钮固定是「渲染流程图」);
14
- 其它适配器发纯文字,一行一个选项(回复字母、数字,或者直接回选项原文都认)。
15
- - 只有第一组选项带标题和玩法说明,之后只发选项本身,不会越聊越长;发新一条时会撤回上一条选项。
16
- - **认不出的回复不会插话**:群里别人正常聊天、你自己随便说句话,机器人都不会来一句「没听懂」,
17
- 也不会重发选项,就安静等着。等不到人(180 秒)就收尾:
18
- 「互动视频先玩到这里~想接着玩就再发一次链接」。
88
+ - QQ 官方机器人上是按钮(点一下就行,最后一个按钮固定是「渲染流程图」);
89
+ 其它平台发纯文字,一行一个选项,回字母、数字或者选项原文都认。
90
+ - 只有第一组选项带标题和说明,之后只发选项本身,不会越聊越长;发新的时候会撤回上一条选项。
91
+ - 群里别人正常聊天、你自己随口说句话,机器人都不会插一句「没听懂」,就安静等你的选择;
92
+ 超过 180 秒没人回就收尾。
19
93
  - 走到结局会撤回最后一条选项,说一句「互动视频走到结局了」,并把结局位置再画一张图。
20
- - 剧情是**后台跑的**,不会拖慢解析:视频该发还是马上发。
94
+ - 剧情在后台跑,不影响视频发送速度。
21
95
 
22
- **剧情图(流程图)**:把整条剧情画成一张思维导图,有哪几条分支、哪里是结局,一张图看完 ——
23
- 你走过的分支会加粗高亮(图例写着「高亮的是你已经走过的路」),B站 的默认选项标「默认」;
24
- 分支太多一次画不完,会注明「剧情太长,图上只画了前半部分分支」。
96
+ **剧情图**:把整条剧情画成一张图 —— 有哪几条分支、哪里是结局,一张看完;
97
+ 你走过的分支会加粗高亮,B 站的默认选项标「默认」;分支太多会注明「图上只画了前半部分」。
25
98
 
26
- - 开关在 **通用 → 解析时发送的内容 → 流程图**(默认不勾)。不勾也能正常玩剧情,只是不出图。
27
- - 想随时补一张:QQ 官方是选项按钮里的「渲染流程图」,其它平台回复「渲染流程图」;
28
- 当前没有进行中的剧情时会提示「现在没有正在进行的互动视频,发一条互动视频链接就能玩」。
29
- - 只有互动视频有这套玩法,普通视频完全不受影响;接口取不到剧情数据时安静跳过,不会报错刷屏。
30
- - 顺带修好了面板里「流程图」这个勾选项一直不出现的问题:面板的候选项是打包时写死的,
31
- 之前的补丁找错了地方、还静默失败 —— 控制台里能看到、面板里没有。现在两边都有。
99
+ - 开关在 **通用 → 解析时发送的内容 → 流程图**(默认不勾)。不勾也能正常玩,只是不出图。
100
+ - 想随时补一张:QQ 官方是选项按钮里的「渲染流程图」,其它平台回复「渲染流程图」。
101
+ - 只有互动视频有这套玩法,普通视频完全不受影响。
102
+
103
+ > 说明:**3.7.0 起,选剧情搬到了网页播放器里**(选项贴在视频上、点完还能看进度),
104
+ > 群里不再发选择按钮;只有「流程图」那张图会照常发。
32
105
 
33
106
  ### 合并转发:流程图可以单独勾
34
107
 
35
- - 「合并转发内容」的候选里多了 **流程图**(B站页和通用页各一份):勾了就进聊天记录,
36
- 不勾就照旧单独发出去 —— 和文字、图片、视频、文件是同一套规则,**不会丢内容**。
37
- - 抖音 / 快手 / 小红书 的列表里没有这一项:它们没有剧情图,加了也是永远匹配不到的假选项
38
- (和当初去掉「语音 / markdown」是同一个理由)。
39
- - 另外堵了一个隐患:剧情图是后台画的,可能比解析结束还晚 —— 以前这种「晚到的内容」会被收进
40
- 一个已经发完的收集袋,再也没人发出去(表现就是内容凭空消失)。现在解析一结束就关掉袋子,
41
- 晚到的一律直发。
108
+ - 「合并转发内容」里多了 **流程图** 这一项:勾了就进聊天记录,不勾就单独发出去 ——
109
+ 和文字、图片、视频是同一套规则,**不会丢内容**。
110
+ - 抖音 / 快手 / 小红书 没有这一项(它们没有剧情图,加了也是永远匹配不到的假选项)。
111
+ - 顺带堵了一个毛病:剧情图是后台画的,可能比解析结果晚 ——
112
+ 以前这种「晚到的东西」会被漏掉、再也没人发出去;现在解析一结束就收尾,晚到的一律直接发。
42
113
 
43
- ### 渲染:只用浏览器,删掉 shotkit 内核
114
+ ### 图片渲染:只用浏览器
44
115
 
45
- - 以前「优先渲染器」可以在 **shotkit 内核**(默认)和**浏览器**之间选。内核在 Windows 上
46
- **加载不了 https 资源** —— 卡片里的远程封面、头像全是空白框;它还会照样去请求这些地址、
47
- 一直等到超时(实测页面里只要有一个连不上的图片,截图就从 1.5 秒变成 22 秒)。
116
+ - 以前可以在「内置渲染方案(默认)」和「浏览器」之间选。内置方案在 Windows 上**加载不了网络图片**
117
+ —— 卡片里的封面、头像全是空白框,还会一直等到超时
118
+ (实测页面里只要有一张连不上的图片,出图就从 1.5 秒变成 22 秒)。
48
119
  - 3.5.0 起**只支持浏览器渲染**:装 koishi-plugin-puppeteer 或同类插件即可。
49
- 面板里那个「优先渲染器」选项已经撤掉,老配置里的值会被忽略(不用手改)。
50
- - 没装浏览器渲染服务时会直说「需要安装浏览器渲染服务(koishi-plugin-puppeteer 或同类插件)
51
- 才能渲染图片」,不再悄悄换内核,也不会给你一张缺图、裂图的卡片。
52
- - 只对内核有用的那套「摘掉远程图片」处理一并删掉(浏览器本来就能正常加载远程图);
53
- 以前为内核做的性能降级(全屏噪点层替换、失效字体剔除)保留了下来 —— 对浏览器同样是净赚。
54
-
55
- ### 出错时的卡片与诊断
56
-
57
- - **错误卡片终于发得出去**:以前一遇到大报错,卡片会渲染成 2880×40000(45MB)甚至更长,
58
- 光渲染 20 多秒,而这么大的图 QQ 必然拒收 —— 等于「报错本身也发不出去」。
59
- 现在日志只留末尾 200 行、每行截断、超长 base64 折起来,卡片稳定在能发出去的尺寸。
60
- - 卡片上会印 **上报编号 + 详情页地址 + 反馈群**。加群链接以前是拿群号拼的,点开是 404,
61
- 现在是真的分享链接。
62
- - 卡片新增「解析库错误诊断」:AMAGI 码 / 平台业务码 / HTTP 状态 / 请求 ID / 实际请求次数 / 耗时,
63
- 外加平台原文、请求轨迹,以及「这类错误重试有没有用」的判断;报错归到哪个平台也修了
64
- (以前小红书的报错一律被算成 system)。
65
- - 卡片上的适配器一栏终于显示**真的适配器名和版本**(取的是实现端,比如 NapCat 自己的版本)——
66
- 以前读的是 Koishi 的字段,那里压根没有版本号,于是卡片上永远挂着一个空的版本号。
67
- - 「kkk版本」诊断卡片:多了构建一致性徽章、本版变更(随包带的更新日志),以及一句隐私声明 ——
68
- 这张图**不采集**账号、主机名、用户目录、网络地址、环境变量、启动参数和适配器凭据;
69
- 之所以要写清楚,是因为它可能被发到群里。
70
- - 「kkk更新日志」渲染失败时改发**纯文字**(截断后发送),不再是「什么都看不到,只剩一张错误卡片」。
71
-
120
+ 面板里那个选项已经撤掉,老配置里的值会被忽略,不用手动改。
121
+ - 没装浏览器渲染服务时会直说「需要安装浏览器渲染服务才能渲染图片」,
122
+ 不再悄悄换方案,也不会给你一张缺图、裂图的卡片。
123
+
124
+ ### 出错时的卡片更好用了
125
+
126
+ - **错误卡片终于发得出去**:以前一遇到大报错,卡片会长到 QQ 拒收(等于「报错本身也发不出去」);
127
+ 现在只保留末尾 200 行、每行截断,尺寸稳定在能发出去的范围内。
128
+ - 卡片上会印上报编号、详情页地址和反馈群(以前那个加群链接点开是 404)。
129
+ - 新增「解析库错误诊断」:出错时给出平台、请求次数、耗时等线索,并告诉你这类错误重试有没有用。
130
+ - 卡片上的适配器一栏终于显示**真的适配器名字和版本**(以前一直是空的)。
131
+ - 「kkk版本」诊断卡片多了版本一致性提示和本版更新内容;这张图**不采集**你的账号、
132
+ 主机名、文件路径、网络地址、环境变量等隐私信息(因为它可能被发到群里)。
133
+ - 「kkk更新日志」出图失败时改发纯文字,不再只剩一张错误卡片。
72
134
  ---
73
135
 
74
136
  ## 3.4.2
75
137
 
76
138
  ### 出错上报的内容更全,也更好看懂
77
139
 
78
- - 上报的「来源信息」以前常常是一排「—」:推送任务的会话是合成的,没有群号这些东西。现在改用框架自己的接口补:
79
- 机器人名、群名(用 bot.getGuild 查出来)、用户名都会显示,卡在哪一步(阶段)也会自动标出来 —— 一眼就知道是谁在哪个群、发的什么。
80
- - **顺便把配置也传上去了**,复现问题时有依据:你改过的设置、画质、发送内容、推送列表都会带过去。
81
- 两条硬规矩:**Cookie 一个都不传**(接口库里的 SESSDATA / bili_jct / 抖音那一串整块丢掉),凡是名字像 token / secret / password 的字段一律显示成 ***。
82
- - **日志只传本插件(kkk)的行**:以前会把整台机器所有插件的日志尾巴都传上去,现在只挑 kkk 相关的,看的人不用再大海捞针。
140
+ - 上报里的「来源信息」以前常常是一排「—」:定时推送没有群号这些东西。现在会补上机器人名、
141
+ 群名、用户名,还会标出问题卡在哪一步 —— 一眼就知道是谁在哪个群发的什么。
142
+ - **顺便把配置也带上**,方便复现问题:你改过的设置、画质、发送内容、推送列表都会带过去。
143
+ 两条硬规矩:**Cookie 一个都不传**,凡是名字像 token / secret / password 的字段一律显示成 ***。
144
+ - **日志只传本插件的部分**:以前会把整台机器所有插件的日志尾巴都传上去,现在只挑本插件相关的,
145
+ 看的人不用大海捞针。
83
146
 
84
- ### 机器人掉线时不再是一句英文报错
147
+ ### 机器人掉线时不再是满屏英文
85
148
 
86
- - 适配器掉线后,机器人的对象还在,但底层连接已经没了 —— 这时推送会让适配器内部炸出一句
87
- TypeError: this._request is not a function,你只看到一堆英文堆栈。
88
- 现在会提前拦住,并说清楚:机器人 2092582839 当前不在线(status=0),这条消息发不出去;等它重新上线后下次推送会正常发出。
89
- - 指定的机器人掉线时**不会偷偷换成另一个机器人发**(那样会串号),只会如实报出来。
149
+ - 机器人掉线后,推送常常炸出一句英文堆栈,你根本看不出发生了什么。现在会提前拦住并说清楚:
150
+ 「机器人 xxx 当前不在线,这条消息发不出去;等它重新上线后下次推送会正常发出」。
151
+ - 指定的机器人掉线时**不会偷偷换另一个机器人发**(那样会串号),只会如实报出来。
90
152
 
91
153
  ---
92
154
 
@@ -94,11 +156,9 @@
94
156
 
95
157
  ### 抖音解析失败时的提示看得懂了
96
158
 
97
- - 抖音接口没返回数据时(常见原因:Cookie 过期、被风控,或者链接 / 作品已失效),以前会直接抛一个英文错误
98
- TypeError: Cannot read properties of undefined (reading 'aweme_detail'),你收到的是一张满屏英文的错误卡片。
99
- 现在会明说是哪一类问题:抖音没有返回这条作品的数据(错误码 8:风控校验失败),常见原因:Cookie 失效、被风控,或者这条链接已经失效 / 作品已删除。
100
- - 日志里会留下接口的原始错误码和返回内容,排查时一眼就能看出是风控还是 Cookie 过期。
101
- - 顺带:抖音的冒烟测试补了「接口被风控」这个场景,以后不会再退回那种英文报错。
159
+ - 抖音没返回数据时(常见原因:Cookie 过期、被风控,或者作品已经删了),以前会直接扔一句英文错误,
160
+ 你收到一张满屏英文的错误卡片。现在会明说是哪一类问题,并给出常见原因,不再让你猜。
161
+ - 日志里会留下接口的错误码和返回内容,一眼能看出是风控还是 Cookie 过期。
102
162
 
103
163
  ---
104
164
 
@@ -109,40 +169,48 @@
109
169
 
110
170
  ### 图片不会再发两张了
111
171
 
112
- - 以前机器人发大图时,如果适配器 15 秒还没返回,它会认为「没发出去」,于是切成几片再发一遍 —— 结果群里出现两张(第一张其实发出去了)。
113
- 现在 15 秒只在日志里写一句「还在传」,120 秒才怀疑卡住,再给 30 秒等结果;真等不到也不会重试(以前小图还会连发三次)。
172
+ - 以前机器人发大图时,如果适配器 15 秒还没返回结果,它会以为「没发出去」,于是切成几片再发一遍 ——
173
+ 结果群里出现两张(第一张其实发出去了)。现在 15 秒只在日志里写一句「还在传」,
174
+ 120 秒才怀疑卡住,再宽限 30 秒;真的等不到也不会重试。
114
175
 
115
176
  ### 解析面板:卡片和选择表分开
116
177
 
117
178
  - 信息卡片单独一条消息,选清晰度 / 选第几集的那张表单独一条。
118
- - 你点完按钮之后,机器人**只撤回那张表**,卡片还在群里留着;只有你下次再发链接(出新卡片)时,旧卡片才会被撤掉。
179
+ - 你点完按钮之后,机器人**只撤回那张表**,卡片还留在群里;只有你下次再发链接(出新卡片)时,
180
+ 旧卡片才会被撤掉。
119
181
  - 番剧翻页也一样:只换表格,不会因为翻几页就在群里堆一排卡片。
120
182
 
121
183
  ### 出错的时候:上报照旧,发什么你说了算
122
184
 
123
185
  - 新增开关「**出错只发文字(不渲染错误卡片)**」(面板 → 通用 → 错误上报,默认关闭)。
124
- 想法来自 @Jingmozhiyu 的 PR #1
125
- 打开后出错只在群里发一行:错误信息已上传,ID:xxx —— 上传的东西一点不少,只是省掉十几秒渲染和一张几 MB 的大图。
126
- - 以前错误提示里那个加群链接是拿群号拼的,点开是 404;现在换成真正的加群链接,能直接点进去。
127
- - 以前遇到「一行日志里塞了几 MB 的图片数据」这种报错,错误卡片要渲染十几分钟、最后还发不出去;现在这种超长内容会自动折起来,几秒钟出图。
186
+ 打开后出错只在群里发一行「错误信息已上传,ID:xxx」—— 上传的内容一点不少,
187
+ 只是省掉十几秒渲染和一张几 MB 的大图。想法来自 @Jingmozhiyu 的 PR #1。
188
+ - 错误提示里的加群链接以前点开是 404,现在换成真正的分享链接,能直接点进去。
189
+ - 以前遇到「一行日志里塞了几 MB 图片数据」这种报错,错误卡片要渲染十几分钟、最后还发不出去;
190
+ 现在这种超长内容会自动折起来,几秒钟出图。
128
191
 
129
192
  ### 控制台里的设置终于都能看懂了
130
193
 
131
- - Koishi 控制台的插件配置页里,200 多项设置全部显示、全部展开,不用点折叠;
132
- - 所有说明都改成了给用户看的说法,去掉了 **加粗**、反引号这类符号(控制台是按纯文本显示的,写了只会看到一堆星号);
133
- - 面板里那个「合并转发(哔哩哔哩)」的重复后缀也去掉了 —— 分类名本来就写着平台名。
194
+ - 控制台的插件配置页里,200 多项设置全部显示、全部展开,不用一个个点开;
195
+ - 所有说明都改成了给用户看的说法,去掉了 **加粗**、反引号这类符号
196
+ (控制台是按纯文本显示的,写了只会看到一堆星号);
197
+ - 面板里「合并转发(哔哩哔哩)」这种重复后缀也去掉了 —— 分类名本来就写着平台名。
134
198
 
135
199
  ### 不再因为「慢」就白丢内容
136
200
 
137
- - 小红书拉评论、拉表情以前到点就放弃(评论区会变成「无法获取评论数据」)。现在 15 秒(表情 8 秒)只在日志里提示,60 秒(表情 30 秒)才怀疑挂住,再给一段宽限等结果 —— 接口只是慢的时候,评论照样能出来。
201
+ - 小红书拉评论、拉表情以前到点就放弃(评论区会变成「无法获取评论数据」)。现在 15 秒
202
+ (表情 8 秒)只在日志里提示,60 秒(表情 30 秒)才怀疑挂住,再宽限一段时间等结果 ——
203
+ 接口只是慢的时候,评论照样能出来。
138
204
 
139
205
  ### 顺手修掉的几个老毛病
140
206
 
141
- - 同一条卡片消息被 QQ 重复投递时只处理第一遍(以前会 OCR、搜索各跑两遍,看起来就是「解析完了又解析一遍」)。
142
- - 快手、小红书一发链接就报错的 bug(这两个平台调用了一个没导入的函数)。
143
- - 「强制在线播放的适配器」等几个设置以前是**静默失效**的,配了也不生效,现在真的生效了。
144
- - 不支持的适配器不再尝试合并转发(B站私聊那种适配器没有聊天记录功能,以前会整条发不出去)。
145
- - 播放链接显示「已过期」时,日志里会说清楚原因:多半是同机另一台机器人抢占了播放器端口,域名连到了那一台。
207
+ - 同一条卡片消息被 QQ 重复投递时只处理第一遍(以前会 OCR、搜索各跑两遍,
208
+ 看起来就是「解析完了又解析一遍」)。
209
+ - 快手、小红书一发链接就报错的问题。
210
+ - 「强制在线播放的适配器」等几个设置以前配了不生效,现在真的生效了。
211
+ - 不支持的适配器不再尝试合并转发(B 站私聊那种适配器没有聊天记录功能,以前会整条发不出去)。
212
+ - 播放链接显示「已过期」时,日志里会说清原因:多半是同机另一台机器人抢占了播放器端口,
213
+ 域名连到了那一台。
146
214
 
147
215
  ---
148
216
 
@@ -150,67 +218,101 @@
150
218
 
151
219
  ### 同一条卡片消息不再解析两遍
152
220
 
153
- - **卡片消息被重复投递时只处理第一遍**:QQ 会把同一次发送投递多遍(客户端重发、指令按钮 = 消息 + 交互事件),实测同一条 B站卡片会在几秒内进来两次 —— 于是 OCR + 搜索各跑两遍、面板也可能发两条,看起来就是「解析完了又解析一遍」。现在卡片这条链路在 OCR **之前**就去重(按「平台 + 频道 + 用户 + 卡片正文」),并且**先把图片链接的签名参数去掉再比**:同一条卡片重投时链接会重新签名,直接拿原文比会当成两条不同的消息。
154
- - 顺带加了排查用的 debug 日志:收到卡片时会打 `收到卡片消息(messageId=…,平台=…)`,同一条卡片的两次投递 messageId 是否相同,一眼就能看出是平台重复投递还是别的插件又发了一遍。
221
+ - **卡片消息被重复投递时只处理第一遍**:QQ 会把同一次发送投递多遍,实测同一条 B 站卡片会在几秒内
222
+ 进来两次 —— 于是识别文字、搜索各跑两遍,看起来就是「解析完了又解析一遍」。
223
+ 现在在识别文字**之前**就去重,而且会先把图片链接里会变的签名部分去掉再比,
224
+ 同一条卡片重投不会被当成两条。
225
+ - 顺带加了排查用的调试日志:收到卡片时会打一行「收到卡片消息(消息 ID / 平台)」,
226
+ 一眼能看出是平台重复投递,还是别的插件又发了一遍。
155
227
 
156
228
  ## 3.3.2
157
229
 
158
- > 修 3.3.1 的一个**致命笔误**:播放器模块里一行 import 多写了一层 `..`,导致插件在**加载时**就失败(`Cannot find module '../../compat/runtime'`),整个插件都起不来。构建链路只做转译不解析路径,所以当时没拦住 —— 现在补了一个「每个编译产物都 require 得动」的自测(scripts/smoke-require.cjs)。
230
+ > 修 3.3.1 的一个**致命笔误**:插件里写错了一处引用路径,导致**整个插件加载不起来**。
231
+ > 当时打包流程只搬代码、不检查路径,没能拦住 —— 现在补了一条自检,
232
+ > 保证每个编译出来的文件都能正常加载。
159
233
 
160
234
  ## 3.3.1
161
235
 
162
236
  > 3.3.0-beta.1 ~ beta.3 是给先行测试的人用的预览版,内容全部并进这一版;从 3.2.2 直接升上来就行。
163
237
 
164
- ### 修了两个「设置根本没生效」的问题
238
+ ### 修了两个「设置根本不生效」的问题
165
239
 
166
- - **「强制在线播放的适配器」这类设置以前是静默失效的**:运行时配置是一份**手写白名单**,新加的开关(强制在线播放的适配器、面板「在线看」列、按需切片、解析去重…)忘了往里补一行,运行时读到的就是 undefined —— 表现就是 B站私聊明明配了强制在线播放,**还是去下载并发视频文件**。现在改成「字段表里的默认值打底 + 归一化覆盖」,以后再加开关不会漏。
167
- - **不支持的适配器不再尝试合并转发**:判断「这个适配器支不支持聊天记录」用的是**黑名单**(只排除 QQ 官方),于是任何自定义适配器都被当成支持 —— B站私聊适配器(platform 就是 bilibili)也被算进去了,整条转发发出去「没有拿到消息 ID」,连退回来的逐条发送也失败,用户什么都没收到。现在改成**白名单**(OneBot 系平台名,或适配器自带 sendGroupForwardMsg/sendPrivateForwardMsg),并会在日志里写明「适配器 xxx 不支持合并转发,本次逐条发送」。
240
+ - **「强制在线播放的适配器」这类设置以前配了没用**:程序内部有一份手写的「认识哪些设置」清单,
241
+ 新加的开关(强制在线播放、面板「在线看」列、按需切片、解析去重…)忘了往清单里补一行,
242
+ 运行时读到的就是「没有这个设置」—— 表现就是 B 站私聊明明配了强制在线播放,**还是发视频文件**。
243
+ 现在改成以设置表为准,以后再加开关不会漏。
244
+ - **不支持的适配器不再硬去合并转发**:以前判断「这个适配器支不支持聊天记录」用的是一份黑名单,
245
+ 于是任何自定义适配器都被当成支持 —— B 站私聊适配器也在里面,整条转发发出去「没有拿到消息 ID」,
246
+ 退回来的逐条发送也失败,用户什么都没收到。现在改成白名单,并在日志里写明
247
+ 「适配器 xxx 不支持合并转发,本次逐条发送」。
168
248
 
169
249
  ### 播放链接显示「已过期」的原因说清楚了
170
250
 
171
- - **端口被别的实例占掉,链接就会指向「另一台机器人」**:同机跑两台 Koishi(正式 + 测试)时只有一台能监听播放器端口。占不到端口的那台退回 Koishi 自己的端口,而域名反代的是独立端口 —— 用户点开链接访问的其实是**抢到端口的那台实例**,它的会话表里没有这个 token,页面就显示「链接已过期」。现在遇到这种情况会打一条**明确的警告**(写清「链接会显示已过期,请换端口或停掉占端口的那台实例」),不再是含糊的「启动失败」;生成链接时也会提醒一次。
251
+ - **端口被别的机器人占了,链接就会指向「另一台机器人」**:同机跑两台机器人(正式 + 测试)时,
252
+ 只有一台能占用播放器端口;占不到的那台会退回机器人自己的端口,而域名指向的是独立端口 ——
253
+ 你点开链接,访问到的其实是**抢到端口的那台**,它不认识这条链接,页面就显示「链接已过期」。
254
+ 现在遇到这种情况会打一条明确的警告,生成链接时也会提醒一次。
172
255
 
173
256
  ### 控制台里的设置全部隐藏,面板补上「Koishi 设置」
174
257
 
175
- - **Koishi 控制台里的设置项全部隐藏了**:控制台只剩一段「所有设置都在 WebUI 面板(/kkk)里改」的说明。原因是同一份配置在两个界面各改一半时,谁后保存谁覆盖对方(「面板里关了、控制台一保存又回来了」)。隐藏**不等于删除** —— 字段仍然声明着,所以在控制台点保存不会把面板里的设置弄丢。
176
- - **面板多了「Koishi 设置」一组**:数据目录、调试日志、自动解析、面板是否要求先登录控制台 —— 以前这几项只能在控制台改,现在控制台全隐藏了,统一挪到面板里。**masters(主人账号)不在里面**:它属于 Koishi 的权限体系,而面板是免登录页面,不给自己开这个口子(仍然改 koishi.yml)。
258
+ - **控制台里的设置项全部隐藏了**:只剩一段说明「所有设置都在面板(/kkk)里改」。
259
+ 原因是同一份配置在两个界面各改一半时,谁后保存谁覆盖对方(「面板里关了、控制台一保存又回来了」)。
260
+ 隐藏**不等于删除**,所以在控制台点保存不会把面板里的设置弄丢。
261
+ - **面板多了「Koishi 设置」一组**:数据目录、调试日志、自动解析、面板是否要求先登录控制台 ——
262
+ 以前这几项只能在控制台改,现在统一挪到面板里。**主人账号不在里面**:它属于机器人权限体系,
263
+ 面板是免登录页面,不给自己开这个口子(仍然在配置文件里改)。
177
264
 
178
265
  ### 顺手修掉的几个问题
179
266
 
180
- - **预览版不会再被提示「有新版本」了**:更新检测以前一律拿 npm 上的 latest 比,本地跑预览版时会说「有新版本 3.2.2」—— 那其实是**降级**。现在本地版本带 -(beta)时改看 beta 通道,而且只在远端确实更新时才提示。
181
- - **修了快手/小红书一解析就报错的 bug**:这两个平台的处理里调用了在线播放器的 `applyForceOnlinePlayer`,却**从来没 import 过它** —— 一发快手链接就是 `ReferenceError: applyForceOnlinePlayer is not defined`(错误卡片倒是发得挺快)。现在补上 import,并加了 `scripts/smoke-imports.cjs` 把这类「用了没 import」钉死(自检 + 全仓库扫描,实测能抓到这次这个坑)。
182
- - **错误提示的分段加了空行**:markdown 里单个换行不算换行,两段会被拼成一整行、QQ 那边字号被撑得很难看;现在 ID 一行、说明一行,中间空一行。
183
- - **卡片解析不再去搜抖音**:抖音那边没有「卡片消息」这种东西,以前那条「当前接口库没有抖音搜索能力,跳过」的日志就是多搜了一个平台留下的 —— 现在只搜 B站(入口本来就只放 B站卡片进来),少一次风控风险、也少几秒等待。
267
+ - **预览版不会再被提示「有新版本」了**:更新检测以前一律拿网上的正式版比较,
268
+ 本地跑预览版时会说「有新版本」—— 那其实是**降级**。现在预览版看预览通道,而且只在真有更新时才提示。
269
+ - **修了快手 / 小红书一解析就报错的问题**(这两个平台调用了一个没引入的功能)。
270
+ 另外加了自检,把这类「用了却没引入」的问题挡在发布前。
271
+ - **错误提示的分段加了空行**:以前两段会被拼成一整行,字号被撑得很难看。
272
+ - **卡片解析不再去搜抖音**:抖音没有「卡片消息」这种东西,以前那条「没有抖音搜索能力,跳过」
273
+ 的日志就是多搜了一个平台留下的 —— 现在只搜 B 站,少一次风控风险、也少几秒等待。
184
274
 
185
275
  ## 3.2.2
186
276
 
187
277
  ### 卡片解析:按 UP 主模糊匹配,候选也发得出来了
188
278
 
189
- - **认错 UP 主的问题修了**:B站卡片的 OCR 文本里,「UP主」的上一行**不一定是昵称** —— 你那张卡的上一行是封面上的「半身像」,真名「雾小霜暗区突围」在**第一行**。以前只认「UP主前一行」,于是拿「半身像」去搜,标题又对不上,六个候选一个都不敢选(就是你看到的「没能唯一定位…候选 6 条」)。现在**首行、UP主前后行**都当候选,搜索时**任意一个对上**就算作者命中,命中的那个会写进日志和提示语。
190
- - **候选列表在个人号上发不出去的问题修了**:候选以前是**一条 markdown 表格**,只有 QQ 官方机器人渲染,个人号(NapCat 等)发过去整条消息都出不去 —— 用户只看到「正在提取卡片信息…」然后就没了下文。现在**按平台分开发**:官方 QQ 还是表格 + 按钮(点一下直接解析);个人号改成纯文本,一条条列「标题 —— UP」+ 完整链接,点链接或复制发回来就能解析。
279
+ - **认错 UP 主的问题修了**:B 站卡片的文字里,「UP主」上面一行**不一定是昵称** ——
280
+ 你那张卡的上一行是封面上的「半身像」,真名在**第一行**。以前只认「UP主前一行」,
281
+ 于是拿「半身像」去搜、标题又对不上,六个候选一个都不敢选。现在首行、UP主前后行都当候选,
282
+ 任意一个对上就算命中,命中的那个会写进日志和提示语。
283
+ - **候选列表在个人号上发不出去的问题修了**:候选以前是一张表格,只有 QQ 官方机器人能显示,
284
+ 个人号(NapCat 等)发过去整条消息都出不去 —— 你只看到「正在提取卡片信息…」然后就没下文。
285
+ 现在按平台分开发:官方 QQ 还是表格 + 按钮(点一下直接解析);个人号改成纯文本,
286
+ 一条条列「标题 —— UP主」和完整链接,点链接或复制发回来就能解析。
191
287
 
192
- 实测(用你那条 OCR):候选名首选「雾小霜暗区突围」;拿它去 B站搜「根本就没有这些大金」,命中作者=雾小霜暗区突围、标题=根本就没有这些大金,**自动定位成功**。
288
+ 实测(用你那条识别结果):首选候选「雾小霜暗区突围」,拿它去 B 站搜索**自动定位成功**。
193
289
 
194
290
  ## 3.2.1
195
291
 
196
292
  ### 出错时自动上报,进群报个编号就行
197
293
 
198
- - **新增错误上报(默认开启)**:插件出错时,自动把**错误信息、错误堆栈、运行环境(Koishi 版本、已安装插件清单、适配器)、最近的日志**上传到收集站,站长在网页上就能看到全部细节 —— 不用再让你截图、也不用让你翻日志文件。上传到 `https://err.tangbot.xyz`(面板「通用 → 错误上报」里能改地址、令牌、日志行数,也能一键关掉)。上传失败不影响报错本身,错误卡片照常发。
199
- - **错误消息里带上编号和群**:卡片下面会跟一条「错误信息已上传,ID:xxxxxxxx」+「可以前往 QQ 群内寻找帮助,在群内发送错误 ID 或该错误图片」。QQ 官方机器人那边群号是**可点的加群链接**(markdown),个人号(NapCat 等)给纯文本链接,客户端同样点得动。编号也印在错误卡片上。
200
- - 面板「通用」多了「错误上报」一栏,里面**只有一个开关**(上传错误信息,默认开)。地址、令牌、反馈群、日志行数全部写死,没有可以填错的地方 —— 关掉开关就完全不上传。
294
+ - **新增错误上报(默认开启)**:插件出错时,自动把**错误信息、错误详情、运行环境、最近的日志**
295
+ 上传到收集站,站长在网页上就能看到全部细节 —— 不用再让你截图、也不用让你翻日志文件。
296
+ 上传地址在面板「通用 → 错误上报」里能改,也能一键关掉;上传失败不影响报错本身,错误卡片照常发。
297
+ - **错误消息里带上编号和群**:卡片下面会跟一条「错误信息已上传,ID:xxxxxxxx」,
298
+ 并提示可以带着这个编号进群求助。QQ 官方机器人那边是可以点的加群链接,个人号给纯文本链接。
299
+ - 面板「通用」多了「错误上报」一栏,里面**只有一个开关**(默认开),地址、令牌这些全部写死,
300
+ 没有可以填错的地方 —— 关掉开关就完全不上传。
201
301
 
202
302
  ### 错误卡片不再卡十几分钟
203
303
 
204
- - **它以前会被一行日志撑爆**:OneBot 发送失败时会把**整个请求参数**拼进报错信息,里面是一张 4.6MB 的 base64 图片;这行原样进日志、原样进卡片,于是卡片 HTML 变成 **9.1MB**,渲染跑十几分钟都出不来(报错本身也就发不出去了)。现在日志**逐行折叠 + 截断**(`base64://…`、超长串都折掉),卡片上的日志行数也封顶,同一张卡片从 9.1MB 降到 3.7MB、**5 秒内**渲染完。
205
- - 折叠对上报同样生效:4.6MB 的那行日志折完只剩 158 字符,上报体积从几 MB 降到 1~2KB。
304
+ - **它以前会被一行日志撑爆**:某类发送失败会把**整个请求参数**(含一张 4.6 MB 的图片数据)
305
+ 拼进报错信息里,于是卡片长度暴涨、渲染十几分钟都出不来(报错本身也就发不出去了)。
306
+ 现在超长内容会自动折叠、截断,日志行数也封顶,同一张卡片从「十几分钟」降到 **5 秒内**。
307
+ - 折叠对上报同样生效:那行 4.6 MB 的日志折完只剩一百多字符。
206
308
 
207
309
  ## 3.1.0
208
310
 
209
311
  ### 卡片渲染:先量再定倍率,快的那个留下
210
312
 
211
- 拿你各个平台的真实卡片在同一台机器上测的(同一份 HTML,各测两遍取平均):
313
+ 拿各个平台的真实卡片在同一台机器上测过(同一份内容,各测两遍取平均):
212
314
 
213
- | 卡片 | 1 倍渲染 | 2 倍渲染 | 现在固定用 |
315
+ | 卡片 | 1 倍分辨率 | 2 倍分辨率 | 现在固定用 |
214
316
  | --- | --- | --- | --- |
215
317
  | 抖音评论区 | **1.5 秒** | 4.2 秒 | 1 倍 |
216
318
  | B 站评论区 | **2.2 秒** | 6.8 秒 | 1 倍 |
@@ -222,14 +324,21 @@
222
324
 
223
325
  两处原因,都修了:
224
326
 
225
- - **有些卡片一直在用两倍分辨率渲染,然后被扔掉一半**:卡片是按 1440 宽排版的,长图切片时又会被压回 1440 宽再切 —— 2 倍渲染出来的 2880 宽像素一个都用不上。但**不能一刀切**:内核在不同倍率下走的路径不一样,实测上面这些卡片,评论卡 1 倍快 2.7 倍,小红书笔记卡反而 2 倍快 3 倍。所以现在每条路由**各测一次**:第一次用你配的倍率,第二次换另一档,之后固定用快的那档(每条路由只多花一次渲染)。你把「渲染精度」设成 50(就要 1 倍)时不测,直接听你的。
226
- - **内核在等它根本加载不了的远程图片**:shotkit 内核在 Windows 上拉不到 https 资源(卡片里的远程头像、封面本来就是空白框),但它照样会去请求、还等你等到超时 —— 实测页面里只要有一个连不上的 https 图片,截图就从 1.5 秒变成 **22 秒**。React 还会给每张图片额外补一条 `<link rel="preload">`(一张评论卡 27 条),这些也算在加载里。现在交给内核之前会把这些摘掉(只有用内核时才摘,切到 puppeteer 不受影响,那边远程图片正常)。
227
- - 顺带:渲染日志现在会写清**每张卡片花了多久**(页面多少毫秒 / 截图多少毫秒),慢的时候能一眼看出是慢在哪一步。
327
+ - **有些卡片一直在用两倍分辨率渲染,然后被扔掉一半**:卡片按 1440 宽排版,长图切片时又会压回 1440 宽
328
+ —— 两倍渲染出来的像素一个都用不上。但不能一刀切:不同卡片表现不一样,评论卡 1 倍快得多,
329
+ 小红书笔记卡反而 2 倍快。所以现在每条链路**各测一次**:第一次用你设的倍率,第二次换另一档,
330
+ 之后固定用快的那档。你把「渲染精度」设成 50(就要 1 倍)时不测,直接听你的。
331
+ - **渲染器在等它根本加载不了的东西**:老的内置渲染方案在 Windows 上拉不到网络图片
332
+ (卡片里的远程头像、封面本来就是空白框),但它照样去请求、还等到超时 ——
333
+ 实测页面里只要有一张连不上的图片,出图就从 1.5 秒变成 **22 秒**。
334
+ - 顺带:渲染日志现在会写清**每张卡片花了多久**(排版多少毫秒 / 截图多少毫秒),慢的时候一眼看出慢在哪。
228
335
 
229
336
  ### 在线播放:声音不再等服务器
230
337
 
231
- - **默认不在服务器上合视频和声音了**:播放页会同时放画面和声音,由浏览器自己对好(原来要等 ffmpeg 在服务器上合完才能开始放,等得久)。
232
- - **下载按钮分成了三个**:「下载画面」(只有画面的那份,和以前一样)、「下载声音」(单独把声音存下来)、「合成后下载」(连声音一起下载,点下去服务器才去合并,合好再给你;合过一次会记住,再点马上就好)。
338
+ - **默认不在服务器上把画面和声音合成一个文件了**:播放页会同时放画面和声音,由浏览器自己对好
339
+ (原来要等服务器合完才能开始放,等得久)。
340
+ - **下载按钮分成三个**:「下载画面」「下载声音」「合成后下载」(点下去服务器才去合并,
341
+ 合过一次会记住,再点马上就好)。
233
342
  - 页面上的静音按钮现在同时管画面和声音;拖动进度条时声音也会跟着对齐。
234
343
 
235
344
  ## 3.0.0
@@ -239,408 +348,344 @@
239
348
 
240
349
  ### 快了这么多
241
350
 
242
- - **卡片渲染从 31 秒降到 3 秒**。模板每张卡片上都铺了一层全屏噪点,那层要一个像素一个像素地算,占掉九成时间;现在默认去掉,画面上几乎看不出区别(逐像素对比平均只差 0.8/255)。
243
- 想保留那层颗粒感也没问题:配置里 `app.noiseOverlay` 改成 `tile` 就是「换成小图案平铺」,还是比原来快 9 倍。
244
- - **不再互相等**:信息卡、评论区、图集、视频各走各的,谁先好了谁先发。以前视频都下载完了,还要等卡片渲染完才肯发出去。
245
- - 顺手剔掉了 384 条「指向不存在的字体文件」的声明,渲染又快了一点(每个 HTML 文件也小了 2.4MB)。
351
+ - **卡片渲染从 31 秒降到 3 秒**。每张卡片上都铺了一层噪点,那层要一个像素一个像素地算,
352
+ 占掉九成时间;现在默认去掉,画面上几乎看不出区别。想保留颗粒感也可以在配置里换成「小图案平铺」,
353
+ 仍然比原来快 9 倍。
354
+ - **不再互相等**:信息卡、评论区、图集、视频各走各的,谁先好了谁先发。
355
+ 以前视频都下载完了,还要等卡片渲染完才肯发出去。
356
+ - 顺手剔掉了 384 条「指向不存在的字体文件」的声明,渲染又快了一点。
246
357
 
247
358
  ### 发不出去 / 重复发的问题
248
359
 
249
- - **失败现在按错误码判断**:以前只看「有没有拿到消息 ID」,会把「上传文件大小超过限制」误判成「被动回复超限」,于是同一张图被传两遍、才去切片。现在看到「上传文件大小超过限制」就直接切片,不白等。
250
- - **没拿到消息 ID 就是没发出去**(和 qq-chat 同一个判法),不再当成成功悄悄丢掉;日志里会直接写清是哪个错误码。
251
- - **OneBot(NapCat 这类个人号)上的图片改发普通图片**:markdown 只有 QQ 官方机器人认,个人号客户端显示不出来 —— 之前你看到的那串 `![#1440px #2000px](链接)` 就是它。切片、图集、评论图片现在都会自动改成发图片。
252
- - **错误卡片不再变成 10MB 的大图**:报错信息里带着几 MB 的图片数据,以前会原样画进卡片(渲染要 28 秒,而且这么大还是会被拒收);现在会折叠掉,只留有用的部分。
360
+ - **失败现在按错误码判断**:以前只看「有没有拿到消息 ID」,会把「上传文件太大」误判成「回复超频」,
361
+ 于是同一张图被传两遍。现在看到「上传文件太大」就直接切成多张,不白等。
362
+ - **没拿到消息 ID 就是没发出去**,不再当成成功悄悄丢掉;日志里会写清是哪个错误码。
363
+ - **个人号(NapCat 这类)上的图片改发普通图片**:那种带 `![#1440px #2000px](链接)` 的写法
364
+ 只有 QQ 官方机器人认,个人号显示不出来。现在切片、图集、评论图片都会自动改成普通图片。
365
+ - **错误卡片不再变成 10 MB 的大图**:以前报错信息里几 MB 的图片数据会被原样画进卡片
366
+ (渲染 28 秒、而且这么大还是会被拒收);现在会折叠掉,只留有用的部分。
253
367
 
254
368
  ### 合并转发
255
369
 
256
- - **两级开关,默认全关**:通用里打开 = 所有平台都合并;全局关着时,可以在抖音 / 哔哩哔哩 / 快手 / 小红书里**单独打开**。
257
- - **可以选合并哪些内容**:文字 / 图片 / 视频 / 文件。**语音和 markdown 去掉了** —— QQ 的聊天记录不支持语音气泡,而 markdown 只有官方机器人认、官方机器人偏偏又不能合并转发,这两个选项本来就是死的。
258
- - **每条内容一个条目**:信息卡、评论区、视频各占一条「聊天记录」,**切片仍留在同一条里**(以前全挤在一条里,结果只有视频能加载、图片全不显示)。
259
- - 开着合并转发时**不会再跳过切片**(以前会把 3 万像素高的评论卡整个塞进转发,直接被拒),**转发失败也不会丢内容**(会自动退回逐条发)。
260
- - 面板里就能改:通用页多了「合并转发内容(全局)」,四个平台页各多了一栏「合并转发」(开关 + 内容)。
370
+ - **两级开关,默认全关**:通用里打开 = 所有平台都合并;全局关着时,可以在
371
+ 抖音 / 哔哩哔哩 / 快手 / 小红书 里**单独打开**。
372
+ - **可以选合并哪些内容**:文字 / 图片 / 视频 / 文件。**语音和 markdown 去掉了** ——
373
+ QQ 的聊天记录不支持语音气泡,而 markdown 只有官方机器人认、官方机器人偏偏又不能合并转发,
374
+ 这两个选项本来就是死的。
375
+ - **每条内容一个条目**:信息卡、评论区、视频各占一条「聊天记录」,长图切片仍留在同一条里
376
+ (以前全挤在一条里,结果只有视频能加载、图片全不显示)。
377
+ - 开着合并转发时**不会再跳过切片**,**转发失败也不会丢内容**(会自动退回逐条发)。
378
+ - 面板里就能改:通用页多了「合并转发内容(全局)」,四个平台页各多了一栏「合并转发」。
261
379
  - 顺手:解析提示(「检测到链接,开始解析」)不会再混进转发里。
262
380
 
263
- ### 在线播放
264
-
265
- - 新增**「强制在线播放的适配器」**(默认填 `bilibili`):从这些适配器进来的消息**一律只给播放链接**,视频不发出去 —— B站私聊机器人发不了视频文件,填上它就行。想关掉就把这一栏清空。
266
- - **超限转在线播放时会说明原因**:以前是静默把视频换成链接,你只拿到一个地址、不知道视频为什么没发出来。
267
- - **播放页的「开启弹幕」开关修好了**(那个开关以前根本没接上,点了没反应;「彩色弹幕」也一样)。
268
-
269
- ### 其他
270
-
271
- - 「纯发链接」的解析里,部分开关(强制在线播放、超限转在线播放)以前不生效,已修。
272
- - 面板「在线播放器设置」里新增「强制在线播放的适配器」一项。
273
-
274
381
  ## 2.1.0
275
382
 
276
- > 这一版把之前两个预览版(`2.0.1-beta.1` / `2.0.1-beta.2`,内容已一并收进来)和一次新联动一起发了:
277
- > **卡片渲染接上了新的高速截图服务 `kkkshot`**,另外修掉几个实测反馈的问题。
383
+ > 这一版把之前两个预览版(内容已一并收进来)和一次新联动一起发了:
384
+ > **卡片出图接上了新的高速服务 kkkshot**,另外修掉几个实测反馈的问题。
278
385
  >
279
- > 升级不需要改配置:所有新开关都有默认值;老配置缺这些键时行为与以前一致。
386
+ > 升级不需要改配置:所有新开关都有默认值;老配置缺这些键时,行为与以前一致。
280
387
 
281
388
  ### 本版重点
282
- - **卡片渲染快 2 倍以上**:新增**联动插件 `koishi-plugin-kkkshot`**(注册 `kkkshot` 服务)。
283
- 装了它,kkk 会**默认优先用它渲染卡片**;没有装(或它渲染失败)就自动退回 `koishi-plugin-puppeteer`,
284
- 行为与以前完全一致。本机实测同一张卡片:**1.54s → 0.60s**(详见下面「配套插件」)。
285
- - **「短时间不重复解析」变成可配置**:通用里新增这个开关 + 「重复解析间隔(分钟)」,
286
- 去重覆盖面也从「抖音 / B站」扩到**快手 / 小红书**。
287
- - **合并转发开关语义修正**:打开才合并(触发者身份),**关掉就不合并**、内容逐条发;
288
- 并且修好了「在面板里打开它却不生效」(面板保存现在会真的写进 config.json)。
289
- - **权限字段能填用户 ID 了**:修掉「选『指定账号』填 ID 一保存就报 `reading 'logger'`」。
389
+
390
+ - **卡片出图快一倍以上**:新增可选插件 **koishi-plugin-kkkshot**。装上它,kkk 会**默认优先用它出图**;
391
+ 没装(或者它出图失败)就自动退回 koishi-plugin-puppeteer,行为和以前完全一样。
392
+ 本机实测同一张卡片:**1.54 秒 → 0.60 秒**(细节见下面「配套插件」)。
393
+ - **「短时间不重复解析」变成可配置**:通用里新增这个开关和「重复解析间隔(分钟)」,
394
+ 去重范围也从「抖音 / B 站」扩到**快手 / 小红书**。
395
+ - **合并转发开关的说明修正**:打开才合并(用触发者的身份展示),**关掉就不合并**、内容逐条发;
396
+ 另外修好了「在面板里打开它却不生效」。
397
+ - **权限字段终于能填用户 ID 了**:以前选「指定账号」再填 ID,一保存就报一句看不懂的英文错,现在正常。
290
398
 
291
399
  ### 新增
292
- - **配套插件 `koishi-plugin-kkkshot`(可选)**:给 kkk 用的高速截图服务,注册 `kkkshot` 服务后
293
- kkk 检测到它就**默认用它渲染卡片**。它和常规 puppeteer 用法的区别:
294
- - **常驻页面池**(默认 2 个页面反复用)而不是每次新建页面再关掉;
295
- - 导航只要 `domcontentloaded`,然后**只等字体和图片**(`document.fonts.ready` + 图片 `complete`),
296
- 不再用 `networkidle0` 白等那一整段静默期;
297
- - 按卡片元素自己的盒子 `clip` 截图(贴合卡片、不带白边),页面底色设成卡片底色;
298
- - **优先复用 `ctx.puppeteer` 的浏览器**(省内存),没有才自己启动;
299
- - 页面用满 `recycleAfter`(默认 100)次回收重建,长跑不涨内存;启动时预热一个页面。
300
- - 加载顺序:`kkk` 把 `kkkshot` 声明成**可选依赖** —— 装了就用,没装就退回 puppeteer,不会因为少装它报错。
400
+
401
+ - **配套插件 koishi-plugin-kkkshot(可选)**:给 kkk 用的高速出图服务。它和常规出图方式的区别:
402
+ 常驻几个页面反复用(不是每次新建)、只等字体和图片加载好(不白等一段固定的静默期)、
403
+ 按卡片本身的边界截图(贴合卡片、不带白边)、优先复用已有的浏览器(省内存)、
404
+ 长时间运行也不会越占越多内存。装了就用,没装就退回原来的方式,不会因为少装它报错。
301
405
  - **通用 →「短时间不重复解析」**(默认开启):同一条链接在一段时间内只解析一次。
302
- QQ 的指令按钮是「发一条消息 + 再发一个交互事件」,用户连点、客户端重发也会把同一条链接投递两遍,
406
+ QQ 的按钮是「发一条消息 + 再发一个交互事件」,用户连点、客户端重发也会把同一条链接投递两遍,
303
407
  跑两遍就是两次「开始解析」、两次下载、两次发送(第二次还常因为缓存已被清理而失败)。
304
- 去重键包含会话、作品 ID、画质与弹幕开关 —— 换画质、换作品、换群都不会被误伤;关掉后每条消息都会解析。
408
+ 去重会区分会话、作品、画质和弹幕开关 —— 换画质、换作品、换群都不会被误伤;关掉后每条消息都会解析。
305
409
  - **通用 →「重复解析间隔(分钟)」**(默认 1,可填 1 ~ 60):上面那个开关打开时才生效,
306
- 开关关掉时这一项在面板里会变灰不可改。取值兜底:超出范围夹到最近的边界(0 → 1 分钟,90 → 60 分钟),
307
- 非数字按默认 1 分钟。
308
- - 去重覆盖面扩到 **快手 / 小红书**(这两条链路以前完全没有去重)。
410
+ 开关关掉时这一项在面板里会变灰不可改。填超出范围的数字会自动夹到最近的边界,填错按默认 1 分钟。
411
+ - 去重范围扩到 **快手 / 小红书**(这两条链路以前完全没有去重)。
309
412
 
310
413
  ### 修复
311
- - **「合并转发打开了没用」**(用户实测):开关在面板里打开、保存也提示「已保存」,
312
- 但日志还是「「解析结果合并转发」关着,本次按逐条发送处理」。根因在「面板/控制台设置 → config.json」的同步规则:
313
- 老规则把「传进来的值正好等于上游默认值」当成「用户没动过」直接跳过,而 `app.fakeForward` 的**默认值就是 true** ——
314
- 于是「把它打开」等于回到默认值,永远写不进 config.json,插件读到的还是 false。
315
- 现在**面板保存走 authoritative 模式**(表单里那份配置就是用户想要的,值等于默认值也照写),
316
- 控制台那条路仍保持保守规则(不拿表单里的默认值盖掉手改的 config.json);
317
- 保存后日志会打一行「面板设置已写入 config.json: xxx」,方便确认到底写进去了没有。
318
- - **「关闭合并转发 还是合并的」**(用户实测):通用里那个开关以前**只管「转发用谁的身份展示」**,
319
- 关掉之后照样合并成一条转发。现在它的语义是**要不要合并**:
320
- 打开 → 一次解析产生的所有内容合并成一条转发(用触发者身份展示);
321
- **关掉 → 不合并**,内容像以前一样一条一条发(过程提示本来就不进转发,这条不受影响)。
322
- 面板里的标签也从「伪造合并转发消息」改成「**解析结果合并转发**」,说明写清了这两句;
323
- 控制台字段说明、配置注释同步更新;冒烟里加了「关掉不合并 / 再打开又合并」的用例守着。
324
- - **选了「指定账号」填上 ID,一保存就报 `Cannot read properties of null (reading 'logger')`**(严重):
325
- 这句报错其实是**被盖掉**的 —— 真正的原因是字段值没通过 Schema 校验。
326
- `loginPerm` / `permission` / `errorLogSendTo` 这几个「允许手填账号」的字段被渲染成了**枚举下拉**
327
- (union of consts),手填的用户 ID 不在选项里,保存时 cordis 的 `resolveConfig` 抛错,
328
- 而它 emit 的 `internal/error` 又被 `@cordisjs/logger` 的监听器再抛一个 `reading 'logger'` ——
329
- 用户就只看到这一句,完全看不出该改哪里。
330
- 现在这几个字段改成普通文本(数组那个是字符串数组):**用户 ID、关键字、多个用逗号分隔**都能保存,
331
- 非法类型仍然会被 Schema 拒掉(校验没有形同虚设);保存失败时的提示也换成能照做的说法,
332
- 并在日志里带上调用栈,下次再遇到不用猜。
333
- - **文案说错了**:原来写「选「指定账号」后填 QQ 号」—— Koishi 这边匹配的是**用户 ID**(session.userId),
334
- 不是 QQ 号。面板的下拉说明与输入框占位符、控制台里的字段说明、以及插件设置里那句
335
- 「主人账号(QQ 号)」都改成了「用户 ID」。
414
+
415
+ - **「合并转发打开了没用」**:面板里打开、保存也提示「已保存」,日志却还是按逐条发送处理。
416
+ 现在已经修好:面板保存会真正写进配置,保存后日志里还会打一行确认。
417
+ - **「关闭合并转发,结果还是合并的」**:那个开关以前只管「转发用谁的身份展示」,
418
+ 关掉之后照样合并成一条。现在它的意思就是**要不要合并**:打开 → 一次解析的内容合并成一条转发
419
+ (用触发者身份展示);关掉 → 不合并,内容一条一条发。面板里的名字也从「伪造合并转发消息」
420
+ 改成了「**解析结果合并转发**」,说明写清了这两句。
421
+ - **「指定账号」填上 ID 一保存就报一句看不懂的英文错**:现在这几个「允许手填」的字段改成了普通输入框,
422
+ 用户 ID、关键字、多个用逗号分隔都能保存;填错类型仍然会被拦下,提示也换成了能照做的说法。
423
+ - **文案说错了**:以前写「填 QQ 号」,其实这里要的是**用户 ID**(不是 QQ 号);
424
+ 面板、控制台和说明文字都改过来了。
336
425
 
337
426
  ### 变更
338
- - 面板标签:**「伪造合并转发消息」→「解析结果合并转发」**(名字要能看出「关掉就逐条发」)。
339
- - **合并转发开关的语义**:从「只决定展示身份」变成「决定要不要合并」(身份固定为触发者)。
340
- - 「谁可以触发扫码登录」与「错误日志接收人」的说明统一成「填用户 ID」。
427
+
428
+ - 面板标签:「伪造合并转发消息」→「**解析结果合并转发**」(名字要能看出「关掉就逐条发」)。
429
+ - 合并转发开关的含义:从「只决定展示身份」变成「决定要不要合并」(身份固定为触发者)。
430
+ - 「谁可以触发扫码登录」和「错误日志接收人」的说明统一成「填用户 ID」。
341
431
 
342
432
  ## 2.0.0
343
433
 
344
- > 这是 Koishi 移植版从 **1.0.0 到 2.0.0** 的一次总更新(把此前 `1.2.0-beta.1` 的全部内容也并了进来)。
345
- > 一句话:**配置面板、QQ 面板与体积、解析链路、弹幕、在线播放器、合并转发、进度与错误处理**,
346
- > 这一路上的改动都在这一版里说清楚。升级到本版**一般不用改配置**:所有新开关都有默认值,
347
- > 老配置里缺这些键时行为与以前一致(每条都标了默认值)。
434
+ > 这是移植版从 1.0.0 到 2.0.0 的一次总更新(把此前的预览版内容也并了进来)。
435
+ > 一句话:**配置面板、QQ 面板、解析链路、弹幕、在线播放器、合并转发、进度与错误处理**,
436
+ > 这一路上的改动都在这一版里。升级一般不用改配置:新开关都有默认值,老配置缺这些键时行为和以前一致。
348
437
 
349
438
  ### 本版重点
350
- - **在线播放器(弹幕在线看)**:选「弹幕」不再把弹幕烧进视频,而是把视频放进播放页、回一条链接;
351
- 播放页照着 B站播放页做(夜间风格、标题/UP/统计、弹幕设置面板),链接到期自动删文件。
352
- - **解析结果合并转发**:一次解析产生的所有内容合并成**一条转发**发出(**不含过程提示**),
353
- 在 OneBot 系适配器上走的是 **OneBot 的合并转发 API**(`send_group_forward_msg` / `send_private_forward_msg`)。
439
+
440
+ - **在线看(弹幕在线播放)**:选「弹幕」不再把弹幕烧进视频,而是给你一条网页链接 ——
441
+ 点开就是带弹幕的播放页(照着 B 站播放页做:深色界面、标题 / UP主 / 统计、
442
+ 弹幕开关 / 字号 / 透明度 / 彩色弹幕)。链接到期自动删文件。
443
+ - **解析结果合并转发**:一次解析的内容合并成**一条转发**(过程提示不进转发)。
354
444
  - **关掉某个平台的解析,那个平台就彻底不处理**(不回复、不提示缺 Cookie、不记统计)。
355
- - **面板「在线播放器设置」**:样式与其它分组完全一致(同一套卡片容器),并且有了**这一组自己的总开关**,
356
- 关掉时组内其它字段全部变灰不可改。
357
- - **ffmpeg 不再被「相对路径 / 没有执行权限」那份拖死**:按候选逐份校验,起不来就换下一份。
358
- - **修 WebUI「推送列表 → 推送目标 → 填频道 id → 点完成 → 整个面板黑屏」**。
445
+ - **面板「在线播放器设置」**:样式和其它分组一致,并且有**这一组自己的总开关**
446
+ (关掉时组内其它设置变灰不可改)。
447
+ - **ffmpeg 找不到 / 没权限的问题修了**:按顺序逐个候选校验,起不来就自动换下一个。
448
+ - **修 WebUI「推送列表里填频道 ID,点完成后整个面板黑屏」**。
359
449
 
360
450
  ### 新增
361
- - **在线播放器(弹幕在线看)**(通用 →「在线播放器设置」):
362
- 解析面板里那一列按钮写「**弹幕**」,点它不再把弹幕烧进视频,而是把视频下下来放进播放器目录、
363
- 回一条链接 —— 点开就是带弹幕的播放页(深色界面、手机也能看,弹幕用 canvas 自己画,
364
- 有弹幕开关 / 字号 / 透明度 / 显示区域 / 滚动·顶部·底部三类开关 / 彩色弹幕)。页面**零外网依赖**,
365
- 服务端支持 HTTP Range,进度条可拖动。
366
- - 配置项(都在「通用 → 在线播放器设置」,括号里是默认值):
367
- **在线播放器总开关**(开)、**面板显示「在线看」按钮**(开)、**播放器公网地址**(空)、
368
- **播放器端口**(0 = 复用 Koishi 端口)、**链接有效期(分钟)**(60)、
369
- **在线播放最大文件(MB)**(0 = 跟随全局「文件大小限制」)、**超限转在线播放**(关)。
370
- - **这一组有自己的总开关**:关掉后组内其它设置全部变灰不可改,解析回到原来的 ffmpeg 烧录流程
371
- (面板列头变回「烧录弹幕」、不再有「在线看」列);这一组在面板里的样式与「缓存设置 / 交互设置」
372
- 等分组**完全一致**(同一套卡片容器、标题与间距)。
373
- - **「在线看」按钮**(面板「弹幕」右边一列):点它**直接在线播放**(带弹幕、视频不发群),
374
- 即使面板弹幕列关着、配置里弹幕功能关着也照样带弹幕;总开关关掉时这一列不出现。
375
- - **超过 QQ 档位上限(默认 200MB)的画质档照样列出来**:在线播放的视频不发到 QQ,
376
- 所以那个体积上限不该再把档位藏掉;超限档位的「清晰度」那一格标「超上限」,
377
- 右边的「在线看」仍可用(受下面那条播放器上限约束)。
378
- - **「在线播放最大文件」**:显式填了就用它;留空或 0 = 跟随全局的「文件大小限制」;
379
- **超限不走在线播放**(判定发生在把文件搬进播放器目录**之前**,一点磁盘都不占),
380
- 退回原来的发送流程并说明「超过在线播放的体积上限,按原来的方式处理」。
381
- 「超限转在线播放」也吃这条上限(开了转播也不突破)。
382
- - **「超限转在线播放」**(默认关):打开后,超过全局「文件大小限制」的视频不再回
383
- 「视频太大了,还是去B站看吧」,而是照常下载并改成在线播放(视频不发群、也不占群文件)。
384
- - **播放器公网地址**留空时:链接退化成「本机 IP + 端口」(本机 / 内网可用),
385
- 日志里警告一次,机器人回复与播放页上都会带一句「未配置公网地址,仅本机可访问」。
386
- - 播放页:**下载按钮**(服务端带 `Content-Disposition`,文件名做过安全处理)、
387
- 过期页与播放页的「直接跳转 / 手动复制」、作品信息(标题 / UP 主 / 封面 / 播放量 / 点赞 / 投币 /
388
- 收藏 / 评论 / 分享 / 发布时间 / 时长,**只用真实数据,没有就不显示**)、封面走**同源**地址(断网不裂图)、
389
- 在线播放优先选 **H.264** 的流(避免「只有声音没有画面」)。
390
- - 路由:`/kkk/player/:token`(播放页)、`/kkk/player/:token/video`(支持 Range;`?download=1` 下载)、
391
- `/kkk/player/:token/download`、`/kkk/player/:token/danmaku`(弹幕 JSON)、
392
- `/kkk/player/:token/cover`;令牌是随机串且只允许 `[0-9a-z]{8,64}`。
393
- - **解析结果合并转发**(通用 →「交互设置 → 伪造合并转发消息」,默认开):
394
- 一次解析产生的**所有内容**(卡片 / 图片 / 视频 / 评论…)合并成**一条转发**发出,
395
- **过程提示不进转发**(「检测到链接,开始解析」「收到请求,开始下载」「加载中…」「发送中…」照常单独发)。
396
- - 走的是**适配器自己的合并转发 API**:OneBot 系会调用
397
- `send_group_forward_msg` / `send_private_forward_msg`(转发节点里带 uin / name);
398
- - **身份**:开着 = 用**触发者**身份展示,关着 = 用**机器人**身份展示;
399
- - 只对支持合并转发的适配器有效果;QQ 官方适配器没有这个能力,会自动退化成逐条发送;
400
- - 发给别人(例如错误日志发给主人)的消息不会被吞进这条转发里。
401
- - **通用 → 强制不烧录弹幕**(默认开):弹幕烧录的总开关,优先级最高;要用弹幕功能先把它关掉。
402
- - **平台解析开关**(抖音 / B站 / 快手 / 小红书):**关掉某个平台后,那个平台彻底不处理** ——
403
- 不管是从自动解析、`#解析` / 引用解析还是面板按钮进来,都不回复、不提示缺 Cookie、不记统计。
404
- - **QQ 适配器**新增一批开关(面板 → WebUI 的「QQ 适配器」分类,与控制台同一份字段表):
405
- **链接解析面板**(开)、**自动撤回面板**(开)、**画质档体积上限**(200MB)、
406
- **番剧选集面板行列数**、**超大图片自动切片**(开)、**切片高度**(2000)、
407
- **卡片文字识别密钥**(OCR)、**面板显示「烧录弹幕」列**(关)、**面板带「打开原站」链接**(开)、
408
- **群文件发送阈值**(30MB)、**强制不烧录弹幕**(开)。
409
- - 面板与播放页的**下载 / 跳转 / 复制**这类按钮:一律内联 SVG 图标,**不用 emoji**。
410
- - 文档:README、帮助指令、更新日志改成用户视角(配置入口 + 指令表 + QQ 用法)。
451
+
452
+ **在线看**(通用 → 在线播放器设置)
453
+
454
+ - 解析面板里那一列按钮写「弹幕」,点它不再烧录,而是把视频下下来放进播放器目录、回一条链接;
455
+ 点开就是播放页(手机也能看;弹幕开关 / 字号 / 透明度 / 显示区域 / 滚动·顶部·底部三类开关 / 彩色弹幕都有),
456
+ 页面不依赖任何外部网站,进度条可以拖。
457
+ - 配置项(括号里是默认值):**在线播放器总开关**(开)、**面板显示「在线看」按钮**(开)、
458
+ **播放器公网地址**(空)、**播放器端口**(0 = 用机器人自己的端口)、
459
+ **链接有效期(分钟)**(60)、**在线播放最大文件(MB)**(0 = 跟随全局「文件大小限制」)、
460
+ **超限转在线播放**(关)。
461
+ - 「在线看」按钮:点它直接在线播放(带弹幕、视频不发群),即使弹幕相关的开关关着也照样带弹幕。
462
+ - **超过 QQ 上限的画质档也会列出来**(在线播放的视频根本不发到 QQ),超限那档标「超上限」。
463
+ - **超限转在线播放**打开后:视频太大不再回「还是去 B 站看吧」,而是照常下载并改成在线播放。
464
+ - **播放器公网地址留空**时:链接只能本机 / 内网打开,日志会警告一次,给用户的回复里也会写明。
465
+ - 播放页有下载按钮、作品信息(**只用真实数据,没有就不显示**)、封面走同源地址(断网不裂图)。
466
+
467
+ **解析结果合并转发**(通用 → 交互设置,默认开)
468
+
469
+ - 一次解析的内容(卡片 / 图片 / 视频 / 评论…)合并成一条转发,过程提示不进转发。
470
+ - 身份:开着 = 用触发者身份展示,关着 = 用机器人身份展示。
471
+ - 只有在支持的适配器上有效果;QQ 官方机器人没有这个能力,会自动退化成逐条发送。
472
+ - 发给别人(比如把错误日志发给主人)的消息不会被吞进这条转发。
473
+
474
+ **其它新增**
475
+
476
+ - **通用 → 强制不烧录弹幕**(默认开):弹幕烧录的总开关,优先级最高。
477
+ - **平台解析开关**(抖音 / B 站 / 快手 / 小红书):关掉某个平台后,那个平台彻底不处理。
478
+ - **QQ 适配器**新增一批开关:链接解析面板、自动撤回面板、画质档体积上限、番剧选集面板行列数、
479
+ 超大图片自动切片与切片高度、卡片文字识别密钥、面板是否显示「烧录弹幕」列、
480
+ 面板是否带「打开原站」链接、群文件发送阈值等。
481
+ - 面板与播放页的按钮一律用图标,不用 emoji。
482
+ - 文档(README / 帮助指令 / 更新日志)改成用户视角。
411
483
 
412
484
  ### 修复
413
- - **WebUI「推送目标填完频道 id 点完成 → 整个面板黑屏」**(线上事故):
414
- 后端 `/kkk/v1/groups/batch` 返回的是 `data: null`,而面板前端拿到后直接 `data.find(...)`,
415
- 渲染期抛 `TypeError: Cannot read properties of null (reading 'find')`,React 卸载整棵树 → 整页空白。
416
- 现在该接口**永远返回数组**(并补上群名 / 头像 / 机器人在线状态),前端也加了一层兜底,
417
- 另外给面板加了**错误边界**:任何没被接住的异常都会顶出一块可读的中文报错卡片(带文件名:行:列),
418
- 不再是黑屏。
419
- - **`spawn ./downloads/ffmpeg-linux-amd64-… EACCES`**(B站 m4s → mp4 修复失败、整条解析跟着失败):
420
- 兼容层把「拿到的那份 ffmpeg」原样交给 spawn、从不校验,而自动下载/缓存下来的那份常常是**相对路径**
421
- 且没有执行权限。现在按 **Koishi 的 ffmpeg 服务 → 配置里的 ffmpegPath → 环境变量 → PATH** 逐份校验
422
- (相对路径按数据目录 / 工作目录归一化成绝对路径、必须存在、Linux/macOS 查 `X_OK`、Windows 查可执行扩展名),
423
- 跳过时打一条带原因的日志、选中时写明用的是哪一份;**spawn 起不来会自动换下一个候选重试**,
424
- 全部不行时 stderr 里列出「都试过哪些」,并给出可以照做的 `chmod +x` 提示。
425
- - **关了小红书的解析,还是会提示没有 Cookie**:平台开关原来只作用在「自动解析」那条命令上,
426
- 走 `#解析` / 引用解析进来的链接照样跑到底并抛「我还没有小红书的 Cookies」。
427
- 现在四个平台的 handler 最前面都判断自己的开关,关掉时直接返回(见上面的「平台解析开关」)。
428
- - **合并转发没生效**:发给适配器的元素少了 `forward` 属性,OneBot 只会把它当成普通消息内容。
429
- 现在带上 `forward` 与 `<author>`(决定这条转发显示成谁发的),实测会走 OneBot 的合并转发 API。
430
- - **「打开原站」链接把整条面板拖挂**(严重):链接原来写成 `mqqapi://forward/url?...`,
431
- QQ 官方接口直接拒收(`[40034028] 请求参数不允许包含url mqqapi://forward/url`),
432
- **整条面板消息都发不出去**。现在改成普通 markdown 链接,并加了兜底:
433
- 面板带链接发送失败时**自动去掉链接行重发一次**。
434
- - **在线播放器设置整组被锁住 / 判断写反**:改为只有总开关受「强制不烧录弹幕」联动(方向已修正),
435
- 其余字段随时可编辑;后来又进一步改成「总开关关掉 → 组内其它字段变灰」。
436
- - **开了在线播放器,面板里却没有「弹幕」按钮**:那一列当时还被 QQ 适配器里那个旧开关管着,
437
- 等于要开两个开关才有入口;现在在线播放模式下这一列只跟播放器总开关走。
438
- - **在线播放器设置和别的分组样式不一致**:它被注入进了「交互设置」的卡片内部(卡片套卡片 + 两列网格),
439
- 现在改成和「缓存设置 / 交互设置」并列的兄弟分组,用的是面板同一套卡片容器。
440
- - **播放器链接点开报 `ERR_UNSAFE_PORT`**(把「播放器端口」配成了 6665-6669 这类 IRC 段):
441
- 服务端正常,是浏览器按黑名单禁止访问;现在启动/生成链接时都会明确警告,
442
- 且**端口在黑名单里、又没配公网地址时自动退回 Koishi 自己的端口**;字段说明里也写明了别用这类端口。
443
- - **av 号链接解析失败**:av→BV 转换的返回结构多包一层,取不到 bvid 导致静默失败。
444
- - **错误卡片切片失败 `e is not defined`**:`sliceImageToMarkdown` 里混进了一段用了不存在变量的分支,
445
- 一调用就 ReferenceError,超长错误卡片永远切不了片(最后原样发一张 8.9MB 的长图,还可能被拒收)。
446
- - **弹幕烧录一直不生效**:此前「移除弹幕功能」时把烧录请求写死成了 false,
447
- 指令 `弹幕解析`、参数 `--dm=1` 与平台配置里的 `burnDanmaku` 都不会真的烧;现已恢复并统一过总开关。
448
- - **「下载进度详情」看不到解析阶段**:现在四条链路都能看到
449
- 「正在获取下载链接 → 正在合并音轨(有的话)→ 正在烧录 / 正在准备在线播放 → 正在发送」,
450
- 阶段挂在解析共用的一个 key 上(不会两条打架),每个阶段结束都会清理,不会卡在某个状态。
451
- - **快手解析崩溃**(`sendParseTip` 循环 import)、**小红书解析**(`sendContent` 为空导致什么都不发 /
452
- 表情数组类型 / 渲染顺序 / 视频笔记字段 / 评论兜底)、**抖音与快手接口形状适配**。
453
- - **图集 / 评论图片 / 实况图**:原来会因为元素类型判断错误(Satori 是 `img` 不是 `image`)导致
454
- markdown 永远为空、退化成一张一张发;现在统一合并成**一条 markdown**,超长图按需切片。
455
- - **卡片消息解析**(群里转发的分享卡片没有链接时):接入 OCR + 平台搜索定位作品,
456
- 多个候选时给一张 markdown 表格让用户点;只处理 B站平台卡片(看卡片自带的 source)。
457
- - **QQ 群文件阈值不生效**(读不到值 / 平台判断取不到):改成读 Koishi 运行时配置 +
458
- 用适配器真实平台名判断,并补了判定日志。
459
- - **发送失败重试**:普通发送 3 次退避重试、切片上传 3 次重试;切片前的失败判断不再只看消息 ID。
460
- - **`getFriendList 失败` 刷日志**:兼容层先做能力判断(qq-crack 没这个方法),没有再安静返回空数组。
461
- - 控制台侧边栏入口消失(`try/else` 语法错误)、入口包缓存导致改了看不到、面板 token 过期报
462
- 「加载配置失败 / 鉴权失败」、生产环境面板报 `assets/web/index.html 缺失`。
485
+
486
+ - **WebUI 填完频道 ID 点完成,整个面板黑屏**(线上事故):现在接口永远返回列表,
487
+ 面板也加了兜底 —— 万一有异常,会显示一张能看懂的中文报错卡片,不再是黑屏。
488
+ - **ffmpeg 报「找不到 / 没有权限」导致解析失败**:现在按
489
+ 「机器人自带的 ffmpeg 服务 → 配置里填的路径 → 环境变量 → 系统 PATH」逐个试,
490
+ 相对路径会先转成绝对路径,Linux/macOS 还会检查执行权限;
491
+ 都不行时日志里会列出试过哪些,并给出能照做的解决办法。
492
+ - **关掉小红书的解析,还是提示没有 Cookie**:现在四个平台都会先看自己的开关,关掉就直接不处理。
493
+ - **合并转发没生效**:修好了,现在真的会走适配器的合并转发。
494
+ - **「打开原站」链接把整条面板拖挂**:那种链接 QQ 官方接口直接拒收,导致整条面板都发不出去;
495
+ 现在换成普通链接,并在发送失败时自动去掉链接那一行重发一次。
496
+ - **在线播放器设置整组被锁住 / 判断写反**:现在只有总开关跟「强制不烧录弹幕」联动,
497
+ 其余字段随时可改;总开关关掉时组内其它设置变灰。
498
+ - **开了在线播放器,面板里却没有「弹幕」按钮**:这一列现在只跟播放器总开关走,不用同时开两个开关。
499
+ - **播放器链接点开报「不安全端口」**:如果「播放器端口」填成了浏览器禁止的端口
500
+ (例如 6665-6669 这类),现在启动和生成链接时都会明确警告,
501
+ 没配公网地址时还会自动退回机器人自己的端口。
502
+ - 另外修了一批具体问题:av 号链接解析失败、超长错误卡片切不了片、弹幕烧录一直不生效、
503
+ 「下载进度详情」看不到解析阶段、快手 / 小红书解析崩溃、图集 / 评论图片 / 实况图发不出来、
504
+ 卡片消息解析、群文件阈值不生效、发送失败重试、控制台侧边栏入口消失、
505
+ 面板提示「鉴权失败」等。
463
506
 
464
507
  ### 变更
465
- - **解析流程统一成「先下载视频 → 再渲染卡片 / 评论区 → 最后发送」,并且单步失败不再中断**
466
- (抖音 / B站 / 小红书 / 快手):中间任何一步失败只跳过这一步、继续跑后面的,能发的视频/卡片照发;
467
- 全部跑完后如果确实有失败,才渲染**一张**错误卡片(里面列出是哪几步失败了)。
468
- - **合并转发语义**:从「只影响转发时用谁的身份」变成「把一次解析产生的所有内容合并成一条转发」
469
- (身份仍由那个开关决定:开 = 触发者,关 = 机器人)。
470
- - **在线播放不受 QQ 的「文件大小限制」约束**(视频根本不发到 QQ),改由「在线播放最大文件」约束;
471
- 面板也不再按前者隐藏画质档。
472
- - **配置入口统一**:插件配置里的设置项全部收到 WebUI 面板(`/kkk`)里改;
473
- 权限(谁可以触发扫码登录)与错误日志接收人改成手填(支持 `*` 与账号,多个用逗号分隔)。
474
- - 解析面板的「烧录弹幕」列与总开关改为**配置驱动**(面板里不再有开关按钮)。
475
- - 评论区图片不再单独发一遍(评论卡片里已有),减少刷屏。
508
+
509
+ - **解析流程统一成「先下载视频 → 再渲染卡片 / 评论区 → 最后发送」,并且单步失败不再中断**:
510
+ 中间任何一步失败只跳过那一步,能发的照发;全部跑完后如果确实有失败,
511
+ 才发**一张**错误卡片说明是哪几步失败了。
512
+ - **合并转发的含义**:从「只影响转发显示成谁发的」变成「把一次解析的内容合并成一条转发」。
513
+ - **在线播放不受 QQ 的「文件大小限制」约束**,改由「在线播放最大文件」约束。
514
+ - **配置入口统一**:所有设置都在面板(/kkk)里改;扫码登录权限与错误日志接收人改成手填
515
+ (支持多个,用逗号分隔)。
516
+ - 评论区图片不再单独发一遍(评论卡片里已经有了),少刷屏。
476
517
 
477
518
  ### 兼容与升级说明
478
- - 老配置缺新键时的行为:在线播放器与「在线看」按钮**默认可用/显示**、面板仍默认有弹幕列;
519
+
520
+ - 老配置缺新键时的行为:在线播放器与「在线看」按钮默认可用 / 显示;
479
521
  「超限转在线播放」默认关(维持「太大了就拒绝」的老行为);「强制不烧录弹幕」默认开。
480
- - **合并转发**需要适配器支持:OneBot 系(NapCat / Lagrange 等)走 OneBot 的合并转发 API;
481
- QQ 官方适配器没有这个能力,会自动退化成逐条发送(功能不报错,只是不合并)。
482
- - 需要 ffmpeg 的功能(弹幕烧录、音视频合成、m4s 修复、图片裁剪):按上面的候选顺序自动找,
483
- 装一份系统 ffmpeg(或在配置 / 环境变量里指定绝对路径)即可;插件本身**不会**再自动下载 ffmpeg。
522
+ - **合并转发**需要适配器支持:OneBot 系(NapCat / Lagrange 等)走适配器的合并转发接口;
523
+ QQ 官方机器人没有这个能力,会自动退化成逐条发送(不报错,只是不合并)。
524
+ - 需要 ffmpeg 的功能(弹幕烧录、音视频合成、格式修复、图片裁剪):请自己装一份系统 ffmpeg
525
+ (或在配置 / 环境变量里指定路径);本插件**不会**再自动下载 ffmpeg。
484
526
 
485
527
  ## 1.1.0
486
528
 
487
529
  ### 变更
488
- - **插件配置只在 WebUI 面板里改**:控制台插件配置页里的设置项已全部隐藏,新字段也会自动进面板对应分类,
489
- 用户看一眼就知道去哪儿设置,不会再出现「控制台里改了一半、面板里改了另一半」的情况。
490
- - **扫码登录权限 / 错误日志接收人支持手填**:可以直接写 `*`(所有人)或账号(多个用逗号分隔),
491
- 错误日志也能私聊发给指定账号;界面上是下拉选模式,只有选「指定账号」时才出现输入框。
492
- - 权限写法统一成 Koishi 的说法:`all` / `admin`(权限等级 4 及以上)/ 指定账号,不再出现 Karin 的 master / allMasters。
493
- - 「自动撤回面板」开关挪到面板的「通用」分类(原来在 QQ 适配器里,不容易找)。
494
- - 插件说明(控制台里的用法提示)重写为面向用户的说明:配置入口、指令表、QQ 用法。
495
- - **API 服务默认关闭**(`APIServer` / `APIServerMount` 默认 false):不需要的人不用被迫开一个 HTTP 端口。
530
+
531
+ - **插件设置只在面板里改**:控制台插件配置页里的设置项全部隐藏,新加的字段也会自动出现在面板对应分类里,
532
+ 不会再出现「控制台改了一半、面板改了另一半」。
533
+ - **扫码登录权限 / 错误日志接收人支持手填**:可以直接写 \*(所有人)或账号(多个用逗号分隔),
534
+ 错误日志也能私聊发给指定账号。界面上是先选模式,选「指定账号」时才出现输入框。
535
+ - 权限说法统一:all / admin(权限等级 4 及以上)/ 指定账号。
536
+ - 「自动撤回面板」开关挪到面板的「通用」分类(原来藏在 QQ 适配器里,不好找)。
537
+ - 插件说明重写为面向使用者的说法:去哪儿配置、有哪些指令、QQ 上怎么用。
538
+ - **API 服务默认关闭**:不需要的人不用被迫多开一个端口。
496
539
 
497
540
  ### 修复
498
- - **QQ 群文件阈值在面板里改了不生效**:判定处读的是上游 config.json 的 Proxy,取不到的键会返回 `{}`,
499
- `Number({})` 是 `NaN`,阈值判断恒为假(日志表现为 `QQ阈值=NaNMB`)。现在改读 Koishi 侧的运行时配置,
500
- 超阈值视频会正常走群文件发送。
501
- - QQ 平台判定取不到平台名(只读 `event.platform`,实际在 `event.bot.bot.platform`),导致群文件分支走不到。
502
- - 面板里的下拉框改用面板自带的 Select 组件(此前用的是浏览器原生下拉,和面板样式不一致)。
541
+
542
+ - **QQ 群文件阈值在面板里改了不生效**:现在会正确读取,超阈值的视频会走群文件发送。
543
+ - QQ 平台识别取不到平台名,导致「群文件发送」这条路走不到。
544
+ - 面板里的下拉框改用面板自带的样式(以前是浏览器默认样式,和面板不搭)。
503
545
 
504
546
  ## 1.0.9
505
547
 
506
548
  ### 变更
507
- - **面板不再从独立 URL 进**:`/kkk`、`/kkk/edit` 以及 `/kkk/assets/*` 在未授权时直接返回 404
508
- (以前是一个「需要先登录」的提示页)。面板只从控制台侧边栏「kkk 配置」进,
509
- 凭据由控制台页面通过 RPC 换取的面板 token 交付。
510
- - **QQ 平台单独的视频体积阈值**:新增配置项 `qqGroupFileLimitMB`(QQ 适配器分组,默认 30)——
511
- 视频超过该体积时改用「群文件」发送,不再受上游 `usegroupfile` 开关影响;
512
- 其它平台仍按上游的「群文件上传」+ `groupfilevalue` 判断。
549
+
550
+ - **面板不再从独立网址进**:直接访问相关地址会返回「找不到」(以前是一个「需要先登录」的提示页)。
551
+ 面板只从控制台侧边栏的「kkk 配置」进,凭据由控制台登录态换取。
552
+ - **QQ 单独的视频体积阈值**:新增设置项(QQ 适配器分组,默认 30MB)——
553
+ 视频超过这个体积就改用「群文件」发送;其它平台仍按原来的「群文件上传 + 阈值」判断。
513
554
 
514
555
  ### 修复
515
- - 之前 30MB~100MB 的视频没有按群文件发送:运行时配置里 `groupfilevalue` 是 100(不是 30),
516
- 这一区间会走视频通道,被 QQ 压缩/改名。现在 QQ 用上面的独立阈值判断。
556
+
557
+ - 以前 30MB~100MB 的视频没有按群文件发送,会走视频通道被 QQ 压缩、改名;现在按上面的独立阈值判断。
517
558
 
518
559
  ## 1.0.8
519
560
 
520
561
  ### 修复
521
- - 控制台入口包加载失败导致**侧边栏「kkk 配置」整个消失**:上一版加 RPC 失败日志时把 `try / else` 括错了,
522
- 注册面板路由的那段代码跑到作用域外(`ReferenceError: server is not defined`),现在结构修正。
523
- - 面板前端包禁用缓存(`/@plugin-<id>/index.js` 加 `no-store`):控制台默认不带缓存头,
524
- 浏览器会一直用旧 bundle,表现为「代码改了但界面没变」。
562
+
563
+ - 控制台侧边栏「kkk 配置」整个消失的问题(上一版改日志时把一段代码写到了错误的位置)。
564
+ - 面板前端加了「不使用缓存」:以前浏览器会一直用旧版本,出现「代码改了但界面没变」。
525
565
 
526
566
  ### 变更
527
- - 控制台页面取登录凭据改成两条路依次尝试(RPC → store.user),都不行时**把失败原因显示在页面上**,
528
- 方便一眼看出是没登录还是别的问题。
567
+
568
+ - 取登录凭据改成两条路依次尝试,都不行时**把失败原因直接显示在页面上**,
569
+ 一眼能看出是没登录还是别的问题。
529
570
 
530
571
  ## 1.0.7
531
572
 
532
573
  ### 修复
533
- - **面板报「加载配置失败 / 鉴权失败: 缺少authorization」**:面板自己的登录 token 存在服务端内存里,
534
- Koishi 一重启就失效,而自动登录脚本看到 localStorage 里已经有 token 就跳过登录,
535
- 于是一直拿着废 token 请求、所有接口 401。现在:
536
- - 每次打开面板都会重新换一个新的 token(不再因为 localStorage 有值就跳过);
537
- - 接口鉴权同时接受「控制台换来的面板 cookie」,即使前端 token 过期也能正常读写配置。
538
- - 1.0.6 引入的登录校验配合这次修复才算完整:现在(装了 auth 插件时)未登录打不开面板、
539
- 登录后配置能正常加载与保存。
574
+
575
+ - **面板提示「加载配置失败 / 鉴权失败」**:面板的登录凭据存在服务端内存里,机器人一重启就失效,
576
+ 而页面以为本地还留着有效凭据、就跳过了登录,于是一直拿着过期的凭据请求、所有接口都失败。现在:
577
+ 每次打开面板都会重新换一份新凭据;接口鉴权也同时接受控制台带来的登录状态,凭据过期也能正常读写配置。
540
578
 
541
579
  ## 1.0.6
542
580
 
543
581
  ### 变更
544
- - **配置面板默认要求登录**(`webUiAuth` 默认开):装了 auth 插件的部署,未登录时打开 `/kkk` 会直接看到
545
- 「需要先登录 Koishi 控制台」,静态资源与接口同样不放行。做法和控制台页面一致 ——
546
- 控制台里的「kkk 配置」页通过带权限校验的 RPC 向服务端换取一次性面板 token,再拼进 iframe 地址;
547
- 拿不到 token(未登录/权限不足)就不加载面板。没装 auth 插件的部署不受影响(本来也没有登录这回事)。
548
- - 面板页面不再需要「HTTP 鉴权密钥」:能进来就说明已经授权,登录态由服务端自动补齐。
582
+
583
+ - **配置面板默认要求登录**:装了登录插件的部署,未登录时打开面板会看到「需要先登录控制台」。
584
+ 没装登录插件的部署不受影响(本来也没有登录这回事)。
585
+ - 面板页面不再需要手动填「鉴权密钥」:能进来就说明已经授权,登录状态由服务端自动补齐。
549
586
 
550
587
  ## 1.0.5
551
588
 
552
589
  ### 修复
553
- - 「关于插件」页的大标题漏改,仍显示 `karin-plugin-kkk`,现在改为 `koishi-plugin-kkk`。
590
+
591
+ - 「关于插件」页的大标题还写着旧名字,现在改成正确的插件名。
554
592
 
555
593
  ## 1.0.4
556
594
 
557
595
  ### 修复
558
- - 1.0.3 里注入版本号那段把中间件里的 `const` 又赋了一次值,导致 `/kkk/assets/*.js`(主题/布局那几个包)返回 500、面板打不开;
559
- 现在改成用新变量承接,已回归正常。
596
+
597
+ - 上一版注入版本号的写法有误,导致面板的几个样式脚本报错、面板打不开;现在已恢复正常。
560
598
 
561
599
  ## 1.0.3
562
600
 
563
601
  ### 变更
564
- - 「添加推送目标」里的**推送群改为手填群号**:原版是从 `/kkk/v1/bots/:id/groups` 拉下拉框,
565
- 拿不到群列表时根本选不了(只显示「请先选择机器人账号。」)。现在直接输入群号(频道 id)即可,
566
- 需要指定平台时写「平台:群号」。提交逻辑同步兼容手填,不再依赖选中列表里的群。
567
- - 「关于插件」页更新:标题改为 koishi-plugin-kkk,版本号改成运行时注入的真实版本,
568
- 仓库 / 反馈 / 头像链接指向 maimai993/koishi-plugin-kkk,开发者信息标注为 Koishi 移植版。
569
- - 机器人账号那一项的说明已由「Karin 当前已注册且在线的 Bot。」改为「Koishi ...」(1.0.2 起生效)。
602
+
603
+ - **「添加推送目标」里的推送群改为手填群号**:以前是从下拉框里选,拿不到群列表时就完全没法选
604
+ (只显示「请先选择机器人账号」)。现在直接输入群号即可,需要指定平台时写「平台:群号」。
605
+ - 「关于插件」页更新:标题、版本号、仓库 / 反馈 / 头像链接都指向本项目的正式地址,
606
+ 并标明这是 Koishi 移植版。
570
607
 
571
608
  ## 1.0.2
572
609
 
573
610
  ### 变更
574
- - 配置面板去掉了写死的用户信息块(原来侧栏一直显示「炫炫 / Super Admin / 当前身份:管理员」)。
575
- - 面板内的 Karin 字样全部改成 Koishi(登录页「Karin 鉴权」、挂载到 Karin、发送方式说明等),
576
- 「帮助文档」按钮改为指向本项目文档站。
577
- - `config/default_config/*.yaml` 里描述字段的 Karin 字样同步改成 Koishi。
611
+
612
+ - 配置面板去掉了写死的用户信息块(以前侧栏一直显示别人的名字和身份)。
613
+ - 面板里残留的旧项目名全部改成 Koishi,「帮助文档」按钮改为指向本项目文档站。
614
+ - 配置文件里字段说明的旧项目名同步改掉。
578
615
 
579
616
  ### 新增
580
- - `webUiAuth` 打开后,面板页面与静态资源同样要求登录 Koishi 控制台(未登录时连 `/kkk/assets/*` 也不放行);
581
- 默认关闭,行为与之前一致(免登录)。
617
+
618
+ - 打开「面板要求登录」后,面板页面和它的静态资源同样要求登录控制台;默认关闭(免登录,
619
+ 行为和以前一致)。
582
620
 
583
621
  ## 1.0.1
584
622
 
585
623
  ### 修复
586
- - 生产环境下 `/kkk` 配置面板报「assets/web/index.html 缺失」:插件根目录不再只按 `lib/` 的位置推断,
587
- 改为从入口所在目录逐级向上找带 `assets/web/index.html` 的那一层(并兜底按包名解析、cwd / cwd/node_modules),
588
- 启动日志里会打印解析结果,找不到时会给出警告。
589
- - 配置面板不再强制登录:生产环境装了 auth 插件时,面板原本要求先登录 Koishi 控制台,现在默认免登录;
590
- 需要恢复登录校验时把配置项 `webUiAuth` 打开即可。
624
+
625
+ - 生产环境下配置面板报「页面文件缺失」:现在会自动向上查找面板文件所在的目录,
626
+ 启动日志里会打印查找结果,找不到时给出警告。
627
+ - 配置面板不再强制登录:装了登录插件的部署,以前要求先登录控制台才能打开面板,现在默认免登录;
628
+ 想恢复登录校验,把设置项「面板要求登录」打开即可。
591
629
 
592
630
  ## 1.0.0
593
631
 
594
- 首个公开版本:**karin-plugin-kkk 的 Koishi 移植版**,把上游的解析 / 推送 / 面板能力完整搬到 Koishi 生态。
632
+ 首个公开版本:**karin-plugin-kkk 的 Koishi 移植版**,把上游的解析 / 推送 / 面板能力完整搬到了 Koishi。
595
633
 
596
634
  ### 链接解析与推送
597
- - **B站**:视频、番剧(先选分集 → 再选画质)、动态、直播、专栏、评论
635
+
636
+ - **B 站**:视频、番剧(先选分集 → 再选画质)、动态、直播、专栏、评论
598
637
  - **抖音**:作品、图集、直播、评论区
599
638
  - **快手 / 小红书**:作品解析
600
- - 解析内容(信息卡片 / 视频 / 评论)与画质、体积上限、是否带弹幕均可配置,QQ 面板上还能临时选
601
- - 动态推送:B站 / 抖音关注列表更新推送,推送目标、过滤规则、强制推送均可配置
602
- - 卡片解析:群里转发的分享卡片没有链接时,识别封面文字再搜索定位作品(识别密钥 `qq.ocrApiKey`)
639
+ - 解析内容(信息卡片 / 视频 / 评论)、画质、体积上限、是否带弹幕都能配置,QQ 面板上还能临时选
640
+ - 动态推送:B 站 / 抖音关注列表更新推送,推送目标、过滤规则、强制推送都能配置
641
+ - 卡片解析:群里转发的分享卡片没有链接时,识别封面文字再搜索定位作品
603
642
 
604
643
  ### QQ 官方机器人交互面板
644
+
605
645
  - 普通视频:先发一张**解析结果同款卡片图**(带热门弹幕),下面是「清晰度 / 视频 / 弹幕 / 大小」四列表格
606
- - 番剧:卡片图(不再把分集画进图里)+ 集数表格(默认 5×4、倒序排列),表格下方是「上一页 / 第 x/y 页 / 下一页」
607
- - 图片经宿主 `assets` 上传成 https 地址,按 QQ 要求写成 `![#宽px #高px](url)`
646
+ - 番剧:卡片图 + 集数表格(默认 5×4、倒序),表格下方是「上一页 / 第 x/y 页 / 下一页」
647
+ - 图片按 QQ 要求的写法上传成链接
608
648
  - 超过体积上限(默认 200MB)的画质自动隐藏 —— 点了也发不出去
609
- - 面板按钮**无状态**:宿主重启后旧面板依然可用
610
- - **下载进度反馈**:`收到请求,开始下载` 消息带「查询下载进度」按钮,只看本次任务的进度;发送前提示 `发送中…`(走群文件时会提前说明)
611
- - **自动撤回**:解析流程中每发一条新消息就撤回上一条,群里只留最新状态(`qq.recallPanel`)
649
+ - 面板按钮**没有状态**:机器人重启后旧面板依然能用
650
+ - **下载进度反馈**:「开始下载」那条消息带一个「查询下载进度」按钮,只看本次任务;
651
+ 发送前会提示「发送中…」(走群文件时会提前说明)
652
+ - **自动撤回**:解析过程中每发一条新消息就撤回上一条,群里只留最新状态
612
653
 
613
654
  ### 图片发送(QQ)
614
- - 评论区那种超长图默认按普通图片发;只有**超过 20MB** 或**发送失败(拿不到消息 ID / 返回错误码)**时才自动切片
615
- - 切片前缩到 1440px 宽,按 `qq.sliceImageHeight`(默认 2000px)等分,最后用一条 markdown 把切片拼回一整张,视觉上仍是一张图
616
- - 切片与合并只对 QQ 生效,其它平台一律按普通图片发送
655
+
656
+ - 评论区那种超长图默认按普通图片发;只有**超过 20MB** 或**发送失败**时才自动切片
657
+ - 切片前缩到 1440 宽、按高度等分,最后用一条消息把切片拼回一整张,视觉上仍是一张图
658
+ - 切片与合并只对 QQ 生效,其它平台按普通图片发
617
659
 
618
660
  ### 弹幕烧录
619
- - B站弹幕烧录进视频(`弹幕解析` 指令,或面板上点「弹幕」那一列)
620
- - 编码器自动探测与回退(NVENC / QSV / AMF / libx264 / libx265)
621
- - 低码率源改用 CRF 保证弹幕文字清晰;横竖屏与旋转元数据识别
661
+
662
+ - B 站弹幕烧进视频(「弹幕解析」指令,或面板上点「弹幕」那一列)
663
+ - 编码器自动探测与回退(优先硬件加速,不行就换软件编码)
664
+ - 低码率视频用更清晰的方式编码,保证弹幕文字看得清;能识别横竖屏与旋转信息
622
665
 
623
666
  ### 配置管理
624
- - **`/kkk`**:插件自带的一体化配置面板,免登录,保存即写回 `koishi.yml` 并热重载
625
- - 原版分类:接口库 / 通用 / 抖音 / 哔哩哔哩 / 快手 / 小红书 / 推送列表
626
- - 另有 **「QQ 适配器」**分类:面板、自动撤回、画质档体积、番剧选集表格、图片切片、卡片识别密钥
627
- - **`/kkk/edit`**:轻量配置页,适合直接改 JSON
628
- - **Koishi 控制台**:侧边栏入口「kkk 配置」打开的就是 `/kkk`;插件配置表单同样分成
629
- 「QQ 适配器 / Koishi 原生设置 / upstream」三组(原生项默认折叠),与控制台表单共用同一份字段定义(`src/qqFields.json`)
630
- - 配置面板自动登录:直接调用登录接口写入登录态,打开即用,不用手点登录框
667
+
668
+ - **面板(/kkk)**:插件自带的一体化配置页,免登录,保存即写回配置文件并热重载;
669
+ 分类沿用上游:接口库 / 通用 / 抖音 / 哔哩哔哩 / 快手 / 小红书 / 推送列表,另有「QQ 适配器」一组
670
+ - **轻量配置页(/kkk/edit)**:适合直接改 JSON
671
+ - **控制台入口**:侧边栏「kkk 配置」打开的就是面板;控制台里的表单与面板共用同一份字段定义
672
+ - 面板自动登录:打开即用,不用手点登录框
631
673
 
632
674
  ### 错误诊断
633
- - 错误诊断卡片:框架版本 / 插件版本 / 适配器、堆栈与运行环境,方便直接贴群里问
634
- - 错误通知接收人可配:触发者 / 管理员(权限等级 > 4)
635
- - `kkk版本` 指令输出一张运行环境卡片
636
675
 
637
- ### 卡片与模板适配
638
- - 框架版本显示 **Koishi 版本**,页脚换用 Koishi logo,支持作者署名
639
- - 与 Koishi puppeteer 插件配合:大卡片不再因单次渲染占用数 GB 内存而 OOM;四角与底部不再有空白
640
- - 评论区默认开启解析,评论图片合并进评论卡片(不再单独合并转发)
676
+ - 错误诊断卡片:框架版本 / 插件版本 / 适配器、错误详情与运行环境,方便直接贴群里问
677
+ - 错误通知接收人可配:触发者 / 管理员
678
+ - 「kkk版本」指令输出一张运行环境卡片
679
+
680
+ ### 卡片与模板
641
681
 
682
+ - 卡片上显示的是 Koishi 版本,页脚换成 Koishi 的标识,支持作者署名
683
+ - 与 Koishi 的浏览器渲染插件配合:大卡片不再因为一次渲染吃掉几 GB 内存而崩溃;
684
+ 卡片四角和底部不再有空白
685
+ - 评论区默认开启解析,评论图片合并进评论卡片(不再单独发一遍)
642
686
  ---
643
687
 
644
688
  ## 移植说明
645
689
 
646
- 上游 [karin-plugin-kkk](https://github.com/ikenxuan/karin-plugin-kkk) 的完整功能清单请见其仓库。本仓库保留其业务逻辑,由 `src/compat/` 提供框架等价实现,配置以 `koishi.yml` 为准并在启动时同步进上游的 `config.json`。
690
+ 上游 [karin-plugin-kkk](https://github.com/ikenxuan/karin-plugin-kkk) 的完整功能清单请看它自己的仓库。
691
+ 本仓库保留其业务逻辑,由兼容层提供框架等价的实现;配置以 `koishi.yml` 为准,启动时同步给插件使用。