koishi-plugin-bilibili-notify 1.3.5 → 1.3.6-beta.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.
package/lib/biliAPI.js CHANGED
@@ -3,8 +3,9 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
3
3
  return (mod && mod.__esModule) ? mod : { "default": mod };
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
+ /* eslint-disable @typescript-eslint/no-unused-vars */
7
+ /* eslint-disable @typescript-eslint/no-unsafe-function-type */
6
8
  /* eslint-disable @typescript-eslint/no-namespace */
7
- /* eslint-disable @typescript-eslint/ban-types */
8
9
  /* eslint-disable @typescript-eslint/no-explicit-any */
9
10
  const koishi_1 = require("koishi");
10
11
  const axios_1 = __importDefault(require("axios"));
@@ -154,7 +155,8 @@ class BiliAPI extends koishi_1.Service {
154
155
  throw new Error('网络异常,本次请求失败!');
155
156
  }
156
157
  }
157
- disposeNotifier() { this.loginNotifier && this.loginNotifier.dispose(); }
158
+ disposeNotifier() { if (this.loginNotifier)
159
+ this.loginNotifier.dispose(); }
158
160
  getRandomUserAgent() {
159
161
  const userAgents = [
160
162
  'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/123.0.0.0 Safari/537.36',
@@ -271,7 +273,8 @@ class BiliAPI extends koishi_1.Service {
271
273
  }
272
274
  enableRefreshCookiesDetect() {
273
275
  // 判断之前是否启动检测
274
- this.refreshCookieTimer && this.refreshCookieTimer();
276
+ if (this.refreshCookieTimer)
277
+ this.refreshCookieTimer();
275
278
  // Open scheduled tasks and check if token need refresh
276
279
  this.refreshCookieTimer = this.ctx.setInterval(async () => {
277
280
  // 从数据库获取登录信息
@@ -6,6 +6,7 @@ declare class ComRegister {
6
6
  config: ComRegister.Config;
7
7
  loginTimer: Function;
8
8
  num: number;
9
+ rebootCount: number;
9
10
  subNotifier: Notifier;
10
11
  subManager: {
11
12
  id: number;
@@ -30,7 +31,8 @@ declare class ComRegister {
30
31
  constructor(ctx: Context, config: ComRegister.Config);
31
32
  getTheCorrespondingBotBasedOnTheSession(session: Session): Bot<Context, any>;
32
33
  sendPrivateMsg(bot: Bot<Context>, content: string): Promise<void>;
33
- sendPrivateMsgAndRebootService(ctx: Context, bot: Bot<Context>, content: string): Promise<void>;
34
+ sendPrivateMsgAndRebootService(ctx: Context, bot: Bot<Context>): Promise<void>;
35
+ sendPrivateMsgAndStopService(ctx: Context, bot: Bot<Context>): Promise<void>;
34
36
  sendMsg(targets: Array<string>, bot: Bot<Context>, content: any): Promise<void>;
35
37
  dynamicDetect(ctx: Context, bot: Bot<Context>, uid: string, guildId: Array<string>): () => Promise<void>;
36
38
  debug_dynamicDetect(ctx: Context, bot: Bot<Context>, uid: string, guildId: Array<string>): () => Promise<void>;
@@ -4,13 +4,14 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
6
  const jsx_runtime_1 = require("@satorijs/element/jsx-runtime");
7
+ /* eslint-disable @typescript-eslint/no-unused-vars */
8
+ /* eslint-disable @typescript-eslint/no-unsafe-function-type */
7
9
  /* eslint-disable @typescript-eslint/no-namespace */
8
10
  /* eslint-disable @typescript-eslint/no-explicit-any */
9
- /* eslint-disable @typescript-eslint/ban-types */
10
11
  const koishi_1 = require("koishi");
11
12
  // 导入qrcode
12
13
  const qrcode_1 = __importDefault(require("qrcode"));
13
- const jimp_1 = __importDefault(require("jimp"));
14
+ const jimp_1 = require("jimp");
14
15
  var LiveType;
15
16
  (function (LiveType) {
16
17
  LiveType[LiveType["NotLiveBroadcast"] = 0] = "NotLiveBroadcast";
@@ -23,6 +24,7 @@ class ComRegister {
23
24
  config;
24
25
  loginTimer;
25
26
  num = 0;
27
+ rebootCount = 0;
26
28
  subNotifier;
27
29
  subManager = [];
28
30
  // QQ群机器人
@@ -260,7 +262,8 @@ class ComRegister {
260
262
  await session.send(koishi_1.h.image(buffer, 'image/png'));
261
263
  });
262
264
  // 检查之前是否存在登录定时器
263
- this.loginTimer && this.loginTimer();
265
+ if (this.loginTimer)
266
+ this.loginTimer();
264
267
  // 设置flag
265
268
  let flag = true;
266
269
  // 发起登录请求检查登录状态
@@ -363,7 +366,8 @@ class ComRegister {
363
366
  }
364
367
  }));
365
368
  // 未订阅该用户,无需取消订阅
366
- !exist && session.send('未订阅该用户,无需取消订阅');
369
+ if (!exist)
370
+ session.send('未订阅该用户,无需取消订阅');
367
371
  });
368
372
  biliCom
369
373
  .subcommand('.show', '展示订阅对象')
@@ -707,7 +711,7 @@ class ComRegister {
707
711
  // 获得对应bot
708
712
  const bot = this.getTheCorrespondingBotBasedOnTheSession(session)
709
713
  // 发送提示消息,重启服务
710
- await this.sendPrivateMsgAndRebootService(ctx, bot, '测试biliAPI等服务自动重启功能')
714
+ await this.sendPrivateMsgAndStopService(ctx, bot, '测试biliAPI等服务自动重启功能')
711
715
  }) */
712
716
  /* biliCom
713
717
  .subcommand('.sendall', '测试给机器人加入的所有群发送消息', { hidden: true })
@@ -780,23 +784,47 @@ class ComRegister {
780
784
  }
781
785
  }
782
786
  }
783
- async sendPrivateMsgAndRebootService(ctx, bot, content) {
784
- await this.sendPrivateMsg(bot, content);
787
+ async sendPrivateMsgAndRebootService(ctx, bot) {
788
+ // 判断重启次数是否超过三次
789
+ if (this.rebootCount >= 3) {
790
+ // logger
791
+ this.logger.error('已重启插件三次,请检查机器人状态后使用指令 sys start 启动插件');
792
+ // 重启失败,发送消息
793
+ await this.sendPrivateMsg(bot, '已重启插件三次,请检查机器人状态后使用指令 sys start 启动插件');
794
+ // 关闭插件
795
+ await ctx.sm.disposePlugin();
796
+ // 结束
797
+ return;
798
+ }
799
+ // 重启次数+1
800
+ this.rebootCount++;
801
+ // logger
802
+ this.logger.info('插件出现未知错误,正在重启插件');
785
803
  // 重启插件
786
- const flag = await ctx.sm.restartPlugin(true /* 非人为重启,需要计数 */);
804
+ const flag = await ctx.sm.restartPlugin();
787
805
  // 判断是否重启成功
788
806
  if (flag) {
789
807
  this.logger.info('重启插件成功');
790
808
  }
791
809
  else {
792
810
  // logger
793
- this.logger.error('已重启插件三次,请检查机器人状态后手动重启');
811
+ this.logger.error('重启插件失败,请检查机器人状态后使用指令 sys start 启动插件');
794
812
  // 重启失败,发送消息
795
- await this.sendPrivateMsg(bot, '已重启插件三次,请检查机器人状态后手动重启');
813
+ await this.sendPrivateMsg(bot, '重启插件失败,请检查机器人状态后使用指令 sys start 启动插件');
796
814
  // 关闭插件
797
815
  await ctx.sm.disposePlugin();
798
816
  }
799
817
  }
818
+ async sendPrivateMsgAndStopService(ctx, bot) {
819
+ // 发送消息
820
+ await this.sendPrivateMsg(bot, '插件发生未知错误,请检查机器人状态后使用指令 sys start 启动插件');
821
+ // logger
822
+ this.logger.error('插件发生未知错误,请检查机器人状态后使用指令 sys start 启动插件');
823
+ // 关闭插件
824
+ await ctx.sm.disposePlugin();
825
+ // 结束
826
+ return;
827
+ }
800
828
  async sendMsg(targets, bot, content) {
801
829
  // 定义需要发送的数组
802
830
  let sendArr = [];
@@ -818,299 +846,331 @@ class ComRegister {
818
846
  dynamicDetect(ctx, bot, uid, guildId) {
819
847
  let firstSubscription = true;
820
848
  let timePoint;
849
+ // 相当于锁的作用,防止上一个循环没处理完
850
+ let flag = true;
821
851
  return async () => {
822
- // 第一次订阅判断
823
- if (firstSubscription) {
824
- // 设置第一次的时间点
825
- timePoint = ctx.ba.getTimeOfUTC8();
826
- // 设置第一次为false
827
- firstSubscription = false;
852
+ // 判断上一个循环是否完成
853
+ if (!flag)
828
854
  return;
829
- }
830
- // 获取用户空间动态数据
831
- let content;
855
+ flag = false;
856
+ // 无论是否执行成功都要释放锁
832
857
  try {
833
- content = await ctx.ba.getUserSpaceDynamic(uid);
834
- }
835
- catch (e) {
836
- return this.logger.error('dynamicDetect getUserSpaceDynamic() 发生了错误,错误为:' + e.message);
837
- }
838
- // 判断是否出现其他问题
839
- if (content.code !== 0) {
840
- switch (content.code) {
841
- case -101: { // 账号未登录
842
- // 输出日志
843
- this.logger.error('账号未登录,插件已停止工作,请登录后,输入指令 sys start 启动插件');
844
- // 发送私聊消息
845
- await this.sendPrivateMsg(bot, '账号未登录,插件已停止工作,请登录后,输入指令 sys start 启动插件');
846
- // 停止服务
847
- await ctx.sm.disposePlugin();
848
- // 结束循环
849
- break;
850
- }
851
- case -352: { // 风控
852
- // 输出日志
853
- this.logger.error('账号被风控,插件已停止工作,请确认风控解除后,输入指令 sys start 启动插件');
854
- // 发送私聊消息
855
- await this.sendPrivateMsg(bot, '账号被风控,插件已停止工作,请确认风控解除后,输入指令 sys start 启动插件');
856
- // 停止服务
857
- await ctx.sm.disposePlugin();
858
- // 结束循环
859
- break;
860
- }
861
- case 4101128:
862
- case 4101129: { // 获取动态信息错误
863
- // 输出日志
864
- this.logger.error('获取动态信息错误,错误码为:' + content.code + ',错误为:' + content.message);
865
- // 发送私聊消息
866
- await this.sendPrivateMsg(bot, '获取动态信息错误,错误码为:' + content.code + ',错误为:' + content.message); // 未知错误
867
- // 结束循环
868
- break;
869
- }
870
- default: { // 未知错误
871
- // 发送私聊消息
872
- await this.sendPrivateMsg(bot, '获取动态信息错误,错误码为:' + content.code + ',错误为:' + content.message); // 未知错误
873
- // 取消订阅
874
- this.unsubAll(ctx, bot, uid);
875
- // 结束循环
876
- break;
877
- }
858
+ // 第一次订阅判断
859
+ if (firstSubscription) {
860
+ // 设置第一次的时间点
861
+ timePoint = ctx.ba.getTimeOfUTC8();
862
+ // 设置第一次为false
863
+ firstSubscription = false;
864
+ return;
878
865
  }
879
- }
880
- // 获取数据内容
881
- const items = content.data.items;
882
- // 定义方法:更新时间点为最新发布动态的发布时间
883
- const updatePoint = (num) => {
884
- switch (num) {
885
- case 1: {
886
- if (items[0].modules.module_tag) { // 存在置顶动态
887
- timePoint = items[num].modules.module_author.pub_ts;
866
+ // 获取用户空间动态数据
867
+ let content;
868
+ try {
869
+ content = await ctx.ba.getUserSpaceDynamic(uid);
870
+ }
871
+ catch (e) {
872
+ return this.logger.error('dynamicDetect getUserSpaceDynamic() 发生了错误,错误为:' + e.message);
873
+ }
874
+ // 判断是否出现其他问题
875
+ if (content.code !== 0) {
876
+ switch (content.code) {
877
+ case -101: { // 账号未登录
878
+ // 输出日志
879
+ this.logger.error('账号未登录,插件已停止工作,请登录后,输入指令 sys start 启动插件');
880
+ // 发送私聊消息
881
+ await this.sendPrivateMsg(bot, '账号未登录,插件已停止工作,请登录后,输入指令 sys start 启动插件');
882
+ // 停止服务
883
+ await ctx.sm.disposePlugin();
884
+ // 结束循环
885
+ break;
886
+ }
887
+ case -352: { // 风控
888
+ // 输出日志
889
+ this.logger.error('账号被风控,插件已停止工作,请确认风控解除后,输入指令 sys start 启动插件');
890
+ // 发送私聊消息
891
+ await this.sendPrivateMsg(bot, '账号被风控,插件已停止工作,请确认风控解除后,输入指令 sys start 启动插件');
892
+ // 停止服务
893
+ await ctx.sm.disposePlugin();
894
+ // 结束循环
895
+ break;
896
+ }
897
+ case 4101128:
898
+ case 4101129: { // 获取动态信息错误
899
+ // 输出日志
900
+ this.logger.error('获取动态信息错误,错误码为:' + content.code + ',错误为:' + content.message);
901
+ // 发送私聊消息
902
+ await this.sendPrivateMsg(bot, '获取动态信息错误,错误码为:' + content.code + ',错误为:' + content.message); // 未知错误
903
+ // 结束循环
904
+ break;
905
+ }
906
+ default: { // 未知错误
907
+ // 发送私聊消息
908
+ await this.sendPrivateMsg(bot, '获取动态信息错误,错误码为:' + content.code + ',错误为:' + content.message); // 未知错误
909
+ // 取消订阅
910
+ this.unsubAll(ctx, bot, uid);
911
+ // 结束循环
912
+ break;
888
913
  }
889
- break;
890
914
  }
891
- case 0: timePoint = items[num].modules.module_author.pub_ts;
892
915
  }
893
- };
894
- // 发送请求 默认只查看配置文件规定数量的数据
895
- for (let num = this.config.dynamicCheckNumber - 1; num >= 0; num--) {
896
- // 没有动态内容则直接跳过
897
- if (!items[num])
898
- continue;
899
- // 寻找发布时间比时间点更晚的动态
900
- if (items[num].modules.module_author.pub_ts > timePoint) {
901
- // 定义变量
902
- let pic;
903
- let buffer;
904
- // 从动态数据中取出UP主名称和动态ID
905
- const upName = content.data.items[num].modules.module_author.name;
906
- const dynamicId = content.data.items[num].id_str;
907
- // 推送该条动态
908
- const attempts = 3;
909
- for (let i = 0; i < attempts; i++) {
910
- // 获取动态推送图片
911
- try {
912
- // 渲染图片
913
- const { pic: gimgPic, buffer: gimgBuffer } = await ctx.gi.generateDynamicImg(items[num]);
914
- // 赋值
915
- pic = gimgPic;
916
- buffer = gimgBuffer;
917
- // 成功则跳出循环
916
+ // 获取数据内容
917
+ const items = content.data.items;
918
+ // 定义方法:更新时间点为最新发布动态的发布时间
919
+ const updatePoint = (num) => {
920
+ switch (num) {
921
+ case 1: {
922
+ if (items[0].modules.module_tag) { // 存在置顶动态
923
+ timePoint = items[num].modules.module_author.pub_ts;
924
+ }
918
925
  break;
919
926
  }
920
- catch (e) {
921
- // 直播开播动态,不做处理
922
- if (e.message === '直播开播动态,不做处理')
923
- return updatePoint(num);
924
- if (e.message === '出现关键词,屏蔽该动态') {
925
- // 如果需要发送才发送
926
- this.config.filter.notify && await this.sendMsg(guildId, bot, `${upName}发布了一条含有屏蔽关键字的动态`);
927
- return updatePoint(num);
928
- }
929
- if (e.message === '已屏蔽转发动态') {
930
- this.config.filter.notify && await this.sendMsg(guildId, bot, `${upName}发布了一条转发动态,已屏蔽`);
931
- return updatePoint(num);
927
+ case 0: timePoint = items[num].modules.module_author.pub_ts;
928
+ }
929
+ };
930
+ // 发送请求 默认只查看配置文件规定数量的数据
931
+ for (let num = this.config.dynamicCheckNumber - 1; num >= 0; num--) {
932
+ // 没有动态内容则直接跳过
933
+ if (!items[num])
934
+ continue;
935
+ // 寻找发布时间比时间点更晚的动态
936
+ if (items[num].modules.module_author.pub_ts > timePoint) {
937
+ // 定义变量
938
+ let pic;
939
+ let buffer;
940
+ // 从动态数据中取出UP主名称和动态ID
941
+ const upName = content.data.items[num].modules.module_author.name;
942
+ const dynamicId = content.data.items[num].id_str;
943
+ // 推送该条动态
944
+ const attempts = 3;
945
+ for (let i = 0; i < attempts; i++) {
946
+ // 获取动态推送图片
947
+ try {
948
+ // 渲染图片
949
+ const { pic: gimgPic, buffer: gimgBuffer } = await ctx.gi.generateDynamicImg(items[num]);
950
+ // 赋值
951
+ pic = gimgPic;
952
+ buffer = gimgBuffer;
953
+ // 成功则跳出循环
954
+ break;
932
955
  }
933
- // 未知错误
934
- if (i === attempts - 1) {
935
- this.logger.error('dynamicDetect generateDynamicImg() 推送卡片发送失败,原因:' + e.message);
936
- // 发送私聊消息并重启服务
937
- return await this.sendPrivateMsgAndRebootService(ctx, bot, '插件可能出现某些未知错误,请尝试重启插件,如果仍然发生该错误,请带着日志向作者反馈');
956
+ catch (e) {
957
+ // 直播开播动态,不做处理
958
+ if (e.message === '直播开播动态,不做处理')
959
+ return updatePoint(num);
960
+ if (e.message === '出现关键词,屏蔽该动态') {
961
+ // 如果需要发送才发送
962
+ if (this.config.filter.notify) {
963
+ await this.sendMsg(guildId, bot, `${upName}发布了一条含有屏蔽关键字的动态`);
964
+ }
965
+ return updatePoint(num);
966
+ }
967
+ if (e.message === '已屏蔽转发动态') {
968
+ if (this.config.filter.notify) {
969
+ await this.sendMsg(guildId, bot, `${upName}发布了一条转发动态,已屏蔽`);
970
+ }
971
+ return updatePoint(num);
972
+ }
973
+ // 未知错误
974
+ if (i === attempts - 1) {
975
+ this.logger.error('dynamicDetect generateDynamicImg() 推送卡片发送失败,原因:' + e.message);
976
+ // 发送私聊消息并重启服务
977
+ return await this.sendPrivateMsgAndStopService(ctx, bot);
978
+ }
938
979
  }
939
980
  }
981
+ // 判断是否需要发送URL
982
+ const dUrl = this.config.dynamicUrl ? `${upName}发布了一条动态:https://t.bilibili.com/${dynamicId}` : '';
983
+ // 如果pic存在,则直接返回pic
984
+ if (pic) {
985
+ this.logger.info('推送动态中,使用render模式');
986
+ // pic存在,使用的是render模式
987
+ await this.sendMsg(guildId, bot, pic + (0, jsx_runtime_1.jsx)(jsx_runtime_1.Fragment, { children: dUrl }));
988
+ }
989
+ else if (buffer) {
990
+ this.logger.info('推送动态中,使用page模式');
991
+ // pic不存在,说明使用的是page模式
992
+ await this.sendMsg(guildId, bot, (0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [koishi_1.h.image(buffer, 'image/png'), dUrl] }));
993
+ }
994
+ else {
995
+ this.logger.info(items[num].modules.module_author.name + '发布了一条动态,但是推送失败');
996
+ }
997
+ // 更新时间点
998
+ updatePoint(num);
940
999
  }
941
- // 判断是否需要发送URL
942
- const dUrl = this.config.dynamicUrl ? `${upName}发布了一条动态:https://t.bilibili.com/${dynamicId}` : '';
943
- // 如果pic存在,则直接返回pic
944
- if (pic) {
945
- this.logger.info('推送动态中,使用render模式');
946
- // pic存在,使用的是render模式
947
- await this.sendMsg(guildId, bot, pic + (0, jsx_runtime_1.jsx)(jsx_runtime_1.Fragment, { children: dUrl }));
948
- }
949
- else if (buffer) {
950
- this.logger.info('推送动态中,使用page模式');
951
- // pic不存在,说明使用的是page模式
952
- await this.sendMsg(guildId, bot, (0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [koishi_1.h.image(buffer, 'image/png'), dUrl] }));
953
- }
954
- else {
955
- this.logger.info(items[num].modules.module_author.name + '发布了一条动态,但是推送失败');
956
- }
957
- // 更新时间点
958
- updatePoint(num);
959
1000
  }
960
1001
  }
1002
+ finally {
1003
+ flag = true;
1004
+ }
961
1005
  };
962
1006
  }
963
1007
  debug_dynamicDetect(ctx, bot, uid, guildId) {
964
1008
  let firstSubscription = true;
965
1009
  let timePoint;
1010
+ // 相当于锁的作用,防止上一个循环没处理完
1011
+ let flag = true;
966
1012
  return async () => {
967
- // 第一次订阅判断
968
- if (firstSubscription) {
969
- this.logger.info(`UID:${uid}-动态监测开始`);
970
- // 设置第一次的时间点
971
- timePoint = ctx.ba.getTimeOfUTC8();
972
- // 设置第一次为false
973
- firstSubscription = false;
1013
+ // 判断上一个循环是否完成
1014
+ if (!flag)
974
1015
  return;
975
- }
976
- this.logger.info(`UID:${uid}-获取动态信息中`);
977
- // 获取用户空间动态数据
978
- let content;
1016
+ flag = false;
1017
+ // 无论是否执行成功都要释放锁
979
1018
  try {
980
- content = await ctx.ba.getUserSpaceDynamic(uid);
981
- }
982
- catch (e) {
983
- return this.logger.error(`UID:${uid}-dynamicDetect getUserSpaceDynamic() 发生了错误,错误为:${e.message}`);
984
- }
985
- this.logger.info(`UID:${uid}-判断动态信息是否正确`);
986
- // 判断是否出现其他问题
987
- if (content.code !== 0) {
988
- switch (content.code) {
989
- case -101: { // 账号未登录
990
- // 输出日志
991
- this.logger.error('账号未登录,插件已停止工作,请登录后,输入指令 sys start 启动插件');
992
- // 发送私聊消息
993
- await this.sendPrivateMsg(bot, '账号未登录,插件已停止工作,请登录后,输入指令 sys start 启动插件');
994
- // 停止服务
995
- await ctx.sm.disposePlugin();
996
- // 结束循环
997
- break;
998
- }
999
- case -352: { // 风控
1000
- // 输出日志
1001
- this.logger.error('账号被风控,插件已停止工作,请确认风控解除后,输入指令 sys start 启动插件');
1002
- // 发送私聊消息
1003
- await this.sendPrivateMsg(bot, '账号被风控,插件已停止工作,请确认风控解除后,输入指令 sys start 启动插件');
1004
- // 停止服务
1005
- await ctx.sm.disposePlugin();
1006
- // 结束循环
1007
- break;
1008
- }
1009
- case 4101128:
1010
- case 4101129: { // 获取动态信息错误
1011
- // 输出日志
1012
- this.logger.error('获取动态信息错误,错误码为:' + content.code + ',错误为:' + content.message);
1013
- // 发送私聊消息
1014
- await this.sendPrivateMsg(bot, '获取动态信息错误,错误码为:' + content.code + ',错误为:' + content.message); // 未知错误
1015
- // 结束循环
1016
- break;
1017
- }
1018
- default: { // 未知错误
1019
- // 发送私聊消息
1020
- await this.sendPrivateMsg(bot, '获取动态信息错误,错误码为:' + content.code + ',错误为:' + content.message); // 未知错误
1021
- // 取消订阅
1022
- this.unsubAll(ctx, bot, uid);
1023
- // 结束循环
1024
- break;
1025
- }
1019
+ // 第一次订阅判断
1020
+ if (firstSubscription) {
1021
+ this.logger.info(`UID:${uid}-动态监测开始`);
1022
+ // 设置第一次的时间点
1023
+ timePoint = ctx.ba.getTimeOfUTC8();
1024
+ // 设置第一次为false
1025
+ firstSubscription = false;
1026
+ return;
1026
1027
  }
1027
- }
1028
- // 获取数据内容
1029
- const items = content.data.items;
1030
- this.logger.info(`UID:${uid}-获取到的动态信息:${items.map(v => v.basic.rid_str).join('、')}`);
1031
- // 定义方法:更新时间点为最新发布动态的发布时间
1032
- const updatePoint = (num) => {
1033
- switch (num) {
1034
- case 1: {
1035
- if (items[0].modules.module_tag) { // 存在置顶动态
1036
- timePoint = items[num].modules.module_author.pub_ts;
1028
+ this.logger.info(`UID:${uid}-获取动态信息中`);
1029
+ // 获取用户空间动态数据
1030
+ let content;
1031
+ try {
1032
+ content = await ctx.ba.getUserSpaceDynamic(uid);
1033
+ }
1034
+ catch (e) {
1035
+ return this.logger.error(`UID:${uid}-dynamicDetect getUserSpaceDynamic() 发生了错误,错误为:${e.message}`);
1036
+ }
1037
+ this.logger.info(`UID:${uid}-判断动态信息是否正确`);
1038
+ // 判断是否出现其他问题
1039
+ if (content.code !== 0) {
1040
+ switch (content.code) {
1041
+ case -101: { // 账号未登录
1042
+ // 输出日志
1043
+ this.logger.error('账号未登录,插件已停止工作,请登录后,输入指令 sys start 启动插件');
1044
+ // 发送私聊消息
1045
+ await this.sendPrivateMsg(bot, '账号未登录,插件已停止工作,请登录后,输入指令 sys start 启动插件');
1046
+ // 停止服务
1047
+ await ctx.sm.disposePlugin();
1048
+ // 结束循环
1049
+ break;
1050
+ }
1051
+ case -352: { // 风控
1052
+ // 输出日志
1053
+ this.logger.error('账号被风控,插件已停止工作,请确认风控解除后,输入指令 sys start 启动插件');
1054
+ // 发送私聊消息
1055
+ await this.sendPrivateMsg(bot, '账号被风控,插件已停止工作,请确认风控解除后,输入指令 sys start 启动插件');
1056
+ // 停止服务
1057
+ await ctx.sm.disposePlugin();
1058
+ // 结束循环
1059
+ break;
1060
+ }
1061
+ case 4101128:
1062
+ case 4101129: { // 获取动态信息错误
1063
+ // 输出日志
1064
+ this.logger.error('获取动态信息错误,错误码为:' + content.code + ',错误为:' + content.message);
1065
+ // 发送私聊消息
1066
+ await this.sendPrivateMsg(bot, '获取动态信息错误,错误码为:' + content.code + ',错误为:' + content.message); // 未知错误
1067
+ // 结束循环
1068
+ break;
1069
+ }
1070
+ default: { // 未知错误
1071
+ // 发送私聊消息
1072
+ await this.sendPrivateMsg(bot, '获取动态信息错误,错误码为:' + content.code + ',错误为:' + content.message); // 未知错误
1073
+ // 取消订阅
1074
+ this.unsubAll(ctx, bot, uid);
1075
+ // 结束循环
1076
+ break;
1037
1077
  }
1038
- break;
1039
1078
  }
1040
- case 0: timePoint = items[num].modules.module_author.pub_ts;
1041
1079
  }
1042
- };
1043
- // 发送请求 默认只查看配置文件规定数量的数据
1044
- for (let num = this.config.dynamicCheckNumber - 1; num >= 0; num--) {
1045
- // 没有动态内容则直接跳过
1046
- if (!items[num])
1047
- continue;
1048
- // 寻找发布时间比时间点更晚的动态
1049
- if (items[num].modules.module_author.pub_ts > timePoint) {
1050
- this.logger.info(`UID:${uid}-即将推送的动态:${items[num].basic.rid_str}`);
1051
- // 定义变量
1052
- let pic;
1053
- let buffer;
1054
- // 从动态数据中取出UP主名称和动态ID
1055
- const upName = content.data.items[num].modules.module_author.name;
1056
- const dynamicId = content.data.items[num].id_str;
1057
- // 推送该条动态
1058
- const attempts = 3;
1059
- this.logger.info(`UID:${uid}-尝试渲染推送图片`);
1060
- for (let i = 0; i < attempts; i++) {
1061
- // 获取动态推送图片
1062
- try {
1063
- // 渲染图片
1064
- const { pic: gimgPic, buffer: gimgBuffer } = await ctx.gi.generateDynamicImg(items[num]);
1065
- // 赋值
1066
- pic = gimgPic;
1067
- buffer = gimgBuffer;
1068
- // 成功则跳出循环
1080
+ // 获取数据内容
1081
+ const items = content.data.items;
1082
+ this.logger.info(`UID:${uid}-获取到的动态信息:${items.map(v => v.basic.rid_str).join('、')}`);
1083
+ // 定义方法:更新时间点为最新发布动态的发布时间
1084
+ const updatePoint = (num) => {
1085
+ switch (num) {
1086
+ case 1: {
1087
+ if (items[0].modules.module_tag) { // 存在置顶动态
1088
+ timePoint = items[num].modules.module_author.pub_ts;
1089
+ }
1069
1090
  break;
1070
1091
  }
1071
- catch (e) {
1072
- // 直播开播动态,不做处理
1073
- if (e.message === '直播开播动态,不做处理')
1074
- return updatePoint(num);
1075
- if (e.message === '出现关键词,屏蔽该动态') {
1076
- // 如果需要发送才发送
1077
- this.config.filter.notify && await this.sendMsg(guildId, bot, `${upName}发布了一条含有屏蔽关键字的动态`);
1078
- return updatePoint(num);
1079
- }
1080
- if (e.message === '已屏蔽转发动态') {
1081
- this.config.filter.notify && await this.sendMsg(guildId, bot, `${upName}发布了一条转发动态,已屏蔽`);
1082
- return updatePoint(num);
1092
+ case 0: timePoint = items[num].modules.module_author.pub_ts;
1093
+ }
1094
+ };
1095
+ // 发送请求 默认只查看配置文件规定数量的数据
1096
+ for (let num = this.config.dynamicCheckNumber - 1; num >= 0; num--) {
1097
+ // 没有动态内容则直接跳过
1098
+ if (!items[num])
1099
+ continue;
1100
+ // 寻找发布时间比时间点更晚的动态
1101
+ if (items[num].modules.module_author.pub_ts > timePoint) {
1102
+ this.logger.info(`UID:${uid}-即将推送的动态:${items[num].basic.rid_str}`);
1103
+ // 定义变量
1104
+ let pic;
1105
+ let buffer;
1106
+ // 从动态数据中取出UP主名称和动态ID
1107
+ const upName = content.data.items[num].modules.module_author.name;
1108
+ const dynamicId = content.data.items[num].id_str;
1109
+ // 推送该条动态
1110
+ const attempts = 3;
1111
+ this.logger.info(`UID:${uid}-尝试渲染推送图片`);
1112
+ for (let i = 0; i < attempts; i++) {
1113
+ // 获取动态推送图片
1114
+ try {
1115
+ // 渲染图片
1116
+ const { pic: gimgPic, buffer: gimgBuffer } = await ctx.gi.generateDynamicImg(items[num]);
1117
+ // 赋值
1118
+ pic = gimgPic;
1119
+ buffer = gimgBuffer;
1120
+ // 成功则跳出循环
1121
+ break;
1083
1122
  }
1084
- // 未知错误
1085
- if (i === attempts - 1) {
1086
- this.logger.error('dynamicDetect generateDynamicImg() 推送卡片发送失败,原因:' + e.message);
1087
- // 发送私聊消息并重启服务
1088
- return await this.sendPrivateMsgAndRebootService(ctx, bot, '插件可能出现某些未知错误,请尝试重启插件,如果仍然发生该错误,请带着日志向作者反馈');
1123
+ catch (e) {
1124
+ // 直播开播动态,不做处理
1125
+ if (e.message === '直播开播动态,不做处理')
1126
+ return updatePoint(num);
1127
+ if (e.message === '出现关键词,屏蔽该动态') {
1128
+ // 如果需要发送才发送
1129
+ if (this.config.filter.notify) {
1130
+ await this.sendMsg(guildId, bot, `${upName}发布了一条含有屏蔽关键字的动态`);
1131
+ }
1132
+ return updatePoint(num);
1133
+ }
1134
+ if (e.message === '已屏蔽转发动态') {
1135
+ if (this.config.filter.notify) {
1136
+ await this.sendMsg(guildId, bot, `${upName}发布了一条转发动态,已屏蔽`);
1137
+ }
1138
+ return updatePoint(num);
1139
+ }
1140
+ // 未知错误
1141
+ if (i === attempts - 1) {
1142
+ this.logger.error('dynamicDetect generateDynamicImg() 推送卡片发送失败,原因:' + e.message);
1143
+ // 发送私聊消息并重启服务
1144
+ return await this.sendPrivateMsgAndStopService(ctx, bot);
1145
+ }
1089
1146
  }
1090
1147
  }
1148
+ this.logger.info(`UID:${uid}-尝试推送动态卡片`);
1149
+ // 判断是否需要发送URL
1150
+ const dUrl = this.config.dynamicUrl ? `${upName}发布了一条动态:https://t.bilibili.com/${dynamicId}` : '';
1151
+ // 如果pic存在,则直接返回pic
1152
+ if (pic) {
1153
+ this.logger.info(`UID:${uid}-推送动态中,使用render模式`);
1154
+ // pic存在,使用的是render模式
1155
+ await this.sendMsg(guildId, bot, pic + (0, jsx_runtime_1.jsx)(jsx_runtime_1.Fragment, { children: dUrl }));
1156
+ }
1157
+ else if (buffer) {
1158
+ this.logger.info(`UID:${uid}-推送动态中,使用page模式`);
1159
+ // pic不存在,说明使用的是page模式
1160
+ await this.sendMsg(guildId, bot, (0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [koishi_1.h.image(buffer, 'image/png'), dUrl] }));
1161
+ }
1162
+ else {
1163
+ this.logger.info(items[num].modules.module_author.name + '发布了一条动态,但是推送失败');
1164
+ }
1165
+ // 更新时间点
1166
+ updatePoint(num);
1167
+ this.logger.info(`UID:${uid}-推送动态完成`);
1091
1168
  }
1092
- this.logger.info(`UID:${uid}-尝试推送动态卡片`);
1093
- // 判断是否需要发送URL
1094
- const dUrl = this.config.dynamicUrl ? `${upName}发布了一条动态:https://t.bilibili.com/${dynamicId}` : '';
1095
- // 如果pic存在,则直接返回pic
1096
- if (pic) {
1097
- this.logger.info(`UID:${uid}-推送动态中,使用render模式`);
1098
- // pic存在,使用的是render模式
1099
- await this.sendMsg(guildId, bot, pic + (0, jsx_runtime_1.jsx)(jsx_runtime_1.Fragment, { children: dUrl }));
1100
- }
1101
- else if (buffer) {
1102
- this.logger.info(`UID:${uid}-推送动态中,使用page模式`);
1103
- // pic不存在,说明使用的是page模式
1104
- await this.sendMsg(guildId, bot, (0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [koishi_1.h.image(buffer, 'image/png'), dUrl] }));
1105
- }
1106
- else {
1107
- this.logger.info(items[num].modules.module_author.name + '发布了一条动态,但是推送失败');
1108
- }
1109
- // 更新时间点
1110
- updatePoint(num);
1111
- this.logger.info(`UID:${uid}-推送动态完成`);
1112
1169
  }
1113
1170
  }
1171
+ finally {
1172
+ flag = true;
1173
+ }
1114
1174
  };
1115
1175
  }
1116
1176
  liveDetect(ctx, bot, roomId, guildId) {
@@ -1145,7 +1205,8 @@ class ComRegister {
1145
1205
  catch (e) {
1146
1206
  if (i === attempts - 1) { // 已尝试三次
1147
1207
  this.logger.error('liveDetect generateLiveImg() 推送卡片生成失败,原因:' + e.message);
1148
- return await this.sendPrivateMsgAndRebootService(ctx, bot, '插件可能出现某些未知错误,请尝试重启插件,如果仍然发生该错误,请带着日志向作者反馈');
1208
+ // 发送私聊消息并重启服务
1209
+ return await this.sendPrivateMsgAndStopService(ctx, bot);
1149
1210
  }
1150
1211
  }
1151
1212
  }
@@ -1180,7 +1241,8 @@ class ComRegister {
1180
1241
  catch (e) {
1181
1242
  if (i === attempts - 1) { // 已尝试三次
1182
1243
  this.logger.error('liveDetect generateLiveImg() 推送卡片生成失败,原因:' + e.message);
1183
- return await this.sendPrivateMsgAndRebootService(ctx, bot, '插件可能出现某些未知错误,请尝试重启插件,如果仍然发生该错误,请带着日志向作者反馈');
1244
+ // 发送私聊消息并重启服务
1245
+ return await this.sendPrivateMsgAndStopService(ctx, bot);
1184
1246
  }
1185
1247
  }
1186
1248
  }
@@ -1212,11 +1274,12 @@ class ComRegister {
1212
1274
  };
1213
1275
  }
1214
1276
  return async () => {
1277
+ // 如果flag为false则说明前面的代码还未执行完,则直接返回
1278
+ if (!flag)
1279
+ return;
1280
+ flag = false;
1281
+ // 无论是否执行成功都要释放锁
1215
1282
  try {
1216
- // 如果flag为false则说明前面的代码还未执行完,则直接返回
1217
- if (!flag)
1218
- return;
1219
- flag = false;
1220
1283
  // 发送请求检测直播状态
1221
1284
  let content;
1222
1285
  const attempts = 3;
@@ -1230,7 +1293,8 @@ class ComRegister {
1230
1293
  catch (e) {
1231
1294
  this.logger.error('liveDetect getLiveRoomInfo 发生了错误,错误为:' + e.message);
1232
1295
  if (i === attempts - 1) { // 已尝试三次
1233
- return await this.sendPrivateMsgAndRebootService(ctx, bot, '插件可能出现某些未知错误,请尝试重启插件,如果仍然发生该错误,请带着日志向作者反馈');
1296
+ // 发送私聊消息并重启服务
1297
+ return await this.sendPrivateMsgAndStopService(ctx, bot);
1234
1298
  }
1235
1299
  }
1236
1300
  }
@@ -1250,7 +1314,8 @@ class ComRegister {
1250
1314
  catch (e) {
1251
1315
  this.logger.error('liveDetect getMasterInfo() 发生了错误,错误为:' + e.message);
1252
1316
  if (i === attempts - 1) { // 已尝试三次
1253
- return await this.sendPrivateMsgAndRebootService(ctx, bot, '插件可能出现某些未知错误,请尝试重启插件,如果仍然发生该错误,请带着日志向作者反馈');
1317
+ // 发送私聊消息并重启服务
1318
+ return await this.sendPrivateMsgAndStopService(ctx, bot);
1254
1319
  }
1255
1320
  }
1256
1321
  }
@@ -1282,8 +1347,8 @@ class ComRegister {
1282
1347
  let resizedImage;
1283
1348
  // Jimp无法处理Webp格式,直接跳过
1284
1349
  try {
1285
- resizedImage = await jimp_1.default.read(userface).then(async (image) => {
1286
- return await image.resize(100, 100).getBufferAsync(jimp_1.default.MIME_PNG);
1350
+ resizedImage = await jimp_1.Jimp.read(userface).then(async (image) => {
1351
+ return await image.resize({ w: 100, h: 100 }).getBuffer(jimp_1.JimpMime.png);
1287
1352
  });
1288
1353
  }
1289
1354
  catch (e) {
@@ -1317,7 +1382,8 @@ class ComRegister {
1317
1382
  catch (e) {
1318
1383
  this.logger.error('liveDetect open getMasterInfo() 发生了错误,错误为:' + e.message);
1319
1384
  if (i === attempts - 1) { // 已尝试三次
1320
- return await this.sendPrivateMsgAndRebootService(ctx, bot, '插件可能出现某些未知错误,请尝试重启插件,如果仍然发生该错误,请带着日志向作者反馈');
1385
+ // 发送私聊消息并重启服务
1386
+ return await this.sendPrivateMsgAndStopService(ctx, bot);
1321
1387
  }
1322
1388
  }
1323
1389
  }
@@ -1403,7 +1469,8 @@ class ComRegister {
1403
1469
  }
1404
1470
  updateSubNotifier(ctx) {
1405
1471
  // 更新控制台提示
1406
- this.subNotifier && this.subNotifier.dispose();
1472
+ if (this.subNotifier)
1473
+ this.subNotifier.dispose();
1407
1474
  // 获取订阅信息
1408
1475
  const subInfo = this.subShow();
1409
1476
  // 定义table
@@ -1525,7 +1592,8 @@ class ComRegister {
1525
1592
  catch (e) {
1526
1593
  this.logger.error('getSubFromDatabase() getUserInfo() 发生了错误,错误为:' + e.message);
1527
1594
  if (i === attempts - 1) { // 已尝试三次
1528
- return await this.sendPrivateMsgAndRebootService(ctx, bot, '你的网络可能出现了某些问题,请检查后重启插件');
1595
+ // 发送私聊消息并重启服务
1596
+ return await this.sendPrivateMsgAndStopService(ctx, bot);
1529
1597
  }
1530
1598
  }
1531
1599
  }
@@ -1628,7 +1696,8 @@ class ComRegister {
1628
1696
  if (index === -1)
1629
1697
  return '未订阅该用户,无需取消订阅';
1630
1698
  // 取消订阅
1631
- this.subManager[index].live && this.subManager[index].liveDispose();
1699
+ if (this.subManager[index].live)
1700
+ this.subManager[index].liveDispose();
1632
1701
  this.subManager[index].liveDispose = null;
1633
1702
  this.subManager[index].live = false;
1634
1703
  // 如果没有对这个UP的任何订阅,则移除
@@ -1647,7 +1716,8 @@ class ComRegister {
1647
1716
  if (index === -1)
1648
1717
  return '未订阅该用户,无需取消订阅';
1649
1718
  // 取消订阅
1650
- this.subManager[index].dynamic && this.subManager[index].dynamicDispose();
1719
+ if (this.subManager[index].dynamic)
1720
+ this.subManager[index].dynamicDispose();
1651
1721
  this.subManager[index].dynamicDispose = null;
1652
1722
  this.subManager[index].dynamic = false;
1653
1723
  // 如果没有对这个UP的任何订阅,则移除
package/lib/index.d.ts CHANGED
@@ -42,12 +42,11 @@ declare class ServerManager extends Service {
42
42
  servers: ForkScope[];
43
43
  renderType: number;
44
44
  dynamicLoopTime: number;
45
- restartCount: number;
46
45
  constructor(ctx: Context);
47
46
  protected start(): void | Promise<void>;
48
47
  registerPlugin: () => Promise<boolean>;
49
48
  disposePlugin: () => Promise<boolean>;
50
- restartPlugin: (count?: boolean) => Promise<boolean>;
49
+ restartPlugin: () => Promise<boolean>;
51
50
  }
52
51
  export declare function apply(ctx: Context, config: Config): void;
53
52
  export {};
package/lib/index.js CHANGED
@@ -28,7 +28,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
28
28
  Object.defineProperty(exports, "__esModule", { value: true });
29
29
  exports.Config = exports.name = exports.inject = void 0;
30
30
  exports.apply = apply;
31
- /* eslint-disable @typescript-eslint/ban-types */
31
+ /* eslint-disable @typescript-eslint/no-empty-object-type */
32
32
  const koishi_1 = require("koishi");
33
33
  // import plugins
34
34
  // import Authority from './authority'
@@ -178,8 +178,6 @@ class ServerManager extends koishi_1.Service {
178
178
  renderType;
179
179
  // 动态循环时间
180
180
  dynamicLoopTime;
181
- // 重启次数
182
- restartCount = 0;
183
181
  constructor(ctx) {
184
182
  super(ctx, 'sm');
185
183
  // 插件运行相关指令
@@ -313,29 +311,25 @@ class ServerManager extends koishi_1.Service {
313
311
  // 成功返回true
314
312
  return true;
315
313
  };
316
- restartPlugin = async (count /* 是否需要计数 */) => {
314
+ restartPlugin = async () => {
317
315
  // 如果没有服务则返回false
318
316
  if (this.servers.length === 0)
319
317
  return false;
320
- // 如果需要计数
321
- if (count) {
322
- // 重启次数大于等于3次
323
- if (this.restartCount >= 3)
324
- return false;
325
- // 重启次数+1
326
- this.restartCount++;
327
- }
328
318
  // 停用插件
329
319
  await this.disposePlugin();
330
320
  // 隔一秒启动插件
331
- await new Promise(resolve => {
321
+ return new Promise(resolve => {
332
322
  this.ctx.setTimeout(async () => {
333
- await this.registerPlugin();
334
- resolve('ok');
323
+ try {
324
+ await this.registerPlugin();
325
+ }
326
+ catch (e) {
327
+ this.logger.error('重启插件失败', e);
328
+ resolve(false);
329
+ }
330
+ resolve(true);
335
331
  }, 1000);
336
332
  });
337
- // 成功返回true
338
- return true;
339
333
  };
340
334
  }
341
335
  function apply(ctx, config) {
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.3.5",
4
+ "version": "1.3.6-beta.0",
5
5
  "contributors": [
6
6
  "Akokko <admin@akokko.com>"
7
7
  ],
@@ -27,25 +27,25 @@
27
27
  "koishi": "^4.17.5"
28
28
  },
29
29
  "dependencies": {
30
- "axios": "^1.7.0-beta.1",
31
- "axios-cookiejar-support": "^5.0.2",
32
- "jimp": "^0.22.12",
33
- "jsdom": "^24.0.0",
34
- "luxon": "^3.4.4",
30
+ "axios": "^1.7.7",
31
+ "axios-cookiejar-support": "^5.0.3",
32
+ "jimp": "^1.6.0",
33
+ "jsdom": "^24.1.3",
34
+ "luxon": "^3.5.0",
35
35
  "md5": "^2.3.0",
36
- "qrcode": "^1.5.3",
36
+ "qrcode": "^1.5.4",
37
37
  "tough-cookie": "^4.1.4"
38
38
  },
39
39
  "devDependencies": {
40
- "@eslint/js": "^9.6.0",
41
- "@types/luxon": "^3",
42
- "@types/md5": "^2",
43
- "@types/qrcode": "^1",
44
- "@types/tough-cookie": "^4",
45
- "eslint": "9.x",
46
- "globals": "^15.6.0",
47
- "koishi-plugin-puppeteer": "^3.8.4",
48
- "typescript-eslint": "^7.14.1"
40
+ "@eslint/js": "^9.12.0",
41
+ "@types/luxon": "^3.4.2",
42
+ "@types/md5": "^2.3.5",
43
+ "@types/qrcode": "^1.5.5",
44
+ "@types/tough-cookie": "^4.0.5",
45
+ "eslint": "^9.12.0",
46
+ "globals": "^15.11.0",
47
+ "koishi-plugin-puppeteer": "^3.9.0",
48
+ "typescript-eslint": "^7.18.0"
49
49
  },
50
50
  "koishi": {
51
51
  "service": {
package/readme.md CHANGED
@@ -171,6 +171,8 @@
171
171
  - ver 1.3.3 新增直播推送人气信息展示
172
172
  - ver 1.3.4 新增消息推送失败是否自动重发的选项,修复了一些潜在的bug
173
173
  - ver 1.3.5 动态监测循环时间新增20分钟选项
174
+ - ver 1.3.6-alpha.0 修复bug:无限重复的报错提示
175
+ - ver 1.3.6-beta.0 取消出错自动重启插件功能
174
176
 
175
177
  ## 交流群
176
178