koishi-plugin-kkk 2.0.1-beta.1 → 3.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.
Files changed (69) hide show
  1. package/CHANGELOG.md +98 -11
  2. package/assets/web/assets/index-BRROK0vh.js +1 -1
  3. package/config/default_config/app.yaml +10 -3
  4. package/config/default_config/config.json +15 -1
  5. package/lib/compat/forward-collect.js +38 -5
  6. package/lib/compat/node-karin.js +183 -30
  7. package/lib/compat/sendError.js +206 -0
  8. package/lib/configBridge.js +18 -7
  9. package/lib/index.js +102 -5
  10. package/lib/karin/apps/tools.js +36 -4
  11. package/lib/karin/module/utils/Base.js +20 -4
  12. package/lib/karin/module/utils/ErrorHandler/handler.js +5 -4
  13. package/lib/karin/module/utils/ErrorHandler/render.js +28 -4
  14. package/lib/karin/module/utils/ImageSlice.js +190 -55
  15. package/lib/karin/module/utils/ParseForward.js +261 -24
  16. package/lib/karin/module/utils/ParseOverride.js +9 -4
  17. package/lib/karin/module/utils/ParseSteps.js +51 -1
  18. package/lib/karin/module/utils/QqPanel.js +70 -5
  19. package/lib/karin/module/utils/Render/index.js +221 -12
  20. package/lib/karin/module/utils/parseTip.js +45 -5
  21. package/lib/karin/platform/bilibili/bilibili.js +60 -16
  22. package/lib/karin/platform/douyin/douyin.js +60 -45
  23. package/lib/karin/platform/kuaishou/kuaishou.js +25 -11
  24. package/lib/karin/platform/xiaohongshu/xiaohongshu.js +25 -8
  25. package/lib/player/index.js +58 -0
  26. package/lib/player/page.js +24 -0
  27. package/lib/qqFields.json +10 -0
  28. package/lib/qqOptions.js +7 -0
  29. package/lib/schema.js +24 -4
  30. package/lib/webui.js +35 -2
  31. package/package.json +1 -1
  32. package/scripts/patch-webui.mjs +166 -12
  33. package/scripts/smoke-async-download.cjs +69 -0
  34. package/scripts/smoke-config.cjs +66 -4
  35. package/scripts/smoke-dup-tip.cjs +120 -0
  36. package/scripts/smoke-parse-forward.cjs +34 -17
  37. package/scripts/smoke-render-path.cjs +161 -0
  38. package/scripts/smoke-shotkit-compat.cjs +102 -0
  39. package/src/compat/forward-collect.ts +46 -6
  40. package/src/compat/node-karin.ts +182 -30
  41. package/src/compat/sendError.ts +227 -0
  42. package/src/configBridge.ts +29 -6
  43. package/src/index.ts +100 -5
  44. package/src/karin/apps/tools.ts +32 -4
  45. package/src/karin/module/utils/Base.ts +21 -4
  46. package/src/karin/module/utils/ErrorHandler/handler.ts +5 -4
  47. package/src/karin/module/utils/ErrorHandler/render.ts +30 -4
  48. package/src/karin/module/utils/ImageSlice.ts +188 -54
  49. package/src/karin/module/utils/ParseForward.ts +254 -25
  50. package/src/karin/module/utils/ParseOverride.ts +9 -3
  51. package/src/karin/module/utils/ParseSteps.ts +50 -0
  52. package/src/karin/module/utils/QqPanel.ts +70 -4
  53. package/src/karin/module/utils/Render/index.ts +218 -12
  54. package/src/karin/module/utils/parseTip.ts +42 -5
  55. package/src/karin/platform/bilibili/bilibili.ts +65 -17
  56. package/src/karin/platform/douyin/douyin.ts +40 -21
  57. package/src/karin/platform/kuaishou/kuaishou.ts +26 -11
  58. package/src/karin/platform/xiaohongshu/xiaohongshu.ts +26 -9
  59. package/src/karin/types/config/app.ts +45 -3
  60. package/src/karin/types/config/bilibili.ts +12 -0
  61. package/src/karin/types/config/douyin.ts +12 -0
  62. package/src/karin/types/config/kuaishou.ts +12 -0
  63. package/src/karin/types/config/xiaohongshu.ts +12 -0
  64. package/src/player/index.ts +52 -0
  65. package/src/player/page.ts +24 -0
  66. package/src/qqFields.json +11 -2
  67. package/src/qqOptions.ts +11 -1
  68. package/src/schema.ts +25 -4
  69. package/src/webui.ts +33 -2
package/CHANGELOG.md CHANGED
@@ -1,24 +1,111 @@
1
1
  # 更新日志
2
2
 
3
- ## 2.0.1-beta.1(预览版)
3
+ ## 3.0.0
4
4
 
5
- > 这是一个**预览版**(npm 上的 `beta` 标签),装着还没正式发布的一批改动。
6
- > 正式版仍请用 `latest`(当前 **2.0.0**)。预览版建议先在小范围群里试,遇到问题把日志发我。
5
+ > 这一版主要两件事:**让它快**、**该发出去的东西真的发出去**。
6
+ > 另外按你的实际用法,把「合并转发」和「在线播放」重做了一遍。
7
+
8
+ ### 快了这么多
9
+
10
+ - **卡片渲染从 31 秒降到 3 秒**。模板每张卡片上都铺了一层全屏噪点,那层要一个像素一个像素地算,占掉九成时间;现在默认去掉,画面上几乎看不出区别(逐像素对比平均只差 0.8/255)。
11
+ 想保留那层颗粒感也没问题:配置里 `app.noiseOverlay` 改成 `tile` 就是「换成小图案平铺」,还是比原来快 9 倍。
12
+ - **不再互相等**:信息卡、评论区、图集、视频各走各的,谁先好了谁先发。以前视频都下载完了,还要等卡片渲染完才肯发出去。
13
+ - 顺手剔掉了 384 条「指向不存在的字体文件」的声明,渲染又快了一点(每个 HTML 文件也小了 2.4MB)。
14
+
15
+ ### 发不出去 / 重复发的问题
16
+
17
+ - **失败现在按错误码判断**:以前只看「有没有拿到消息 ID」,会把「上传文件大小超过限制」误判成「被动回复超限」,于是同一张图被传两遍、才去切片。现在看到「上传文件大小超过限制」就直接切片,不白等。
18
+ - **没拿到消息 ID 就是没发出去**(和 qq-chat 同一个判法),不再当成成功悄悄丢掉;日志里会直接写清是哪个错误码。
19
+ - **OneBot(NapCat 这类个人号)上的图片改发普通图片**:markdown 只有 QQ 官方机器人认,个人号客户端显示不出来 —— 之前你看到的那串 `![#1440px #2000px](链接)` 就是它。切片、图集、评论图片现在都会自动改成发图片。
20
+ - **错误卡片不再变成 10MB 的大图**:报错信息里带着几 MB 的图片数据,以前会原样画进卡片(渲染要 28 秒,而且这么大还是会被拒收);现在会折叠掉,只留有用的部分。
21
+
22
+ ### 合并转发
23
+
24
+ - **两级开关,默认全关**:通用里打开 = 所有平台都合并;全局关着时,可以在抖音 / 哔哩哔哩 / 快手 / 小红书里**单独打开**。
25
+ - **可以选合并哪些内容**:文字 / 图片 / 视频 / 文件。**语音和 markdown 去掉了** —— QQ 的聊天记录不支持语音气泡,而 markdown 只有官方机器人认、官方机器人偏偏又不能合并转发,这两个选项本来就是死的。
26
+ - **每条内容一个条目**:信息卡、评论区、视频各占一条「聊天记录」,**切片仍留在同一条里**(以前全挤在一条里,结果只有视频能加载、图片全不显示)。
27
+ - 开着合并转发时**不会再跳过切片**(以前会把 3 万像素高的评论卡整个塞进转发,直接被拒),**转发失败也不会丢内容**(会自动退回逐条发)。
28
+ - 面板里就能改:通用页多了「合并转发内容(全局)」,四个平台页各多了一栏「合并转发」(开关 + 内容)。
29
+ - 顺手:解析提示(「检测到链接,开始解析」)不会再混进转发里。
30
+
31
+ ### 在线播放
32
+
33
+ - 新增**「强制在线播放的适配器」**(默认填 `bilibili`):从这些适配器进来的消息**一律只给播放链接**,视频不发出去 —— B站私聊机器人发不了视频文件,填上它就行。想关掉就把这一栏清空。
34
+ - **超限转在线播放时会说明原因**:以前是静默把视频换成链接,你只拿到一个地址、不知道视频为什么没发出来。
35
+ - **播放页的「开启弹幕」开关修好了**(那个开关以前根本没接上,点了没反应;「彩色弹幕」也一样)。
36
+
37
+ ### 其他
38
+
39
+ - 「纯发链接」的解析里,部分开关(强制在线播放、超限转在线播放)以前不生效,已修。
40
+ - 面板「在线播放器设置」里新增「强制在线播放的适配器」一项。
41
+
42
+ ## 2.1.0
43
+
44
+ > 这一版把之前两个预览版(`2.0.1-beta.1` / `2.0.1-beta.2`,内容已一并收进来)和一次新联动一起发了:
45
+ > **卡片渲染接上了新的高速截图服务 `kkkshot`**,另外修掉几个实测反馈的问题。
7
46
  >
8
- > 这一版只动了一处:把「短时间内不重复解析」从写死的 20 秒变成**可开关 + 可自定义分钟数**。
47
+ > 升级不需要改配置:所有新开关都有默认值;老配置缺这些键时行为与以前一致。
48
+
49
+ ### 本版重点
50
+ - **卡片渲染快 2 倍以上**:新增**联动插件 `koishi-plugin-kkkshot`**(注册 `kkkshot` 服务)。
51
+ 装了它,kkk 会**默认优先用它渲染卡片**;没有装(或它渲染失败)就自动退回 `koishi-plugin-puppeteer`,
52
+ 行为与以前完全一致。本机实测同一张卡片:**1.54s → 0.60s**(详见下面「配套插件」)。
53
+ - **「短时间不重复解析」变成可配置**:通用里新增这个开关 + 「重复解析间隔(分钟)」,
54
+ 去重覆盖面也从「抖音 / B站」扩到**快手 / 小红书**。
55
+ - **合并转发开关语义修正**:打开才合并(触发者身份),**关掉就不合并**、内容逐条发;
56
+ 并且修好了「在面板里打开它却不生效」(面板保存现在会真的写进 config.json)。
57
+ - **权限字段能填用户 ID 了**:修掉「选『指定账号』填 ID 一保存就报 `reading 'logger'`」。
9
58
 
10
59
  ### 新增
60
+ - **配套插件 `koishi-plugin-kkkshot`(可选)**:给 kkk 用的高速截图服务,注册 `kkkshot` 服务后
61
+ kkk 检测到它就**默认用它渲染卡片**。它和常规 puppeteer 用法的区别:
62
+ - **常驻页面池**(默认 2 个页面反复用)而不是每次新建页面再关掉;
63
+ - 导航只要 `domcontentloaded`,然后**只等字体和图片**(`document.fonts.ready` + 图片 `complete`),
64
+ 不再用 `networkidle0` 白等那一整段静默期;
65
+ - 按卡片元素自己的盒子 `clip` 截图(贴合卡片、不带白边),页面底色设成卡片底色;
66
+ - **优先复用 `ctx.puppeteer` 的浏览器**(省内存),没有才自己启动;
67
+ - 页面用满 `recycleAfter`(默认 100)次回收重建,长跑不涨内存;启动时预热一个页面。
68
+ - 加载顺序:`kkk` 把 `kkkshot` 声明成**可选依赖** —— 装了就用,没装就退回 puppeteer,不会因为少装它报错。
11
69
  - **通用 →「短时间不重复解析」**(默认开启):同一条链接在一段时间内只解析一次。
12
70
  QQ 的指令按钮是「发一条消息 + 再发一个交互事件」,用户连点、客户端重发也会把同一条链接投递两遍,
13
71
  跑两遍就是两次「开始解析」、两次下载、两次发送(第二次还常因为缓存已被清理而失败)。
14
- 去重键包含会话、作品 ID、画质与弹幕开关 —— 换画质、换作品、换群都不会被误伤。
15
- 关掉这个开关后**每条消息都会解析**,需要反复调试同一条链接时可以临时关掉。
72
+ 去重键包含会话、作品 ID、画质与弹幕开关 —— 换画质、换作品、换群都不会被误伤;关掉后每条消息都会解析。
16
73
  - **通用 →「重复解析间隔(分钟)」**(默认 1,可填 1 ~ 60):上面那个开关打开时才生效,
17
- 用来决定「多长时间内算重复」;开关关掉时这一项会变灰不可改。填得越大越省事,
18
- 但也意味着这段时间里你手动再发一次同一条链接会被忽略(想立刻重解析就把开关关掉)。
19
- 填歪了会自动兜底:超出范围夹到最近的边界(填 0 → 1 分钟,填 90 → 60 分钟),非数字按默认 1 分钟。
20
- - 去重覆盖面从「抖音 / B站」扩到 **快手 / 小红书**:这两条链路以前完全没有去重,
21
- 同一条链接被重复投递(连点、客户端重发)会跑两遍;现在四个平台共用同一把锁、同一个开关。
74
+ 开关关掉时这一项在面板里会变灰不可改。取值兜底:超出范围夹到最近的边界(0 → 1 分钟,90 → 60 分钟),
75
+ 非数字按默认 1 分钟。
76
+ - 去重覆盖面扩到 **快手 / 小红书**(这两条链路以前完全没有去重)。
77
+
78
+ ### 修复
79
+ - **「合并转发打开了没用」**(用户实测):开关在面板里打开、保存也提示「已保存」,
80
+ 但日志还是「「解析结果合并转发」关着,本次按逐条发送处理」。根因在「面板/控制台设置 → config.json」的同步规则:
81
+ 老规则把「传进来的值正好等于上游默认值」当成「用户没动过」直接跳过,而 `app.fakeForward` 的**默认值就是 true** ——
82
+ 于是「把它打开」等于回到默认值,永远写不进 config.json,插件读到的还是 false。
83
+ 现在**面板保存走 authoritative 模式**(表单里那份配置就是用户想要的,值等于默认值也照写),
84
+ 控制台那条路仍保持保守规则(不拿表单里的默认值盖掉手改的 config.json);
85
+ 保存后日志会打一行「面板设置已写入 config.json: xxx」,方便确认到底写进去了没有。
86
+ - **「关闭合并转发 还是合并的」**(用户实测):通用里那个开关以前**只管「转发用谁的身份展示」**,
87
+ 关掉之后照样合并成一条转发。现在它的语义是**要不要合并**:
88
+ 打开 → 一次解析产生的所有内容合并成一条转发(用触发者身份展示);
89
+ **关掉 → 不合并**,内容像以前一样一条一条发(过程提示本来就不进转发,这条不受影响)。
90
+ 面板里的标签也从「伪造合并转发消息」改成「**解析结果合并转发**」,说明写清了这两句;
91
+ 控制台字段说明、配置注释同步更新;冒烟里加了「关掉不合并 / 再打开又合并」的用例守着。
92
+ - **选了「指定账号」填上 ID,一保存就报 `Cannot read properties of null (reading 'logger')`**(严重):
93
+ 这句报错其实是**被盖掉**的 —— 真正的原因是字段值没通过 Schema 校验。
94
+ `loginPerm` / `permission` / `errorLogSendTo` 这几个「允许手填账号」的字段被渲染成了**枚举下拉**
95
+ (union of consts),手填的用户 ID 不在选项里,保存时 cordis 的 `resolveConfig` 抛错,
96
+ 而它 emit 的 `internal/error` 又被 `@cordisjs/logger` 的监听器再抛一个 `reading 'logger'` ——
97
+ 用户就只看到这一句,完全看不出该改哪里。
98
+ 现在这几个字段改成普通文本(数组那个是字符串数组):**用户 ID、关键字、多个用逗号分隔**都能保存,
99
+ 非法类型仍然会被 Schema 拒掉(校验没有形同虚设);保存失败时的提示也换成能照做的说法,
100
+ 并在日志里带上调用栈,下次再遇到不用猜。
101
+ - **文案说错了**:原来写「选「指定账号」后填 QQ 号」—— Koishi 这边匹配的是**用户 ID**(session.userId),
102
+ 不是 QQ 号。面板的下拉说明与输入框占位符、控制台里的字段说明、以及插件设置里那句
103
+ 「主人账号(QQ 号)」都改成了「用户 ID」。
104
+
105
+ ### 变更
106
+ - 面板标签:**「伪造合并转发消息」→「解析结果合并转发」**(名字要能看出「关掉就逐条发」)。
107
+ - **合并转发开关的语义**:从「只决定展示身份」变成「决定要不要合并」(身份固定为触发者)。
108
+ - 「谁可以触发扫码登录」与「错误日志接收人」的说明统一成「填用户 ID」。
22
109
 
23
110
  ## 2.0.0
24
111