yz-yuki-plugin 2.0.7-0 → 2.0.7-2

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 CHANGED
@@ -1,4 +1,5 @@
1
1
  # 2.0.7
2
+ * 添加白名单关键词过滤功能
2
3
  * 新增B站视频解析
3
4
 
4
5
  # 2.0.6
package/README.md CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
  # YUKI-PLUGIN
4
4
 
5
- - 一个适用于 `Yunzai 系列机器人框架` 的B站动态和微博动态订阅推送的插件
5
+ - 一个适用于 `Yunzai 系列机器人框架` 的B站动态、B站视频链接解析和微博动态订阅推送的插件
6
6
 
7
7
  - 支持 群聊/私聊 订阅B站动态和微博动态,支持定时推送,支持手动触发推送,支持简单查询B站/微博用户信息。
8
8
 
@@ -160,6 +160,7 @@ https://m.weibo.cn/u/7643376782 # 7643376782 为崩坏星穹铁道博主uid
160
160
  请使用 `#优纪帮助`或 `/yuki帮助` 获取完整帮助
161
161
 
162
162
  - [x] B站动态
163
+ - [x] B站视频链接解析
163
164
  - [x] 微博动态
164
165
 
165
166
 
@@ -190,6 +191,7 @@ https://m.weibo.cn/u/7643376782 # 7643376782 为崩坏星穹铁道博主uid
190
191
  | 删除B站ck | 删除手动获取的B站cookie,权限:Master | `#删除B站本地ck` |
191
192
  | 查看B站ck | 查看当前启用的B站ck,仅限私聊 | `#我的B站ck` |
192
193
  | 刷新B站临时ck | 重新获取并刷新redis缓存的未绑定自己的B站ck而自动获取的 临时B站cookie | `#刷新B站临时ck` |
194
+ | B站视频链接解析 | 解析B站视频链接,支持av号、BV号、app分享链接,官方短链 | `链接xxxx` |
193
195
  ||||
194
196
  | **微博功能** | ------------------------- | ---------- |
195
197
  | 添加微博推送 | 检测博主的微博动态进行推送,权限:Master。可选分类:视频、图文、文章、转发,不加分类则默认全部 | `#订阅微博推送uid` `#订阅微博推送 图文 uid` |
@@ -43,6 +43,15 @@ pushContentLineLimit: 5
43
43
  # 是否展示定时任务的日志,0 不显示 1 显示
44
44
  pushTaskLog: 1
45
45
 
46
+ # 白名单关键词,命中即推送,不在白名单则不推送。
47
+ # 白名单优先级高于黑名单,即命中白名单即推送,不在白名单则不推送。
48
+ # 白名单为空则不启用白名单功能。
49
+ # 配置示例:
50
+ # whiteWordslist:
51
+ # - 白名单关键词1
52
+ # - 白名单关键词2
53
+ whiteWordslist:
54
+
46
55
  # 包含关键词不推送
47
56
  banWords:
48
57
  - 关键词1
@@ -38,6 +38,15 @@ pushContentLineLimit: 5
38
38
  # 是否展示定时任务的日志,0 不显示 1 显示
39
39
  pushTaskLog: 1
40
40
 
41
+ # 白名单关键词,命中即推送,不在白名单则不推送。
42
+ # 白名单优先级高于黑名单,即命中白名单即推送,不在白名单则不推送。
43
+ # 白名单为空则不启用白名单功能。
44
+ # 配置示例:
45
+ # whiteWordslist:
46
+ # - 白名单关键词1
47
+ # - 白名单关键词2
48
+ whiteWordslist:
49
+
41
50
  # 包含关键词不推送
42
51
  banWords:
43
52
  - 关键词1
@@ -503,24 +503,26 @@ message.use(async (e) => {
503
503
  logger?.info(`优纪B站视频链接解析配置文件已设置关闭,解析终止。`);
504
504
  return;
505
505
  }
506
- const VideoIDStr = e.msg
507
- .match(/(b23\.tv\/[a-zA-Z0-9]+)|(www\.bilibili\.com\/video\/)?(av\d+|BV[a-zA-Z0-9]+)/)?.[0]
508
- .replace(/^www\.bilibili\.com\/video\//, '');
509
- let vedioID;
510
- if (VideoIDStr && new RegExp(/^b23\.tv\/[a-zA-Z0-9]+/).test(VideoIDStr)) {
511
- const tvUrlID = VideoIDStr.replace(/^b23\.tv\//g, '');
512
- const bvidStr = await new BilibiliWebDataFetcher(e).getBVIDByShortUrl(tvUrlID);
513
- vedioID = { bvid: bvidStr };
514
- }
515
- else if (VideoIDStr && new RegExp(/^av\d+/).test(VideoIDStr)) {
516
- const aid = VideoIDStr.replace(/^av/g, '');
517
- vedioID = { aid: Number(aid) };
518
- }
519
- else if (VideoIDStr && new RegExp(/|^BV[a-zA-Z0-9]+/).test(VideoIDStr)) {
520
- vedioID = { bvid: VideoIDStr };
506
+ const videoIDMatch = e.msg.match(/(b23\.tv\/([a-zA-Z0-9]+))|(www\.bilibili\.com\/video\/)?(av\d+|BV[a-zA-Z0-9]+)/);
507
+ let videoID;
508
+ if (videoIDMatch) {
509
+ if (videoIDMatch[2]) {
510
+ // 匹配 b23.tv/ 后面的部分
511
+ const bvidStr = await new BilibiliWebDataFetcher(e).getBVIDByShortUrl(videoIDMatch[2]);
512
+ videoID = { bvid: bvidStr };
513
+ }
514
+ else if (videoIDMatch[4].startsWith('av')) {
515
+ // 匹配 av 开头的部分
516
+ const aid = videoIDMatch[4].replace(/^av/, '');
517
+ videoID = { aid: Number(aid) };
518
+ }
519
+ else if (videoIDMatch[4].startsWith('BV')) {
520
+ // 匹配 BV 开头的部分
521
+ videoID = { bvid: videoIDMatch[4] };
522
+ }
521
523
  }
522
524
  e.reply('优纪酱解析中,请稍后~');
523
- const res = await new BilibiliWebDataFetcher(e).getBiliVideoInfoByAid_BV(vedioID);
525
+ const res = await new BilibiliWebDataFetcher(e).getBiliVideoInfoByAid_BV(videoID);
524
526
  if (res?.statusText !== 'OK') {
525
527
  e.reply('诶嘿,出了点网络问题,等会再试试吧~');
526
528
  return;
@@ -585,11 +587,13 @@ message.use(async (e) => {
585
587
  `\n--------------------`,
586
588
  `\n${formatNumber(data?.stat?.view)}播放 • ${formatNumber(data?.stat?.danmaku)}弹幕 • ${formatNumber(data?.stat?.reply)}评论 `,
587
589
  `\n${formatNumber(data?.stat?.like)}点赞 • ${formatNumber(data?.stat?.coin)}投币 • ${formatNumber(data?.stat?.favorite)}收藏`,
588
- `\n${formatNumber(data?.stat?.share)}分享`
590
+ `\n${formatNumber(data?.stat?.share)}分享`,
591
+ `\n--------------------`,
592
+ `\n链接:b23.tv/${data?.bvid}`
589
593
  ];
590
594
  e.reply(message);
591
595
  }
592
- }, [/(b23\.tv\/[a-zA-Z0-9]+)|(www\.bilibili\.com\/video\/)?(av\d+|BV[a-zA-Z0-9]+)/]);
596
+ }, [/(b23\.tv\/([a-zA-Z0-9]+))|(www\.bilibili\.com\/video\/)?(av\d+|BV[a-zA-Z0-9]+)/]);
593
597
  const YukiBli = message.ok;
594
598
 
595
599
  export { YukiBli };
@@ -184,12 +184,23 @@ class BiliTask {
184
184
  if (pushMsgMode === 'PIC') {
185
185
  const { data, uid } = await BiliQuery.formatDynamicData(pushDynamicData); // 处理动态数据
186
186
  const extentData = { ...data };
187
+ const getWhiteWords = biliConfigData?.whiteWordslist;
187
188
  const getBanWords = biliConfigData?.banWords;
189
+ if (getWhiteWords && Array.isArray(getWhiteWords) && getWhiteWords.length > 0) {
190
+ // 构建白名单关键字正则表达式,转义特殊字符
191
+ const whiteWords = new RegExp(getWhiteWords.map(word => word.replace(/[.*+?^${}()|[\]\\]/g, '\\$&')).join('|'), 'g');
192
+ if (!whiteWords.test(`${extentData?.title}${extentData?.content}`)) {
193
+ return; // 如果动态消息不在白名单中,则直接返回
194
+ }
195
+ }
196
+ else if (getWhiteWords && !Array.isArray(getWhiteWords)) {
197
+ logger.error(`B站动态:Yaml配置文件中,whiteWordslist 字段格式不是数组格式,请检查!`);
198
+ }
188
199
  if (getBanWords && Array.isArray(getBanWords) && getBanWords.length > 0) {
189
200
  // 构建屏蔽关键字正则表达式,转义特殊字符
190
201
  const banWords = new RegExp(getBanWords.map(word => word.replace(/[.*+?^${}()|[\]\\]/g, '\\$&')).join('|'), 'g');
191
202
  if (banWords.test(`${extentData?.title}${extentData?.content}`)) {
192
- return 'return'; // 如果动态消息包含屏蔽关键字,则直接返回
203
+ return; // 如果动态消息包含屏蔽关键字,则直接返回
193
204
  }
194
205
  }
195
206
  else if (getBanWords && !Array.isArray(getBanWords)) {
@@ -223,7 +234,18 @@ class BiliTask {
223
234
  if (dynamicMsg === undefined || dynamicMsg === 'continue') {
224
235
  return 'return'; // 如果动态消息构建失败,则直接返回
225
236
  }
237
+ const getWhiteWords = biliConfigData?.whiteWordslist;
226
238
  const getBanWords = biliConfigData?.banWords;
239
+ if (getWhiteWords && Array.isArray(getWhiteWords) && getWhiteWords.length > 0) {
240
+ // 构建白名单关键字正则表达式,转义特殊字符
241
+ const whiteWords = new RegExp(getWhiteWords.map(word => word.replace(/[.*+?^${}()|[\]\\]/g, '\\$&')).join('|'), 'g');
242
+ if (!whiteWords.test(dynamicMsg.msg.join(''))) {
243
+ return; // 如果动态消息不在白名单中,则直接返回
244
+ }
245
+ }
246
+ else if (getWhiteWords && !Array.isArray(getWhiteWords)) {
247
+ logger.error(`B站动态:Yaml配置文件中,whiteWordslist 字段格式不是数组格式,请检查!`);
248
+ }
227
249
  if (getBanWords && Array.isArray(getBanWords) && getBanWords.length > 0) {
228
250
  // 构建屏蔽关键字正则表达式,转义特殊字符
229
251
  const banWords = new RegExp(getBanWords.map(word => word.replace(/[.*+?^${}()|[\]\\]/g, '\\$&')).join('|'), 'g');
@@ -149,7 +149,18 @@ class WeiboTask {
149
149
  return; // 如果已经发送过,则直接返回
150
150
  if (!!weiboConfigData.pushMsgMode) {
151
151
  const { data, uid } = await WeiboQuery.formatDynamicData(pushDynamicData); // 处理动态数据
152
+ const getWhiteWords = weiboConfigData?.whiteWordslist;
152
153
  const getBanWords = weiboConfigData?.banWords;
154
+ if (getWhiteWords && Array.isArray(getWhiteWords) && getWhiteWords.length > 0) {
155
+ // 构建白名单关键字正则表达式,转义特殊字符
156
+ const whiteWords = new RegExp(getWhiteWords.map(word => word.replace(/[.*+?^${}()|[\]\\]/g, '\\$&')).join('|'), 'g');
157
+ if (!whiteWords.test(`${data?.title}${data?.content}`)) {
158
+ return; // 如果动态消息不在白名单中,则直接返回
159
+ }
160
+ }
161
+ else if (getWhiteWords && !Array.isArray(getWhiteWords)) {
162
+ logger.error(`微博动态:Yaml配置文件中,whiteWordslist 字段格式不是数组格式,请检查!`);
163
+ }
153
164
  if (getBanWords && Array.isArray(getBanWords) && getBanWords.length > 0) {
154
165
  // 构建屏蔽关键字正则表达式,转义特殊字符
155
166
  const banWords = new RegExp(getBanWords.map(word => word.replace(/[.*+?^${}()|[\]\\]/g, '\\$&')).join('|'), 'g');
@@ -189,7 +200,18 @@ class WeiboTask {
189
200
  if (dynamicMsg === undefined || dynamicMsg === 'continue') {
190
201
  return 'return'; // 如果动态消息构建失败或内部资源获取失败,则直接返回
191
202
  }
203
+ const getWhiteWords = weiboConfigData?.whiteWordslist;
192
204
  const getBanWords = weiboConfigData?.banWords;
205
+ if (getWhiteWords && Array.isArray(getWhiteWords) && getWhiteWords.length > 0) {
206
+ // 构建白名单关键字正则表达式,转义特殊字符
207
+ const whiteWords = new RegExp(getWhiteWords.map(word => word.replace(/[.*+?^${}()|[\]\\]/g, '\\$&')).join('|'), 'g');
208
+ if (!whiteWords.test(dynamicMsg.msg.join(''))) {
209
+ return; // 如果动态消息不在白名单中,则直接返回
210
+ }
211
+ }
212
+ else if (getWhiteWords && !Array.isArray(getWhiteWords)) {
213
+ logger.error(`微博动态:Yaml配置文件中,whiteWordslist 字段格式不是数组格式,请检查!`);
214
+ }
193
215
  if (getBanWords && Array.isArray(getBanWords) && getBanWords.length > 0) {
194
216
  // 构建屏蔽关键字正则表达式,转义特殊字符
195
217
  const banWords = new RegExp(getBanWords.map(word => word.replace(/[.*+?^${}()|[\]\\]/g, '\\$&')).join('|'), 'g');
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "yz-yuki-plugin",
3
- "version": "2.0.7-0",
3
+ "version": "2.0.7-2",
4
4
  "description": "优纪插件,yunzaijs 关于 微博推送、B站推送 等功能的拓展插件",
5
5
  "author": "snowtafir",
6
6
  "type": "module",