diff --git a/CHANGELOG.md b/CHANGELOG.md index d09f287..9c19323 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,7 @@ # 2.0.6 * 优化文字动态图片资源的发送 * 依赖升级 +* 新增哔哩直播动态@全体成员功能,开启前请检查机器人管理员权限和所在聊天类型是否支持 # 2.0.5 * 优化ck diff --git a/defaultConfig/bilibili/config.yaml b/defaultConfig/bilibili/config.yaml index e1a7442..e7588ed 100644 --- a/defaultConfig/bilibili/config.yaml +++ b/defaultConfig/bilibili/config.yaml @@ -1,7 +1,7 @@ # b站推送,1 开启 0 关闭,保留添加的相关数据,但是不再推送 pushStatus: 1 -# 检测b站动态的周期,Cron表达式,作用域共6位,具体方法浏览器搜索 “node-schedule cron表达式”,示例: +# 检测b站动态的冷却时间 CD,Cron表达式,作用域共6位,具体方法浏览器搜索 “node-schedule cron表达式”,示例: # "*/15 * * * *" #每15min检测一次 # "*/31 * * * *" #每31min检测一次 # "0 5,35 * * * *" #每小时固定第5分0秒、第35分0秒检测一次,共2次/h @@ -58,3 +58,9 @@ noSplitHeight: 7500 # 动态卡片分页截图高度,默认8000px(仅填数字,无需填入单位),请勿设置过大或过小。启用分片截图时生效。 splitHeight: 8000 + +# 直播动态是否@全体成员,默认 0 关闭,1 开启。开启前请检查 <机器人> 是否有 [管理员权限] 或 [聊天平台是否支持],某些聊天平台或类型不支持@全体成员,如qq官方机器人等。 +liveAtAll: 0 + +# 直播动态@全体成员的共享冷却时间CD,单位秒,默认 1800 秒(30分钟),即每个群聊30分钟内不论多少条直播动态,只会@一次。注意,qq群有 @全体成员 10次/日 的限制,所以请合理设置。 +liveAtAllCD: 1800 diff --git a/defaultConfig/weibo/config.yaml b/defaultConfig/weibo/config.yaml index b52101a..c78e18e 100644 --- a/defaultConfig/weibo/config.yaml +++ b/defaultConfig/weibo/config.yaml @@ -1,7 +1,7 @@ # 微博推送,1 开启 0 关闭,保留添加的相关数据,但是不再推送 pushStatus: 1 -# 检测微博动态的周期,Cron表达式,作用域共6位,具体方法浏览器搜索 “node-schedule cron表达式”,示例: +# 检测微博动态的冷却时间 CD,Cron表达式,作用域共6位,具体方法浏览器搜索 “node-schedule cron表达式”,示例: # "*/15 * * * *" #每15min检测一次 # "*/31 * * * *" #每31min检测一次 # "0 5,35 * * * *" #每小时固定第5分0秒、第35分0秒检测一次,共2次/h diff --git a/models/bilibili/bilibili.main.models.ts b/models/bilibili/bilibili.main.models.ts index 36dea34..cde7317 100644 --- a/models/bilibili/bilibili.main.models.ts +++ b/models/bilibili/bilibili.main.models.ts @@ -60,7 +60,7 @@ export async function applyLoginQRCode(e: any) { const { img } = qrCodeImage; qrCodeBufferArray = img; } - let msg: string[] = []; + let msg: any[] = []; if (qrCodeBufferArray.length === 0) { msg.push('渲染二维码图片失败,请查看终端输出的实时日志,\n复制哔哩登陆二维码URL,使用在线或本地二维码生成工具生成二维码并扫码。'); } else { diff --git a/models/bilibili/bilibili.main.query.ts b/models/bilibili/bilibili.main.query.ts index 452a61a..e607292 100644 --- a/models/bilibili/bilibili.main.query.ts +++ b/models/bilibili/bilibili.main.query.ts @@ -430,6 +430,7 @@ export class BiliQuery { content: any, dynamicTitle: any; let title = `B站【${upName}】动态推送:\n`; + let dynamicType: string = data.type; switch (data.type) { case 'DYNAMIC_TYPE_AV': @@ -450,7 +451,7 @@ export class BiliQuery { pics = [segment.image(desc?.cover)]; - return { msg, pics }; + return { msg, pics, dynamicType }; case 'DYNAMIC_TYPE_WORD': // 处理文字动态 @@ -482,7 +483,7 @@ export class BiliQuery { `时间:${author ? moment(author.pub_ts * 1000).format('YYYY年MM月DD日 HH:mm:ss') : ''}` ]; - return { msg, pics }; + return { msg, pics, dynamicType }; case 'DYNAMIC_TYPE_DRAW': // 处理图文动态 @@ -532,7 +533,7 @@ export class BiliQuery { `时间:${author ? moment(author.pub_ts * 1000).format('YYYY年MM月DD日 HH:mm:ss') : ''}` ]; - return { msg, pics }; + return { msg, pics, dynamicType }; case 'DYNAMIC_TYPE_ARTICLE': // 处理文章动态 @@ -577,7 +578,7 @@ export class BiliQuery { `时间:${author ? moment(author.pub_ts * 1000).format('YYYY年MM月DD日 HH:mm:ss') : ''}` ]; - return { msg, pics }; + return { msg, pics, dynamicType }; case 'DYNAMIC_TYPE_FORWARD': // 处理转发动态 @@ -610,7 +611,7 @@ export class BiliQuery { ...origContent ]; - return { msg, pics }; + return { msg, pics, dynamicType }; case 'DYNAMIC_TYPE_LIVE_RCMD': // 处理直播动态 @@ -623,7 +624,7 @@ export class BiliQuery { msg = [title, `-----------------------------\n`, `标题:${desc.title}\n`, `链接:https:${desc.link}`]; pics = [segment.image(desc.cover)]; - return { msg, pics }; + return { msg, pics, dynamicType }; default: // 处理未定义的动态类型 diff --git a/models/bilibili/bilibili.main.task.ts b/models/bilibili/bilibili.main.task.ts index 3452e8e..3382915 100644 --- a/models/bilibili/bilibili.main.task.ts +++ b/models/bilibili/bilibili.main.task.ts @@ -208,6 +208,10 @@ export class BiliTask { } if (sended) return; // 如果已经发送过,则直接返回 + let liveAtAll: boolean = biliConfigData.liveAtAll === true ? true : false; // 直播动态是否@全体成员,默认false + let liveAtAllCD: number = biliConfigData.liveAtAllCD || 1800; // 直播动态@全体成员 冷却时间CD,默认 30 分钟 + let liveAtAllMark: number | string = await redis.get(`${markKey}${chatId}:liveAtAllMark`); // 直播动态@全体成员标记,默认 0 + if (!!biliConfigData.pushMsgMode) { const { data, uid } = await BiliQuery.formatDynamicData(pushDynamicData); // 处理动态数据 const extentData = { ...data }; @@ -246,6 +250,16 @@ export class BiliTask { (logger ?? Bot.logger)?.mark('优纪插件:B站动态执行推送'); + if (liveAtAll && liveAtAllMark && extentData?.type === 'DYNAMIC_TYPE_LIVE_RCMD') { + try { + await this.sendMessage(chatId, bot_id, chatType, segment.at('all')); + await redis.set(`${markKey}${chatId}:liveAtAllMark`, 1, { EX: liveAtAllCD }); // 设置直播动态@全体成员标记为 1 + } catch (error) { + logger.error(`直播动态发送@全体成员失败,请检查 <机器人> 是否有 [管理员权限] 或 [聊天平台是否支持] :${error}`); + await this.sendMessage(chatId, bot_id, chatType, ['直播动态发送@全体成员失败,请检查权限或平台是否支持']); + } + } + for (let i = 0; i < imgs.length; i++) { const image: Buffer = imgs[i]; await this.sendMessage(chatId, bot_id, chatType, segment.image(image)); @@ -273,8 +287,26 @@ export class BiliTask { let mergeTextPic: boolean = !!biliConfigData.mergeTextPic === false ? false : true; // 是否合并文本和图片,默认为 true if (mergeTextPic) { const mergeMsg = [...dynamicMsg.msg, ...dynamicMsg.pics]; + if (liveAtAll && liveAtAllMark && dynamicMsg.dynamicType === 'DYNAMIC_TYPE_LIVE_RCMD') { + try { + await this.sendMessage(chatId, bot_id, chatType, segment.at('all')); + await redis.set(`${markKey}${chatId}:liveAtAllMark`, 1, { EX: liveAtAllCD }); // 设置直播动态@全体成员标记为 1 + } catch (error) { + logger.error(`直播动态发送@全体成员失败,请检查 <机器人> 是否有 [管理员权限] 或 [聊天平台是否支持] :${error}`); + await this.sendMessage(chatId, bot_id, chatType, ['直播动态发送@全体成员失败,请检查权限或平台是否支持']); + } + } await this.sendMessage(chatId, bot_id, chatType, mergeMsg); } else { + if (liveAtAll && liveAtAllMark && dynamicMsg.dynamicType === 'DYNAMIC_TYPE_LIVE_RCMD') { + try { + await this.sendMessage(chatId, bot_id, chatType, segment.at('all')); + await redis.set(`${markKey}${chatId}:liveAtAllMark`, 1, { EX: liveAtAllCD }); // 设置直播动态@全体成员标记为 1 + } catch (error) { + logger.error(`直播动态发送@全体成员失败,请检查 <机器人> 是否有 [管理员权限] 或 [聊天平台是否支持] :${error}`); + await this.sendMessage(chatId, bot_id, chatType, ['直播动态发送@全体成员失败,请检查权限或平台是否支持']); + } + } await this.sendMessage(chatId, bot_id, chatType, dynamicMsg.msg); const pics = dynamicMsg.pics; if (pics && pics.length > 0) { diff --git a/package.json b/package.json index 5dc18f1..90a0d47 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "yuki-plugin", - "version": "2.0.6-4", + "version": "2.0.6-5", "author": "snowtafir", "description": "优纪插件,yunzai-V4 关于 微博推送、B站推送 等功能的拓展插件", "main": "./index",