From 10db52f9ae05bbdd83e1d6a1e07fa28445d50d69 Mon Sep 17 00:00:00 2001 From: shanmite Date: Sun, 5 Dec 2021 19:56:50 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E5=AE=8C=E5=96=84=E9=94=99=E8=AF=AF?= =?UTF-8?q?=E5=BB=B6=E6=97=B6=E9=87=8D=E8=AF=95(#82)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 成功 0 - 评论 未知错误 1001 - 评论 原动态已删除 1002 - 评论 评论区已关闭 1003 - 评论 需要输入验证码 1004 - 评论 已被对方拉入黑名单 1005 - 评论 黑名单用户无法互动 1006 - 评论 UP主已关闭评论区 1007 - 关注 未知错误 2001 - 关注 您已被对方拉入黑名单 2002 - 关注 黑名单用户无法关注 2003 - 关注 账号异常 2004 - 关注 关注已达上限 2005 - 分区 移动失败 3001 - 点赞 未知错误 4001 - 点赞 点赞异常 4002 - 点赞 点赞频繁 4003 - 转发 未知错误 5001 - 转发 该动态不能转发分享 5002 - 转发 请求数据发生错误,请刷新或稍后重试 5003 - 转发 操作太频繁了,请稍后重试 5004 --- lib/core/monitor.js | 172 ++++++++++++++++++++++++++------------------ lib/net/bili.js | 124 +++++++++++++++++++------------- lib/utils.js | 19 +++++ 3 files changed, 197 insertions(+), 118 deletions(-) diff --git a/lib/core/monitor.js b/lib/core/monitor.js index cd5d685..641658d 100644 --- a/lib/core/monitor.js +++ b/lib/core/monitor.js @@ -1,4 +1,4 @@ -const { log, hasEnv, shuffle, getRandomOne, delay, try_for_each } = require('../utils'); +const { log, hasEnv, shuffle, getRandomOne, delay, try_for_each, retryfn } = require('../utils'); const { send } = require('../net/http'); const bili = require('../net/bili'); const { sendNotify } = require('../helper/notify'); @@ -49,13 +49,16 @@ class Monitor extends Searcher { case 0: event_bus.emit('Turn_on_the_Monitor') break; - case 11: + case 1001: event_bus.emit('Turn_off_the_Monitor', '评论失败') - break - case 21: + break; + case 2001: event_bus.emit('Turn_off_the_Monitor', '关注出错') - break - case 22: + break; + case 3001: + event_bus.emit('Turn_off_the_Monitor', '分区移动出错') + break; + case 2004: log.warn('账号异常', `UID(${global_var.get('myUID')})异常号只会对部分UP出现关注异常`) if (!config.is_exception) { await sendNotify('[动态抽奖]账号异常通知', `UID: ${global_var.get('myUID')}\n\n异常号只会对部分UP出现关注异常\n\n可在设置中令is_exception为true关闭此推送`) @@ -63,7 +66,7 @@ class Monitor extends Searcher { config.is_exception = true; event_bus.emit('Turn_on_the_Monitor') break - case 23: + case 2005: log.warn('关注已达上限', `UID(${global_var.get('myUID')})关注已达上限,已临时进入只转已关注模式`) if (!config.is_outof_maxfollow) { await sendNotify('[动态抽奖]关注已达上限', `UID: ${global_var.get('myUID')}\n\n关注已达上限,已临时进入只转已关注模式\n\n可在设置中令is_outof_maxfollow为true关闭此推送`) @@ -72,17 +75,17 @@ class Monitor extends Searcher { config.only_followed = true; event_bus.emit('Turn_on_the_Monitor') break - case 31: + case 5001: event_bus.emit('Turn_off_the_Monitor', '转发失败') break - case 41: + case 6001: event_bus.emit('Turn_off_the_Monitor', '获取开奖时间失败') break - case 51: + case 7001: event_bus.emit('Turn_off_the_Monitor', '获取关注数失败') break default: - event_bus.emit('Turn_off_the_Monitor', '未知错误') + event_bus.emit('Turn_off_the_Monitor', '??? 未知错误') break; } } @@ -117,7 +120,7 @@ class Monitor extends Searcher { let { ts } = await bili.getLotteryNotice(lottery.dyid); const ts_10 = Date.now() / 1000; if (ts < 0) { - return 41 + return 6001 } if (ts < ts_10) { log.info('过滤', '已过开奖时间') @@ -134,7 +137,7 @@ class Monitor extends Searcher { if (minfollower > 0) { const followerNum = await bili.getUserInfo(lottery.uid[0]); if (followerNum < 0) { - return 51 + return 7001 } if (followerNum < minfollower) { log.info('过滤', `粉丝数(${followerNum})小于指定数量`) @@ -158,16 +161,31 @@ class Monitor extends Searcher { status = await this.go(lottery) switch (status) { case 0: - case 9: - case 19: + case 1002: + case 1003: + case 1004: + case 1005: + case 1006: + case 1007: + case 2002: + case 2003: + case 4001: + case 4002: + case 4003: + case 5002: + case 5003: + case 5004: break; - case 22: - is_exception = 22 + case 2004: + is_exception = 2004 break; - case 23: - is_outof_maxfollow = 23 + case 2005: + is_outof_maxfollow = 2005 break; - default: + case 1001: + case 2001: + case 3001: + case 5001: return status } @@ -418,14 +436,27 @@ class Monitor extends Searcher { * 关注转发评论 * @param {LotteryOptions} option * @returns {Promise} - * 0 - 成功 - * 9 - 评论黑名单/评论区关闭/动态删除 - * 11 - 评论错误 - * 19 - 关注黑名单 - * 21 - 关注错误 - * 22 - 关注异常 - * 23 - 关注已达上限 - * 31 - 转发失败 + * - 成功 0 + * - 评论 未知错误 1001 + * - 评论 原动态已删除 1002 + * - 评论 评论区已关闭 1003 + * - 评论 需要输入验证码 1004 + * - 评论 已被对方拉入黑名单 1005 + * - 评论 黑名单用户无法互动 1006 + * - 评论 UP主已关闭评论区 1007 + * - 关注 未知错误 2001 + * - 关注 您已被对方拉入黑名单 2002 + * - 关注 黑名单用户无法关注 2003 + * - 关注 账号异常 2004 + * - 关注 关注已达上限 2005 + * - 分区 移动失败 3001 + * - 点赞 未知错误 4001 + * - 点赞 点赞异常 4002 + * - 点赞 点赞频繁 4003 + * - 转发 未知错误 5001 + * - 转发 该动态不能转发分享 5002 + * - 转发 请求数据发生错误,请刷新或稍后重试 5003 + * - 转发 操作太频繁了,请稍后重试 5004 */ async go(option) { log.debug('正在转发的动态信息', option); @@ -434,64 +465,69 @@ class Monitor extends Searcher { return 0 } + let status = 0 const { uid, dyid, chat_type, rid, relay_chat, ctrl } = option; /* 评论 */ if (rid && chat_type) { - let status = 0 - const - { chat } = config, - retry = [...new Array(5).keys()], - max_retry_times = retry.length; - await try_for_each(retry, async (times) => { - status = await bili.sendChat(rid, getRandomOne(chat), chat_type) - switch (status) { - case 0: - return true - case -1: - log.warn('抽奖信息', `uid: ${uid},dyid: ${dyid}`) - return true - default: - log.error('抽奖信息', `uid: ${uid},dyid: ${dyid}`) - log.info('自动评论', `将在 ${times + 1} 分钟后再次发送评论(${times + 1}/${max_retry_times})`) - await delay(60 * 1000 * (times + 1)) - return false - } - }) - if (status) return 10 + status; + const { chat } = config; + + status = await retryfn( + 5, + [1, 4], + () => bili.sendChat(rid, getRandomOne(chat), chat_type) + ) + + if (status) { + log.warn("抽奖信息", `dyid: ${dyid}, rid: ${rid}, chat_type: ${chat_type}`) + return 1000 + status + } } /* 关注 */ if (uid.length) { - let status = 0 await try_for_each(uid, async (u) => { status = await bili.autoAttention(u) - switch (status) { - case 0: - if (await bili.movePartition(u, this.tagid)) { - log.error('抽奖信息', `uid: ${u},dyid: ${dyid}`) - } - return false - case -1: - case 2: - case 3: - log.warn('抽奖信息', `uid: ${u},dyid: ${dyid}`) - return true - default: - log.error('抽奖信息', `uid: ${u},dyid: ${dyid}`) - return true + if (status) { + log.warn("抽奖信息", `dyid: ${dyid}, uid: ${u}`) + return true + } else if (await bili.movePartition(u, this.tagid)) { + log.warn("抽奖信息", `dyid: ${dyid}, uid: ${u} tagid: ${this.tagid}`) + /* 3000系错误 */ + status = 1001 + return true + } else { + return false } }) - if (status) return 20 + status + if (status) return 2000 + status } /* 点赞 */ - await bili.autolike(dyid) + status = await retryfn( + 5, + [1, 2, 3], + () => bili.autolike(dyid) + ) + + if (status) { + log.warn("抽奖信息", `dyid: ${dyid}`) + return 4000 + status + } /* 转发 */ - if (await bili.autoRelay(global_var.get("myUID"), dyid, relay_chat, ctrl)) return 31; + status = await retryfn( + 5, + [1, 3, 4], + () => bili.autoRelay(global_var.get("myUID"), dyid, relay_chat, ctrl) + ) - return 0 + if (status) { + log.warn("抽奖信息", `dyid: ${dyid}`) + return 5000 + status + } + + return status } } diff --git a/lib/net/bili.js b/lib/net/bili.js index 7a21e44..3a692c8 100644 --- a/lib/net/bili.js +++ b/lib/net/bili.js @@ -618,13 +618,13 @@ const bili_client = { case 0: return [false, 0, '关注+1'] case 22002: - return [false, -1, '您已被对方拉入黑名单'] + return [false, 2, '您已被对方拉入黑名单'] case 22003: - return [false, -1, '黑名单用户无法关注'] + return [false, 3, '黑名单用户无法关注'] case 22015: - return [false, 2, '账号异常'] + return [false, 4, '账号异常'] case 22009: - return [false, 3, '关注已达上限'] + return [false, 5, '关注已达上限'] default: return [true, 1, `未知错误\n${responseText}`] } @@ -636,11 +636,12 @@ const bili_client = { * @param {Number} uid * 被关注者的UID * @returns {Promise} - * -1 - 黑名单 - * 0 - 成功 - * 1 - 失败 - * 2 - 异常 - * 3 - 关注已达上限 + * - 成功 0 + * - 未知错误 1 + * - 您已被对方拉入黑名单 2 + * - 黑名单用户无法关注 3 + * - 账号异常 4 + * - 关注已达上限 5 */ autoAttention(uid) { return this._autoAttention.run(uid) @@ -650,8 +651,8 @@ const bili_client = { * @param {number} uid * @param {number} tagid 关注分区的ID * @returns {Promise} - * 0 - 成功 - * 1 - 失败 + * - 成功 0 + * - 失败 1 */ async movePartition(uid, tagid) { const responseText = await post({ @@ -703,25 +704,36 @@ const bili_client = { * 动态自动点赞 * @param {string} dyid * @returns {Promise} - * 0 - 成功 - * 1 - 失败 + * - 成功 0 + * - 未知错误 1 + * - 点赞异常 2 + * - 点赞频繁 3 */ async autolike(dyid) { - const responseText = await post({ - url: API.DYNAMIC_LIKE_THUMB, - contents: { - uid: GlobalVar.get("myUID"), - dynamic_id: dyid, - up: 1, - csrf: GlobalVar.get("csrf") - } - }); - if (/^{"code":0/.test(responseText)) { - log.info('自动点赞', '点赞成功'); - return 0; - } else { - log.error('自动点赞', `点赞失败\n${responseText}`); - return 1; + const + responseText = await post({ + url: API.DYNAMIC_LIKE_THUMB, + contents: { + uid: GlobalVar.get("myUID"), + dynamic_id: dyid, + up: 1, + csrf: GlobalVar.get("csrf") + } + }), + res = strToJson(responseText); + switch (res.code) { + case 0: + log.info('自动点赞', '点赞成功'); + return 0; + case 1000113: + log.warn('自动点赞', '点赞异常'); + return 2; + case 1000001: + log.warn('自动点赞', '点赞频繁'); + return 3; + default: + log.error('自动点赞', `未知错误\n${responseText}`); + return 1; } }, /** @@ -733,8 +745,11 @@ const bili_client = { * @param {string} [msg] * 动态的ID * @returns {Promise} - * 0 - 成功 - * 1 - 失败 + * - 成功 0 + * - 未知错误 1 + * - 该动态不能转发分享 2 + * - 请求数据发生错误,请刷新或稍后重试 3 + * - 操作太频繁了,请稍后重试 4 */ async autoRelay(uid, dyid, msg = '转发动态', ctrl = '[]') { const len = msg.length; @@ -756,18 +771,22 @@ const bili_client = { } }), res = strToJson(responseText); - if (res.code === 0) { - log.info('转发动态', '成功转发一条动态'); - return 0; - } else if (res.code === 1101004) { - log.warn('转发动态', '该动态不能转发分享'); - return 0; - } else if (res.code === 2201116) { - log.warn('转发动态', '请求数据发生错误,请刷新或稍后重试'); - return 0; - } else { - log.error('转发动态', `转发动态失败\n${responseText}`); - return 1; + switch (res.code) { + case 0: + log.info('转发动态', '成功转发一条动态'); + return 0; + case 1101004: + log.warn('转发动态', '该动态不能转发分享'); + return 2; + case 2201116: + log.warn('转发动态', '请求数据发生错误,请刷新或稍后重试'); + return 3; + case 1101008: + log.warn('转发动态', '操作太频繁了,请稍后重试'); + return 4; + default: + log.error('转发动态', `未知错误\n${responseText}`); + return 1; } }, /** @@ -897,8 +916,13 @@ const bili_client = { * 17(无图) * @returns {Promise} * - 成功 0 - * - 失败 1 - * - 黑名单/评论区关闭/动态删除 -1 + * - 未知错误 1 + * - 原动态已删除 2 + * - 评论区已关闭 3 + * - 需要输入验证码 4 + * - 已被对方拉入黑名单 5 + * - 黑名单用户无法互动 6 + * - UP主已关闭评论区 7 */ async sendChat(rid, msg, type) { const @@ -918,22 +942,22 @@ const bili_client = { return 0; case -404: log.error('自动评论', '原动态已删除'); - return -1; + return 2; case 12002: log.error('自动评论', '评论区已关闭'); - return -1; + return 3; case 12015: log.error('自动评论', '需要输入验证码'); - return 1; + return 4; case 12035: log.error('自动评论', `已被对方拉入黑名单`); - return -1; + return 5; case 12053: log.error('自动评论', '黑名单用户无法互动'); - return -1; + return 6; case 12061: log.error('自动评论', 'UP主已关闭评论区'); - return -1; + return 7; default: log.error('自动评论', `未知错误\n${responseText}`); return 1; diff --git a/lib/utils.js b/lib/utils.js index f3bd4fc..372a67f 100644 --- a/lib/utils.js +++ b/lib/utils.js @@ -57,6 +57,25 @@ const utils = { if (await fn(item)) break } }, + /** + * @template T + * @param {number} max_times + * @param {Array} unexpected + * @param {() => Promise} fn + */ + async retryfn(max_times, unexpected, fn) { + let ret = null; + for (let times = 0; times < max_times; times++) { + ret = await fn() + if (unexpected.includes(ret)) { + utils.log.warn('自动重试', `将在 ${times + 1} 分钟后再次尝试(${times + 1}/${max_times})`) + await utils.delay(60 * 1000 * (times + 1)) + } else { + break + } + } + return ret; + }, /** * 函数柯里化 * @template T