wc -l *.js

哦对了,忘记提了,这个东西在win上面叫pagefile,原理都差不多,就是拿你disk上面的一块给你的memory做缓冲,
还有就是 我自己是测过的,哪怕是2c2g的linux机器,你多配点swap,跑个puppeteer服务是没啥问题的
看这里:
debian ubuntu的机器 可以直接用apt install chromium安装,因为chromium是开源软件,所以是直接收录在debian软件包里面的, 然后安装好以后二进制的路径在这: /usr/bin/chromium 这个可以填入koishi的puppeteer插件的配置项里面~
哦还有,我突然发现私聊的 napcat音乐卡片还没做, 做一下
拆分js文件以后有点小bug,请更新到最新版本 (比如忘记加 reusable 可重用, 点歌数字解析有点问题等等)
如果还有bug 请及时反馈捏~ :
💬 插件使用问题 / 🐛 Bug反馈 / 👨💻 插件开发交流,欢迎加入QQ群:259248174 🎉(这个群G了)
💬 插件使用问题 / 🐛 Bug反馈 / 👨💻 插件开发交流,欢迎加入新QQ群:1085190201 🎉
💡 在群里直接艾特我,回复的更快哦~ ✨
1.9.5-beta.1+20260329 ![]()
1. 歌曲名 改为 (1) 歌曲名,更清晰易读网易的红色的 小圆角矩形tag~1.9.4-beta.1+20260329 ![]()
1.9.9-beta.3+20260411 ![]()
1.9.9-beta.2+20260411 ![]()
1.9.9-beta.1+20260411 ![]()
--test 测试模式,仅展示歌单不进入选择流程1.9.7-beta.1+20260410 ![]()
music类型(单曲卡片),禁用news类型(歌单/一起听等)customWhitelist灵活控制哪些卡片类型需要解析enableWhitelist配置项控制是否启用白名单过滤used_id配置项设置歌单里默认选择的序号(范围0-10)1.9.6-beta.4+20260330 ![]()
1.9.6-beta.3+20260330 ![]()
1.9.6-beta.2+20260329 ![]()
1.9.5-beta.1+20260329 ![]()
1. 歌曲名 改为 (1) 歌曲名,更清晰易读网易的红色的 小圆角矩形tag~code is here:
https://gitee.com/vincent-zyu/koishi-plugin-music-link-vincentzyu-fork/blob/main/lib/renderer-qq-markdown.js
or
https://github.com/VincentZyuApps/koishi-plugin-music-link-vincentzyu-fork/blob/56a2923318626ed717b85b7f638b588f5d20dc69/lib/renderer-qq-markdown.js
如上所示, qq官bot平台支持markdown歌单
新增配置项:
// 🖼️ 歌单渲染格式设置
Schema.object({
showGeneratingTip: Schema.boolean().default(true).description('💬 是否在开始生成歌单时发送"🔄正在生成歌单,请稍候..."的提示消息<br>✅ 开启(默认):发送提示并在完成后撤回<br>❌ 关闭:不发送提示消息,直接等待渲染完成'),
renderMode: Schema
.array(Schema.object({
mode: Schema.union([
Schema.const('text').description('📝 文字模式'),
Schema.const('puppeteer').description('🎨 Puppeteer (传统方式)'),
Schema.const('svg').description('✨ SVG (resvg 渲染,推荐)'),
Schema.const('markdown_table').description('📊 QQ Markdown 表格模式'),
Schema.const('markdown_style').description('💫 QQ Markdown 格式风格'),
]).role('radio').description('渲染模式'),
enabled: Schema.boolean().default(true).description('是否启用'),
}))
.role('table')
.default([
{ mode: 'text', enabled: true },
{ mode: 'puppeteer', enabled: true },
{ mode: 'svg', enabled: true },
{ mode: 'markdown_table', enabled: false },
{ mode: 'markdown_style', enabled: false },
])
.description('🖼️ 消息渲染模式设置(可添加多个,按顺序执行)<br>✨ (非qq官机平台)配合"严格顺序模式"可实现:文字 → SVG → Puppeteer 的发送顺序<br>⚠️ 如果启用了多个相同模式,只有第一个会生效'),
strictOrderMode: Schema.boolean().default(true).description('📋 是否严格按照上表顺序串行执行(默认 true 为串行渲染)<br>⚠️ <b>强烈建议开启</b>:由于 Node.js单线程特性,并行渲染会导致 CPU争抢,使所有模式都变慢<br>✅ 串行模式:各渲染器独占CPU,互不干扰,总耗时更短<br>🐢 并行模式:多个渲染器同时竞争单线程CPU,互相阻塞,性能会有下降'),
}).description('🖼️ 歌单渲染格式设置'),
↓ markdown file is also here
https://gitee.com/vincent-zyu/koishi-plugin-music-link-vincentzyu-fork/blob/main/doc/koishi%E8%AE%BA%E5%9D%9B%E7%9A%84%E6%9B%B4%E6%96%B0%E6%97%A5%E5%BF%97%E6%8D%8F/1.9.7%E6%9B%B4%E6%96%B0%E4%BA%86%E8%A7%A3%E6%9E%90onebot%E9%9F%B3%E4%B9%90%E5%8D%A1%E7%89%87%E7%9A%84%E7%99%BD%E5%90%8D%E5%8D%95.md
or:
https://github.com/VincentZyuApps/koishi-plugin-music-link-vincentzyu-fork/blob/01aed5ad314bb01f774d5b07e6064da02900eb9b/doc/koishi%E8%AE%BA%E5%9D%9B%E7%9A%84%E6%9B%B4%E6%96%B0%E6%97%A5%E5%BF%97%E6%8D%8F/1.9.7%E6%9B%B4%E6%96%B0%E4%BA%86%E8%A7%A3%E6%9E%90onebot%E9%9F%B3%E4%B9%90%E5%8D%A1%E7%89%87%E7%9A%84%E7%99%BD%E5%90%8D%E5%8D%95.md
以下是正文:
本次更新为 OneBot平台 的音乐卡片自动解析功能新增了 白名单过滤机制,让你可以更精细地控制哪些类型的音乐卡片会被插件自动识别和处理。
上图说明:发送了6个音乐卡片(3个
news类型 + 3个music类型)
只有3个
music类型的单曲卡片触发了中间件解析 (网易云 Deco 火花、QQ音乐 Mimi 科学、酷狗音乐 神秘毛子歌手 神秘俄语歌)
剩下3个
news类型的歌单/一起听卡片被成功过滤跳过 (网易云 一起听 by蓝蚀白瑜、网易云 歌单 Phigros、MIUI音乐 Mimi 拥抱)。
view 字段进行精确匹配使用quote-debug-msg-json-image这个插件 把onebot音乐卡片的json数据dump出来,观察发现: 一般单曲卡片json的键值对中
view这个key对应的值是music,而其他的卡片(比如歌单、一起听等等)的这个键对应的值一般是news
doc/dev/20260410_1736_1.9.7_新增中间件解析onebot音乐卡片白名单的规划捏/
├──
单曲卡片
│ ├── MIUI音乐单曲实际上就是QQ音乐的音乐卡片捏_20260410_151110.json
│ ├── QQ音乐单曲的音乐卡片捏_20260410_173524.json
│ ├── 网易云单曲的音乐卡片捏_20260410_144917.json
│ └── 酷狗音乐单曲的音乐卡片捏_20260410_150015.json
└──
非单曲卡片
├── 网易云一起听的音乐卡片捏_20260410_144218.json
└── 网易云歌单的音乐卡片捏_20260410_144736.json
所以目前的做法其实很简单,有个table配置项,默认配置是 music卡片解析,news卡片不解析
想要了解细节的可以往下看
在QQ/TIM等客户端中,分享音乐时会发送一种特殊的 JSON格式卡片消息。这些卡片包含了歌曲信息、封面、播放链接等元数据。
例如,当你从网易云音乐或QQ音乐分享到群聊时,看到的不是普通文本,而是一个带有封面图和播放按钮的精美卡片。
不同类型的音乐卡片结构差异很大:
| 卡片类型 | 适用场景 | 是否需要解析 |
|---|---|---|
| 分享单首歌曲 | ||
| 分享整个歌单 | ||
| 多人在线听歌 |
问题场景:
解决方案:
通过白名单过滤,只让插件处理你真正需要的卡片类型(通常是单曲),忽略其他无关卡片。
enableWhitelist - 是否启用白名单过滤true(启用)# 启用白名单(推荐)
enableWhitelist: true
# 关闭白名单(解析所有卡片)
enableWhitelist: false
customWhitelist - 自定义白名单规则表这是一个表格形式的配置项,每行代表一条规则:
| 列名 | 类型 | 说明 | 示例 |
|---|---|---|---|
viewType |
字符串 | 卡片的视图类型 | music, news |
enabled |
布尔值 | 是否启用此规则 | true, false |
配置项的代码:
Schema.object({
enablemiddleware: Schema.boolean().description("🔍 是否自动解析Onebot音乐卡片json <br> <i> ⚠️仅对Onebot平台生效</i>").default(false),
enablePrependMiddleware: Schema.boolean().description("⚡ 是否使用前置中间件监听<br>`中间件无法接受到消息可以考虑开启`").default(false),
enableWhitelist: Schema.boolean().default(true).description('🎯 是否启用白名单过滤<br>✅ 开启(默认):只解析白名单中允许的卡片类型<br>❌ 关闭:解析所有音乐卡片'),
customWhitelist: Schema.array(Schema.object({
viewType: Schema.string().default('music').description('视图类型'),
enabled: Schema.boolean().default(true).description('启用此规则'),
})).role('table').description('⚙️ 自定义白名单规则<br>只有匹配白名单规则的卡片才会被解析<br>💡 留空表示拒绝所有卡片<br><b>常见类型说明:</b><br>• <code>music</code> - 大概率为单曲卡片(推荐启用)<br>• <code>news</code> - 大概率为歌单、一起听等(通常禁用)<br>• <code>其他</code> - 如果以后有新的type你也可以自己填入喵').default([
{ viewType: 'music', enabled: true },
{ viewType: 'news', enabled: false },
]),
// <br>• <code>music</code> - 单曲卡片(最常见)<br>• <code>news</code> - 歌单/一起听等其他卡片<br>• 其他 - 自定义类型
used_id: Schema.number().default(1).min(0).max(10).description("🔢 在歌单里默认选择的序号<br>范围`0-10`,无需考虑11-20,会自动根据Onebot音乐卡片卡片的平台选择。若音乐平台不匹配 则在搜索项前十个进行选择。"),
}).description('🎴 中间件解析Onebot音乐卡片Json的相关设置'),
默认规则:
customWhitelist:
- viewType: music # 单曲卡片
enabled: true # ✅ 允许解析
- viewType: news # 歌单/一起听卡片
enabled: false # ❌ 拒绝解析
如何添加新规则:
viewType 列输入卡片类型(如 music、news 或其他)enabled 列的复选框以启用该规则上图展示了白名单配置的表格界面,可以清晰地看到 viewType 和 enabled 两列
本git仓库的
doc/dev/20260410_1736_1.9.7_新增中间件解析onebot音乐卡片白名单的规划捏这个文件夹 存了一些json示例捏
root@bawuyinguo:/home/bawuyinguo/SSoftwareFiles/koishi/koishi-dev-4/external/music-link-vincentzyu-fork/doc/dev/20260410_1736_1.9.7_新增中间件解析onebot音乐卡片白名单的规划捏# ls -la | grep json
-rw-r--r-- 1 root root 2637 4月 10 17:46 MIUI音乐单曲实际上就是QQ音乐的音乐卡片捏_20260410_151110.json
-rw-r--r-- 1 root root 3083 4月 10 17:46 QQ音乐单曲的音乐卡片捏_20260410_173524.json
-rw-r--r-- 1 root root 2902 4月 10 17:46 网易云一起听的音乐卡片捏_20260410_144218.json
-rw-r--r-- 1 root root 2823 4月 10 17:46 网易云单曲的音乐卡片捏_20260410_144917.json
-rw-r--r-- 1 root root 2747 4月 10 17:46 网易云歌单的音乐卡片捏_20260410_144736.json
-rw-r--r-- 1 root root 3412 4月 10 17:46 酷狗音乐单曲的音乐卡片捏_20260410_150015.json
root@bawuyinguo:/home/bawuyinguo/SSoftwareFiles/koishi/koishi-dev-4/external/music-link-vincentzyu-fork/doc/dev/20260410_1736_1.9.7_新增中间件解析onebot音乐卡片白名单的规划捏#
OneBot音乐卡片本质上是JSON格式的数据,关键字段如下:
{
"app": "com.tencent.music.lua", // SDK标识(固定)
"view": "music", // 视图类型(关键!)
"meta": {
"music": { // 单曲元数据
"title": "歌曲名称",
"desc": "歌手",
"jumpUrl": "https://..."
}
}
}
关键发现:
view: "music"view: "news"app 字段对于同一类卡片是固定的,因此只需关注 view 字段// 伪代码示意
if (!config.enableWhitelist) {
return true; // 未启用白名单,允许所有卡片
}
// 检查卡片的 view 字段是否在白名单中
return config.customWhitelist.some(rule =>
rule.enabled && (rule.viewType === '*' || rule.viewType === jsonData.view)
);
以下是从真实环境中捕获的各种音乐卡片JSON样本,你可以点击查看完整内容:
提示: 如果你想自己捕获音乐卡片的JSON数据,可以使用这个插件捏: quote-debug-msg-json-image
该插件可以将收到的消息(包括OneBot音乐卡片)导出为JSON文件,方便调试和分析。
QQ音乐单曲的音乐卡片捏_20260410_173524.json
关键特征:
{
"app": "com.tencent.music.lua",
"view": "music",
"meta": {
"music": {
"title": "歌曲名称",
"desc": "歌手",
"tag": "QQ音乐"
}
}
}
酷狗音乐单曲的音乐卡片捏_20260410_150015.json
网易云单曲的音乐卡片捏_20260410_144917.json
网易云歌单的音乐卡片捏_20260410_144736.json
关键特征:
{
"app": "com.tencent.tuwen.lua",
"view": "news",
"meta": {
"news": {
"title": "歌单名称",
"desc": "包含XX首歌曲",
"tag": "网易云音乐"
}
}
}
网易云一起听的音乐卡片捏_20260410_144218.json
MIUI音乐单曲实际上就是QQ音乐的音乐卡片捏_20260410_151110.json
(MIUI据说实际上貌似就是QQ音乐套壳
?但是好像似乎MIUI分享出来的卡片的
view字段是news而不是music。如果有人需要保留miui音乐的检测 同时排除其他非单曲卡片 可以找我联系捏。因为懒 不想做了鹅鹅鹅)
保持默认配置即可:
enableWhitelist: true
customWhitelist:
- viewType: music
enabled: true
- viewType: news
enabled: false
效果:
关闭白名单过滤:
enableWhitelist: false
注意: 这可能导致插件尝试解析不兼容的卡片类型而产生错误。
如果你发现了新的卡片类型并希望支持它:
enableWhitelist 为 truecustomWhitelist 表格中添加新行:
viewType: 输入新发现的视图类型(可通过日志查看)enabled: 勾选以启用如何查看卡片的 view 类型?
loggerinfo: true 配置项,观察日志输出中的 view= 字段quote-debug-msg-json-image插件,使用dump-json指令捏可能原因:
view 字段)enableWhitelist 为 true 但白名单为空enabled: false)解决方法:
loggerinfo: true 查看日志[卡片过滤] 提示信息方法1:查看日志
# 开启详细日志后,会看到类似输出:
⏭️ [卡片过滤] 跳过非匹配卡片 | 🔍 view=news | ️ 白名单=已启用
here is code:
root@bawuyinguo:/home/.../music-link-vincentzyu-fork# rg 卡片过滤
lib/middleware.js
57: logInfo(`⏭️ [卡片过滤] 跳过非匹配卡片 | 🔍 view=${jsonData.view} | ️ 白名单=${config.enableWhitelist ? '已启用' : '未启用'}`);
方法2:查看JSON文件
"view": "xxx" 字段方法3:参考本文档的示例
view: "music"view: "news"目前支持 * 作为通配符:
customWhitelist:
- viewType: "*" # 匹配所有类型
enabled: true
但这等同于关闭白名单,不如直接设置 enableWhitelist: false 更清晰。
无效。 白名单过滤仅对 OneBot平台 生效,因为:
enableWhitelist 配置项customWhitelist 表格配置如果遇到任何问题或有改进建议: