mirror of
https://github.com/shanmiteko/LotteryAutoScript.git
synced 2026-06-04 21:01:17 +08:00
feat: 新增设置check_if_duplicated
检查是否重复转发 - 不检查 -1 - 通过是否点赞判断 0 - 检索本地dyids文件 1
This commit is contained in:
parent
d0a8aa9169
commit
3cf3939b49
@ -7,6 +7,7 @@ const { randomDynamic } = require('../helper/randomDynamic')
|
|||||||
const { Searcher } = require('./searcher');
|
const { Searcher } = require('./searcher');
|
||||||
const global_var = require("../data/global_var");
|
const global_var = require("../data/global_var");
|
||||||
const config = require("../data/config");
|
const config = require("../data/config");
|
||||||
|
const d_storage = require('../helper/d_storage');
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 监视器
|
* 监视器
|
||||||
@ -124,11 +125,13 @@ class Monitor extends Searcher {
|
|||||||
}
|
}
|
||||||
if (ts < ts_10) {
|
if (ts < ts_10) {
|
||||||
log.info('过滤', '已过开奖时间')
|
log.info('过滤', '已过开奖时间')
|
||||||
|
d_storage.updateDyid(lottery.dyid)
|
||||||
await delay(filter_wait)
|
await delay(filter_wait)
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
if (ts > ts_10 + config.maxday * 86400) {
|
if (ts > ts_10 + config.maxday * 86400) {
|
||||||
log.info('过滤', '超过指定开奖时间')
|
log.info('过滤', '超过指定开奖时间')
|
||||||
|
d_storage.updateDyid(lottery.dyid)
|
||||||
await delay(filter_wait)
|
await delay(filter_wait)
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
@ -141,6 +144,7 @@ class Monitor extends Searcher {
|
|||||||
}
|
}
|
||||||
if (followerNum < minfollower) {
|
if (followerNum < minfollower) {
|
||||||
log.info('过滤', `粉丝数(${followerNum})小于指定数量`)
|
log.info('过滤', `粉丝数(${followerNum})小于指定数量`)
|
||||||
|
d_storage.updateDyid(lottery.dyid)
|
||||||
await delay(filter_wait)
|
await delay(filter_wait)
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
@ -189,6 +193,8 @@ class Monitor extends Searcher {
|
|||||||
return status
|
return status
|
||||||
}
|
}
|
||||||
|
|
||||||
|
d_storage.updateDyid(lottery.dyid)
|
||||||
|
|
||||||
await delay(wait * (Math.random() + 0.5));
|
await delay(wait * (Math.random() + 0.5));
|
||||||
}
|
}
|
||||||
log.info('抽奖', '开始转发下一组动态');
|
log.info('抽奖', '开始转发下一组动态');
|
||||||
@ -230,7 +236,7 @@ class Monitor extends Searcher {
|
|||||||
/** 所有抽奖信息 */
|
/** 所有抽奖信息 */
|
||||||
let alllotteryinfo = [];
|
let alllotteryinfo = [];
|
||||||
const
|
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;
|
now_ts = Date.now() / 1000;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -249,6 +255,15 @@ class Monitor extends Searcher {
|
|||||||
|
|
||||||
log.info('筛选动态', `去重后(${protoLotteryInfo.length})`);
|
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) {
|
if (lottery_param[0] !== "APIs" && set_lottery_info_url && protoLotteryInfo.length) {
|
||||||
log.info("上传抽奖信息", "开始")
|
log.info("上传抽奖信息", "开始")
|
||||||
await new Promise((resolve) => {
|
await new Promise((resolve) => {
|
||||||
@ -283,7 +298,12 @@ class Monitor extends Searcher {
|
|||||||
log.debug('正在筛选的动态信息', lottery_info);
|
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})`)
|
log.info("筛选动态", `已转发(https://t.bilibili.com/${dyid})`)
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
@ -466,11 +486,12 @@ class Monitor extends Searcher {
|
|||||||
}
|
}
|
||||||
|
|
||||||
let status = 0
|
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) {
|
if (rid && chat_type) {
|
||||||
const { chat } = config;
|
|
||||||
|
|
||||||
status = await retryfn(
|
status = await retryfn(
|
||||||
5,
|
5,
|
||||||
@ -504,15 +525,17 @@ class Monitor extends Searcher {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* 点赞 */
|
/* 点赞 */
|
||||||
status = await retryfn(
|
if (!check_if_duplicated) {
|
||||||
5,
|
status = await retryfn(
|
||||||
[1, 2, 3],
|
5,
|
||||||
() => bili.autolike(dyid)
|
[1, 2, 3],
|
||||||
)
|
() => bili.autolike(dyid)
|
||||||
|
)
|
||||||
|
|
||||||
if (status) {
|
if (status) {
|
||||||
log.warn("抽奖信息", `dyid: ${dyid}`)
|
log.warn("抽奖信息", `dyid: ${dyid}`)
|
||||||
return 4000 + status
|
return 4000 + status
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* 转发 */
|
/* 转发 */
|
||||||
|
|||||||
@ -1,7 +1,8 @@
|
|||||||
const utils = require('../utils');
|
const utils = require('../utils');
|
||||||
const bili = require('../net/bili');
|
const bili = require('../net/bili');
|
||||||
const { send } = require("../net/http");
|
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
|
const { log } = utils
|
||||||
|
|
||||||
@ -369,6 +370,7 @@ class Searcher {
|
|||||||
for (const dyid of dyids_set) {
|
for (const dyid of dyids_set) {
|
||||||
if (dyid.length === utils.dyid_length) {
|
if (dyid.length === utils.dyid_length) {
|
||||||
|
|
||||||
|
log.info('获取动态', `查看专栏中所提及动态(${dyid}) (${length--})`)
|
||||||
const card = await bili.getOneDynamicByDyid(dyid)
|
const card = await bili.getOneDynamicByDyid(dyid)
|
||||||
|
|
||||||
if (card) {
|
if (card) {
|
||||||
@ -377,8 +379,12 @@ class Searcher {
|
|||||||
const parsed_card = parseDynamicCard(card)
|
const parsed_card = parseDynamicCard(card)
|
||||||
, { is_liked } = parsed_card;
|
, { is_liked } = parsed_card;
|
||||||
|
|
||||||
log.info('获取动态', `查看专栏中所提及动态(${dyid})是否点赞 (${length--})`)
|
if (
|
||||||
if (is_liked) {
|
(!check_if_duplicated
|
||||||
|
&& is_liked)
|
||||||
|
|| (check_if_duplicated === 1
|
||||||
|
&& await d_storage.searchDyid(dyid))
|
||||||
|
) {
|
||||||
log.info('获取动态', `动态(${dyid})已转发过`)
|
log.info('获取动态', `动态(${dyid})已转发过`)
|
||||||
_weight += 1;
|
_weight += 1;
|
||||||
}
|
}
|
||||||
@ -445,23 +451,27 @@ class Searcher {
|
|||||||
if (length) {
|
if (length) {
|
||||||
const lottery_info = raw_lottery_info
|
const lottery_info = raw_lottery_info
|
||||||
.reduce(async (pre, cur) => {
|
.reduce(async (pre, cur) => {
|
||||||
const results = await pre
|
let results = await pre
|
||||||
, { dyid } = cur;
|
, { dyid } = cur;
|
||||||
|
|
||||||
const card = await bili.getOneDynamicByDyid(dyid)
|
if (!check_if_duplicated) {
|
||||||
|
|
||||||
if (card) {
|
|
||||||
await utils.delay(get_dynamic_detail_wait)
|
|
||||||
|
|
||||||
const { is_liked } = parseDynamicCard(card)
|
|
||||||
|
|
||||||
log.info('获取动态', `查看动态(${dyid})是否点赞 (${length--})`)
|
log.info('获取动态', `查看动态(${dyid})是否点赞 (${length--})`)
|
||||||
if (is_liked) {
|
const card = await bili.getOneDynamicByDyid(dyid)
|
||||||
log.info('获取动态', `动态(${dyid})已转发过`)
|
|
||||||
} else {
|
if (card) {
|
||||||
cur.is_liked = is_liked
|
await utils.delay(get_dynamic_detail_wait)
|
||||||
return [...results, cur]
|
|
||||||
|
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
|
return results
|
||||||
|
|||||||
@ -69,6 +69,14 @@ const config = {
|
|||||||
*/
|
*/
|
||||||
chatmodel: '01',
|
chatmodel: '01',
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 检查是否重复转发
|
||||||
|
* - 不检查 -1
|
||||||
|
* - 通过是否点赞判断 0
|
||||||
|
* - 检索本地dyids文件 1
|
||||||
|
*/
|
||||||
|
check_if_duplicated: 0,
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* - 动态创建时间
|
* - 动态创建时间
|
||||||
* - 多少天前
|
* - 多少天前
|
||||||
|
|||||||
@ -1,4 +1,4 @@
|
|||||||
const { getRemoteConfig } = require("../utils");
|
const { getRemoteConfig, createDir, createFile } = require("../utils");
|
||||||
const config = require("../data/config");
|
const config = require("../data/config");
|
||||||
|
|
||||||
const key_map = new Map([['DedeUserID', 'myUID'], ['bili_jct', 'csrf']]);
|
const key_map = new Map([['DedeUserID', 'myUID'], ['bili_jct', 'csrf']]);
|
||||||
@ -15,10 +15,11 @@ let global_var = {
|
|||||||
* 全局变量初始化
|
* 全局变量初始化
|
||||||
* 更新config
|
* 更新config
|
||||||
* @param {string} cookie
|
* @param {string} cookie
|
||||||
|
* @param {string} num
|
||||||
*/
|
*/
|
||||||
async init(cookie) {
|
async init(cookie, num) {
|
||||||
if (cookie) {
|
if (cookie) {
|
||||||
config.updata(process.env.NUMBER);
|
config.updata(num);
|
||||||
|
|
||||||
this.set('cookie', cookie);
|
this.set('cookie', cookie);
|
||||||
|
|
||||||
@ -37,6 +38,8 @@ let global_var = {
|
|||||||
]);
|
]);
|
||||||
this.set('remoteconfig', await getRemoteConfig());
|
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
52
lib/helper/d_storage.js
Normal 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;
|
||||||
46
lib/utils.js
46
lib/utils.js
@ -13,6 +13,8 @@ const utils = {
|
|||||||
env_file: path.join(process.cwd(), "env.js"),
|
env_file: path.join(process.cwd(), "env.js"),
|
||||||
/**配置文件 */
|
/**配置文件 */
|
||||||
config_file: path.join(process.cwd(), "my_config.js"),
|
config_file: path.join(process.cwd(), "my_config.js"),
|
||||||
|
/**dyids存放目录 */
|
||||||
|
dyids_dir: path.join(process.cwd(), "dyids"),
|
||||||
/**dyid长度 */
|
/**dyid长度 */
|
||||||
dyid_length: 18,
|
dyid_length: 18,
|
||||||
/**
|
/**
|
||||||
@ -325,6 +327,50 @@ const utils = {
|
|||||||
resolve()
|
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' })
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
2
main.js
2
main.js
@ -45,7 +45,7 @@ async function main() {
|
|||||||
process.env.ENABLE_MULTIPLE_ACCOUNT = ENABLE_MULTIPLE_ACCOUNT;
|
process.env.ENABLE_MULTIPLE_ACCOUNT = ENABLE_MULTIPLE_ACCOUNT;
|
||||||
} else if (COOKIE) {
|
} else if (COOKIE) {
|
||||||
const global_var = require("./lib/data/global_var");
|
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");
|
const { start, isMe, clear, update, checkCookie } = require("./lib/index");
|
||||||
|
|||||||
@ -48,7 +48,7 @@ module.exports = Object.freeze({
|
|||||||
* API传回数据类型 {RespondBody}
|
* API传回数据类型 {RespondBody}
|
||||||
* 获取抽奖信息的链接字符串
|
* 获取抽奖信息的链接字符串
|
||||||
* @example
|
* @example
|
||||||
* "https://raw.fastgit.org/spiritLHL/sync_lottery/master/archive_datas/datas.json"
|
* "https://github.com/spiritLHL/sync_lottery"
|
||||||
*/
|
*/
|
||||||
APIs: [],
|
APIs: [],
|
||||||
|
|
||||||
@ -83,6 +83,14 @@ module.exports = Object.freeze({
|
|||||||
*/
|
*/
|
||||||
chatmodel: '01',
|
chatmodel: '01',
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 检查是否重复转发
|
||||||
|
* - 不检查 -1
|
||||||
|
* - 通过是否点赞判断 0
|
||||||
|
* - 检索本地dyids文件 1
|
||||||
|
*/
|
||||||
|
check_if_duplicated: 0,
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* - 动态创建时间
|
* - 动态创建时间
|
||||||
* - 多少天前
|
* - 多少天前
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user