diff --git a/.eslintrc.json b/.eslintrc.json index 418703b..3a28b3e 100644 --- a/.eslintrc.json +++ b/.eslintrc.json @@ -6,7 +6,7 @@ }, "extends": "eslint:recommended", "parserOptions": { - "ecmaVersion": 12 + "ecmaVersion": "latest" }, "rules": { } diff --git a/README.md b/README.md index e760f98..a111b07 100644 --- a/README.md +++ b/README.md @@ -26,6 +26,8 @@ - 监控专栏合集 - 自动点赞、评论、乱序转发、@好友、带话题、可选随机动态 - 检测是否中奖 + - 已读@ + - 已读私信 - 清理动态关注 - 检查更新 - 更多功能设置请参考配置文件 diff --git a/lib/clear.js b/lib/clear.js index 567c2e1..9238045 100644 --- a/lib/clear.js +++ b/lib/clear.js @@ -10,11 +10,11 @@ const config = require("./data/config"); */ async function getFollowList() { const tagid = await bili.checkMyPartition(config.clear_partition); + let rmup = []; if (typeof tagid === 'undefined') { log.info('获取关注列表', '未能成功获取关注分区id'); - return + return rmup } - let rmup = []; for (let index = 1; index < 42; index++) { const uids = await bili.getPartitionUID(tagid, index); await delay(2e3); diff --git a/lib/core/monitor.js b/lib/core/monitor.js index 62f521d..a3dbf1d 100644 --- a/lib/core/monitor.js +++ b/lib/core/monitor.js @@ -83,7 +83,7 @@ class Monitor extends Searcher { async startLottery() { const allLottery = await this.filterLotteryInfo() , len = allLottery.length - , { dy_contents, create_dy, create_dy_mode, wait } = config; + , { create_dy, create_dy_mode, wait } = config; log.info('筛选动态', `筛选完毕(${len})`); @@ -332,53 +332,51 @@ class Monitor extends Searcher { log.info('NOT_GO_LOTTERY', 'ON'); return 0 } + const { uid, dyid, chat_type, rid, relay_chat, ctrl } = option; + /* 评论 */ if (rid && chat_type) { - let status = 0; - const max_retry_times = 5; - for (let times = 0; times < max_retry_times; times++) { - status = await bili.sendChat(rid, utils.getRandomOne(config.chat), chat_type) - if (status === -1) { - log.warn('抽奖信息', `uid: ${uid},dyid: ${dyid}`) - return 0 + let status = 0 + const + { chat } = config, + retry = [...new Array(5).keys()], + max_retry_times = retry.length; + await utils.try_for_each(retry, async (times) => { + status = await bili.sendChat(rid, utils.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 utils.delay(60 * 1000 * (times + 1)) + return false } - if (!status) { - break - } - log.error('抽奖信息', `uid: ${uid},dyid: ${dyid}`) - log.info('自动评论', `将在 ${times + 1} 分钟后再次发送评论(${times + 1}/${max_retry_times})`) - await utils.delay(60 * 1000 * (times + 1)) - } - if (status) return 11; + }) + if (status) return 10 + status; } /* 关注 */ - const [u1, u2] = uid - if (u1) { - let status = await bili.autoAttention(u1) - if (status) { - log.error('抽奖信息', `uid: ${uid},dyid: ${dyid}`) - return 20 + status - }; - status = await bili.movePartition(u1, this.tagid) - if (status) { - log.error('抽奖信息', `uid: ${uid},dyid: ${dyid}`) - return 20 + status - }; - if (u2) { - utils.delay(5000) - status = await bili.autoAttention(u2) - if (status) { - log.error('抽奖信息', `uid: ${uid},dyid: ${dyid}`) - return 20 + status - }; - status = await bili.movePartition(u2, this.tagid) - if (status) { - log.error('抽奖信息', `uid: ${uid},dyid: ${dyid}`) - return 20 + status - }; - } + if (uid.length) { + let status = 0 + await utils.try_for_each(uid, async (u) => { + status = await bili.autoAttention(u) + switch (status) { + case 0: + return false + case -1: + log.warn('抽奖信息', `uid: ${u},dyid: ${dyid}`) + return true + default: + log.error('抽奖信息', `uid: ${u},dyid: ${dyid}`) + return true + } + }) + if (status) return 20 + status } /* 点赞 */ diff --git a/lib/net/bili.js b/lib/net/bili.js index d20c890..2dc39ac 100644 --- a/lib/net/bili.js +++ b/lib/net/bili.js @@ -3,6 +3,80 @@ const { strToJson, log } = require('../utils'); const { send } = require('./http'); const API = require('./api.bili'); +class Line { + /** + * 智能线路切换 + * @typedef {string} ErrorMsg + * @typedef {[ErrorMsg, any]} ResResult + * @param {any} default_value + * @param {string} line_name + * @param {Array<(...arg) => Promise>} requests + * @param {(responseText: string) => ResResult} [pub_handler] + */ + constructor(default_value, line_name, requests, pub_handler) { + this.line_name = line_name + this.requests = requests + this.valid_line = 0 + this.switch_times = 0 + this.default_value = default_value + if (pub_handler) this.pub_handler = pub_handler + } + + /** + * 切换线路 + * @returns {boolean} + */ + switchLine() { + const { valid_line, requests: { length }, switch_times } = this + this.valid_line = (valid_line + 1) % length + this.switch_times += 1 + if (switch_times > length) { + return false + } else { + return true + } + } + + /** + * 存储当前有效线路 + * @param {number} line + */ + storeLine(line) { + this.valid_line = line + this.switch_times = 0 + } + + /** + * 启动 + * @param {...any} args + * @returns {Promise} + */ + async run(...args) { + const + { line_name, requests, valid_line, default_value } = this, + resp = await requests[valid_line](...args); + let err, value; + if (typeof resp === 'string') { + [err, value] = this.pub_handler(resp) + } else { + [err, value] = resp + } + if (!err) { + this.storeLine(valid_line) + return value + } + if (this.switchLine()) { + log.warn(line_name, err) + log.warn(line_name, `切换线路(${valid_line + 1}/${requests.length})`) + return await this.run() + } else { + log.error(line_name, err) + log.error(line_name, '所有备用线路均连接失败') + return default_value + } + } +} + /** * GET请求 * @param {import('./http').RequestOptions} param0 @@ -59,16 +133,16 @@ const bili_client = { * @returns {Promise} */ async getMyinfo() { - return get({ - url: API.SPACE_MYINFO - }).then(responseText => { - let res = strToJson(responseText); - if (res.code === 0) { - return true; - } else { - return false; - } - }) + const + responseText = await get({ + url: API.SPACE_MYINFO + }), + res = strToJson(responseText); + if (res.code === 0) { + return true; + } else { + return false; + } }, /** * 获取被at的信息 @@ -81,51 +155,49 @@ const bili_client = { * @returns {Promise} */ async getMyAtInfo() { - return get({ - url: API.MSGFEED_AT - }).then(responseText => { - const res = strToJson(responseText); - const atInfo = []; - if (res.code === 0) { - const items = res.data.items; - if (items.length !== 0) { - items.forEach(i => { - const { at_time, item, user } = i - , { nickname: up_uname } = user - , { business, uri: url, source_content } = item; - atInfo.push({ - at_time, - up_uname, - business, - source_content, - url - }); + const + responseText = await get({ + url: API.MSGFEED_AT + }), + res = strToJson(responseText); + let atInfo = []; + if (res.code === 0) { + const items = res.data.items; + if (items.length !== 0) { + items.forEach(i => { + const { at_time, item, user } = i, { nickname: up_uname } = user, { business, uri: url, source_content } = item; + atInfo.push({ + at_time, + up_uname, + business, + source_content, + url }); - } - return atInfo; - } else { - return atInfo; + }); } - }) + return atInfo; + } else { + return atInfo; + } }, /** * 获取未读@ * @returns {Promise} */ async getUnreadAtNum() { - return get({ - url: API.MSGFEED_UNREAD - }).then(responseText => { - let res = strToJson(responseText); - if (res.code === 0) { - const { at } = res.data; - log.info('获取未读@', `成功 数量: ${at}`) - return at - } else { - log.error('获取未读@', `失败\n${responseText}`) - return -1 - } - }) + const + responseText = await get({ + url: API.MSGFEED_UNREAD + }), + res = strToJson(responseText); + if (res.code === 0) { + const { at } = res.data; + log.info('获取未读@', `成功 数量: ${at}`); + return at; + } else { + log.error('获取未读@', `失败\n${responseText}`); + return -1; + } }, /** * 获取私信 @@ -147,52 +219,54 @@ const bili_client = { * @returns {Promise} */ async getSessionInfo(session_type, ts_16 = '') { - return get({ - url: API.SESSION_SVR_GET_SESSIONS, - query: { - session_type, - end_ts: ts_16, - } - }).then(responseText => { - let res = strToJson(responseText); - if (res.code === 0) { - log.info('获取一页私信(20)', '成功 ' + (ts_16 ? 'end_ts->' + ts_16 : '第一页')); - /**@type {Array} */ - const sessions = res.data.session_list || []; - const has_more = res.data.has_more; - const data = sessions.map(session => { - const { session_ts, last_msg, unread_count, talker_id } = session; - const { content = '', timestamp = 0, sender_uid = 0, msg_seqno } = last_msg || {}; - return { session_ts, content, timestamp, sender_uid, unread_count, talker_id, msg_seqno } - }) - return { has_more, data } - } else if (res.code === 2) { - log.error('获取私信', `API抽风...请再次尝试`); - return { has_more: 0, data: [] } - } else { - log.error('获取私信', `失败\n${responseText}`); - return { has_more: 0, data: [] } - } - }) + const + responseText = await get({ + url: API.SESSION_SVR_GET_SESSIONS, + query: { + session_type, + end_ts: ts_16, + } + }), + res = strToJson(responseText); + if (res.code === 0) { + log.info('获取一页私信(20)', '成功 ' + (ts_16 ? 'end_ts->' + ts_16 : '第一页')); + /**@type {Array} */ + const + sessions = res.data.session_list || [], + has_more = res.data.has_more, + data = sessions.map(session => { + const + { session_ts, last_msg, unread_count, talker_id } = session, + { content = '', timestamp = 0, sender_uid = 0, msg_seqno } = last_msg || {}; + return { session_ts, content, timestamp, sender_uid, unread_count, talker_id, msg_seqno }; + }); + return { has_more, data }; + } else if (res.code === 2) { + log.error('获取私信', `API抽风...请再次尝试`); + return { has_more: 0, data: [] }; + } else { + log.error('获取私信', `失败\n${responseText}`); + return { has_more: 0, data: [] }; + } }, /** * 获取未读私信数量 * @returns {Promise<{ unfollow_unread: number, follow_unread: number }>} */ async getUnreadSessionNum() { - return get({ - url: API.SESSION_SVR_SINGLE_UNREAD - }).then(responseText => { - let res = strToJson(responseText); - if (res.code === 0) { - const { unfollow_unread = 0, follow_unread = 0 } = res.data; - log.info('获取未读私信', `成功 已关注未读数: ${follow_unread}, 未关注未读数 ${unfollow_unread}`); - return { unfollow_unread, follow_unread } - } else { - log.error('获取未读私信', `失败\n${responseText}`); - return null - } - }) + const + responseText = await get({ + url: API.SESSION_SVR_SINGLE_UNREAD + }), + res = strToJson(responseText); + if (res.code === 0) { + const { unfollow_unread = 0, follow_unread = 0 } = res.data; + log.info('获取未读私信', `成功 已关注未读数: ${follow_unread}, 未关注未读数 ${unfollow_unread}`); + return { unfollow_unread, follow_unread }; + } else { + log.error('获取未读私信', `失败\n${responseText}`); + return null; + } }, /** * 私信已读 @@ -200,77 +274,74 @@ const bili_client = { * @param {number} session_type * @param {number} msg_seqno */ - updateSessionStatus(talker_id, session_type, msg_seqno) { - return post({ - url: API.SESSION_SVR_UPDATE_ACK, - config: { - retry: false - }, - contents: { - talker_id, - session_type, - ack_seqno: msg_seqno, - csrf_token: GlobalVar.get("csrf"), - csrf: GlobalVar.get("csrf") - } - }).then(responseText => { - let res = strToJson(responseText); - if (res.code === 0) { - log.info('私信已读', `成功 -> talker_id: ${talker_id}`); - } else { - log.error('私信已读', `失败 -> talker_id: ${talker_id}\n${responseText}`); - } - }) + async updateSessionStatus(talker_id, session_type, msg_seqno) { + const + responseText = await post({ + url: API.SESSION_SVR_UPDATE_ACK, + config: { + retry: false + }, + contents: { + talker_id, + session_type, + ack_seqno: msg_seqno, + csrf_token: GlobalVar.get("csrf"), + csrf: GlobalVar.get("csrf") + } + }), + res = strToJson(responseText); + if (res.code === 0) { + log.info('私信已读', `成功 -> talker_id: ${talker_id}`); + } else { + log.error('私信已读', `失败 -> talker_id: ${talker_id}\n${responseText}`); + } }, /** * 获取关注列表 * @param {number} uid * @returns {Promise} */ - getAttentionList(uid) { - return get({ - url: API.FEED_GET_ATTENTION_LIST, - query: { - uid - } - }).then(responseText => { - let res = strToJson(responseText); - if (res.code === 0) { - log.info('获取关注列表', '成功'); - return res.data.list.toString() - } else { - log.error('获取关注列表', `失败\n${responseText}`); - return null - } - }) + async getAttentionList(uid) { + const + responseText = await get({ + url: API.FEED_GET_ATTENTION_LIST, + query: { + uid + } + }), + res = strToJson(responseText); + if (res.code === 0) { + log.info('获取关注列表', '成功'); + return res.data.list.toString(); + } else { + log.error('获取关注列表', `失败\n${responseText}`); + return null; + } }, /** * 获取一个动态的细节 * @param {string} dynamic_id * @return {Promise} 失败返回undefined */ - getOneDynamicByDyid(dynamic_id) { - return get({ - url: API.DYNAMIC_SVR_GET_DYNAMIC_DETAIL, - query: { - dynamic_id - } - }).then(responseText => { - const { code, data } = strToJson(responseText) - , { card } = data || {}; - - if (code !== 0) { - log.error('获取一个动态的细节', `获取动态(${dynamic_id})数据出错:\n${responseText}`) - return - } - - if (!card) { - log.warn('获取一个动态的细节', `动态(${dynamic_id})不存在`) - return - } - - return card - }) + async getOneDynamicByDyid(dynamic_id) { + const + responseText = await get({ + url: API.DYNAMIC_SVR_GET_DYNAMIC_DETAIL, + query: { + dynamic_id + } + }), + { code, data } = strToJson(responseText), + { card } = data || {}; + if (code !== 0) { + log.error('获取一个动态的细节', `获取动态(${dynamic_id})数据出错:\n${responseText}`); + return; + } + if (!card) { + log.warn('获取一个动态的细节', `动态(${dynamic_id})不存在`); + return; + } + return card; }, /** * 获取一组动态的信息 @@ -300,21 +371,21 @@ const bili_client = { * 正确:tag_ID * 错误:-1 */ - getTagIDByTagName(tag_name) { - return get({ - url: API.TAG_INFO, - query: { - tag_name - } - }).then(responseText => { - const res = strToJson(responseText); - if (res.code !== 0) { - log.error('获取TagID', '失败'); - return -1 - } else { - return res.data.tag_id - } - }) + async getTagIDByTagName(tag_name) { + const + responseText = await get({ + url: API.TAG_INFO, + query: { + tag_name + } + }), + res = strToJson(responseText); + if (res.code !== 0) { + log.error('获取TagID', '失败'); + return -1; + } else { + return res.data.tag_id; + } }, /** * 获取tag下的热门动态以及一条最新动态 @@ -352,32 +423,32 @@ const bili_client = { * @param {string} keyword * @return {Promise>} */ - searchArticlesByKeyword(keyword) { - return get({ - url: API.WEB_INTERFACE_SEARCH_TYPE, - query: { - keyword, - page: 1, - order: 'pubdate', - search_type: 'article' - } - }).then(responseText => { - const res = JSON.parse(responseText); - if (res.code === 0) { - let cv_arr = [] - try { - log.info('搜索专栏', '成功 关键词: ' + keyword) - cv_arr = res.data.result.map(it => it.id) - } catch (error) { - log.error('搜索专栏', '失败 原因:\n' + responseText) - cv_arr = [] + async searchArticlesByKeyword(keyword) { + const + responseText = await get({ + url: API.WEB_INTERFACE_SEARCH_TYPE, + query: { + keyword, + page: 1, + order: 'pubdate', + search_type: 'article' } - return cv_arr - } else { - log.error('搜索专栏', '失败 原因:\n' + responseText) - return [] + }), + res = JSON.parse(responseText); + if (res.code === 0) { + let cv_arr = []; + try { + log.info('搜索专栏', '成功 关键词: ' + keyword); + cv_arr = res.data.result.map(it => it.id); + } catch (error) { + log.error('搜索专栏', '失败 原因:\n' + responseText); + cv_arr = []; } - }) + return cv_arr; + } else { + log.error('搜索专栏', '失败 原因:\n' + responseText); + return []; + } }, /** * 获取专栏内容 @@ -390,12 +461,15 @@ const bili_client = { }) }, /** - * 获取粉丝数 - * @param {number} uid - * @returns {Promise} + * 获取粉丝数的所有有效方式 */ - getUserInfo(uid) { - return get({ + _getUserInfo: new Line(-1, '获取粉丝数', [ + /** + * 线路一 + * @param {number} uid + * @returns {Promise} + */ + (uid) => get({ url: API.WEB_INTERFACE_CARD, query: { mid: uid, @@ -404,29 +478,33 @@ const bili_client = { config: { retry: false } - }).then(responseText => { - const res = strToJson(responseText); - if (res.code === 0) { - return res.data.follower - } else { - log.warn('获取粉丝数', '尝试切换线路'); - return get({ - url: API.RELATION_STAT, - query: { - vmid: uid - } - }).then(responseText => { - const res = strToJson(responseText); - if (res.code === 0) { - log.info('获取粉丝数', 'ok'); - return res.data.follower - } else { - log.error('获取粉丝数', `出错 可能是访问过频繁\n${responseText}`); - return -1 - } - }) + }), + /** + * 线路二 + * @param {number} uid + * @returns {Promise} + */ + (uid) => get({ + url: API.RELATION_STAT, + query: { + vmid: uid } }) + ], responseText => { + const res = strToJson(responseText); + if (res.code === 0) { + return [null, res.data.follower]; + } else { + return [`出错 可能是访问过频繁\n${responseText}`, null] + } + }), + /** + * 获取粉丝数 + * @param {number} uid + * @returns {Promise} + */ + getUserInfo(uid) { + return this._getUserInfo.run(uid) }, /** * 获取开奖信息 @@ -434,63 +512,30 @@ const bili_client = { * 动态id * @typedef LotteryNotice * @property {number | -1} ts - * @property {string | "获取开奖信息失败"} text - * @property {string | "null"} item - * @property {string | "未知"} isMe * @returns {Promise} 开奖时间 */ - getLotteryNotice(dyid) { - return get({ - url: API.LOTTERY_SVR_LOTTERY_NOTICE, - query: { - dynamic_id: dyid - } - }).then(responseText => { - const res = strToJson(responseText); - /(?<=_prize_cmt":").*(?=")/.exec(); - if (res.code === 0) { - const timestamp10 = res.data.lottery_time, - timestamp13 = timestamp10 * 1000, - time = new Date(timestamp13); - const remain = (() => { - const timestr = ((timestamp13 - Date.now()) / 86400000).toString(), - timearr = timestr.replace(/(\d+)\.(\d+)/, "$1,0.$2").split(','); - const text = timearr[0][0] === '-' ? `开奖时间已过${timearr[0].substring(1)}天余${parseInt(timearr[1] * 24)}小时` : `还有${timearr[0]}天余${parseInt(timearr[1] * 24)}小时`; - return text; - })(); - let isMeB = (new RegExp(GlobalVar.get("myUID"))).test(responseText); - const isMe = isMeB ? '中奖了!!!' : '未中奖'; - const iteminfo = res.data.first_prize_cmt || '' + ' ' + res.data.second_prize_cmt || '' + ' ' + res.data.third_prize_cmt || ''; - return { - ts: timestamp10, - text: `开奖时间: ${time.toLocaleString()} ${remain}`, - item: iteminfo, - isMe: isMe - }; - } else { - log.error('获取开奖信息', `失败\n${responseText}`); - return { - ts: -1, - text: '获取开奖信息失败', - item: 'null', - isMe: '未知' - }; - } - }) + async getLotteryNotice(dyid) { + const + responseText = await get({ + url: API.LOTTERY_SVR_LOTTERY_NOTICE, + query: { + dynamic_id: dyid + } + }), + res = strToJson(responseText); + if (res.code === 0) { + return { + ts: res.data.lottery_time + }; + } else { + log.error('获取开奖信息', `失败\n${responseText}`); + return { + ts: -1 + }; + } }, - /** - * 之前不检查是否重复关注 - * 自动关注 - * 并转移分组 - * @param {Number} uid - * 被关注者的UID - * @returns {Promise} - * 0 - 成功 - * 1 - 失败 - * 2 - 异常 - */ - autoAttention(uid) { - return post({ + _autoAttention: new Line(1, '自动关注', [ + (uid) => post({ url: API.RELATION_MODIFY, config: { retry: false @@ -501,59 +546,52 @@ const bili_client = { re_src: 0, csrf: GlobalVar.get("csrf") } - }).then(responseText => { - let _responseText = '' - /* 重复关注code also equal 0 */ - const res = strToJson(responseText) - _responseText += responseText - if (res.code === 0) { - log.info('自动关注', '关注+1'); - return 0 - } else if (res.code === 22002) { - log.error('自动关注', '您已被对方拉入黑名单'); - return 1 - } else { - log.warn('自动关注', `失败 尝试切换线路\n${responseText}`); - _responseText += responseText - return post({ - url: API.FEED_SETUSERFOLLOW, - contents: { - type: 1, - follow: uid, - csrf: GlobalVar.get("csrf") - } - }).then(responseText => { - if (/^{"code":0/.test(responseText)) { - log.info('自动关注', '关注+1'); - return 0 - } else { - log.warn('自动关注', `失败 尝试切换另一条线路\n${responseText}`); - _responseText += responseText - return post({ - url: API.RELATION_BATCH_MODIFY, - contents: { - fid: uid, - act: 1, - re_src: 0, - csrf: GlobalVar.get("csrf") - } - }).then(responseText => { - if (/^{"code":0/.test(responseText)) { - log.info('自动关注', '关注+1'); - return 0 - } else { - log.error('自动关注', `失败\n${responseText}`); - _responseText += responseText - if (_responseText.includes(22015)) { - return 2 - } - return 1 - } - }) - } - }) + }), + (uid) => post({ + url: API.FEED_SETUSERFOLLOW, + contents: { + type: 1, + follow: uid, + csrf: GlobalVar.get("csrf") + } + }), + (uid) => post({ + url: API.RELATION_BATCH_MODIFY, + contents: { + fid: uid, + act: 1, + re_src: 0, + csrf: GlobalVar.get("csrf") } }) + ], responseText => { + const res = strToJson(responseText); + switch (res.code) { + case 0: + log.info('自动关注', '关注+1'); + return [null, 0] + case 22002: + return ['您已被对方拉入黑名单', -1] + case 22015: + return ['账号异常', 2] + default: + return [`未知错误\n${responseText}`, 1] + } + }), + /** + * 之前不检查是否重复关注 + * 自动关注 + * 并转移分组 + * @param {Number} uid + * 被关注者的UID + * @returns {Promise} + * -1 - 黑名单 + * 0 - 成功 + * 1 - 失败 + * 2 - 异常 + */ + autoAttention(uid) { + return this._autoAttention.run(uid) }, /** * 移动分区 @@ -563,52 +601,51 @@ const bili_client = { * 0 - 成功 * 1 - 失败 */ - movePartition(uid, tagid) { - return post({ + async movePartition(uid, tagid) { + const responseText = await post({ url: API.RELATION_TAGS_ADDUSERS, contents: { fids: uid, tagids: tagid, csrf: GlobalVar.get("csrf") } - }).then(responseText => { - /* 重复移动code also equal 0 */ - if (/^{"code":0/.test(responseText)) { - log.info('移动分区', 'up主分区移动成功'); - return 0 - } else { - log.error('移动分区', `up主分区移动失败\n${responseText}`); - return 1 - } - }) + }); + /* 重复移动code also equal 0 */ + if (/^{"code":0/.test(responseText)) { + log.info('移动分区', 'up主分区移动成功'); + return 0; + } else { + log.error('移动分区', `up主分区移动失败\n${responseText}`); + return 1; + } }, /** * 取消关注 * @param {number} uid * @returns {Promise} */ - cancelAttention(uid) { - return post({ - url: API.RELATION_MODIFY, - config: { - retry: false - }, - contents: { - fid: uid, - act: 2, - re_src: 0, - csrf: GlobalVar.get("csrf") - } - }).then(responseText => { - const res = strToJson(responseText); - if (res.code === 0) { - log.info('自动取关', `取关成功(${uid})`); - return true - } else { - log.error('自动取关', `取关失败(${uid})\n${responseText}`); - return false - } - }) + async cancelAttention(uid) { + const + responseText = await post({ + url: API.RELATION_MODIFY, + config: { + retry: false + }, + contents: { + fid: uid, + act: 2, + re_src: 0, + csrf: GlobalVar.get("csrf") + } + }), + res = strToJson(responseText); + if (res.code === 0) { + log.info('自动取关', `取关成功(${uid})`); + return true; + } else { + log.error('自动取关', `取关失败(${uid})\n${responseText}`); + return false; + } }, /** * 动态自动点赞 @@ -617,8 +654,8 @@ const bili_client = { * 0 - 成功 * 1 - 失败 */ - autolike(dyid) { - return post({ + async autolike(dyid) { + const responseText = await post({ url: API.DYNAMIC_LIKE_THUMB, contents: { uid: GlobalVar.get("myUID"), @@ -626,15 +663,14 @@ const bili_client = { up: 1, csrf: GlobalVar.get("csrf") } - }).then(responseText => { - if (/^{"code":0/.test(responseText)) { - log.info('自动点赞', '点赞成功'); - return 0 - } else { - log.error('自动点赞', `点赞失败\n${responseText}`); - return 1 - } - }) + }); + if (/^{"code":0/.test(responseText)) { + log.info('自动点赞', '点赞成功'); + return 0; + } else { + log.error('自动点赞', `点赞失败\n${responseText}`); + return 1; + } }, /** * 转发前应查看是否重复转发 @@ -648,12 +684,12 @@ const bili_client = { * 0 - 成功 * 1 - 失败 */ - autoRelay(uid, dyid, msg = '转发动态', ctrl = '[]') { + async autoRelay(uid, dyid, msg = '转发动态', ctrl = '[]') { const len = msg.length; if (len > 233) { msg = msg.slice(0, 233 - len) } - return post({ + const responseText = await post({ url: API.DYNAMIC_REPOST_REPOST, config: { retry: false @@ -665,15 +701,14 @@ const bili_client = { ctrl, csrf: GlobalVar.get("csrf") } - }).then(responseText => { - if (/^{"code":0/.test(responseText)) { - log.info('转发动态', '成功转发一条动态'); - return 0 - } else { - log.error('转发动态', `转发动态失败\n${responseText}`); - return 1 - } - }) + }); + if (/^{"code":0/.test(responseText)) { + log.info('转发动态', '成功转发一条动态'); + return 0; + } else { + log.error('转发动态', `转发动态失败\n${responseText}`); + return 1; + } }, /** * @typedef Picture @@ -684,12 +719,13 @@ const bili_client = { * @param { string | Picture[] } content * @return {Promise} */ - createDynamic(content) { - let contents = { - csrf: GlobalVar.get("csrf"), - extension: '{"emoji_type":1,"from":{"emoji_type":1},"flag_cfg":{}}' - } - let url = ''; + async createDynamic(content) { + let + contents = { + csrf: GlobalVar.get("csrf"), + extension: '{"emoji_type":1,"from":{"emoji_type":1},"flag_cfg":{}}' + }, + url = ''; if (content instanceof Array) { url = API.DYNAMIC_SVR_CREATE_DRAW contents = { @@ -705,46 +741,45 @@ const bili_client = { content, } } - return post({ + const responseText = await post({ url, contents, - }).then(responseText => { - if (/^{"code":0/.test(responseText)) { - log.info('发布动态', '成功创建一条随机内容的动态'); - } else { - log.error('发布动态', `发布动态失败\n${responseText}`); - } - }) + }); + if (/^{"code":0/.test(responseText)) { + log.info('发布动态', '成功创建一条随机内容的动态'); + } else { + log.error('发布动态', `发布动态失败\n${responseText}`); + } }, /** * 获取推荐 * @returns {Promise>} */ - getTopRcmd() { - return get( - { - url: API.TOP_RCMD, - } - ).then(responseText => { - const res = strToJson(responseText); - if (res.code === 0) { - log.info('获取推荐', `成功`); - return res.data.item.map(it => { - return [it.owner.mid, it.id] - }) - } else { - log.error('获取推荐', `获取推荐失败\n${responseText}`); - return [] - } - }) + async getTopRcmd() { + const + responseText = await get( + { + url: API.TOP_RCMD, + } + ), + res = strToJson(responseText); + if (res.code === 0) { + log.info('获取推荐', `成功`); + return res.data.item.map(it => { + return [it.owner.mid, it.id]; + }); + } else { + log.error('获取推荐', `获取推荐失败\n${responseText}`); + return []; + } }, /** * 分享视频 * @param {number} uid * @param {number} aid */ - shareVideo(uid, aid) { - return post({ + async shareVideo(uid, aid) { + const responseText = await post({ url: API.DYNAMIC_REPOST_SHARE, contents: { platform: "pc", @@ -755,21 +790,20 @@ const bili_client = { rid: aid, csrf_token: GlobalVar.get("csrf") } - }).then(responseText => { - if (/^{"code":0/.test(responseText)) { - log.info('转发视频', `成功转发视频(av${aid})`); - } else { - log.error('转发视频', `转发失败\n${responseText}`); - } - }) + }); + if (/^{"code":0/.test(responseText)) { + log.info('转发视频', `成功转发视频(av${aid})`); + } else { + log.error('转发视频', `转发失败\n${responseText}`); + } }, /** * 移除动态 * @param {string} dyid * @returns {Promise} */ - rmDynamic(dyid) { - return post({ + async rmDynamic(dyid) { + const responseText = await post({ url: API.DYNAMIC_SVR_RM_DYNAMIC, contents: { dynamic_id: dyid, @@ -778,15 +812,14 @@ const bili_client = { config: { retry: false } - }).then(responseText => { - if (/^{"code":0/.test(responseText)) { - log.info('删除动态', `成功删除一条动态(${dyid})`); - return true - } else { - log.error('删除动态', `删除动态失败(${dyid})\n${responseText}`); - return false - } - }) + }); + if (/^{"code":0/.test(responseText)) { + log.info('删除动态', `成功删除一条动态(${dyid})`); + return true; + } else { + log.error('删除动态', `删除动态失败(${dyid})\n${responseText}`); + return false; + } }, /** * 发送评论 @@ -802,40 +835,41 @@ const bili_client = { * - 失败 1 * - 黑名单 -1 */ - sendChat(rid, msg, type, show = true) { - return post({ - url: API.REPLY_ADD, - contents: { - oid: rid, - type: type, - message: msg, - csrf: GlobalVar.get("csrf") - } - }).then(responseText => { - const res = strToJson(responseText); - if (res.code === 0) { - show && log.info('自动评论', '评论成功'); - return 0 - } else if (res.code === -404) { - show && log.error('自动评论', '原动态已删除'); - return 0 - } else if (res.code === 12002) { - show && log.error('自动评论', '评论区已关闭'); - return 0 - } else if (res.code === 12015) { - show && log.error('自动评论', '需要输入验证码'); - return 1 - } else if (res.code === 12035) { - show && log.error('自动评论', `已被对方拉入黑名单`); - return -1 - } else if (res.code === 12053) { - show && log.error('自动评论', '黑名单用户无法互动'); - return -1 - } else { - show && log.error('自动评论', `评论失败\n${responseText}`); - return 1 - } - }) + async sendChat(rid, msg, type) { + const + responseText = await post({ + url: API.REPLY_ADD, + contents: { + oid: rid, + type: type, + message: msg, + csrf: GlobalVar.get("csrf") + } + }), + res = strToJson(responseText); + switch (res.code) { + case 0: + log.info('自动评论', '评论成功'); + return 0; + case -404: + log.error('自动评论', '原动态已删除'); + return 0; + case 12002: + log.error('自动评论', '评论区已关闭'); + return 0; + case 12015: + log.error('自动评论', '需要输入验证码'); + return 1; + case 12035: + log.error('自动评论', `已被对方拉入黑名单`); + return -1; + case 12053: + log.error('自动评论', '黑名单用户无法互动'); + return -1; + default: + log.error('自动评论', `评论失败\n${responseText}`); + return 1; + } }, /** * 检查分区 @@ -844,60 +878,60 @@ const bili_client = { * @param {string} [name] * @returns {Promise} */ - checkMyPartition(name) { - if (!name) name = '此处存放因抽奖临时关注的up'; - return get({ - url: API.RELATION_TAGS - }).then(responseText => { - const res = strToJson(responseText); - let tagid = undefined; - if (res.code === 0) { - const data = res.data.filter((it) => it.name === name); - if (data.length) { - log.info('获取分区id', '成功'); - tagid = data[0].tagid + async checkMyPartition(name) { + if (!name) name = '此处存放因抽奖临时关注的up' + const + responseText = await get({ + url: API.RELATION_TAGS + }), + res = strToJson(responseText); + let tagid = undefined; + if (res.code === 0) { + const data = res.data.filter((it) => it.name === name); + if (data.length) { + log.info('获取分区id', '成功'); + tagid = data[0].tagid; + } else { + log.warn('获取分区id', `失败 无指定分区名${name}`); + } + if (name === '此处存放因抽奖临时关注的up') { + if (typeof tagid === 'undefined') { + return bili_client.createPartition(name); } else { - log.warn('获取分区id', '失败 无指定分区'); - } - if (name === '此处存放因抽奖临时关注的up') { - if (typeof tagid === 'undefined') { - return bili_client.createPartition(name) - } else { - return tagid - } - } else { - return tagid + return tagid; } } else { - log.error('获取分区id', `访问出错 可在my_config里手动填入\n${responseText}`) - return tagid + return tagid; } - }) + } else { + log.error('获取分区id', `访问出错 可在my_config里手动填入\n${responseText}`); + return tagid; + } }, /** * 创造分区 * @param {string} partition_name * @returns {Promise} */ - createPartition(partition_name) { - return post({ - url: API.RELATION_TAG_CREATE, - contents: { - tag: partition_name, - csrf: GlobalVar.get("csrf") - } - }).then(responseText => { - let obj = strToJson(responseText); - if (obj.code === 0) { - log.info('新建分区', '分区新建成功') - /* 获取tagid */ - let { tagid } = obj.data - return tagid - } else { - log.error('新建分区', `分区新建失败\n${responseText}`); - return undefined - } - }) + async createPartition(partition_name) { + const + responseText = await post({ + url: API.RELATION_TAG_CREATE, + contents: { + tag: partition_name, + csrf: GlobalVar.get("csrf") + } + }), + obj = strToJson(responseText); + if (obj.code === 0) { + /* 获取tagid */ + let { tagid } = obj.data; + log.info('新建分区', '分区新建成功'); + return tagid; + } else { + log.error('新建分区', `分区新建失败\n${responseText}`); + return undefined; + } }, /** * 获取一个分区中50个的id @@ -905,29 +939,29 @@ const bili_client = { * @param {number} n 1-> * @returns {Promise} */ - getPartitionUID(tagid, n) { - return get({ - url: API.RELATION_TAG, - query: { - mid: GlobalVar.get("myUID"), - tagid: tagid, - pn: n, - ps: 50 - } - }).then(responseText => { - const res = strToJson(responseText); - let uids = []; - if (res.code === 0) { - res.data.forEach(d => { - uids.push(d.mid); - }) - log.info(`获取分组${tagid}`, `成功获取取关分区列表${n}`); - return uids - } else { - log.error(`获取分组${tagid}`, `获取取关分区列表失败\n${responseText}`); - return uids - } - }) + async getPartitionUID(tagid, n) { + const + responseText = await get({ + url: API.RELATION_TAG, + query: { + mid: GlobalVar.get("myUID"), + tagid: tagid, + pn: n, + ps: 50 + } + }), + res = strToJson(responseText); + let uids = []; + if (res.code === 0) { + res.data.forEach(d => { + uids.push(d.mid); + }); + log.info(`获取分组${tagid}`, `成功获取取关分区列表${n}`); + return uids; + } else { + log.error(`获取分组${tagid}`, `获取取关分区列表失败\n${responseText}`); + return uids; + } } };