Compare commits

...
7 Commits
Author SHA1 Message Date
shanmiteko 80ae3df933 docs: 更新CHANGLOG 2021-10-14 16:32:19 +08:00
shanmiteko ac397c68ec fix: 未移动分区(#50) 2021-10-14 16:16:10 +08:00
shanmiteko 423bc24939 fix: 修改线路切换逻辑 2021-10-14 16:15:39 +08:00
shanmiteko 41b28a133e docs: 更新README 2021-10-13 20:48:10 +08:00
shanmiteko b1ead1329d feat: LOG日志显示随机动态内容(#47) 2021-10-13 20:28:06 +08:00
shanmiteko e0e99a07bb feat: 增加设置过滤间隔 2021-10-13 19:31:25 +08:00
shanmiteko 30d0e8b1bd docs: 增加CHANGELOG 2021-10-12 12:09:49 +08:00
9 changed files with 512 additions and 41 deletions
+436
View File
@@ -0,0 +1,436 @@
## 主要变化(2.2.6)
- LOG日志显示随机动态内容(#47)
- 增加设置过滤间隔
## 较上一版本变化
- `env.js`
- `my_config.js`增加`filter_wait`
**替换可执行文件和更改配置文件(建议修改)**
_如果之前版本小于上一版本,请查看[CHANGELOG](CHANGELOG.md)变更说明_
**Full Changelog**: https://github.com/shanmiteko/LotteryAutoScript/compare/v2.2.5...v2.2.6
## 主要变化(2.2.5)
## 问题修复
- 因黑名单而关注失败(#45)
## 较上一版本变化
- `env.js`
- `my_config.js`
**替换可执行文件**
_如果之前版本小于上一版本,请查看**历次更新**说明_
_[查看链接](https://github.com/shanmiteko/LotteryAutoScript/releases)_
**Full Changelog**: https://github.com/shanmiteko/LotteryAutoScript/compare/v2.2.4...v2.2.5
## 主要变化(2.2.4)
- api线路切换具有记忆功能
- 增加更多时延自定义值(#44)
- 重构部分代码
- 内置默认设置
## 问题修复
- 清理动态时关注列表获取失败
## 较上一版本变化
- `env.js`
- `my_config.js`增加
- `get_session_wait` 读取下一页私信间隔
- `update_session_wait` 已读私信间隔
- `get_partition_wait` 读取下一页关注列表间隔
- `get_dynamic_detail_wait` 获取动态细节间隔
- `random_dynamic_wait` 随机动态间隔
**替换可执行文件和更改配置文件(建议修改)**
_如果之前版本小于上一版本,请查看**历次更新**说明_
_[查看链接](https://github.com/shanmiteko/LotteryAutoScript/releases)_
**Full Changelog**: https://github.com/shanmiteko/LotteryAutoScript/compare/v2.2.3...v2.2.4
## 主要变化(2.2.3)
- clear_dynamic_type类型可以多选(#42)
## 问题修复
- 番剧动态无user_profile(#41)
## 较上一版本变化
- `env.js`
- `my_config.js`修改`clear_dynamic_type`
**替换可执行文件和更改配置文件(建议修改)**
_如果之前版本小于上一版本,请查看**历次更新**说明_
_[查看链接](https://github.com/shanmiteko/LotteryAutoScript/releases)_
**Full Changelog**: https://github.com/shanmiteko/LotteryAutoScript/compare/v2.2.2...v2.2.3
## 主要变化(2.2.2)
- 随机转发热门视频(#40)
## 较上一版本变化
- `env.js`
- `my_config.js`增加`create_dy_mode` `create_dy_type`
**替换可执行文件和更改配置文件(建议修改)**
_如果之前版本小于上一版本,请查看**历次更新**说明_
_[查看链接](https://github.com/shanmiteko/LotteryAutoScript/releases)_
**Full Changelog**: https://github.com/shanmiteko/LotteryAutoScript/compare/v2.2.1...v2.2.2
## 主要变化(2.2.1)
- 动态不存在时出错(#39)
## 较上一版本变化
- `env.js`
- `my_config.js`
**替换可执行文件**
_如果之前版本小于上一版本,请查看**历次更新**说明_
_[查看链接](https://github.com/shanmiteko/LotteryAutoScript/releases)_
**Full Changelog**: https://github.com/shanmiteko/LotteryAutoScript/compare/v2.2.0...v2.2.1
## 主要变化(2.2.0)
- 修改转发验重逻辑
- 可间隔插入随机动态(#33)
## 较上一版本变化
- `env.js`
- `my_config.js`增加create_dy_mode
**替换可执行文件和更改配置文件(建议修改)**
_如果之前版本小于上一版本,请查看**历次更新**说明_
_[查看链接](https://github.com/shanmiteko/LotteryAutoScript/releases)_
## 主要变化(2.1.8)
- 设置支持热更新(#29)
## 较上一版本变化
- `env.js`文件格式更改
- `my_config.js`文件格式更改
**替换可执行文件和更改配置文件(建议修改)**
_如果之前版本小于上一版本,请查看**历次更新**说明_
_[查看链接](https://github.com/shanmiteko/LotteryAutoScript/releases)_
## 主要变化(2.1.7)
- 设置支持热更新(#29)
## 较上一版本变化
- `env.js`文件格式更改
- `my_config.js`
**替换可执行文件和更改env.js**
_如果之前版本小于上一版本,请查看**历次更新**说明_
_[查看链接](https://github.com/shanmiteko/LotteryAutoScript/releases)_
## 主要变化(2.1.6)
- 新增设置not_check_article(#25)
## 较上一版本变化
- `env.js`
- `my_config.js`新增设置not_check_article
**替换可执行文件和更改my_config.js**
_如果之前版本小于上一版本,请查看**历次更新**说明_
_[查看链接](https://github.com/shanmiteko/LotteryAutoScript/releases)_
## 主要变化(2.1.5)
- 修复之前无法更新的问题
## 较上一版本变化
- `env.js`
- `my_config.js`
**仅需替换可执行文件**
_如果之前版本小于上一版本,请查看**历次更新**说明_
_[查看链接](https://github.com/shanmiteko/LotteryAutoScript/releases)_
## 主要变化(2.1.4)
- 黑名单处理(#22)
## 较上一版本变化
- `env.js`
- `my_config.js`
**仅需替换可执行文件**
_如果之前版本小于上一版本,请查看**历次更新**说明_
_[查看链接](https://github.com/shanmiteko/LotteryAutoScript/releases)_
## 主要变化(2.1.3)
- 错误码变更(#20)
## 较上一版本变化
- `env.js`
- `my_config.js`
**仅需替换可执行文件**
_如果之前版本小于上一版本,请查看**历次更新**说明_
_[查看链接](https://github.com/shanmiteko/LotteryAutoScript/releases)_
## 主要变化(2.1.2)
- 支持arm平台运行
- 改变账号异常应对策略
- 修改dingtalk签名base64问题(#17)
## 较上一版本变化
- `env.js`
- `my_config.js`
**仅需替换可执行文件**
_如果之前版本小于上一版本,请查看**历次更新**说明_
_[查看链接](https://github.com/shanmiteko/LotteryAutoScript/releases)_
## 主要变化(2.1.1)
- 获取未读私信接口变化
## 较上一版本变化
- `env.js`
- `my_config.js`
**仅需替换可执行文件**
_如果之前版本小于上一版本,请查看**历次更新**说明_
_[查看链接](https://github.com/shanmiteko/LotteryAutoScript/releases)_
## 主要变化(2.1.0)
- 修复两处问题
## 较上一版本变化
- `env.js`
- `my_config.js`
**仅需替换可执行文件**
_如果之前版本小于上一版本,请查看**历次更新**说明_
_[查看链接](https://github.com/shanmiteko/LotteryAutoScript/releases)_
## 主要变化(2.0.9)
- 账号异常自动切换线路(#14)
## 较上一版本变化
- `env.js`
- `my_config.js`
**仅需替换可执行文件**
_如果之前版本小于上一版本,请查看**历次更新**说明_
_[查看链接](https://github.com/shanmiteko/LotteryAutoScript/releases)_
## 主要变化(2.0.8)
- 账号异常时未处理和发送通知
## 较上一版本变化
- `env.js`
- `my_config.js`
**仅需替换可执行文件**
_如果之前版本小于上一版本,请查看**历次更新**说明_
_[查看链接](https://github.com/shanmiteko/LotteryAutoScript/releases)_
## 主要变化(2.0.7)
- 修复一处问题
- 日志时间UTC+8(#13)
## 较上一版本变化
- `env.js`
- `my_config.js`
**仅需替换可执行文件**
_如果之前版本小于上一版本,请查看**历次更新**说明_
_[查看链接](https://github.com/shanmiteko/LotteryAutoScript/releases)_
## 主要变化
- 支持更新检查
- 增加设置`update_loop_wait`
## 较上一版本(v2.0.5)变化
- `env.js`
- `my_config.js`增加设置`update_loop_wait`
**替换可执行文件和更新my_config.js**
_如果之前版本小于2.0.5,请查看历次更新说明_
## 主要变化
- 不参与主站黑名单用户抽奖
- my_config.js注释修改
- 可从环境变量中读取COOKIE
- 其他不影响功能的调整
## 较上一版本(v2.0.4)变化
- `env.js`
- `my_config.js`
**仅需替换可执行文件**
## 新特性
中奖通知设置可设黑名单
## 较上一版本(v2.0.3)变化
`env.js`
`my_config.js`
**仅需替换可执行文件**
## 问题修复
- 评论失败未退出
- 切割tag不精准
## 较上一版本(v2.0.2)变化
`env.js`
`my_config.js`
**仅需替换可执行文件**
edit: 替换release
## 问题修复
#9
## 较上一版本(2.0.1)变化
`env.js`
`my_config.js`
**仅需替换可执行文件**
## 新增特性
增加两处自定义设置(`my_config.js`)
- `clear_quick_remove_attention`
- `notice_key_words`
## 问题修复
#7
## 较上一版本(2.0.0)变化
`env.js`
`my_config.js`需修改添加两处自定义设置
除了替换可执行文件,还要修改`my_config.js`文件
## 新增特性
打乱将转发的动态顺序,防止被人认出是抽奖号
## 问题修复
修复两处潜在bug
## 较上一版本(1.9.9)变化
`env.js`
`my_config.js`
只需替换可执行文件
## 优化体验
清理动态时日志更详细
以及其他细节处理
## 较上一版本(1.9.8)变化
`env.js`
`my_config.js`
只需替换可执行文件
edit: 1.9.9.1
edit: 1.9.9.2
## 修复Bug
两级解构时第一级为undefined(表现为异常退出)
## 较上一版本(1.9.7)变化
`env.js`更改注释内容
`my_config.js`
只需替换可执行文件
## 修复Bug
转发专栏内的抽奖时无法获取关注
## 较上一版本(1.9.6)变化
`env.js`
`my_config.js`
只需替换可执行文件
## 主要变化(1.9.6)
去除对unzipper的依赖
专栏转发率达一半以上时跳过
## 较上一版本变更
`env.js`
`my_config.js`
只需替换可执行文件
## 主要新增功能(1.9.5)
可从专栏里获取抽奖动态
## 较上一版本变更
`env.js`无变化
`my_config.js`去掉部分设置,新增部分设置
## 1.9.0
修复Bug后的稳定版(大概
- 21/7/21 附加bat脚本增加对小白的友好性
## 1.8
fix: 开奖时间过滤失效
# 1.7
change 修复一处bug
change 重新上传zip
change 重新上传zip
## 1.6
perf: 重构代码
- 分离动态筛选部分的网络请求和数据处理
- 优化部分ifelse判断
feat:
- 新增NOT_GO_LOTTERY环境变量
- 边转边存dyid
- 滤除的dyid也进行存储
fix: 修复部分bug
## 1.5
feat: 日志相关
- 彩色输出
- 环境变量LOTTERY_LOG_LEVEL更改日志等级
feat: 设置相关
- lottery_loop_wait 抽奖循环
- check_loop_wait 检奖循环
- clear_loop_wait 清理循环
## 1.4
fix: 部分动态无法获取描述
## 1.3
feat: 新增loop_wait设置
可执行文件压缩包
# 命令行工具
可执行文件压缩包
可执行文件压缩包
Binary file not shown.

Before

Width:  |  Height:  |  Size: 123 KiB

After

Width:  |  Height:  |  Size: 274 KiB

+19 -13
View File
@@ -1,4 +1,4 @@
const utils = require('../utils');
const { log, hasEnv, shuffle, getRandomOne, delay, try_for_each } = require('../utils');
const bili = require('../net/bili');
const { sendNotify } = require('../helper/notify');
const event_bus = require('../helper/event_bus');
@@ -6,7 +6,6 @@ const { randomDynamic } = require('../helper/randomDynamic')
const { Searcher } = require('./searcher');
const global_var = require("../data/global_var");
const config = require("../data/config");
const { log, hasEnv } = utils;
/**
* 监视器
@@ -83,13 +82,13 @@ class Monitor extends Searcher {
async startLottery() {
const allLottery = await this.filterLotteryInfo()
, len = allLottery.length
, { create_dy, create_dy_mode, wait } = config;
, { create_dy, create_dy_mode, wait, filter_wait } = config;
log.info('筛选动态', `筛选完毕(${len})`);
if (len) {
let is_exception = false;
for (const [index, Lottery] of utils.shuffle(allLottery).entries()) {
for (const [index, Lottery] of shuffle(allLottery).entries()) {
let status = 0;
if (Lottery.isOfficialLottery) {
@@ -100,10 +99,12 @@ class Monitor extends Searcher {
}
if (ts < ts_10) {
log.info('过滤', '已过开奖时间')
await delay(filter_wait)
continue
}
if (ts > ts_10 + config.maxday * 86400) {
log.info('过滤', '超过指定开奖时间')
await delay(filter_wait)
continue
}
} else if (Lottery.uid[0]) {
@@ -113,6 +114,7 @@ class Monitor extends Searcher {
}
if (followerNum < config.minfollower) {
log.info('过滤', `粉丝数(${followerNum})小于指定数量`)
await delay(filter_wait)
continue
}
}
@@ -120,9 +122,9 @@ class Monitor extends Searcher {
if (create_dy
&& create_dy_mode instanceof Array
&& index > 0
&& index % utils.getRandomOne(create_dy_mode[0]) === 0
&& index % getRandomOne(create_dy_mode[0]) === 0
) {
const number = utils.getRandomOne(create_dy_mode[1]) || 0;
const number = getRandomOne(create_dy_mode[1]) || 0;
randomDynamic(number)
}
@@ -139,7 +141,7 @@ class Monitor extends Searcher {
return status
}
await utils.delay(wait * (Math.random() + 0.5));
await delay(wait * (Math.random() + 0.5));
}
log.info('抽奖', '开始转发下一组动态');
if (is_exception) {
@@ -195,7 +197,7 @@ class Monitor extends Searcher {
});
/* 检查动态是否满足要求 */
await utils.try_for_each(protoLotteryInfo, async function ({
await try_for_each(protoLotteryInfo, async function ({
lottery_info_type, is_liked,
uids, uname, dyid,
ctrl, rid, des, type,
@@ -254,7 +256,7 @@ class Monitor extends Searcher {
let
/**转发评语 */
RandomStr = utils.getRandomOne(config.relay),
RandomStr = getRandomOne(config.relay),
/**控制字段 */
new_ctrl = [];
@@ -346,8 +348,8 @@ class Monitor extends Searcher {
{ 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)
await try_for_each(retry, async (times) => {
status = await bili.sendChat(rid, getRandomOne(chat), chat_type)
switch (status) {
case 0:
return true
@@ -357,7 +359,7 @@ class Monitor extends Searcher {
default:
log.error('抽奖信息', `uid: ${uid},dyid: ${dyid}`)
log.info('自动评论', `将在 ${times + 1} 分钟后再次发送评论(${times + 1}/${max_retry_times})`)
await utils.delay(60 * 1000 * (times + 1))
await delay(60 * 1000 * (times + 1))
return false
}
})
@@ -367,12 +369,16 @@ class Monitor extends Searcher {
/* 关注 */
if (uid.length) {
let status = 0
await utils.try_for_each(uid, async (u) => {
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:
log.warn('抽奖信息', `uid: ${u},dyid: ${dyid}`)
return true
default:
+6
View File
@@ -119,6 +119,12 @@ const config = {
*/
get_dynamic_detail_wait: 2000,
/**
* - 过滤间隔(开奖时间/粉丝数)
* - 单位毫秒
*/
filter_wait: 1000,
/**
* - 随机动态间隔
* - 单位毫秒
+28 -25
View File
@@ -6,20 +6,23 @@ const API = require('./api.bili');
class Line {
/**
* 智能线路切换
* @typedef {string} ErrorMsg
* @typedef {[ErrorMsg, any]} ResResult
* @param {any} default_value
* @typedef {boolean} iSwitch 是否切换
* @typedef {string} Msg 信息说明
* @typedef {[iSwitch, any, Msg]} ResResult
* @param {string} line_name
* @param {Array<(...arg) => Promise<ResResult | string>>} requests
* @param {(responseText: string) => ResResult} [pub_handler]
*/
constructor(default_value, line_name, requests, pub_handler) {
constructor(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
/**
* @type {ResResult}
*/
this.res_result = [false, null, '']
}
/**
@@ -53,26 +56,27 @@ class Line {
*/
async run(...args) {
const
{ line_name, requests, valid_line, default_value } = this,
{ line_name, requests, valid_line } = this,
resp = await requests[valid_line](...args);
let err, value;
if (typeof resp === 'string') {
[err, value] = this.pub_handler(resp)
this.res_result = this.pub_handler(resp)
} else {
[err, value] = resp
this.res_result = resp
}
if (!err) {
const [i_switch, value, msg] = this.res_result
if (!i_switch) {
log.info(line_name, msg)
this.storeLine(valid_line)
return value
}
if (this.switchLine()) {
log.warn(line_name, err)
log.warn(line_name, msg)
log.warn(line_name, `切换线路(${valid_line + 1}/${requests.length})`)
return await this.run()
} else {
log.error(line_name, err)
log.error(line_name, msg)
log.error(line_name, '所有备用线路均连接失败')
return default_value
return value
}
}
}
@@ -463,7 +467,7 @@ const bili_client = {
/**
* 获取粉丝数的所有有效方式
*/
_getUserInfo: new Line(-1, '获取粉丝数', [
_getUserInfo: new Line('获取粉丝数', [
/**
* 线路一
* @param {number} uid
@@ -493,9 +497,9 @@ const bili_client = {
], responseText => {
const res = strToJson(responseText);
if (res.code === 0) {
return [null, res.data.follower];
return [false, res.data.follower, 'ok'];
} else {
return [`出错 可能是访问过频繁\n${responseText}`, null]
return [true, 1, `出错 可能是访问过频繁\n${responseText}`]
}
}),
/**
@@ -534,7 +538,7 @@ const bili_client = {
};
}
},
_autoAttention: new Line(1, '自动关注', [
_autoAttention: new Line('自动关注', [
(uid) => post({
url: API.RELATION_MODIFY,
config: {
@@ -568,16 +572,15 @@ const bili_client = {
const res = strToJson(responseText);
switch (res.code) {
case 0:
log.info('自动关注', '关注+1');
return [null, 0]
return [false, 0, '关注+1']
case 22002:
return ['您已被对方拉入黑名单', -1]
return [false, -1, '您已被对方拉入黑名单']
case 22003:
return ['黑名单用户无法关注', -1]
return [false, -1, '黑名单用户无法关注', -1]
case 22015:
return ['账号异常', 2]
return [false, 2, '账号异常', 2]
default:
return [`未知错误\n${responseText}`, 1]
return [true, 1, `未知错误\n${responseText}`]
}
}),
/**
@@ -748,9 +751,9 @@ const bili_client = {
contents,
});
if (/^{"code":0/.test(responseText)) {
log.info('发布动态', '成功创建一条随机内容的动态');
log.info('发布动态', `成功创建一条随机内容的动态\n${content}\n`);
} else {
log.error('发布动态', `发布动态失败\n${responseText}`);
log.error('发布动态', `发布动态失败\n${content}\n${responseText}`);
}
},
/**
+15 -1
View File
@@ -177,7 +177,21 @@ const utils = {
* @param {String} [split] 分隔符
*/
proPrint(msg, split = ' ') {
console.log([msg].flat().join(split))
if (msg instanceof Array) {
msg = msg.join(split)
}
console.log(msg)
},
/**
* @param {Array<string>} msg
* @returns
*/
rainbow(msg) {
const
colors = ['red', 'yellow', 'green', 'cyan', 'blue', 'magenta'],
colorsCount = colors.length;
this.proPrint(msg.map(it => it.split('').map((l, i) => chalk[colors[i % colorsCount]](l)).join('')), '\n')
},
debug(context, msg) {
if (this.level > 3) {
+1 -1
View File
@@ -142,7 +142,7 @@ function initConfig() {
}
(async function () {
log.proPrint(metainfo, '\n')
log.rainbow(metainfo)
if (initEnv() || initConfig()) return;
+6
View File
@@ -131,6 +131,12 @@ module.exports = Object.freeze({
*/
get_dynamic_detail_wait: 2000,
/**
* - 过滤间隔(开奖时间/粉丝数)
* - 单位毫秒
*/
filter_wait: 1000,
/**
* - 随机动态间隔
* - 单位毫秒
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "lottery-auto-script",
"version": "2.2.5",
"version": "2.2.7",
"description": "自动参与B站动态抽奖",
"main": "main.js",
"scripts": {