koishi-plugin-bilibili-notify 1.0.9-alpha.0 → 1.0.11
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/lib/biliAPI.js +10 -10
- package/lib/comRegister.d.ts +3 -2
- package/lib/comRegister.js +125 -73
- package/lib/generateImg.d.ts +6 -0
- package/lib/generateImg.js +25 -6
- package/lib/index.d.ts +1 -0
- package/lib/index.js +18 -1
- package/package.json +7 -5
- package/readme.md +2 -0
- package/lib/authority.d.ts +0 -5
- package/lib/authority.js +0 -12
package/lib/biliAPI.js
CHANGED
|
@@ -150,11 +150,7 @@ class BiliAPI extends koishi_1.Service {
|
|
|
150
150
|
}
|
|
151
151
|
getCookies() {
|
|
152
152
|
let cookies;
|
|
153
|
-
this.jar.
|
|
154
|
-
if (err)
|
|
155
|
-
throw err;
|
|
156
|
-
cookies = JSON.stringify(c, null, 2);
|
|
157
|
-
});
|
|
153
|
+
cookies = JSON.stringify(this.jar.serializeSync().cookies);
|
|
158
154
|
return cookies;
|
|
159
155
|
}
|
|
160
156
|
async loadCookiesFromDatabase() {
|
|
@@ -205,6 +201,8 @@ class BiliAPI extends koishi_1.Service {
|
|
|
205
201
|
});
|
|
206
202
|
this.jar.setCookieSync(cookie, `http${cookie.secure ? 's' : ''}://${cookie.domain}${cookie.path}`, {});
|
|
207
203
|
});
|
|
204
|
+
// restart plugin check
|
|
205
|
+
this.checkIfTokenNeedRefresh(decryptedRefreshToken, csrf);
|
|
208
206
|
// Open scheduled tasks and check if token need refresh
|
|
209
207
|
this.ctx.setInterval(() => {
|
|
210
208
|
this.checkIfTokenNeedRefresh(decryptedRefreshToken, csrf);
|
|
@@ -285,13 +283,15 @@ class BiliAPI extends koishi_1.Service {
|
|
|
285
283
|
}]);
|
|
286
284
|
// Get new csrf from cookies
|
|
287
285
|
let newCsrf;
|
|
288
|
-
this.jar.store.getAllCookies((err, c) => {
|
|
289
|
-
if (err)
|
|
290
|
-
throw err;
|
|
286
|
+
/* this.jar.store.getAllCookies((err, c) => {
|
|
287
|
+
if (err) throw err;
|
|
291
288
|
c.forEach(cookie => {
|
|
292
|
-
if (cookie.key === 'bili_jct')
|
|
293
|
-
newCsrf = cookie.value;
|
|
289
|
+
if (cookie.key === 'bili_jct') newCsrf = cookie.value
|
|
294
290
|
});
|
|
291
|
+
}) */
|
|
292
|
+
this.jar.serializeSync().cookies.forEach(cookie => {
|
|
293
|
+
if (cookie.key === 'bili_jct')
|
|
294
|
+
newCsrf = cookie.value;
|
|
295
295
|
});
|
|
296
296
|
// Accept update
|
|
297
297
|
const { data: aceeptData } = await this.client.post('https://passport.bilibili.com/x/passport-login/web/confirm/refresh', {
|
package/lib/comRegister.d.ts
CHANGED
|
@@ -18,9 +18,10 @@ declare class ComRegister {
|
|
|
18
18
|
}[];
|
|
19
19
|
qqBot: Bot<Context>;
|
|
20
20
|
qqguildBot: Bot<Context>;
|
|
21
|
+
oneBot: Bot<Context>;
|
|
21
22
|
constructor(ctx: Context, config: ComRegister.Config);
|
|
22
|
-
dynamicDetect(ctx: Context, bot: Bot<Context>, guildId: string, uid: string): () => Promise<void
|
|
23
|
-
liveDetect(ctx: Context, bot: Bot<Context>, guildId: string, roomId: string): () => Promise<
|
|
23
|
+
dynamicDetect(ctx: Context, bot: Bot<Context>, guildId: string, uid: string): () => Promise<void>;
|
|
24
|
+
liveDetect(ctx: Context, bot: Bot<Context>, guildId: string, roomId: string): () => Promise<string[]>;
|
|
24
25
|
subShow(): string;
|
|
25
26
|
checkIfNeedSub(comNeed: boolean, subType: string, session: Session, data?: any): Promise<boolean>;
|
|
26
27
|
updateSubNotifier(ctx: Context): void;
|
package/lib/comRegister.js
CHANGED
|
@@ -24,13 +24,17 @@ class ComRegister {
|
|
|
24
24
|
qqBot;
|
|
25
25
|
// QQ频道机器人
|
|
26
26
|
qqguildBot;
|
|
27
|
+
// OneBot机器人
|
|
28
|
+
oneBot;
|
|
27
29
|
constructor(ctx, config) {
|
|
28
30
|
this.logger = ctx.logger('commandRegister');
|
|
29
31
|
this.config = config;
|
|
30
32
|
// 拿到QQ群机器人
|
|
31
|
-
this.qqBot = ctx.bots
|
|
33
|
+
this.qqBot = ctx.bots.find(bot => bot.platform === 'qq');
|
|
32
34
|
// 拿到QQ频道机器人
|
|
33
|
-
this.qqguildBot = ctx.bots
|
|
35
|
+
this.qqguildBot = ctx.bots.find(bot => bot.platform === 'qqguild');
|
|
36
|
+
// 拿到OneBot机器人
|
|
37
|
+
this.oneBot = ctx.bots.find(bot => bot.platform === 'onebot');
|
|
34
38
|
// 从数据库获取订阅
|
|
35
39
|
this.getSubFromDatabase(ctx);
|
|
36
40
|
/* const testCom = ctx.command('test', { hidden: true, permissions: ['authority:5'] })
|
|
@@ -38,7 +42,9 @@ class ComRegister {
|
|
|
38
42
|
testCom.subcommand('.cookies')
|
|
39
43
|
.usage('测试指令,用于测试从数据库读取cookies')
|
|
40
44
|
.action(async () => {
|
|
41
|
-
|
|
45
|
+
this.logger.info('调用test cookies指令')
|
|
46
|
+
// await ctx.biliAPI.loadCookiesFromDatabase()
|
|
47
|
+
console.log(ctx.biliAPI.getCookies());
|
|
42
48
|
})
|
|
43
49
|
|
|
44
50
|
testCom
|
|
@@ -131,19 +137,16 @@ class ComRegister {
|
|
|
131
137
|
// 判断是否出问题
|
|
132
138
|
if (content.code !== 0)
|
|
133
139
|
return await session.send('出问题咯,请联系管理员解决!');
|
|
134
|
-
//
|
|
135
|
-
|
|
140
|
+
// 生成二维码
|
|
141
|
+
qrcode_1.default.toBuffer(content.data.url, {
|
|
136
142
|
errorCorrectionLevel: 'H', // 错误更正水平
|
|
137
|
-
type: '
|
|
138
|
-
quality: 0.92, // 图像质量(仅适用于'image/jpeg')
|
|
143
|
+
type: 'png', // 输出类型
|
|
139
144
|
margin: 1, // 边距大小
|
|
140
145
|
color: {
|
|
141
146
|
dark: '#000000', // 二维码颜色
|
|
142
147
|
light: '#FFFFFF' // 背景颜色
|
|
143
148
|
}
|
|
144
|
-
}
|
|
145
|
-
// 生成二维码
|
|
146
|
-
qrcode_1.default.toBuffer(content.data.url, options, async (err, buffer) => {
|
|
149
|
+
}, async (err, buffer) => {
|
|
147
150
|
if (err)
|
|
148
151
|
return await session.send('二维码生成出错,请联系管理员解决!');
|
|
149
152
|
await session.send(koishi_1.h.image(buffer, 'image/png'));
|
|
@@ -311,11 +314,11 @@ class ComRegister {
|
|
|
311
314
|
if (!liveMsg && !dynamicMsg) {
|
|
312
315
|
return '您未订阅该UP的任何消息';
|
|
313
316
|
}
|
|
314
|
-
//
|
|
315
|
-
let platform;
|
|
317
|
+
// 设置群号
|
|
316
318
|
if (!guildId) { // 没有输入群号,默认当前聊天环境
|
|
317
319
|
switch (session.event.platform) {
|
|
318
320
|
case 'qqguild':
|
|
321
|
+
case 'onebot':
|
|
319
322
|
guildId = session.event.channel.id;
|
|
320
323
|
break;
|
|
321
324
|
case 'qq':
|
|
@@ -324,21 +327,8 @@ class ComRegister {
|
|
|
324
327
|
default: return '暂不支持该平台';
|
|
325
328
|
}
|
|
326
329
|
}
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
// 判断是哪个聊天平台
|
|
330
|
-
switch (session.event.platform) {
|
|
331
|
-
case 'qqguild': {
|
|
332
|
-
bot = this.qqguildBot;
|
|
333
|
-
platform = 'qqguild';
|
|
334
|
-
break;
|
|
335
|
-
}
|
|
336
|
-
case 'qq': {
|
|
337
|
-
bot = this.qqBot;
|
|
338
|
-
platform = 'qq';
|
|
339
|
-
break;
|
|
340
|
-
}
|
|
341
|
-
default: return '暂不支持该平台';
|
|
330
|
+
else {
|
|
331
|
+
return '暂不支持群号发送!';
|
|
342
332
|
}
|
|
343
333
|
// 保存到数据库中
|
|
344
334
|
const sub = await ctx.database.create('bilibili', {
|
|
@@ -348,7 +338,7 @@ class ComRegister {
|
|
|
348
338
|
video: 1,
|
|
349
339
|
live: liveMsg ? 1 : 0,
|
|
350
340
|
targetId: guildId,
|
|
351
|
-
platform,
|
|
341
|
+
platform: session.event.platform,
|
|
352
342
|
time: new Date()
|
|
353
343
|
});
|
|
354
344
|
// 订阅数+1
|
|
@@ -376,15 +366,15 @@ class ComRegister {
|
|
|
376
366
|
}
|
|
377
367
|
// 需要订阅直播
|
|
378
368
|
if (liveMsg) {
|
|
379
|
-
await session.execute(`bili live ${data.live_room.roomid} ${guildId} -b ${platform}`);
|
|
369
|
+
await session.execute(`bili live ${data.live_room.roomid} ${guildId} -b ${session.event.platform}`);
|
|
380
370
|
// 发送订阅消息通知
|
|
381
|
-
await
|
|
371
|
+
await session.send(`订阅${userData.info.uname}直播通知`);
|
|
382
372
|
}
|
|
383
373
|
// 需要订阅动态
|
|
384
374
|
if (dynamicMsg) {
|
|
385
|
-
await session.execute(`bili dynamic ${mid} ${guildId} -b ${platform}`);
|
|
375
|
+
await session.execute(`bili dynamic ${mid} ${guildId} -b ${session.event.platform}`);
|
|
386
376
|
// 发送订阅消息通知
|
|
387
|
-
await
|
|
377
|
+
await session.send(`订阅${userData.info.uname}动态通知`);
|
|
388
378
|
}
|
|
389
379
|
// 新增订阅展示到控制台
|
|
390
380
|
this.updateSubNotifier(ctx);
|
|
@@ -419,6 +409,9 @@ class ComRegister {
|
|
|
419
409
|
case 'qqguild':
|
|
420
410
|
bot = this.qqguildBot;
|
|
421
411
|
break;
|
|
412
|
+
case 'onebot':
|
|
413
|
+
bot = this.oneBot;
|
|
414
|
+
break;
|
|
422
415
|
default: return '非法调用';
|
|
423
416
|
}
|
|
424
417
|
// 开始循环检测
|
|
@@ -454,6 +447,9 @@ class ComRegister {
|
|
|
454
447
|
case 'qqguild':
|
|
455
448
|
bot = this.qqguildBot;
|
|
456
449
|
break;
|
|
450
|
+
case 'onebot':
|
|
451
|
+
bot = this.oneBot;
|
|
452
|
+
break;
|
|
457
453
|
default: return '非法调用';
|
|
458
454
|
}
|
|
459
455
|
// 开始循环检测
|
|
@@ -583,12 +579,20 @@ class ComRegister {
|
|
|
583
579
|
// 直播开播动态,不做处理
|
|
584
580
|
if (e.message === '直播开播动态,不做处理')
|
|
585
581
|
break;
|
|
582
|
+
if (e.message === '出现关键词,屏蔽该动态') {
|
|
583
|
+
await bot.sendMessage(guildId, `UID:${uid} 发布了一条含有屏蔽关键字的动态`);
|
|
584
|
+
break;
|
|
585
|
+
}
|
|
586
586
|
}
|
|
587
587
|
// 如果pic存在,则直接返回pic
|
|
588
|
-
if (pic)
|
|
589
|
-
|
|
590
|
-
|
|
591
|
-
|
|
588
|
+
if (pic) {
|
|
589
|
+
// pic存在,使用的是render模式
|
|
590
|
+
await bot.sendMessage(guildId, pic);
|
|
591
|
+
}
|
|
592
|
+
else {
|
|
593
|
+
// pic不存在,说明使用的是page模式
|
|
594
|
+
await bot.sendMessage(guildId, koishi_1.h.image(buffer, 'image/png'));
|
|
595
|
+
}
|
|
592
596
|
// 如果成功,那么跳出循环
|
|
593
597
|
break;
|
|
594
598
|
}
|
|
@@ -637,14 +641,25 @@ class ComRegister {
|
|
|
637
641
|
// 相当于锁的作用,防止上一个循环没处理完
|
|
638
642
|
let flag = true;
|
|
639
643
|
async function sendLiveNotifyCard(data, uData, liveType) {
|
|
640
|
-
|
|
641
|
-
|
|
642
|
-
|
|
643
|
-
|
|
644
|
-
|
|
645
|
-
|
|
646
|
-
|
|
647
|
-
|
|
644
|
+
let attempts = 3;
|
|
645
|
+
for (let i = 0; i < attempts; i++) {
|
|
646
|
+
try {
|
|
647
|
+
// 获取直播通知卡片
|
|
648
|
+
const { pic, buffer } = await ctx.gimg.generateLiveImg(data, uData, liveType);
|
|
649
|
+
// 推送直播信息
|
|
650
|
+
// pic 存在,使用的是render模式
|
|
651
|
+
if (pic)
|
|
652
|
+
return bot.sendMessage(guildId, pic);
|
|
653
|
+
// pic不存在,说明使用的是page模式
|
|
654
|
+
await bot.sendMessage(guildId, koishi_1.h.image(buffer, 'image/png'));
|
|
655
|
+
}
|
|
656
|
+
catch (e) {
|
|
657
|
+
this.logger.error('liveDetect generateLiveImg() 推送卡片发送失败');
|
|
658
|
+
if (i === attempts - 1) { // 已尝试三次
|
|
659
|
+
return bot.sendMessage(guildId, '插件可能出现某些未知错误,请尝试重启插件,如果仍然会发生该错误,请向作者反馈');
|
|
660
|
+
}
|
|
661
|
+
}
|
|
662
|
+
}
|
|
648
663
|
}
|
|
649
664
|
return async () => {
|
|
650
665
|
try {
|
|
@@ -654,11 +669,17 @@ class ComRegister {
|
|
|
654
669
|
flag && (flag = false);
|
|
655
670
|
// 发送请求检测直播状态
|
|
656
671
|
let content;
|
|
657
|
-
|
|
658
|
-
|
|
659
|
-
|
|
660
|
-
|
|
661
|
-
|
|
672
|
+
let attempts = 3;
|
|
673
|
+
for (let i = 0; i < attempts; i++) {
|
|
674
|
+
try {
|
|
675
|
+
content = await ctx.biliAPI.getLiveRoomInfo(roomId);
|
|
676
|
+
}
|
|
677
|
+
catch (e) {
|
|
678
|
+
this.logger.error('liveDetect getLiveRoomInfo 网络请求失败');
|
|
679
|
+
if (i === attempts - 1) { // 已尝试三次
|
|
680
|
+
return bot.sendMessage(guildId, '你的网络可能出现了某些问题,请检查后重启插件');
|
|
681
|
+
}
|
|
682
|
+
}
|
|
662
683
|
}
|
|
663
684
|
const { data } = content;
|
|
664
685
|
// B站出问题了
|
|
@@ -677,12 +698,18 @@ class ComRegister {
|
|
|
677
698
|
firstSubscription = false;
|
|
678
699
|
// 获取主播信息
|
|
679
700
|
let userData;
|
|
680
|
-
|
|
681
|
-
|
|
682
|
-
|
|
683
|
-
|
|
684
|
-
|
|
685
|
-
|
|
701
|
+
let attempts = 3;
|
|
702
|
+
for (let i = 0; i < attempts; i++) {
|
|
703
|
+
try {
|
|
704
|
+
const { data: userInfo } = await ctx.biliAPI.getMasterInfo(data.uid);
|
|
705
|
+
userData = userInfo;
|
|
706
|
+
}
|
|
707
|
+
catch (e) {
|
|
708
|
+
this.logger.error('liveDetect getMasterInfo() 本次网络请求失败');
|
|
709
|
+
if (i === attempts - 1) { // 已尝试三次
|
|
710
|
+
return bot.sendMessage(guildId, '你的网络可能出现了某些问题,请检查后重启插件');
|
|
711
|
+
}
|
|
712
|
+
}
|
|
686
713
|
}
|
|
687
714
|
// 主播信息不会变,请求一次即可
|
|
688
715
|
uData = userData;
|
|
@@ -707,7 +734,7 @@ class ComRegister {
|
|
|
707
734
|
// 下播了将定时器清零
|
|
708
735
|
timer = 0;
|
|
709
736
|
// 发送下播通知
|
|
710
|
-
bot.sendMessage(guildId, `${uData.info.uname}下播啦,本次直播了${await ctx.gimg.getTimeDifference(liveTime)}`);
|
|
737
|
+
await bot.sendMessage(guildId, `${uData.info.uname}下播啦,本次直播了${await ctx.gimg.getTimeDifference(liveTime)}`);
|
|
711
738
|
}
|
|
712
739
|
// 未进循环,还未开播,继续循环
|
|
713
740
|
break;
|
|
@@ -720,12 +747,18 @@ class ComRegister {
|
|
|
720
747
|
liveTime = data.live_time;
|
|
721
748
|
// 获取主播信息
|
|
722
749
|
let userData;
|
|
723
|
-
|
|
724
|
-
|
|
725
|
-
|
|
726
|
-
|
|
727
|
-
|
|
728
|
-
|
|
750
|
+
let attempts = 3;
|
|
751
|
+
for (let i = 0; i < attempts; i++) {
|
|
752
|
+
try {
|
|
753
|
+
const { data: userInfo } = await ctx.biliAPI.getMasterInfo(data.uid);
|
|
754
|
+
userData = userInfo;
|
|
755
|
+
}
|
|
756
|
+
catch (e) {
|
|
757
|
+
this.logger.error('liveDetect open getMasterInfo() 网络请求错误');
|
|
758
|
+
if (i === attempts - 1) { // 已尝试三次
|
|
759
|
+
return bot.sendMessage(guildId, '你的网络可能出现了某些问题,请检查后重启插件');
|
|
760
|
+
}
|
|
761
|
+
}
|
|
729
762
|
}
|
|
730
763
|
// 主播信息不会变,开播时刷新一次即可
|
|
731
764
|
uData = userData;
|
|
@@ -800,14 +833,20 @@ class ComRegister {
|
|
|
800
833
|
updateSubNotifier(ctx) {
|
|
801
834
|
// 更新控制台提示
|
|
802
835
|
this.subNotifier && this.subNotifier.dispose();
|
|
803
|
-
//
|
|
804
|
-
|
|
805
|
-
|
|
806
|
-
|
|
807
|
-
|
|
808
|
-
|
|
809
|
-
|
|
810
|
-
|
|
836
|
+
// 获取订阅信息
|
|
837
|
+
const subInfo = this.subShow();
|
|
838
|
+
// 定义table
|
|
839
|
+
let table = '';
|
|
840
|
+
if (subInfo === '没有订阅任何UP') {
|
|
841
|
+
table = subInfo;
|
|
842
|
+
}
|
|
843
|
+
else {
|
|
844
|
+
// 获取subTable
|
|
845
|
+
let subTableArray = subInfo.split('\n');
|
|
846
|
+
subTableArray.splice(subTableArray.length - 1, 1);
|
|
847
|
+
// 定义Table
|
|
848
|
+
table = (0, jsx_runtime_1.jsx)(jsx_runtime_1.Fragment, { children: (0, jsx_runtime_1.jsx)("ul", { children: subTableArray.map(str => ((0, jsx_runtime_1.jsx)("li", { children: str }))) }) });
|
|
849
|
+
}
|
|
811
850
|
// 设置更新后的提示
|
|
812
851
|
this.subNotifier = ctx.notifier.create(table);
|
|
813
852
|
}
|
|
@@ -827,7 +866,7 @@ class ComRegister {
|
|
|
827
866
|
if (!this.config.unlockSubLimits && this.num > 3) {
|
|
828
867
|
ctx.notifier.create({
|
|
829
868
|
type: 'danger',
|
|
830
|
-
content: '您未解锁订阅限制,且订阅数大于3人,请您手动删除bilibili
|
|
869
|
+
content: '您未解锁订阅限制,且订阅数大于3人,请您手动删除bilibili表中多余的数据后重启本插件'
|
|
831
870
|
});
|
|
832
871
|
return;
|
|
833
872
|
}
|
|
@@ -844,8 +883,21 @@ class ComRegister {
|
|
|
844
883
|
}
|
|
845
884
|
// 拿到对应bot
|
|
846
885
|
switch (sub.platform) {
|
|
847
|
-
case 'qq':
|
|
848
|
-
|
|
886
|
+
case 'qq':
|
|
887
|
+
bot = this.qqBot;
|
|
888
|
+
break;
|
|
889
|
+
case 'qqguild':
|
|
890
|
+
bot = this.qqguildBot;
|
|
891
|
+
break;
|
|
892
|
+
case 'onebot':
|
|
893
|
+
bot = this.oneBot;
|
|
894
|
+
break;
|
|
895
|
+
default: {
|
|
896
|
+
// 本条数据被篡改,删除该条订阅
|
|
897
|
+
ctx.database.remove('bilibili', { id: sub.id });
|
|
898
|
+
// 继续下个循环
|
|
899
|
+
continue;
|
|
900
|
+
}
|
|
849
901
|
}
|
|
850
902
|
// 判断数据库是否被篡改
|
|
851
903
|
// 获取用户信息
|
package/lib/generateImg.d.ts
CHANGED
|
@@ -33,6 +33,12 @@ declare class GenerateImg extends Service {
|
|
|
33
33
|
declare namespace GenerateImg {
|
|
34
34
|
interface Config {
|
|
35
35
|
renderType: number;
|
|
36
|
+
filter: {
|
|
37
|
+
enable: boolean;
|
|
38
|
+
regex: string;
|
|
39
|
+
keywords: Array<string>;
|
|
40
|
+
filter: boolean;
|
|
41
|
+
};
|
|
36
42
|
removeBorder: boolean;
|
|
37
43
|
cardColorStart: string;
|
|
38
44
|
cardColorEnd: string;
|
package/lib/generateImg.js
CHANGED
|
@@ -232,24 +232,37 @@ class GenerateImg extends koishi_1.Service {
|
|
|
232
232
|
const like = module_stat.like.count;
|
|
233
233
|
// TOPIC
|
|
234
234
|
const topic = data.modules.module_dynamic.topic ? data.modules.module_dynamic.topic.name : '';
|
|
235
|
-
async
|
|
235
|
+
const getDynamicMajor = async (dynamicMajorData, forward) => {
|
|
236
236
|
// 定义返回值
|
|
237
237
|
let main = '';
|
|
238
238
|
let link = '';
|
|
239
239
|
// 定义forward类型返回值
|
|
240
240
|
let forwardInfo;
|
|
241
241
|
// 最基本的图文处理
|
|
242
|
-
|
|
242
|
+
const basicDynamic = () => {
|
|
243
243
|
const module_dynamic = dynamicMajorData.modules.module_dynamic;
|
|
244
244
|
if (module_dynamic.desc) {
|
|
245
245
|
const richText = module_dynamic.desc.rich_text_nodes.reduce((accumulator, currentValue) => {
|
|
246
246
|
if (currentValue.emoji) {
|
|
247
|
-
return accumulator + `<img style="width:
|
|
247
|
+
return accumulator + `<img style="width:28px; height:28px;" src="${currentValue.emoji.icon_url}"/>`;
|
|
248
248
|
}
|
|
249
249
|
else {
|
|
250
250
|
return accumulator + currentValue.text;
|
|
251
251
|
}
|
|
252
252
|
}, '');
|
|
253
|
+
// 关键字和正则屏蔽
|
|
254
|
+
if (this.config.filter.enable) { // 开启关键字和正则屏蔽
|
|
255
|
+
if (this.config.filter.regex) { // 正则屏蔽
|
|
256
|
+
const reg = new RegExp(this.config.filter.regex);
|
|
257
|
+
if (reg.test(richText))
|
|
258
|
+
throw new Error('出现关键词,屏蔽该动态');
|
|
259
|
+
}
|
|
260
|
+
if (this.config.filter.keywords.length !== 0 &&
|
|
261
|
+
this.config.filter.keywords
|
|
262
|
+
.some(keyword => richText.includes(keyword))) {
|
|
263
|
+
throw new Error('出现关键词,屏蔽该动态');
|
|
264
|
+
}
|
|
265
|
+
}
|
|
253
266
|
// 查找\n
|
|
254
267
|
const text = richText.replace(/\n/g, '<br>');
|
|
255
268
|
// 拼接字符串
|
|
@@ -283,7 +296,7 @@ class GenerateImg extends koishi_1.Service {
|
|
|
283
296
|
</div>
|
|
284
297
|
`;
|
|
285
298
|
}
|
|
286
|
-
}
|
|
299
|
+
};
|
|
287
300
|
// 判断动态类型
|
|
288
301
|
switch (dynamicMajorData.type) {
|
|
289
302
|
case DYNAMIC_TYPE_WORD:
|
|
@@ -497,7 +510,7 @@ class GenerateImg extends koishi_1.Service {
|
|
|
497
510
|
default: return [`${upName}发布了一条我无法识别的动态,请自行查看`, ''];
|
|
498
511
|
}
|
|
499
512
|
return [main, link, forwardInfo];
|
|
500
|
-
}
|
|
513
|
+
};
|
|
501
514
|
// 获取动态主要内容
|
|
502
515
|
const [main, link] = await getDynamicMajor(data, false);
|
|
503
516
|
// 加载字体
|
|
@@ -683,7 +696,7 @@ class GenerateImg extends koishi_1.Service {
|
|
|
683
696
|
overflow: hidden;
|
|
684
697
|
border-radius: 5px 0 0 5px;
|
|
685
698
|
margin-top: 10px;
|
|
686
|
-
height:
|
|
699
|
+
height: 147px;
|
|
687
700
|
}
|
|
688
701
|
|
|
689
702
|
.card .video-cover {
|
|
@@ -994,6 +1007,12 @@ class GenerateImg extends koishi_1.Service {
|
|
|
994
1007
|
(function (GenerateImg) {
|
|
995
1008
|
GenerateImg.Config = koishi_1.Schema.object({
|
|
996
1009
|
renderType: koishi_1.Schema.number(),
|
|
1010
|
+
filter: koishi_1.Schema.object({
|
|
1011
|
+
enable: koishi_1.Schema.boolean(),
|
|
1012
|
+
regex: koishi_1.Schema.string(),
|
|
1013
|
+
keywords: koishi_1.Schema.array(String),
|
|
1014
|
+
filter: koishi_1.Schema.boolean()
|
|
1015
|
+
}),
|
|
997
1016
|
removeBorder: koishi_1.Schema.boolean(),
|
|
998
1017
|
cardColorStart: koishi_1.Schema.string(),
|
|
999
1018
|
cardColorEnd: koishi_1.Schema.string(),
|
package/lib/index.d.ts
CHANGED
package/lib/index.js
CHANGED
|
@@ -70,6 +70,23 @@ exports.Config = koishi_1.Schema.object({
|
|
|
70
70
|
.role('')
|
|
71
71
|
.default('render')
|
|
72
72
|
.description('渲染类型,默认为render模式,渲染速度更快,但会出现乱码问题,若出现乱码问题,请切换到page模式。若使用自定义字体,建议选择render模式'),
|
|
73
|
+
filter: koishi_1.Schema.intersect([
|
|
74
|
+
koishi_1.Schema.object({
|
|
75
|
+
enable: koishi_1.Schema.boolean()
|
|
76
|
+
.default(false)
|
|
77
|
+
.description('是否开启动态关键字屏蔽功能')
|
|
78
|
+
}).description('屏蔽设置'),
|
|
79
|
+
koishi_1.Schema.union([
|
|
80
|
+
koishi_1.Schema.object({
|
|
81
|
+
enable: koishi_1.Schema.const(true).required(),
|
|
82
|
+
regex: koishi_1.Schema.string()
|
|
83
|
+
.description('正则表达式屏蔽'),
|
|
84
|
+
keywords: koishi_1.Schema.array(String)
|
|
85
|
+
.description('关键字屏蔽,一个关键字为一项')
|
|
86
|
+
}),
|
|
87
|
+
koishi_1.Schema.object({})
|
|
88
|
+
])
|
|
89
|
+
]),
|
|
73
90
|
style: koishi_1.Schema.object({}).description('美化设置'),
|
|
74
91
|
removeBorder: koishi_1.Schema.boolean()
|
|
75
92
|
.default(false)
|
|
@@ -128,7 +145,7 @@ function apply(ctx, config) {
|
|
|
128
145
|
ctx.plugin(Database);
|
|
129
146
|
// Regist server
|
|
130
147
|
ctx.plugin(wbi_1.default, { key: config.key });
|
|
131
|
-
ctx.plugin(generateImg_1.default, { renderType, removeBorder: config.removeBorder, cardColorStart: config.cardColorStart, cardColorEnd: config.cardColorEnd, font: config.font });
|
|
148
|
+
ctx.plugin(generateImg_1.default, { renderType, filter: config.filter, removeBorder: config.removeBorder, cardColorStart: config.cardColorStart, cardColorEnd: config.cardColorEnd, font: config.font });
|
|
132
149
|
ctx.plugin(biliAPI_1.default);
|
|
133
150
|
// load plugin
|
|
134
151
|
// ctx.plugin(Authority)
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "koishi-plugin-bilibili-notify",
|
|
3
3
|
"description": "Koishi bilibili notify plugin",
|
|
4
|
-
"version": "1.0.
|
|
4
|
+
"version": "1.0.11",
|
|
5
5
|
"contributors": [
|
|
6
6
|
"Akokko <admin@akokko.com>"
|
|
7
7
|
],
|
|
@@ -17,7 +17,6 @@
|
|
|
17
17
|
"url": "git+https://github.com/Akokk0/koishi-plugin-bilibili-notify"
|
|
18
18
|
},
|
|
19
19
|
"homepage": "https://www.npmjs.com/package/koishi-plugin-bilibili-notify",
|
|
20
|
-
"scripts": {},
|
|
21
20
|
"keywords": [
|
|
22
21
|
"chatbot",
|
|
23
22
|
"koishi",
|
|
@@ -25,16 +24,19 @@
|
|
|
25
24
|
"bilibili"
|
|
26
25
|
],
|
|
27
26
|
"peerDependencies": {
|
|
28
|
-
"koishi": "^4.16.
|
|
27
|
+
"koishi": "^4.16.6"
|
|
29
28
|
},
|
|
30
29
|
"dependencies": {
|
|
31
|
-
"axios-cookiejar-support": "^
|
|
32
|
-
"jsdom": "^
|
|
30
|
+
"axios-cookiejar-support": "^5.0.0",
|
|
31
|
+
"jsdom": "^24.0.0",
|
|
33
32
|
"md5": "^2.3.0",
|
|
34
33
|
"qrcode": "^1.5.3",
|
|
35
34
|
"tough-cookie": "^4.1.3"
|
|
36
35
|
},
|
|
37
36
|
"devDependencies": {
|
|
37
|
+
"@types/md5": "^2",
|
|
38
|
+
"@types/qrcode": "^1",
|
|
39
|
+
"@types/tough-cookie": "^4",
|
|
38
40
|
"koishi-plugin-puppeteer": "^3.7.3"
|
|
39
41
|
},
|
|
40
42
|
"koishi": {
|
package/readme.md
CHANGED
|
@@ -85,6 +85,8 @@
|
|
|
85
85
|
- ver 1.0.7 修复了在已登录情况下,再次登录会导致重复订阅和提示用户未订阅任何UP主的提示(实际上已订阅)的bug,新增了订阅对象在控制台的显示,优化了bili show指令的逻辑
|
|
86
86
|
- ver 1.0.8 修复了取消订阅的bug
|
|
87
87
|
- ver 1.0.9 更新请求客户端header信息。优化了动态推送卡片的页面布局,增加了字体大小。提供用户开放订阅数量限制的选项,提供用户移除推送卡片边框的选项。在控制台页面增加订阅信息提示
|
|
88
|
+
- ver 1.0.10 增加对onebot的支持,添加动态关键字屏蔽功能
|
|
89
|
+
- ver 1.0.11 修复了render渲染模式下,动态重复推送的问题,修复了没有订阅时,控制台空白提示的问题。优化了视频动态缩略图显示不全的问题,优化了部分逻辑。增强容错和增加错误提示
|
|
88
90
|
|
|
89
91
|
## 感谢
|
|
90
92
|
|
package/lib/authority.d.ts
DELETED
package/lib/authority.js
DELETED
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
class Authority {
|
|
4
|
-
constructor(ctx) {
|
|
5
|
-
// 授予权限
|
|
6
|
-
/* ctx.permissions.provide('telegram:admin', async (name, session) => {
|
|
7
|
-
console.log(session);
|
|
8
|
-
return session.telegram?.sender?.role === 'admin'
|
|
9
|
-
}) */
|
|
10
|
-
}
|
|
11
|
-
}
|
|
12
|
-
exports.default = Authority;
|