feat: 新增设置check_if_duplicated

检查是否重复转发
- 不检查 -1
- 通过是否点赞判断 0
- 检索本地dyids文件 1
This commit is contained in:
shanmite 2021-12-06 16:12:41 +08:00
parent d0a8aa9169
commit 3cf3939b49
8 changed files with 183 additions and 33 deletions

View File

@ -7,6 +7,7 @@ const { randomDynamic } = require('../helper/randomDynamic')
const { Searcher } = require('./searcher');
const global_var = require("../data/global_var");
const config = require("../data/config");
const d_storage = require('../helper/d_storage');
/**
* 监视器
@ -124,11 +125,13 @@ class Monitor extends Searcher {
}
if (ts < ts_10) {
log.info('过滤', '已过开奖时间')
d_storage.updateDyid(lottery.dyid)
await delay(filter_wait)
continue
}
if (ts > ts_10 + config.maxday * 86400) {
log.info('过滤', '超过指定开奖时间')
d_storage.updateDyid(lottery.dyid)
await delay(filter_wait)
continue
}
@ -141,6 +144,7 @@ class Monitor extends Searcher {
}
if (followerNum < minfollower) {
log.info('过滤', `粉丝数(${followerNum})小于指定数量`)
d_storage.updateDyid(lottery.dyid)
await delay(filter_wait)
continue
}
@ -189,6 +193,8 @@ class Monitor extends Searcher {
return status
}
d_storage.updateDyid(lottery.dyid)
await delay(wait * (Math.random() + 0.5));
}
log.info('抽奖', '开始转发下一组动态');
@ -230,7 +236,7 @@ class Monitor extends Searcher {
/** 所有抽奖信息 */
let alllotteryinfo = [];
const
{ set_lottery_info_url, key_words, model, chatmodel, max_create_time, is_imitator, only_followed, at_users, blockword, blacklist, use_public_blacklist } = config,
{ check_if_duplicated, set_lottery_info_url, key_words, model, chatmodel, max_create_time, is_imitator, only_followed, at_users, blockword, blacklist, use_public_blacklist } = config,
now_ts = Date.now() / 1000;
/**
@ -249,6 +255,15 @@ class Monitor extends Searcher {
log.info('筛选动态', `去重后(${protoLotteryInfo.length})`);
/**并发查询dyid */
await Promise.all(
[...dyids_map.keys()]
.map(it => d_storage
.searchDyid(it)
.then(hasIt => dyids_map.set(it, hasIt))
)
)
if (lottery_param[0] !== "APIs" && set_lottery_info_url && protoLotteryInfo.length) {
log.info("上传抽奖信息", "开始")
await new Promise((resolve) => {
@ -283,7 +298,12 @@ class Monitor extends Searcher {
log.debug('正在筛选的动态信息', lottery_info);
/* 遇到转发过就退出 */
if (is_liked) {
if (
(!check_if_duplicated
&& is_liked)
|| (check_if_duplicated === 1
&& dyids_map.get(dyid))
) {
log.info("筛选动态", `已转发(https://t.bilibili.com/${dyid})`)
return false
}
@ -466,11 +486,12 @@ class Monitor extends Searcher {
}
let status = 0
const { uid, dyid, chat_type, rid, relay_chat, ctrl } = option;
const
{ uid, dyid, chat_type, rid, relay_chat, ctrl } = option,
{ chat, check_if_duplicated } = config;
/* 评论 */
if (rid && chat_type) {
const { chat } = config;
status = await retryfn(
5,
@ -504,15 +525,17 @@ class Monitor extends Searcher {
}
/* 点赞 */
status = await retryfn(
5,
[1, 2, 3],
() => bili.autolike(dyid)
)
if (!check_if_duplicated) {
status = await retryfn(
5,
[1, 2, 3],
() => bili.autolike(dyid)
)
if (status) {
log.warn("抽奖信息", `dyid: ${dyid}`)
return 4000 + status
if (status) {
log.warn("抽奖信息", `dyid: ${dyid}`)
return 4000 + status
}
}
/* 转发 */

View File

@ -1,7 +1,8 @@
const utils = require('../utils');
const bili = require('../net/bili');
const { send } = require("../net/http");
const { article_scan_page, article_create_time, not_check_article, get_dynamic_detail_wait, uid_scan_page, search_wait, tag_scan_page } = require("../data/config");
const { check_if_duplicated, article_scan_page, article_create_time, not_check_article, get_dynamic_detail_wait, uid_scan_page, search_wait, tag_scan_page } = require("../data/config");
const d_storage = require("../helper/d_storage")
const { log } = utils
@ -369,6 +370,7 @@ class Searcher {
for (const dyid of dyids_set) {
if (dyid.length === utils.dyid_length) {
log.info('获取动态', `查看专栏中所提及动态(${dyid}) (${length--})`)
const card = await bili.getOneDynamicByDyid(dyid)
if (card) {
@ -377,8 +379,12 @@ class Searcher {
const parsed_card = parseDynamicCard(card)
, { is_liked } = parsed_card;
log.info('获取动态', `查看专栏中所提及动态(${dyid})是否点赞 (${length--})`)
if (is_liked) {
if (
(!check_if_duplicated
&& is_liked)
|| (check_if_duplicated === 1
&& await d_storage.searchDyid(dyid))
) {
log.info('获取动态', `动态(${dyid})已转发过`)
_weight += 1;
}
@ -445,23 +451,27 @@ class Searcher {
if (length) {
const lottery_info = raw_lottery_info
.reduce(async (pre, cur) => {
const results = await pre
let results = await pre
, { dyid } = cur;
const card = await bili.getOneDynamicByDyid(dyid)
if (card) {
await utils.delay(get_dynamic_detail_wait)
const { is_liked } = parseDynamicCard(card)
if (!check_if_duplicated) {
log.info('获取动态', `查看动态(${dyid})是否点赞 (${length--})`)
if (is_liked) {
log.info('获取动态', `动态(${dyid})已转发过`)
} else {
cur.is_liked = is_liked
return [...results, cur]
const card = await bili.getOneDynamicByDyid(dyid)
if (card) {
await utils.delay(get_dynamic_detail_wait)
const { is_liked } = parseDynamicCard(card)
if (is_liked) {
log.info('获取动态', `动态(${dyid})已转发过`)
} else {
cur.is_liked = is_liked
results.push(cur)
}
}
} else {
results.push(cur)
}
return results

View File

@ -69,6 +69,14 @@ const config = {
*/
chatmodel: '01',
/**
* 检查是否重复转发
* - 不检查 -1
* - 通过是否点赞判断 0
* - 检索本地dyids文件 1
*/
check_if_duplicated: 0,
/**
* - 动态创建时间
* - 多少天前

View File

@ -1,4 +1,4 @@
const { getRemoteConfig } = require("../utils");
const { getRemoteConfig, createDir, createFile } = require("../utils");
const config = require("../data/config");
const key_map = new Map([['DedeUserID', 'myUID'], ['bili_jct', 'csrf']]);
@ -15,10 +15,11 @@ let global_var = {
* 全局变量初始化
* 更新config
* @param {string} cookie
* @param {string} num
*/
async init(cookie) {
async init(cookie, num) {
if (cookie) {
config.updata(process.env.NUMBER);
config.updata(num);
this.set('cookie', cookie);
@ -37,6 +38,8 @@ let global_var = {
]);
this.set('remoteconfig', await getRemoteConfig());
}
await createDir('dyids');
await createFile(num < 2 ? 'dyid.txt' : `dyid${num}.txt`, '', 'a')
}
};

52
lib/helper/d_storage.js Normal file
View File

@ -0,0 +1,52 @@
const { log, readDyidFile, writeDyidFile, dyid_length } = require("../utils");
const d_storage = {
/**
* 搜索dyid
* @param {string} dyid
* @returns {Promise<boolean>}
*/
searchDyid: (dyid) => {
return new Promise((resolve) => {
const Rdyid = new RegExp(dyid);
const rs = readDyidFile(Number(process.env.NUMBER));
let status = false;
rs.on('data', chunk => {
if (Rdyid.test(chunk)) {
status = true
}
})
rs.on('end', () => {
resolve(status)
})
rs.on('error', err => {
log.error('搜索dyid', err)
resolve(status)
})
})
},
/**
* 更新dyid
* @param {string} dyid
*/
updateDyid: (dyid) => {
log.info('更新dyid', `写入${dyid}`);
if (dyid.length !== dyid_length) {
log.error('更新dyid', `dyid(${dyid})长度不为18 若出现此问题请即时通知开发者`)
}
return new Promise((resolve) => {
const ws = writeDyidFile(Number(process.env.NUMBER));
ws.write(dyid + ',', () => {
ws.destroy();
resolve()
})
ws.on('error', err => {
log.error('更新dyid', err)
resolve()
})
});
}
}
module.exports = d_storage;

View File

@ -13,6 +13,8 @@ const utils = {
env_file: path.join(process.cwd(), "env.js"),
/**配置文件 */
config_file: path.join(process.cwd(), "my_config.js"),
/**dyids存放目录 */
dyids_dir: path.join(process.cwd(), "dyids"),
/**dyid长度 */
dyid_length: 18,
/**
@ -325,6 +327,50 @@ const utils = {
resolve()
})
});
},
/**
* CreateFile
* @param {string} filepath 相对于dyids的文件路径
* @param {string} [defaultValue] 写入默认值
* @param {string} flag
* @returns {Promise<void>}
*/
createFile(filepath, defaultValue, flag) {
const fpath = path.join(utils.dyids_dir, filepath);
const buffer = Buffer.from(defaultValue);
return new Promise((resolve, rejects) => {
fs.open(fpath, flag, (err, fd) => {
if (err) {
rejects(err)
} else {
fs.write(fd, buffer, 0, buffer.length, 0, err => {
if (err) {
rejects(err)
} else {
resolve();
}
})
}
})
});
},
/**
* 读取dyid文件
* @param {number} num
* @returns {fs.ReadStream}
*/
readDyidFile(num) {
const fpath = num < 2 ? path.join(utils.dyids_dir, 'dyid.txt') : path.join(utils.dyids_dir, `dyid${num}.txt`);
return fs.createReadStream(fpath, { encoding: 'utf8', highWaterMark: (utils.dyid_length + 1) * 1000 })
},
/**
* 追加dyid
* @param {number} num
* @returns {fs.WriteStream}
*/
writeDyidFile(num) {
const fpath = num < 2 ? path.join(utils.dyids_dir, 'dyid.txt') : path.join(utils.dyids_dir, `dyid${num}.txt`);
return fs.createWriteStream(fpath, { flags: 'a' })
}
};

View File

@ -45,7 +45,7 @@ async function main() {
process.env.ENABLE_MULTIPLE_ACCOUNT = ENABLE_MULTIPLE_ACCOUNT;
} else if (COOKIE) {
const global_var = require("./lib/data/global_var");
await global_var.init(COOKIE, Number(NUMBER));
await global_var.init(COOKIE, NUMBER);
/**引入基础功能 */
const { start, isMe, clear, update, checkCookie } = require("./lib/index");

View File

@ -48,7 +48,7 @@ module.exports = Object.freeze({
* API传回数据类型 {RespondBody}
* 获取抽奖信息的链接字符串
* @example
* "https://raw.fastgit.org/spiritLHL/sync_lottery/master/archive_datas/datas.json"
* "https://github.com/spiritLHL/sync_lottery"
*/
APIs: [],
@ -83,6 +83,14 @@ module.exports = Object.freeze({
*/
chatmodel: '01',
/**
* 检查是否重复转发
* - 不检查 -1
* - 通过是否点赞判断 0
* - 检索本地dyids文件 1
*/
check_if_duplicated: 0,
/**
* - 动态创建时间
* - 多少天前