diff --git a/env.example.js b/env.example.js index 1701832..846ca81 100644 --- a/env.example.js +++ b/env.example.js @@ -10,7 +10,7 @@ module.exports = Object.freeze({ * ## 高级功能 * - `ENABLE_CHAT_CAPTCHA_OCR` 开启评论验证码识别 使用方法见README * - `CHAT_CAPTCHA_OCR_URL` 验证码识别接口 POST `url`->`code` - * - `ENABLE_AI_JUDGE` 是否启用AI判断抽奖 + * - `ENABLE_AI_JUDGE` 是否启用AI判断抽奖过滤过期抽奖 * - `ENABLE_AI_COMMENTS` 是否启用AI评论 * * ## 调试相关 diff --git a/lib/core/monitor.js b/lib/core/monitor.js index 92572a1..eac3706 100644 --- a/lib/core/monitor.js +++ b/lib/core/monitor.js @@ -127,6 +127,13 @@ class Monitor extends Searcher { continue; } + if (hasEnv('ENABLE_AI_JUDGE') && lottery.drawtime !== -1 && lottery.drawtime < Date.now() / 1000) { + log.info('AI过滤', '已过开奖时间'); + d_storage.updateDyid(lottery.dyid); + await delay(filter_wait); + continue; + } + if (lottery.isOfficialLottery) { let { ts } = await bili.getLotteryNotice(lottery.dyid); const ts_10 = Date.now() / 1000; @@ -250,6 +257,7 @@ class Monitor extends Searcher { * @property {number[]} uid 用户标识 * @property {string} dyid 动态标识 * @property {boolean} isOfficialLottery 是否官方抽奖 + * @property {number} drawtime 开奖时间t10 * @property {string} relay_chat 转发词 * @property {string} ctrl 定位@ * @property {string} [rid] 评论标识 @@ -406,6 +414,7 @@ class Monitor extends Searcher { isSendChat = (hasOfficialLottery && chatmodel[0] === '1') || (!hasOfficialLottery && chatmodel[1] === '1'), + drawtime = -1, keys = [dyid, m_uid, ori_uid]; log.debug('筛选动态', { real_uid, mIsFollowed, oriIsFollowed, realIsFollowed, needAt, needTopic, type, isRelayDynamic, key_words, has_key_words, blockword, isBlock, isLottery, isSendChat }); @@ -465,10 +474,12 @@ class Monitor extends Searcher { let msg_json = JSON.parse(msg); has_key_words = msg_json.has_key_words; needAt = msg_json.needAt; + needTopic = msg_json.needTopic; + drawtime = msg_json.drawtime; isLottery = has_key_words; log.info('ai判断抽奖', msg_json.more); } catch (_) { - log.error('ai判断抽奖', '未返回JSON格式'); + log.error('ai判断抽奖', `未返回JSON格式${msg}`); } } if (!has_key_words && description) { @@ -489,6 +500,8 @@ class Monitor extends Searcher { onelotteryinfo.isOfficialLottery = hasOfficialLottery; + onelotteryinfo.drawtime = drawtime; + /**初始化待关注列表 */ onelotteryinfo.uid = []; diff --git a/my_config.example.js b/my_config.example.js index 8660c56..a8e555d 100644 --- a/my_config.example.js +++ b/my_config.example.js @@ -515,7 +515,7 @@ module.exports = Object.freeze({ 'model': 'Qwen/Qwen3-32B', 'enable_thinking': true, }, - prompt: '你是一个B站用户,需要判断动态内容是否是抽奖动态,以及参与条件,以json格式输出,仅需包含key:has_key_words(bool 是否是抽奖动态),needAt(bool 是否需要@自己的好友),more(string 总结参与抽奖的条件).回答不要包含markdown标记文本,输出纯json文本' + prompt: '你是一个B站用户,需要判断动态内容是否是抽奖动态,以及参与条件,以json格式输出,仅需包含key:has_key_words(bool 是否是抽奖动态),needAt(bool 参与抽奖是否需要@自己的好友),needTopic(string 参与抽奖需要带的话题,返回话题需要用#号括起来),drawtime(number 开奖时间的10位数时间戳未获取到返回-1),more(string 总结参与抽奖的条件).回答不要包含markdown标记文本,输出纯json文本' }, ai_comments_parm: { diff --git a/test/ai.test.js b/test/ai.test.js index 832f98c..f3acae8 100644 --- a/test/ai.test.js +++ b/test/ai.test.js @@ -20,7 +20,34 @@ const config = require('../lib/data/config'); '#胜利女神新的希望# #nikke# \n【一周年评论盖楼挑战③】拿来吧妮……的表情包!\n\n指挥官的手机里,\n一定存着几张出场率超高的妮姬表情包吧?\n和妮姬们相遇的一周年已至,这些也成了旅途中的一段快乐印记~是时候公开自己的库存了yo!\n\n无论是新收新做的趣味表情,还是珍藏一年的经典老图——\n现在,让它们登场吧!\n\n评论区交出您的表情包库存,看看这一年谁的“收藏”最cool!!\n🎁我们将在6月9日于本条评论区随机抽选:\n▶1位指挥官赠送【周边大礼盒】× 1\n▶10位指挥官赠送【Q版印章小立牌】× 1\n\n💝盖楼目标达成奖励:\n5月20日~22日期间,参与【一周年评论盖楼挑战】系列话题活动! 当全平台评论数累计达成 【2026】 楼时,我们将从本平台参与系列话题活动的用户中额外抽取2位幸运指挥官,每人送出【哈曼卡顿音响】× 1!\n\n————————————\n✦《胜利女神:新的希望》一周年庆典版本「OLD TALES 尘封童话」现已上线!游戏多端互通,前往Bilibili游戏中心搜索《胜利女神:新的希望》即可下载。' ); console.log(msg); - + msg = await utils.getAiContent( + config.ai_judge_parm.url, + config.ai_judge_parm.body, + config.ai_judge_parm.prompt, + '#全民掉线行动#今日启动!参与活动,领GT7、X1心动优惠 2022年助你去线去烦恼,乐享焕新声活!活动规则见下图。 #供电局福利社# #互动抽奖##抽奖# 【关注】@Haylou嘿喽 ,带话题#全民掉线行动#,【转发+评论+赞】本动态,小嘿将随机抽4个欧皇送出以下福利: 一等奖:Haylou X1 双降噪蓝牙耳机 1台 二等奖:Haylou GT7 真无线蓝牙耳机1台 三等奖:50元京东卡*2 并且小嘿特意又申请了意外惊喜,加码福利送上,大家冲鸭: 截至抽奖结束: 【转发超1w】,再抽一位小可爱送50元京东卡*1 【粉丝超1.5w】,再抽一位小可爱送Haylou T17运动蓝牙耳机*1台 开奖时间1月27日,中奖名单将通过第三方抽奖工具选出。冲冲冲! *一定要时刻关注@Haylou嘿喽 哦!开奖后的3天内,未回复小嘿私信领奖的粉丝按照自动弃奖处理哦! ' + ); + console.log(JSON.parse(msg)); + msg = await utils.getAiContent( + config.ai_comments_parm.url, + config.ai_comments_parm.body, + config.ai_comments_parm.prompt, + '#全民掉线行动#今日启动!参与活动,领GT7、X1心动优惠 2022年助你去线去烦恼,乐享焕新声活!活动规则见下图。 #供电局福利社# #互动抽奖##抽奖# 【关注】@Haylou嘿喽 ,带话题#全民掉线行动#,【转发+评论+赞】本动态,小嘿将随机抽4个欧皇送出以下福利: 一等奖:Haylou X1 双降噪蓝牙耳机 1台 二等奖:Haylou GT7 真无线蓝牙耳机1台 三等奖:50元京东卡*2 并且小嘿特意又申请了意外惊喜,加码福利送上,大家冲鸭: 截至抽奖结束: 【转发超1w】,再抽一位小可爱送50元京东卡*1 【粉丝超1.5w】,再抽一位小可爱送Haylou T17运动蓝牙耳机*1台 开奖时间1月27日,中奖名单将通过第三方抽奖工具选出。冲冲冲! *一定要时刻关注@Haylou嘿喽 哦!开奖后的3天内,未回复小嘿私信领奖的粉丝按照自动弃奖处理哦! ' + ); + console.log(msg); + msg = await utils.getAiContent( + config.ai_judge_parm.url, + config.ai_judge_parm.body, + config.ai_judge_parm.prompt, + '#全民掉线行动#今日启动!参与活动,领GT7、X1心动优惠 2022年助你去线去烦恼,乐享焕新声活!活动规则见下图。 #供电局福利社# #互动抽奖##抽奖# 【关注】@Haylou嘿喽 ,带话题#全民掉线行动#,【转发+评论+赞】本动态,小嘿将随机抽4个欧皇送出以下福利: 一等奖:Haylou X1 双降噪蓝牙耳机 1台 二等奖:Haylou GT7 真无线蓝牙耳机1台 三等奖:50元京东卡*2 并且小嘿特意又申请了意外惊喜,加码福利送上,大家冲鸭: 截至抽奖结束: 【转发超1w】,再抽一位小可爱送50元京东卡*1 【粉丝超1.5w】,再抽一位小可爱送Haylou T17运动蓝牙耳机*1台,中奖名单将通过第三方抽奖工具选出。冲冲冲! *一定要时刻关注@Haylou嘿喽 哦!开奖后的3天内,未回复小嘿私信领奖的粉丝按照自动弃奖处理哦! ' + ); + console.log(JSON.parse(msg)); + msg = await utils.getAiContent( + config.ai_comments_parm.url, + config.ai_comments_parm.body, + config.ai_comments_parm.prompt, + '#全民掉线行动#今日启动!参与活动,领GT7、X1心动优惠 2022年助你去线去烦恼,乐享焕新声活!活动规则见下图。 #供电局福利社# #互动抽奖##抽奖# 【关注】@Haylou嘿喽 ,带话题#全民掉线行动#,【转发+评论+赞】本动态,小嘿将随机抽4个欧皇送出以下福利: 一等奖:Haylou X1 双降噪蓝牙耳机 1台 二等奖:Haylou GT7 真无线蓝牙耳机1台 三等奖:50元京东卡*2 并且小嘿特意又申请了意外惊喜,加码福利送上,大家冲鸭: 截至抽奖结束: 【转发超1w】,再抽一位小可爱送50元京东卡*1 【粉丝超1.5w】,再抽一位小可爱送Haylou T17运动蓝牙耳机*1台 开奖时间1月27日,中奖名单将通过第三方抽奖工具选出。冲冲冲! *一定要时刻关注@Haylou嘿喽 哦!开奖后的3天内,未回复小嘿私信领奖的粉丝按照自动弃奖处理哦! ' + ); + console.log(msg); }, ]); console.log('ai.test ... ok!');