mirror of
https://github.com/shanmiteko/LotteryAutoScript.git
synced 2026-07-22 21:13:47 +08:00
Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
266a657a8f | ||
|
|
ebf7440ef2 | ||
|
|
a0e668bcb5 | ||
|
|
a47472a3e4 | ||
|
|
3698c81384 | ||
|
|
ad7df1aa74 |
+1
-2
@@ -1,7 +1,6 @@
|
||||
node_modules/
|
||||
dyids/
|
||||
dist/
|
||||
lib/dyid*.txt
|
||||
dyid.zip
|
||||
package-lock.json
|
||||
env.js
|
||||
my_config.js
|
||||
@@ -5,7 +5,7 @@
|
||||
- [获取COOKIE](#获取cookie)
|
||||
- [本地运行](#本地运行)
|
||||
- [可执行文件](#可执行文件)
|
||||
- [搭建运行环境](#搭建运行环境)
|
||||
- [以源码方式运行](#以源码方式运行)
|
||||
- [Windows](#windows)
|
||||
- [Linux](#linux)
|
||||
- [Docker](#docker)
|
||||
@@ -38,7 +38,7 @@ Chrome浏览器:
|
||||
|
||||
2. 进入Application找到Cookies栏中的SESSDATA将HttpOnly选项**取消**勾选
|
||||
|
||||
(此步骤是为了方便后续采用JS获取Cookies)
|
||||
(此步骤是为了方便后续采用JS获取Cookies,获取完毕后应再次勾选)
|
||||
|
||||

|
||||
|
||||
@@ -66,20 +66,21 @@ Chrome浏览器:
|
||||
↓↓
|
||||
|
||||
### 本地运行
|
||||
设置环境变量中的cookie和推送相关参数
|
||||
具体操作详见[env.example.js](env.example.js)文件内注释
|
||||
|
||||
#### 可执行文件
|
||||
在当前目录下[打开终端](https://cn.bing.com/search?q=%E5%A6%82%E4%BD%95%E5%9C%A8%E5%BD%93%E5%89%8D%E7%9B%AE%E5%BD%95%E6%89%93%E5%BC%80%E7%BB%88%E7%AB%AF)运行内部的可执行文件即可
|
||||
1. [[下载](https://github.com/shanmiteko/LotteryAutoScript/releases)|[cnpmjs镜像下载](https://github.com.cnpmjs.org/shanmiteko/LotteryAutoScript/releases)|[Fastgit镜像下载](https://hub.fastgit.org/shanmiteko/LotteryAutoScript/releases)]压缩包并解压
|
||||
```
|
||||
env.js
|
||||
lottery.exe
|
||||
my_config.js
|
||||
```
|
||||
2. `env.js`中填入`COOKIE`和推送参数
|
||||
3. `my_config.js`中自定义设置
|
||||
4. 在当前目录下打开终端运行可执行文件`lottery`
|
||||
5. 运行截图
|
||||

|
||||
|
||||
[下载](https://github.com/shanmiteko/LotteryAutoScript/releases)
|
||||
|
||||
[cnpmjs镜像下载](https://github.com.cnpmjs.org/shanmiteko/LotteryAutoScript/releases)
|
||||
|
||||
[Fastgit镜像下载](https://hub.fastgit.org/shanmiteko/LotteryAutoScript/releases)
|
||||
|
||||
|
||||
#### 搭建运行环境
|
||||
#### 以源码方式运行
|
||||
|
||||
<details>
|
||||
|
||||
@@ -179,7 +180,7 @@ cd lottery
|
||||
进入lottery上一级目录
|
||||
|
||||
```bash
|
||||
docker image rm shanmite/lottery_auto_docker
|
||||
docker image rm -f shanmite/lottery_auto_docker
|
||||
rm -rf lottery/
|
||||
```
|
||||
|
||||
@@ -234,4 +235,6 @@ rm -rf lottery/
|
||||
----------------------------------------
|
||||
|
||||
## 设置说明
|
||||
详见[env.example.js](./env.example.js)文件内部注释
|
||||
|
||||
详见[my_config.example.js](./my_config.example.js)文件内部注释
|
||||
Binary file not shown.
|
After Width: | Height: | Size: 163 KiB |
+7
-5
@@ -8,7 +8,10 @@
|
||||
* ## 账号相关参数
|
||||
* - `COOKIE` 是必填项
|
||||
* - `NUMBER` 表示是第几个账号
|
||||
* - `PAT` 与 `GITHUB_REPOSITORY` 如果之前在Github Action上运行过脚本, 可填写已下载转发过的动态dyid, 之后可移除
|
||||
* - `CLEAR` 是否启用清理功能
|
||||
* - `ENABLE_MULTIPLE_ACCOUNT` 是否启用多账号
|
||||
* - `MULTIPLE_ACCOUNT_PARM` 多账号参数(JSON格式)
|
||||
* - `LOTTERY_LOG_LEVEL` 输出日志等级 Error<Warn<Info<Debug 1<2<3<4
|
||||
*
|
||||
* ## 多账号
|
||||
* 1. 将 ENABLE_MULTIPLE_ACCOUNT 的值改为true
|
||||
@@ -21,10 +24,9 @@ const account_parm = {
|
||||
COOKIE: "",
|
||||
NUMBER: 1,
|
||||
CLEAR: true,
|
||||
LOCALLAUNCH: true,
|
||||
PAT: "",
|
||||
GITHUB_REPOSITORY: "用户名/仓库名",
|
||||
ENABLE_MULTIPLE_ACCOUNT: false
|
||||
ENABLE_MULTIPLE_ACCOUNT: false,
|
||||
MULTIPLE_ACCOUNT_PARM: "",
|
||||
LOTTERY_LOG_LEVEL: 3
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
+70
-32
@@ -1,3 +1,4 @@
|
||||
const chalk = require('chalk');
|
||||
const fs = require('fs');
|
||||
const path = require('path');
|
||||
const { HttpRequest } = require("./HttpRequest");
|
||||
@@ -92,13 +93,40 @@ const Base = {
|
||||
}
|
||||
return RandomOne
|
||||
},
|
||||
/**提示信息 */
|
||||
tooltip: {
|
||||
log: (msg) => {
|
||||
console.log("%s: %s", new Date().toLocaleString(), msg)
|
||||
/**日志 */
|
||||
log: {
|
||||
level: 0,
|
||||
/**
|
||||
* 初始化默认level为3
|
||||
*/
|
||||
init() {
|
||||
let _level = Number(process.env.LOTTERY_LOG_LEVEL);
|
||||
this.level = isNaN(_level) ? 3 : _level;
|
||||
},
|
||||
warn: (msg) => {
|
||||
console.log("%s: %s", new Date().toLocaleString(), msg)
|
||||
/**
|
||||
* @param {String|Array<String>} msg
|
||||
* @param {String} [split] 分隔符
|
||||
*/
|
||||
proPrint(msg, split = ' ') {
|
||||
console.log([msg].flat().join(split))
|
||||
},
|
||||
debug(context, msg) {
|
||||
if (this.level > 3) {
|
||||
if (msg instanceof Object) msg = JSON.stringify(msg, null, 4);
|
||||
this.proPrint([`[${Date()}]`, chalk.grey("[Debug]"), chalk.hex('#FFA500')(`[${context}]`), '\n', chalk.hex('#0070BB')(`[${msg}]`)])
|
||||
}
|
||||
},
|
||||
info(context, msg) {
|
||||
if (this.level > 2)
|
||||
this.proPrint([`[${Date()}]`, chalk.grey("[Info]"), chalk.hex('#FFA500')(`[${context}]`), chalk.hex('#48BB31')(`[${msg}]`)])
|
||||
},
|
||||
warn(context, msg) {
|
||||
if (this.level > 1)
|
||||
this.proPrint([`[${Date()}]`, chalk.grey("[Warn]"), chalk.hex('#FFA500')(`[${context}]`), chalk.hex('#BBBB23')(`[${msg}]`)])
|
||||
},
|
||||
error(context, msg) {
|
||||
if (this.level > 0)
|
||||
this.proPrint([`[${Date()}]`, chalk.grey("[Error]"), chalk.hex('#FFA500')(`[${context}]`), chalk.hex('#FF0006')(`[${msg}]`)])
|
||||
}
|
||||
},
|
||||
/**
|
||||
@@ -154,36 +182,45 @@ const Base = {
|
||||
* 获取远程设置
|
||||
* @returns {Promise<JSON>}
|
||||
*/
|
||||
getRemoteConfig: () => new Promise((resolve) => {
|
||||
HttpRequest({
|
||||
method: 'GET',
|
||||
url: 'https://gitee.com/shanmite/lottery-notice/raw/master/notice.json',
|
||||
headers: {
|
||||
'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.116 Safari/537.36',
|
||||
accept: 'text/plain; charset=utf-8',
|
||||
referer: 'https://gitee.com/shanmite/lottery-notice/blob/master/notice.json',
|
||||
},
|
||||
success: res => {
|
||||
try {
|
||||
const body = JSON.parse(res.body);
|
||||
if (body.node_msg) console.log(body.node_msg);
|
||||
resolve(body.config)
|
||||
} catch (error) {
|
||||
resolve(JSON.parse('{}'))
|
||||
getRemoteConfig() {
|
||||
return new Promise((resolve) => {
|
||||
HttpRequest({
|
||||
method: 'GET',
|
||||
url: 'https://gitee.com/shanmite/lottery-notice/raw/master/notice.json',
|
||||
headers: {
|
||||
'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.116 Safari/537.36',
|
||||
accept: 'text/plain; charset=utf-8',
|
||||
referer: 'https://gitee.com/shanmite/lottery-notice/blob/master/notice.json',
|
||||
},
|
||||
success: res => {
|
||||
try {
|
||||
const body = JSON.parse(res.body);
|
||||
if (body.node_msg) this.log.info('公告', '\n' + body.node_msg + '\n');
|
||||
resolve(body.config)
|
||||
} catch (error) {
|
||||
resolve(JSON.parse('{}'))
|
||||
}
|
||||
},
|
||||
failure: err => {
|
||||
this.log.error('获取远程设置', '获取远程设置错误: ' + err);
|
||||
resolve(JSON.parse('{}'));
|
||||
}
|
||||
},
|
||||
failure: err => {
|
||||
console.log('获取远程设置错误: ' + err);
|
||||
resolve(JSON.parse('{}'));
|
||||
}
|
||||
})
|
||||
})
|
||||
}),
|
||||
},
|
||||
/**
|
||||
*
|
||||
* @param {string} ts 13位时间戳
|
||||
* @param {number} zoneOffset 东时区记做正数
|
||||
* 是否存在文件或目录
|
||||
* @param {string} path
|
||||
* @returns
|
||||
*/
|
||||
transformTimeZone: (ts, zoneOffset) => new Date(new Date(ts).getTime() + zoneOffset * 60 * 60 * 1000).toLocaleString(),
|
||||
hasFileOrDir(path) {
|
||||
try {
|
||||
fs.accessSync(path, fs.constants.F_OK)
|
||||
} catch (_) {
|
||||
return false
|
||||
}
|
||||
return true
|
||||
},
|
||||
/**
|
||||
* 生成文件夹
|
||||
* @param {string} dirname
|
||||
@@ -245,4 +282,5 @@ const Base = {
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
module.exports = Base;
|
||||
+48
-48
@@ -1,5 +1,5 @@
|
||||
const Ajax = require('./Ajax');
|
||||
const { strToJson, tooltip } = require('./Base');
|
||||
const { strToJson, log } = require('./Base');
|
||||
const GlobalVar = require('./GlobalVar');
|
||||
|
||||
/**
|
||||
@@ -80,10 +80,10 @@ const BiliAPI = {
|
||||
if (res.code === 0) {
|
||||
const { at } = res.data;
|
||||
resolve(at)
|
||||
tooltip.log(`[获取未读@]成功 数量: ${at}`)
|
||||
log.info('获取未读@', `成功 数量: ${at}`)
|
||||
} else {
|
||||
resolve(-1)
|
||||
tooltip.log(`[获取未读@]失败\n${responseText}`)
|
||||
log.error('获取未读@', `失败\n${responseText}`)
|
||||
}
|
||||
}
|
||||
})
|
||||
@@ -122,7 +122,7 @@ const BiliAPI = {
|
||||
success: responseText => {
|
||||
let res = strToJson(responseText);
|
||||
if (res.code === 0) {
|
||||
tooltip.log('[获取一页私信](20)成功 ' + (ts_16 ? 'end_ts->' + ts_16 : '第一页'));
|
||||
log.info('获取一页私信(20)', '成功 ' + (ts_16 ? 'end_ts->' + ts_16 : '第一页'));
|
||||
/**@type {Array} */
|
||||
const sessions = res.data.session_list || [];
|
||||
const has_more = res.data.has_more;
|
||||
@@ -133,7 +133,7 @@ const BiliAPI = {
|
||||
})
|
||||
resolve({ has_more, data })
|
||||
} else {
|
||||
tooltip.log(`[获取私信]失败\n${responseText}`);
|
||||
log.error('获取私信', `失败\n${responseText}`);
|
||||
resolve({ has_more: 0, data: [] });
|
||||
}
|
||||
}
|
||||
@@ -154,10 +154,10 @@ const BiliAPI = {
|
||||
if (res.code === 0) {
|
||||
const { unfollow_unread, follow_unread } = res.data;
|
||||
resolve({ unfollow_unread, follow_unread });
|
||||
tooltip.log(`[获取未读私信]成功 已关注未读数: ${follow_unread}, 未关注未读数 ${unfollow_unread}`);
|
||||
log.info('获取未读私信', `成功 已关注未读数: ${follow_unread}, 未关注未读数 ${unfollow_unread}`);
|
||||
} else {
|
||||
resolve(null);
|
||||
tooltip.log(`[获取未读私信]失败\n${responseText}`);
|
||||
log.error('获取未读私信', `失败\n${responseText}`);
|
||||
}
|
||||
}
|
||||
})
|
||||
@@ -181,9 +181,9 @@ const BiliAPI = {
|
||||
success: responseText => {
|
||||
let res = strToJson(responseText);
|
||||
if (res.code === 0) {
|
||||
tooltip.log(`[私信已读]成功 -> talker_id: ${talker_id}`);
|
||||
log.info('私信已读', `成功 -> talker_id: ${talker_id}`);
|
||||
} else {
|
||||
tooltip.log(`[私信已读]失败 -> talker_id: ${talker_id}`);
|
||||
log.error('私信已读', `失败 -> talker_id: ${talker_id}`);
|
||||
}
|
||||
}
|
||||
})
|
||||
@@ -203,10 +203,10 @@ const BiliAPI = {
|
||||
success: responseText => {
|
||||
let res = strToJson(responseText);
|
||||
if (res.code === 0) {
|
||||
tooltip.log('[获取关注列表]成功');
|
||||
log.info('获取关注列表', '成功');
|
||||
resolve(res.data.list.toString());
|
||||
} else {
|
||||
tooltip.log(`[获取关注列表]失败\n${responseText}`);
|
||||
log.error('获取关注列表', `失败\n${responseText}`);
|
||||
resolve(null);
|
||||
}
|
||||
}
|
||||
@@ -258,7 +258,7 @@ const BiliAPI = {
|
||||
success: responseText => {
|
||||
const res = strToJson(responseText);
|
||||
if (res.code !== 0) {
|
||||
tooltip.log('获取TagID失败');
|
||||
log.error('获取TagID', '失败');
|
||||
resolve(-1);
|
||||
} else {
|
||||
resolve(res.data.tag_id);
|
||||
@@ -325,7 +325,7 @@ const BiliAPI = {
|
||||
if (res.code === 0) {
|
||||
resolve(res.data.follower);
|
||||
} else {
|
||||
tooltip.warn(`[获取粉丝数]尝试切换线路`);
|
||||
log.warn('获取粉丝数', '尝试切换线路');
|
||||
Ajax.get({
|
||||
url: 'https://api.bilibili.com/x/relation/stat',
|
||||
queryStringsObj: {
|
||||
@@ -335,9 +335,9 @@ const BiliAPI = {
|
||||
const res = strToJson(responseText);
|
||||
if (res.code === 0) {
|
||||
resolve(res.data.follower);
|
||||
tooltip.log(`[获取粉丝数]ok`);
|
||||
log.info('获取粉丝数', 'ok');
|
||||
} else {
|
||||
tooltip.warn(`获取粉丝数出错,可能是访问过频繁\n${responseText}`);
|
||||
log.error('获取粉丝数', `出错 可能是访问过频繁\n${responseText}`);
|
||||
resolve(-1);
|
||||
}
|
||||
}
|
||||
@@ -389,7 +389,7 @@ const BiliAPI = {
|
||||
isMe: isMe
|
||||
});
|
||||
} else {
|
||||
tooltip.log(`获取开奖信息失败\n${responseText}`);
|
||||
log.info('获取开奖信息', `失败\n${responseText}`);
|
||||
resolve({
|
||||
ts: -1,
|
||||
text: '获取开奖信息失败',
|
||||
@@ -427,16 +427,16 @@ const BiliAPI = {
|
||||
/* 重复关注code also equal 0 */
|
||||
const res = strToJson(responseText)
|
||||
if (res.code === 0) {
|
||||
tooltip.log('[自动关注]关注+1');
|
||||
log.info('自动关注', '关注+1');
|
||||
resolve(0);
|
||||
} else if (res.code === 22002) {
|
||||
tooltip.log('[自动关注]您已被对方拉入黑名单');
|
||||
log.error('自动关注', '您已被对方拉入黑名单');
|
||||
resolve(1);
|
||||
} else if (res.code === 22015) {
|
||||
tooltip.log('[自动关注]您的账号异常无法关注');
|
||||
log.error('自动关注', '您的账号异常无法关注');
|
||||
resolve(2);
|
||||
} else {
|
||||
tooltip.log(`[自动关注]失败 尝试切换线路\n${responseText}`);
|
||||
log.warn('自动关注', `失败 尝试切换线路\n${responseText}`);
|
||||
Ajax.post({
|
||||
url: 'https://api.vc.bilibili.com/feed/v1/feed/SetUserFollow',
|
||||
data: {
|
||||
@@ -446,10 +446,10 @@ const BiliAPI = {
|
||||
},
|
||||
success: responseText => {
|
||||
if (/^{"code":0/.test(responseText)) {
|
||||
tooltip.log('[自动关注]关注+1');
|
||||
log.info('自动关注', '关注+1');
|
||||
resolve(0);
|
||||
} else {
|
||||
tooltip.log(`[自动关注]失败 尝试切换另一条线路\n${responseText}`);
|
||||
log.warn('自动关注', `失败 尝试切换另一条线路\n${responseText}`);
|
||||
Ajax.post({
|
||||
url: 'https://api.bilibili.com/x/relation/batch/modify',
|
||||
data: {
|
||||
@@ -460,10 +460,10 @@ const BiliAPI = {
|
||||
},
|
||||
success: responseText => {
|
||||
if (/^{"code":0/.test(responseText)) {
|
||||
tooltip.log('[自动关注]关注+1');
|
||||
log.info('自动关注', '关注+1');
|
||||
resolve(0);
|
||||
} else {
|
||||
tooltip.log(`[自动关注]失败\n${responseText}`);
|
||||
log.error('自动关注', `失败\n${responseText}`);
|
||||
resolve(1);
|
||||
}
|
||||
}
|
||||
@@ -496,10 +496,10 @@ const BiliAPI = {
|
||||
success: responseText => {
|
||||
/* 重复移动code also equal 0 */
|
||||
if (/^{"code":0/.test(responseText)) {
|
||||
tooltip.log('[移动分区]up主分区移动成功');
|
||||
log.info('移动分区', 'up主分区移动成功');
|
||||
resolve(0);
|
||||
} else {
|
||||
tooltip.log(`[移动分区]up主分区移动失败\n${responseText}`);
|
||||
log.error('移动分区', `up主分区移动失败\n${responseText}`);
|
||||
resolve(1);
|
||||
}
|
||||
}
|
||||
@@ -525,10 +525,10 @@ const BiliAPI = {
|
||||
success: responseText => {
|
||||
const res = strToJson(responseText);
|
||||
if (res.code === 0) {
|
||||
tooltip.log('[自动取关]取关成功');
|
||||
log.info('自动取关', '取关成功');
|
||||
resolve(true)
|
||||
} else {
|
||||
tooltip.log(`[自动取关]取关失败\n${responseText}`);
|
||||
log.error('自动取关', `取关失败\n${responseText}`);
|
||||
resolve(false)
|
||||
}
|
||||
}
|
||||
@@ -554,10 +554,10 @@ const BiliAPI = {
|
||||
},
|
||||
success: responseText => {
|
||||
if (/^{"code":0/.test(responseText)) {
|
||||
tooltip.log('[自动点赞]点赞成功');
|
||||
log.info('自动点赞', '点赞成功');
|
||||
resolve(0);
|
||||
} else {
|
||||
tooltip.log(`[转发动态]点赞失败\n${responseText}`);
|
||||
log.error('自动点赞', `点赞失败\n${responseText}`);
|
||||
resolve(1);
|
||||
}
|
||||
}
|
||||
@@ -594,10 +594,10 @@ const BiliAPI = {
|
||||
},
|
||||
success: responseText => {
|
||||
if (/^{"code":0/.test(responseText)) {
|
||||
tooltip.log('[转发动态]成功转发一条动态');
|
||||
log.info('转发动态', '成功转发一条动态');
|
||||
resolve(0);
|
||||
} else {
|
||||
tooltip.log(`[转发动态]转发动态失败\n${responseText}`);
|
||||
log.error('转发动态', `转发动态失败\n${responseText}`);
|
||||
resolve(1);
|
||||
}
|
||||
}
|
||||
@@ -640,9 +640,9 @@ const BiliAPI = {
|
||||
data,
|
||||
success: responseText => {
|
||||
if (/^{"code":0/.test(responseText)) {
|
||||
tooltip.log('[发布动态]成功创建一条随机内容的动态');
|
||||
log.info('发布动态', '成功创建一条随机内容的动态');
|
||||
} else {
|
||||
tooltip.warn(`[发布动态]发布动态失败\n${responseText}`);
|
||||
log.error('发布动态', `发布动态失败\n${responseText}`);
|
||||
}
|
||||
resolve()
|
||||
}
|
||||
@@ -665,10 +665,10 @@ const BiliAPI = {
|
||||
retry: false,
|
||||
success: responseText => {
|
||||
if (/^{"code":0/.test(responseText)) {
|
||||
tooltip.log('[删除动态]成功删除一条动态');
|
||||
log.info('删除动态', '成功删除一条动态');
|
||||
resolve(true);
|
||||
} else {
|
||||
tooltip.log(`[删除动态]删除动态失败\n${responseText}`);
|
||||
log.error('删除动态', `删除动态失败\n${responseText}`);
|
||||
resolve(false);
|
||||
}
|
||||
}
|
||||
@@ -701,19 +701,19 @@ const BiliAPI = {
|
||||
success: responseText => {
|
||||
const res = strToJson(responseText);
|
||||
if (res.code === 0) {
|
||||
show ? tooltip.log('[自动评论]评论成功') : void 0;
|
||||
show && log.info('自动评论', '评论成功');
|
||||
resolve(0);
|
||||
} else if (res.code === -404) {
|
||||
show ? tooltip.log('[自动评论]原动态已删除') : void 0;
|
||||
show && log.error('自动评论', '原动态已删除');
|
||||
resolve(0);
|
||||
} else if (res.code === 12002) {
|
||||
show ? tooltip.log('[自动评论]评论区已关闭') : void 0;
|
||||
show && log.error('自动评论', '评论区已关闭');
|
||||
resolve(0);
|
||||
} else if (res.code === 12015) {
|
||||
show ? tooltip.log('[自动评论]需要输入验证码') : void 0;
|
||||
show && log.error('自动评论', '需要输入验证码');
|
||||
resolve(1);
|
||||
} else {
|
||||
show ? tooltip.log(`[自动评论]评论失败\n${responseText}`) : void 0;
|
||||
show && log.error('自动评论', `评论失败\n${responseText}`);
|
||||
resolve(0);
|
||||
}
|
||||
}
|
||||
@@ -738,10 +738,10 @@ const BiliAPI = {
|
||||
if (res.code === 0) {
|
||||
const data = res.data.filter((it) => it.name === name);
|
||||
if (data.length) {
|
||||
tooltip.log('[获取分区id]成功');
|
||||
log.info('获取分区id', '成功');
|
||||
tagid = data[0].tagid
|
||||
} else {
|
||||
tooltip.log('[获取分区id]失败 无指定分区');
|
||||
log.warn('获取分区id', '失败 无指定分区');
|
||||
}
|
||||
if (name === '此处存放因抽奖临时关注的up') {
|
||||
if (typeof tagid === 'undefined') {
|
||||
@@ -753,7 +753,7 @@ const BiliAPI = {
|
||||
resolve(tagid)
|
||||
}
|
||||
} else {
|
||||
tooltip.warn(`[获取分区id]访问出错 可在my_config里手动填入\n${responseText}`)
|
||||
log.error('获取分区id', `访问出错 可在my_config里手动填入\n${responseText}`)
|
||||
resolve(tagid)
|
||||
}
|
||||
}
|
||||
@@ -776,11 +776,11 @@ const BiliAPI = {
|
||||
success: responseText => {
|
||||
let obj = strToJson(responseText);
|
||||
if (obj.code === 0) {
|
||||
tooltip.log('[新建分区]分区新建成功')
|
||||
log.info('新建分区', '分区新建成功')
|
||||
let { tagid } = obj.data /* 获取tagid */
|
||||
resolve(tagid)
|
||||
} else {
|
||||
tooltip.warn(`[新建分区]分区新建失败\n${responseText}`);
|
||||
log.error('新建分区', `分区新建失败\n${responseText}`);
|
||||
resolve(undefined);
|
||||
}
|
||||
}
|
||||
@@ -810,10 +810,10 @@ const BiliAPI = {
|
||||
res.data.forEach(d => {
|
||||
uids.push(d.mid);
|
||||
})
|
||||
tooltip.log(`[获取分组${tagid}]成功获取取关分区列表${n}`);
|
||||
log.info(`获取分组${tagid}`, `成功获取取关分区列表${n}`);
|
||||
resolve(uids)
|
||||
} else {
|
||||
tooltip.warn(`[获取分组]获取取关分区列表失败\n${responseText}`);
|
||||
log.error(`获取分组${tagid}`, `获取取关分区列表失败\n${responseText}`);
|
||||
resolve(uids)
|
||||
}
|
||||
}
|
||||
|
||||
+11
-6
@@ -6,6 +6,7 @@ const Public = require('./Public');
|
||||
const GlobalVar = require("./GlobalVar");
|
||||
const config = require("./config");
|
||||
const MyStorage = require('./MyStorage');
|
||||
const { log } = Base;
|
||||
|
||||
/**
|
||||
* 监视器
|
||||
@@ -55,10 +56,10 @@ class Monitor extends Public {
|
||||
dyids.push(Lottery.dyid);
|
||||
}
|
||||
if (dyids.length) MyStorage.updateDyid(dyids.toString())
|
||||
Base.tooltip.log('开始转发下一组动态');
|
||||
log.info('抽奖', '开始转发下一组动态');
|
||||
} else {
|
||||
status = 0;
|
||||
Base.tooltip.log('无未转发抽奖');
|
||||
log.info('抽奖', '无未转发抽奖');
|
||||
}
|
||||
}
|
||||
switch (status) {
|
||||
@@ -85,7 +86,7 @@ class Monitor extends Public {
|
||||
eventBus.emit('Turn_off_the_Monitor', '转发失败')
|
||||
break
|
||||
default:
|
||||
eventBus.emit('Turn_off_the_Monitor', '出错 status:' + status)
|
||||
eventBus.emit('Turn_off_the_Monitor', '出错 allLottery: ' + allLottery)
|
||||
break;
|
||||
}
|
||||
}
|
||||
@@ -111,11 +112,13 @@ class Monitor extends Public {
|
||||
if (protoLotteryInfo === null)
|
||||
return [];
|
||||
|
||||
log.debug('未进行筛选的动态信息', protoLotteryInfo);
|
||||
/** 所有抽奖信息 */
|
||||
let alllotteryinfo = [];
|
||||
const { key_words, model, chatmodel, is_imitator, maxday: _maxday, minfollower, skip_official_verify, only_followed, at_users, blockword, blacklist } = config;
|
||||
const maxday = _maxday * 86400
|
||||
let dyids_set = new Set();
|
||||
log.info('筛选动态', '正在筛选');
|
||||
for (const info of protoLotteryInfo) {
|
||||
const { lottery_info_type, uids, uname, dyid, official_verify, ctrl, befilter, rid, des, type, hasOfficialLottery } = info;
|
||||
|
||||
@@ -149,6 +152,7 @@ class Monitor extends Public {
|
||||
|
||||
if (lottery_info_type === 'uid' && is_imitator) {
|
||||
isLottery = true;
|
||||
isSendChat = chatmodel[1] === '1' || chatmodel[1] === '1';
|
||||
} else if (hasOfficialLottery && model[0] === '1') {
|
||||
({ ts } = await BiliAPI.getLotteryNotice(dyid));
|
||||
if (ts < 0) { alllotteryinfo = null; break }
|
||||
@@ -172,7 +176,7 @@ class Monitor extends Public {
|
||||
const isFollowed = (new RegExp(uid)).test(self.attentionList);
|
||||
if (only_followed && !isFollowed) continue;
|
||||
/* 判断是否转发过 */
|
||||
const isRelay = await MyStorage.searchDyid(dyid);
|
||||
const isRelayed = await MyStorage.searchDyid(dyid);
|
||||
/* 获取黑名单并去重合并 */
|
||||
const { blacklist: remote_blacklist } = GlobalVar.get("remoteconfig");
|
||||
const new_blacklist = remote_blacklist ?
|
||||
@@ -181,7 +185,7 @@ class Monitor extends Public {
|
||||
if ((new RegExp(dyid + '|' + uid)).test(new_blacklist)) continue;
|
||||
onelotteryinfo.uid = [] /**初始化待关注列表 */
|
||||
if (!isFollowed) onelotteryinfo.uid.push(uid);
|
||||
if (!isRelay) {
|
||||
if (!isRelayed) {
|
||||
onelotteryinfo.dyid = dyid;
|
||||
let RandomStr = Base.getRandomOne(config.relay);
|
||||
let new_ctrl = [];
|
||||
@@ -244,6 +248,7 @@ class Monitor extends Public {
|
||||
* 41 - 转发失败
|
||||
*/
|
||||
async go(option) {
|
||||
log.debug('正在转发的动态信息', option);
|
||||
let status = 1;
|
||||
const { uid, dyid, type, rid, relay_chat, ctrl } = option;
|
||||
/* 评论 */
|
||||
@@ -253,7 +258,7 @@ class Monitor extends Public {
|
||||
for (let times = 0; times < max_retry_times && status; times++) {
|
||||
status = await send();
|
||||
if (status) {
|
||||
Base.tooltip.log(`将在 ${times + 1} 分钟后再次发送评论(${times + 1}/${max_retry_times})`)
|
||||
log.info('自动评论', `将在 ${times + 1} 分钟后再次发送评论(${times + 1}/${max_retry_times})`)
|
||||
await Base.delay(60 * 1000 * (times + 1))
|
||||
}
|
||||
}
|
||||
|
||||
+4
-28
@@ -1,31 +1,7 @@
|
||||
const Base = require("./Base");
|
||||
const GihubAPI = require("./GithubAPI");
|
||||
const { log } = Base;
|
||||
|
||||
const MyStorage = {
|
||||
/**
|
||||
* 初始化dyid.txt
|
||||
*/
|
||||
init: () => {
|
||||
return new Promise((resolve) => {
|
||||
GihubAPI.listArtifacts().then(async artifact => {
|
||||
const { id, size_in_bytes } = artifact;
|
||||
if (size_in_bytes) {
|
||||
GihubAPI.downloadArtifacts(id).then(async status => {
|
||||
if (status) {
|
||||
Base.tooltip.log('存储初始化成功');
|
||||
} else {
|
||||
Base.tooltip.log('存储初始化失败');
|
||||
await Base.createFile('dyid.txt', '', 'a')
|
||||
}
|
||||
resolve()
|
||||
})
|
||||
} else {
|
||||
await Base.createFile('dyid.txt', '', 'a')
|
||||
resolve()
|
||||
}
|
||||
})
|
||||
});
|
||||
},
|
||||
/**
|
||||
* 搜索dyid
|
||||
* @param {string} dyid
|
||||
@@ -45,7 +21,7 @@ const MyStorage = {
|
||||
resolve(status)
|
||||
})
|
||||
rs.on('error', err => {
|
||||
Base.tooltip.log(err)
|
||||
log.error('搜索dyid', err)
|
||||
resolve(status)
|
||||
})
|
||||
})
|
||||
@@ -55,7 +31,7 @@ const MyStorage = {
|
||||
* @param {string} dyid
|
||||
*/
|
||||
updateDyid: (dyid) => {
|
||||
Base.tooltip.log('写入已转发过的动态信息');
|
||||
log.info('更新dyid', '写入已转发过的动态信息');
|
||||
return new Promise((resolve) => {
|
||||
const ws = Base.writeDyidFile(Number(process.env.NUMBER));
|
||||
ws.write(dyid + ',', () => {
|
||||
@@ -63,7 +39,7 @@ const MyStorage = {
|
||||
resolve()
|
||||
})
|
||||
ws.on('error', err => {
|
||||
Base.tooltip.log(err)
|
||||
log.error('更新dyid', err)
|
||||
resolve()
|
||||
})
|
||||
});
|
||||
|
||||
+63
-39
@@ -1,6 +1,7 @@
|
||||
const Base = require('./Base');
|
||||
const BiliAPI = require('./BiliAPI');
|
||||
const config = require("./config");
|
||||
const { log } = Base
|
||||
/**
|
||||
* 基础功能
|
||||
*/
|
||||
@@ -38,7 +39,7 @@ class Public {
|
||||
* @returns {Promise<{allModifyDynamicResArray: UsefulDynamicInfo[];offset: string}>} 获取前 `pages*12` 个动态信息
|
||||
*/
|
||||
async checkAllDynamic(hostuid, pages, time = 0, _offset = '0') {
|
||||
Base.tooltip.log(`准备读取${pages}页动态`);
|
||||
log.info('检查所有动态', `准备读取${pages}页动态`);
|
||||
const mDR = this.modifyDynamicRes,
|
||||
getOneDynamicInfoByUID = BiliAPI.getOneDynamicInfoByUID,
|
||||
curriedGetOneDynamicInfoByUID = Base.curryify(getOneDynamicInfoByUID); /* 柯里化的请求函数 */
|
||||
@@ -53,7 +54,7 @@ class Public {
|
||||
let allModifyDynamicResArray = [];
|
||||
let offset = _offset;
|
||||
for (let i = 0; i < pages; i++) {
|
||||
Base.tooltip.log(`正在读取其中第${i + 1}页动态`);
|
||||
log.info('检查所有动态', `正在读取其中第${i + 1}页动态`);
|
||||
let OneDynamicInfo = await hadUidGetOneDynamicInfoByUID(offset);
|
||||
const mDRdata = mDR(OneDynamicInfo);
|
||||
if (mDRdata === null) {
|
||||
@@ -67,11 +68,13 @@ class Public {
|
||||
nextinfo = mDRdata.nextinfo;
|
||||
if (nextinfo.has_more === 0) {
|
||||
offset = nextinfo.next_offset;
|
||||
Base.tooltip.log(`成功读取${i + 1}页信息(已经是最后一页了故无法读取更多)`);
|
||||
log.info('检查所有动态', `成功读取${i + 1}页信息(已经是最后一页了故无法读取更多)`);
|
||||
break;
|
||||
} else {
|
||||
allModifyDynamicResArray.push.apply(allModifyDynamicResArray, mDRArry);
|
||||
i + 1 < pages ? Base.tooltip.log(`开始读取第${i + 2}页动态信息`) : Base.tooltip.log(`${pages}页信息全部成功读取完成`);
|
||||
i + 1 < pages
|
||||
? log.info('检查所有动态', `开始读取第${i + 2}页动态信息`)
|
||||
: log.info('检查所有动态', `${pages}页信息全部成功读取完成`);
|
||||
offset = nextinfo.next_offset;
|
||||
}
|
||||
await Base.delay(time);
|
||||
@@ -86,13 +89,12 @@ class Public {
|
||||
*/
|
||||
modifyDynamicRes(res) {
|
||||
const strToJson = Base.strToJson,
|
||||
jsonRes = strToJson(res),
|
||||
{ data } = jsonRes;
|
||||
if (jsonRes.code !== 0) {
|
||||
Base.tooltip.warn('获取动态数据出错,可能是访问太频繁');
|
||||
{ data, code } = strToJson(res);
|
||||
if (code !== 0) {
|
||||
log.error('处理动态数据', '获取动态数据出错,可能是访问太频繁 \n' + res);
|
||||
return null;
|
||||
}
|
||||
/* 字符串防止损失精度 */
|
||||
/* 字符串offset防止损失精度 */
|
||||
const offset = typeof data.offset === 'string' ? data.offset : /(?<=next_offset":)[0-9]*/.exec(res)[0]
|
||||
, next = {
|
||||
has_more: data.has_more,
|
||||
@@ -103,12 +105,12 @@ class Public {
|
||||
*/
|
||||
let array = [];
|
||||
if (next.has_more === 0) {
|
||||
Base.tooltip.log('动态数据读取完毕');
|
||||
log.info('处理动态数据', '动态数据读取完毕');
|
||||
} else {
|
||||
/**
|
||||
* 空动态无cards
|
||||
*/
|
||||
const Cards = data.cards;
|
||||
const Cards = data.cards || [];
|
||||
Cards.forEach(onecard => {
|
||||
/**临时储存单个动态中的信息 */
|
||||
let obj = {};
|
||||
@@ -116,38 +118,59 @@ class Public {
|
||||
, { info, card: user_profile_card } = desc.user_profile
|
||||
, { official_verify } = user_profile_card
|
||||
, cardToJson = strToJson(card);
|
||||
obj.uid = info.uid; /* 转发者的UID */
|
||||
obj.uname = info.uname;/* 转发者的name */
|
||||
obj.official_verify = official_verify.type > -1 ? true : false; /* 是否官方号 */
|
||||
obj.createtime = desc.timestamp /* 动态的ts10 */
|
||||
obj.type = desc.type /* 动态类型 */
|
||||
obj.rid_str = desc.rid_str.length > 12 ? desc.dynamic_id_str : desc.rid_str;/* 用于发送评论 */
|
||||
obj.orig_type = desc.orig_type /* 源动态类型 */
|
||||
obj.dynamic_id = desc.dynamic_id_str; /* 转发者的动态ID !!!!此为大数需使用字符串值,不然JSON.parse()会有丢失精度 */
|
||||
/* 转发者的UID */
|
||||
obj.uid = info.uid;
|
||||
/* 转发者的name */
|
||||
obj.uname = info.uname;
|
||||
/* 是否官方号 */
|
||||
obj.official_verify = official_verify.type > -1 ? true : false;
|
||||
/* 动态的ts10 */
|
||||
obj.createtime = desc.timestamp
|
||||
/* 动态类型 */
|
||||
obj.type = desc.type
|
||||
/* 用于发送评论 */
|
||||
obj.rid_str = desc.rid_str.length > 12 ? desc.dynamic_id_str : desc.rid_str;
|
||||
/* 源动态类型 */
|
||||
obj.orig_type = desc.orig_type
|
||||
/* 转发者的动态ID !!!!此为大数需使用字符串值,不然JSON.parse()会有丢失精度 */
|
||||
obj.dynamic_id = desc.dynamic_id_str;
|
||||
const { extension, extend_json } = onecard;
|
||||
obj.ctrl = (typeof extend_json === 'undefined') ? [] : strToJson(extend_json).ctrl || []; /* 定位@信息 */
|
||||
obj.hasOfficialLottery = (typeof extension === 'undefined') ? false : typeof extension.lott === 'undefined' ? false : true; /* 是否有官方抽奖 */
|
||||
const item = cardToJson.item || {};
|
||||
obj.description = item.content || item.description || ''; /* 转发者的描述 */
|
||||
/* 定位@信息 */
|
||||
obj.ctrl = (typeof extend_json === 'undefined') ? [] : strToJson(extend_json).ctrl || [];
|
||||
/* 是否有官方抽奖 */
|
||||
obj.hasOfficialLottery = (typeof extension === 'undefined') ? false : typeof extension.lott === 'undefined' ? false : true;
|
||||
const { item = {} } = cardToJson;
|
||||
/* 转发者的描述 后两个分别是视频动态的描述和视频本身的描述*/
|
||||
obj.description = item.content || item.description || cardToJson.dynamic || cardToJson.desc || '';
|
||||
if (obj.type === 1) {
|
||||
obj.origin_uid = desc.origin.uid; /* 被转发者的UID */
|
||||
obj.origin_rid_str = desc.origin.rid_str.length > 12 ? desc.origin.dynamic_id_str : desc.origin.rid_str; /* 被转发者的rid(用于发评论) */
|
||||
obj.origin_dynamic_id = desc.orig_dy_id_str; /* 被转发者的动态的ID !!!!此为大数需使用字符串值,不然JSON.parse()会有丢失精度 */
|
||||
/* 被转发者的UID */
|
||||
obj.origin_uid = desc.origin.uid;
|
||||
/* 被转发者的rid(用于发评论) */
|
||||
obj.origin_rid_str = desc.origin.rid_str.length > 12 ? desc.origin.dynamic_id_str : desc.origin.rid_str;
|
||||
/* 被转发者的动态的ID !!!!此为大数需使用字符串值,不然JSON.parse()会有丢失精度 */
|
||||
obj.origin_dynamic_id = desc.orig_dy_id_str;
|
||||
const { origin_extension, origin_user } = cardToJson;
|
||||
try {
|
||||
/* 是否官方号 */
|
||||
obj.origin_official_verify = typeof origin_user === 'undefined' ?
|
||||
false : origin_user.card.official_verify.type < 0 ?
|
||||
false : true; /* 是否官方号 */
|
||||
} catch (error) {
|
||||
false : true;
|
||||
} catch (_) {
|
||||
obj.origin_official_verify = false;
|
||||
}
|
||||
/* 是否有官方抽奖 */
|
||||
obj.origin_hasOfficialLottery = typeof origin_extension === 'undefined' ?
|
||||
false : typeof origin_extension.lott === 'undefined' ?
|
||||
false : true; /* 是否有官方抽奖 */
|
||||
false : true;
|
||||
const origin = cardToJson.origin || '{}';
|
||||
const { user, item } = strToJson(origin);
|
||||
obj.origin_uname = typeof user === 'undefined' ? '' : user.name || user.uname || ''; /* 被转发者的name */
|
||||
obj.origin_description = typeof item === 'undefined' ? '' : item.content || item.description || ''; /* 被转发者的描述 */
|
||||
const originToJson = strToJson(origin);
|
||||
const { user, item } = originToJson;
|
||||
/* 被转发者的name */
|
||||
obj.origin_uname = typeof user === 'undefined'
|
||||
? '' : user.name || user.uname || '';
|
||||
/* 被转发者的描述 */
|
||||
obj.origin_description = typeof item === 'undefined'
|
||||
? '' : item.content || item.description || originToJson.dynamic || originToJson.desc || '';
|
||||
}
|
||||
array.push(obj);
|
||||
});
|
||||
@@ -183,12 +206,12 @@ class Public {
|
||||
hotdy = await BiliAPI.getHotDynamicInfoByTagID(tag_id),
|
||||
modDR = self.modifyDynamicRes(hotdy);
|
||||
if (modDR === null) return null;
|
||||
Base.tooltip.log(`开始获取带话题#${tag_name}#的动态信息`);
|
||||
Base.tooltip.log('成功获取热门动态');
|
||||
log.info('获取动态', `开始获取带话题#${tag_name}#的动态信息`);
|
||||
log.info('获取动态', '成功获取热门动态');
|
||||
let mDRdata = modDR.modifyDynamicResArray; /* 热门动态 */
|
||||
let next_offset = modDR.nextinfo.next_offset;
|
||||
for (let index = 0; index < config.scan_page_num; index++) {
|
||||
Base.tooltip.log(`成功读取${index + 1}页动态`);
|
||||
log.info('获取动态', `成功读取${index + 1}页动态`);
|
||||
const newdy = await BiliAPI.getOneDynamicInfoByTag(tag_name, next_offset);
|
||||
const _modify = self.modifyDynamicRes(newdy);
|
||||
if (_modify === null) return null;
|
||||
@@ -212,7 +235,7 @@ class Public {
|
||||
hasOfficialLottery: o.hasOfficialLottery
|
||||
};
|
||||
})
|
||||
Base.tooltip.log(`成功获取带话题#${tag_name}#的动态信息`);
|
||||
log.info('获取动态', `成功获取带话题#${tag_name}#的动态信息`);
|
||||
return fomatdata
|
||||
}
|
||||
/**
|
||||
@@ -222,7 +245,7 @@ class Public {
|
||||
* @returns {Promise<LotteryInfo[] | null>}
|
||||
*/
|
||||
async getLotteryInfoByUID(UID) {
|
||||
Base.tooltip.log(`开始获取用户${UID}的动态信息`);
|
||||
log.info('获取动态', `开始获取用户${UID}的动态信息`);
|
||||
const { allModifyDynamicResArray: aMDRA } = await this.checkAllDynamic(UID, config.scan_page_num, config.search_wait);
|
||||
if (!aMDRA.length) return null;
|
||||
const fomatdata = aMDRA.map(o => {
|
||||
@@ -240,9 +263,10 @@ class Public {
|
||||
hasOfficialLottery: o.origin_hasOfficialLottery
|
||||
}
|
||||
}).filter(a => a.type === 0 ? false : true)
|
||||
Base.tooltip.log(`成功获取用户${UID}的动态信息`);
|
||||
log.info('获取动态', `成功获取用户${UID}的动态信息`);
|
||||
return fomatdata;
|
||||
}
|
||||
}
|
||||
|
||||
module.exports = Public;
|
||||
|
||||
module.exports = Public;
|
||||
+10
-19
@@ -1,13 +1,10 @@
|
||||
const Base = require("./Base");
|
||||
const { log, delay } = require("./Base");
|
||||
const BiliAPI = require("./BiliAPI");
|
||||
const { trigger } = require("./GithubAPI");
|
||||
const Public = require("./Public");
|
||||
const GlobalVar = require('./GlobalVar');
|
||||
const { followWhiteList } = require("./config");
|
||||
const config = require("./config");
|
||||
|
||||
/** Github运行限制时间*/
|
||||
const MAX_TIME = 6 * 60 * 60 * 1000 - 6 * 60 * 1000;
|
||||
/**动态偏移量 */
|
||||
let offset = '0';
|
||||
|
||||
@@ -17,11 +14,14 @@ let offset = '0';
|
||||
*/
|
||||
async function getFollowList() {
|
||||
const tagid = await BiliAPI.checkMyPartition(config.clear_partition);
|
||||
if (typeof tagid === 'undefined') { Base.tooltip.log('未能成功获取关注分区id'); return }
|
||||
if (typeof tagid === 'undefined') {
|
||||
log.info('获取关注列表', '未能成功获取关注分区id');
|
||||
return
|
||||
}
|
||||
let rmup = [];
|
||||
for (let index = 1; index < 42; index++) {
|
||||
const uids = await BiliAPI.getPartitionUID(tagid, index);
|
||||
await Base.delay(2e3);
|
||||
await delay(2e3);
|
||||
if (!uids.length) break;
|
||||
rmup.push(...uids)
|
||||
}
|
||||
@@ -35,15 +35,6 @@ async function getFollowList() {
|
||||
*/
|
||||
async function clear() {
|
||||
const { clear_max_day, clear_remove_dynamic, clear_remove_attention, clear_remove_delay, clear_dynamic_type } = config;
|
||||
if (!process.env.LOCALLAUNCH) {
|
||||
setTimeout(() => {
|
||||
Base.tooltip.log('运行时间超过Actions上限 - 6小时');
|
||||
Base.tooltip.log('尝试再次触发clear 并中止此任务')
|
||||
trigger('clear.yml').then(() => {
|
||||
process.exit(0);
|
||||
})
|
||||
}, MAX_TIME);
|
||||
}
|
||||
let success = true;
|
||||
const uid_list = await getFollowList();
|
||||
if (!clear_remove_dynamic && clear_remove_attention) {
|
||||
@@ -53,7 +44,7 @@ async function clear() {
|
||||
/* 取消关注 */
|
||||
success = await BiliAPI.cancelAttention(uid);
|
||||
/* 延时 */
|
||||
await Base.delay(clear_remove_delay);
|
||||
await delay(clear_remove_delay);
|
||||
|
||||
if (!success) break;
|
||||
}
|
||||
@@ -64,7 +55,7 @@ async function clear() {
|
||||
for (let index = 0; ; index++) {
|
||||
const { allModifyDynamicResArray, offset: _offset } = await Public.prototype.checkAllDynamic(GlobalVar.get("myUID"), 1, 5 * 1000, offset);
|
||||
offset = _offset;
|
||||
Base.tooltip.log(`开始读取第${index + 1}页(12条)`);
|
||||
log.info('清理动态', `开始读取第${index + 1}页(12条)`);
|
||||
for (let index = 0; index < allModifyDynamicResArray.length; index++) {
|
||||
const res = allModifyDynamicResArray[index];
|
||||
const { type, dynamic_id, createtime } = res;
|
||||
@@ -87,7 +78,7 @@ async function clear() {
|
||||
}
|
||||
|
||||
/* 延时 */
|
||||
await Base.delay(clear_remove_delay);
|
||||
await delay(clear_remove_delay);
|
||||
|
||||
if (!success) break;
|
||||
} else {
|
||||
@@ -95,7 +86,7 @@ async function clear() {
|
||||
}
|
||||
}
|
||||
}
|
||||
Base.tooltip.log(`第${index}页中的转发动态与关注全部处理成功`)
|
||||
log.info('清理动态', `第${index}页中的转发动态与关注全部处理成功`)
|
||||
if (offset === '0' || !success) break;
|
||||
}
|
||||
}
|
||||
|
||||
+2
-11
@@ -1,14 +1,5 @@
|
||||
const { config_file, tooltip } = require('./Base');
|
||||
|
||||
const my_config = (() => {
|
||||
let _my_config = {}
|
||||
try {
|
||||
_my_config = require(config_file)
|
||||
} catch (e) {
|
||||
tooltip.log("[config]自定义设置异常 原因如下:\n" + e);
|
||||
}
|
||||
return _my_config;
|
||||
})();
|
||||
const { config_file } = require('./Base');
|
||||
const my_config = require(config_file);
|
||||
|
||||
const config = {
|
||||
...my_config["default_config"],
|
||||
|
||||
+19
-36
@@ -1,19 +1,16 @@
|
||||
const Base = require('./Base');
|
||||
const BiliAPI = require('./BiliAPI');
|
||||
const GihubAPI = require("./GithubAPI");
|
||||
const eventBus = require('./eventBus');
|
||||
const GlobalVar = require('./GlobalVar');
|
||||
const Public = require('./Public');
|
||||
const Monitor = require('./Monitor');
|
||||
const { sendNotify } = require('./sendNotify');
|
||||
const config = require('./config');
|
||||
|
||||
/** Github运行限制时间*/
|
||||
const MAX_TIME = 6 * 60 * 60 * 1000 - 6 * 60 * 1000;
|
||||
const { log } = Base;
|
||||
|
||||
async function createRandomDynamic(num) {
|
||||
Base.tooltip.log(`准备创建${num}条随机动态`);
|
||||
if (config.create_dy) {
|
||||
log.info('随机动态', `准备创建${num}条随机动态`);
|
||||
const Dynamic = await Public.prototype.checkAllDynamic(GlobalVar.get("myUID"), 1);
|
||||
if ((Dynamic.allModifyDynamicResArray[0] || { type: 0 }).type === 1) {
|
||||
for (let index = 0; index < num; index++) {
|
||||
@@ -21,13 +18,13 @@ async function createRandomDynamic(num) {
|
||||
await Base.delay(2000);
|
||||
}
|
||||
} else {
|
||||
Base.tooltip.log('已有非抽奖动态故无需创建');
|
||||
log.info('随机动态', '已有非抽奖动态故无需创建');
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 主函数
|
||||
* 抽奖主函数
|
||||
* @param {string} cookie
|
||||
* @returns {Promise<void>}
|
||||
*/
|
||||
@@ -38,13 +35,13 @@ function start() {
|
||||
eventBus.on('Turn_on_the_Monitor', async () => {
|
||||
const lotterys = GlobalVar.get("Lottery");
|
||||
if (lotterys.length === 0) {
|
||||
Base.tooltip.log('抽奖信息为空');
|
||||
log.info('抽奖', '抽奖信息为空');
|
||||
resolve();
|
||||
return;
|
||||
}
|
||||
if (times.value() === lotterys.length) {
|
||||
await createRandomDynamic(config.create_dy_num);
|
||||
Base.tooltip.log('所有动态转发完毕');
|
||||
log.info('抽奖', '所有动态转发完毕');
|
||||
times.clear();
|
||||
eventBus.emit('Turn_off_the_Monitor', '目前无抽奖信息,过一会儿再来看看吧')
|
||||
return;
|
||||
@@ -55,25 +52,11 @@ function start() {
|
||||
});
|
||||
eventBus.on('Turn_off_the_Monitor', async (msg) => {
|
||||
await createRandomDynamic(config.create_dy_num);
|
||||
Base.tooltip.log('[运行结束]程序自动关闭 原因: ' + msg);
|
||||
log.info('结束抽奖', '原因: ' + msg);
|
||||
eventBus.flush();
|
||||
resolve();
|
||||
})
|
||||
if (process.env.LOCALLAUNCH) {
|
||||
eventBus.emit('Turn_on_the_Monitor');
|
||||
} else {
|
||||
setTimeout(() => {
|
||||
eventBus.emit('Turn_off_the_Monitor', '运行时间超过Actions上限 - 6小时')
|
||||
}, MAX_TIME);
|
||||
GihubAPI.hasLotteryRun().then(s => {
|
||||
if (s) {
|
||||
Base.tooltip.log("有冲突的工作流故终止此任务");
|
||||
resolve()
|
||||
} else {
|
||||
eventBus.emit('Turn_on_the_Monitor');
|
||||
}
|
||||
})
|
||||
}
|
||||
eventBus.emit('Turn_on_the_Monitor');
|
||||
});
|
||||
}
|
||||
|
||||
@@ -86,18 +69,18 @@ async function isMe() {
|
||||
const UnreadSessionNum = await BiliAPI.getUnreadSessionNum();
|
||||
const { follow_unread, unfollow_unread } = UnreadSessionNum || { unfollow_unread: 0, follow_unread: 0 };
|
||||
if (UnreadAtNum > 0) {
|
||||
Base.tooltip.log('<-- 正在检查at');
|
||||
log.info('中奖检测', '<-- 正在检查at');
|
||||
const MyAtInfo = await BiliAPI.getMyAtInfo();
|
||||
MyAtInfo.forEach(async AtInfo => {
|
||||
const { at_time, up_uname, business, source_content, url } = AtInfo
|
||||
desp += `发生时间: ${Base.transformTimeZone(at_time * 1000, 8)} \n\n`
|
||||
desp += `发生时间: ${new Date(at_time * 1000).toLocaleString()} \n\n`
|
||||
desp += `用户: ${up_uname} \n\n`
|
||||
desp += `在${business}中@了你(${GlobalVar.get("myUID")}) \n\n`
|
||||
desp += `原内容为: ${source_content} \n\n`
|
||||
desp += `[直达链接](${url}) \n\n`
|
||||
desp += `\n\n\n\n`
|
||||
});
|
||||
Base.tooltip.log('--> OK');
|
||||
log.info('中奖检测', '--> OK');
|
||||
}
|
||||
if (follow_unread + unfollow_unread > 0) {
|
||||
const check = async (type) => {
|
||||
@@ -112,7 +95,7 @@ async function isMe() {
|
||||
BiliAPI.updateSessionStatus(talker_id);
|
||||
await Base.delay(1000);
|
||||
if (/中奖|获得|填写|写上|提供|地址|支付宝账号|码|大会员/.test(content)) {
|
||||
desp += `发生时间: ${Base.transformTimeZone(timestamp * 1000, 8)} \n\n`
|
||||
desp += `发生时间: ${new Date(timestamp * 1000).toLocaleString()} \n\n`
|
||||
desp += `用户: ${sender_uid} \n\n`
|
||||
desp += `私信你(${GlobalVar.get("myUID")})说: ${content} \n\n`
|
||||
desp += `[直达链接](https://message.bilibili.com/#/whisper/mid${sender_uid}) \n\n`
|
||||
@@ -128,20 +111,20 @@ async function isMe() {
|
||||
} while (MySession.has_more && max < 10);
|
||||
}
|
||||
if (follow_unread) {
|
||||
Base.tooltip.log('<-- 正在检查已关注者的私信')
|
||||
log.info('中奖检测', '<-- 正在检查已关注者的私信')
|
||||
await check(1)
|
||||
}
|
||||
if (unfollow_unread) {
|
||||
Base.tooltip.log('<-- 正在检查未关注者的私信')
|
||||
log.info('中奖检测', '<-- 正在检查未关注者的私信')
|
||||
await check(2)
|
||||
}
|
||||
Base.tooltip.log('--> OK');
|
||||
log.info('中奖检测', '--> OK');
|
||||
}
|
||||
if (desp) {
|
||||
Base.tooltip.log(desp);
|
||||
log.info(desp);
|
||||
await sendNotify('可能中奖了', desp);
|
||||
} else {
|
||||
Base.tooltip.log("未中奖");
|
||||
log.info('中奖检测', "未中奖");
|
||||
}
|
||||
return;
|
||||
}
|
||||
@@ -152,10 +135,10 @@ async function isMe() {
|
||||
*/
|
||||
async function checkCookie(num) {
|
||||
if (await BiliAPI.getMyinfo()) {
|
||||
Base.tooltip.log('成功登录');
|
||||
log.info('Cookie有效性检测', '成功登录');
|
||||
return true;
|
||||
} else {
|
||||
Base.tooltip.log(`登录失败 COOKIE${num} 已失效 UID:${GlobalVar.get("myUID")}`);
|
||||
log.error('Cookie有效性检测', `登录失败 COOKIE${num} 已失效 UID:${GlobalVar.get("myUID")}`);
|
||||
await sendNotify('动态抽奖出错-登录失败', `COOKIE${num} 已失效 UID:${GlobalVar.get("myUID")}`)
|
||||
return false;
|
||||
}
|
||||
|
||||
+57
-57
@@ -1,4 +1,4 @@
|
||||
const { tooltip } = require("./Base");
|
||||
const { log } = require("./Base");
|
||||
const { HttpRequest } = require("./HttpRequest");
|
||||
const { createTransport } = require("nodemailer");
|
||||
|
||||
@@ -202,26 +202,26 @@ function serverNotify(text, desp) {
|
||||
try {
|
||||
const data = JSON.parse(res.body);
|
||||
if (data.errno === 0) {
|
||||
tooltip.log('server酱发送通知消息成功\n')
|
||||
log.info('发送通知','server酱发送通知消息成功\n')
|
||||
} else if (data.errno === 1024) {
|
||||
// 一分钟内发送相同的内容会触发
|
||||
tooltip.log(`server酱发送通知消息异常: ${data.errmsg}\n`)
|
||||
log.error('发送通知',`server酱发送通知消息异常: ${data.errmsg}\n`)
|
||||
} else {
|
||||
tooltip.log(`server酱发送通知消息异常\n${JSON.stringify(data)}`)
|
||||
log.error('发送通知',`server酱发送通知消息异常\n${JSON.stringify(data)}`)
|
||||
}
|
||||
} catch (error) {
|
||||
tooltip.log(error);
|
||||
log.error('发送通知',error);
|
||||
} finally {
|
||||
resolve()
|
||||
}
|
||||
},
|
||||
failure: err => {
|
||||
tooltip.log('server酱 发送通知调用API失败!!\n')
|
||||
log.error('发送通知','server酱 发送通知调用API失败!!\n')
|
||||
throw new Error(err);
|
||||
}
|
||||
})
|
||||
} else {
|
||||
tooltip.log('您未提供server酱的SCKEY,取消微信推送消息通知\n');
|
||||
log.warn('发送通知','您未提供server酱的SCKEY,取消微信推送消息通知\n');
|
||||
resolve()
|
||||
}
|
||||
})
|
||||
@@ -247,23 +247,23 @@ function serverNotifyTurbo(text, desp) {
|
||||
try {
|
||||
const data = JSON.parse(res.body);
|
||||
if (data.code === 0) {
|
||||
tooltip.log('server酱(Turbo版)发送通知消息成功\n')
|
||||
log.info('发送通知','server酱(Turbo版)发送通知消息成功\n')
|
||||
} else {
|
||||
tooltip.log(`server酱(Turbo版)发送通知消息异常\n${JSON.stringify(data)}`)
|
||||
log.error('发送通知',`server酱(Turbo版)发送通知消息异常\n${JSON.stringify(data)}`)
|
||||
}
|
||||
} catch (error) {
|
||||
tooltip.log(error);
|
||||
log.error('发送通知',error);
|
||||
} finally {
|
||||
resolve()
|
||||
}
|
||||
},
|
||||
failure: err => {
|
||||
tooltip.log('server酱(Turbo版) 发送通知调用API失败!!\n')
|
||||
log.error('发送通知','server酱(Turbo版) 发送通知调用API失败!!\n')
|
||||
throw new Error(err);
|
||||
}
|
||||
})
|
||||
} else {
|
||||
tooltip.log('您未提供server酱(Turbo版)的SCKEY,取消微信推送消息通知\n');
|
||||
log.warn('发送通知','您未提供server酱(Turbo版)的SCKEY,取消微信推送消息通知\n');
|
||||
resolve()
|
||||
}
|
||||
})
|
||||
@@ -301,25 +301,25 @@ function coolPush(text, desp) {
|
||||
try {
|
||||
const data = JSON.parse(res.body);
|
||||
if (data.code === 200) {
|
||||
tooltip.log(`酷推发送${pushMode(QQ_MODE)}通知消息成功\n`)
|
||||
log.info('发送通知',`酷推发送${pushMode(QQ_MODE)}通知消息成功\n`)
|
||||
} else if (data.code === 400) {
|
||||
tooltip.log(`QQ酷推(Cool Push)发送${pushMode(QQ_MODE)}推送失败:${data}\n`)
|
||||
log.error('发送通知',`QQ酷推(Cool Push)发送${pushMode(QQ_MODE)}推送失败:${data}\n`)
|
||||
} else {
|
||||
tooltip.log(`酷推推送异常: ${data.msg}`);
|
||||
log.error('发送通知',`酷推推送异常: ${data.msg}`);
|
||||
}
|
||||
} catch (error) {
|
||||
tooltip.log(error);
|
||||
log.error('发送通知',error);
|
||||
} finally {
|
||||
resolve()
|
||||
}
|
||||
},
|
||||
failure: err => {
|
||||
tooltip.log(`酷推 发送${pushMode(QQ_MODE)}通知调用API失败!!\n`)
|
||||
log.error('发送通知',`酷推 发送${pushMode(QQ_MODE)}通知调用API失败!!\n`)
|
||||
throw new Error(err);
|
||||
}
|
||||
})
|
||||
} else {
|
||||
tooltip.log('您未提供酷推的SKEY,取消QQ推送消息通知\n');
|
||||
log.warn('发送通知','您未提供酷推的SKEY,取消QQ推送消息通知\n');
|
||||
resolve()
|
||||
}
|
||||
})
|
||||
@@ -345,24 +345,24 @@ function barkNotify(text, desp, params = {}) {
|
||||
try {
|
||||
const data = JSON.parse(res.body);
|
||||
if (data.code === 200) {
|
||||
tooltip.log('Bark APP发送通知消息成功\n')
|
||||
log.info('发送通知','Bark APP发送通知消息成功\n')
|
||||
} else {
|
||||
tooltip.log(`${data.message}\n`);
|
||||
log.error('发送通知',`${data.message}\n`);
|
||||
}
|
||||
} catch (error) {
|
||||
tooltip.log(error);
|
||||
log.error('发送通知',error);
|
||||
} finally {
|
||||
resolve()
|
||||
}
|
||||
},
|
||||
failure: err => {
|
||||
tooltip.log('Bark APP发送通知调用API失败!!\n');
|
||||
log.error('发送通知','Bark APP发送通知调用API失败!!\n');
|
||||
resolve();
|
||||
throw new Error(err)
|
||||
}
|
||||
})
|
||||
} else {
|
||||
tooltip.log('您未提供Bark的APP推送BARK_PUSH,取消Bark推送消息通知\n');
|
||||
log.warn('发送通知','您未提供Bark的APP推送BARK_PUSH,取消Bark推送消息通知\n');
|
||||
resolve()
|
||||
}
|
||||
})
|
||||
@@ -391,20 +391,20 @@ function tgBotNotify(text, desp) {
|
||||
try {
|
||||
const data = JSON.parse(res.body);
|
||||
if (data.ok) {
|
||||
tooltip.log('Telegram发送通知消息完成。\n')
|
||||
log.info('发送通知','Telegram发送通知消息完成。\n')
|
||||
} else if (data.error_code === 400) {
|
||||
tooltip.log('请主动给bot发送一条消息并检查接收用户ID是否正确。\n')
|
||||
log.error('发送通知','请主动给bot发送一条消息并检查接收用户ID是否正确。\n')
|
||||
} else if (data.error_code === 401) {
|
||||
tooltip.log('Telegram bot token 填写错误。\n')
|
||||
log.error('发送通知','Telegram bot token 填写错误。\n')
|
||||
}
|
||||
} catch (error) {
|
||||
tooltip.log(error);
|
||||
log.error('发送通知',error);
|
||||
} finally {
|
||||
resolve()
|
||||
}
|
||||
},
|
||||
failure: err => {
|
||||
tooltip.log('telegram发送通知消息失败!!\n')
|
||||
log.error('发送通知','telegram发送通知消息失败!!\n')
|
||||
resolve()
|
||||
throw new Error(err)
|
||||
}
|
||||
@@ -417,7 +417,7 @@ function tgBotNotify(text, desp) {
|
||||
}
|
||||
HttpRequest(options)
|
||||
} else {
|
||||
tooltip.log('您未提供telegram机器人推送所需的TG_BOT_TOKEN和TG_USER_ID,取消telegram推送消息通知\n');
|
||||
log.warn('发送通知','您未提供telegram机器人推送所需的TG_BOT_TOKEN和TG_USER_ID,取消telegram推送消息通知\n');
|
||||
resolve()
|
||||
}
|
||||
})
|
||||
@@ -456,18 +456,18 @@ function ddBotNotify(text, desp) {
|
||||
try {
|
||||
const data = JSON.parse(res.body);
|
||||
if (data.errcode === 0) {
|
||||
tooltip.log('钉钉发送通知消息完成。\n')
|
||||
log.info('发送通知','钉钉发送通知消息完成。\n')
|
||||
} else {
|
||||
tooltip.log(`${data.errmsg}\n`)
|
||||
log.error('发送通知',`${data.errmsg}\n`)
|
||||
}
|
||||
} catch (e) {
|
||||
tooltip.log(e);
|
||||
log.error('发送通知',e);
|
||||
} finally {
|
||||
resolve();
|
||||
}
|
||||
},
|
||||
failure: err => {
|
||||
tooltip.log('钉钉发送通知消息失败!!\n')
|
||||
log.error('发送通知','钉钉发送通知消息失败!!\n')
|
||||
throw new Error(err);
|
||||
}
|
||||
})
|
||||
@@ -495,24 +495,24 @@ function ddBotNotify(text, desp) {
|
||||
try {
|
||||
const data = JSON.parse(res.body);
|
||||
if (data.errcode === 0) {
|
||||
tooltip.log('钉钉发送通知消息完成。\n')
|
||||
log.info('发送通知','钉钉发送通知消息完成。\n')
|
||||
} else {
|
||||
tooltip.log(`${data.errmsg}\n`)
|
||||
log.error('发送通知',`${data.errmsg}\n`)
|
||||
}
|
||||
} catch (e) {
|
||||
tooltip.log(e);
|
||||
log.error('发送通知',e);
|
||||
} finally {
|
||||
resolve();
|
||||
}
|
||||
},
|
||||
failure: err => {
|
||||
tooltip.log('钉钉发送通知消息失败!!\n');
|
||||
log.error('发送通知','钉钉发送通知消息失败!!\n');
|
||||
resolve();
|
||||
throw new Error(err)
|
||||
}
|
||||
})
|
||||
} else {
|
||||
tooltip.log('您未提供钉钉机器人推送所需的DD_BOT_TOKEN或者DD_BOT_SECRET,取消钉钉推送消息通知\n');
|
||||
log.warn('发送通知','您未提供钉钉机器人推送所需的DD_BOT_TOKEN或者DD_BOT_SECRET,取消钉钉推送消息通知\n');
|
||||
resolve()
|
||||
}
|
||||
})
|
||||
@@ -541,24 +541,24 @@ function qywxBotNotify(text, desp) {
|
||||
try {
|
||||
const data = JSON.parse(res.body);
|
||||
if (data.errcode === 0) {
|
||||
tooltip.log('企业微信发送通知消息完成。\n');
|
||||
log.info('发送通知','企业微信发送通知消息完成。\n');
|
||||
} else {
|
||||
tooltip.log(`${data.errmsg}\n`);
|
||||
log.error('发送通知',`${data.errmsg}\n`);
|
||||
}
|
||||
} catch (e) {
|
||||
tooltip.log(e);
|
||||
log.error('发送通知',e);
|
||||
} finally {
|
||||
resolve();
|
||||
}
|
||||
},
|
||||
failure: err => {
|
||||
tooltip.log('企业微信发送通知消息失败!!\n');
|
||||
log.error('发送通知','企业微信发送通知消息失败!!\n');
|
||||
resolve();
|
||||
throw new Error(err)
|
||||
}
|
||||
})
|
||||
} else {
|
||||
tooltip.log('您未提供企业微信机器人推送所需的QYWX_KEY,取消企业微信推送消息通知\n');
|
||||
log.warn('发送通知','您未提供企业微信机器人推送所需的QYWX_KEY,取消企业微信推送消息通知\n');
|
||||
resolve();
|
||||
}
|
||||
});
|
||||
@@ -570,7 +570,7 @@ function iGotNotify(text, desp, params = {}) {
|
||||
// 校验传入的IGOT_PUSH_KEY是否有效
|
||||
const IGOT_PUSH_KEY_REGX = new RegExp("^[a-zA-Z0-9]{24}$")
|
||||
if (!IGOT_PUSH_KEY_REGX.test(IGOT_PUSH_KEY)) {
|
||||
tooltip.log('您所提供的IGOT_PUSH_KEY无效\n')
|
||||
log.error('发送通知','您所提供的IGOT_PUSH_KEY无效\n')
|
||||
resolve()
|
||||
return
|
||||
}
|
||||
@@ -593,24 +593,24 @@ function iGotNotify(text, desp, params = {}) {
|
||||
try {
|
||||
const data = JSON.parse(res.body);
|
||||
if (data.ret === 0) {
|
||||
tooltip.log('iGot发送通知消息成功\n')
|
||||
log.info('发送通知','iGot发送通知消息成功\n')
|
||||
} else {
|
||||
tooltip.log(`iGot发送通知消息失败:${data.errMsg}\n`)
|
||||
log.error('发送通知',`iGot发送通知消息失败:${data.errMsg}\n`)
|
||||
}
|
||||
} catch (e) {
|
||||
tooltip.log(e);
|
||||
log.error('发送通知',e);
|
||||
} finally {
|
||||
resolve();
|
||||
}
|
||||
},
|
||||
failure: err => {
|
||||
tooltip.log('iGot 发送通知调用API失败!!\n')
|
||||
log.error('发送通知','iGot 发送通知调用API失败!!\n')
|
||||
resolve();
|
||||
throw new Error(err)
|
||||
}
|
||||
})
|
||||
} else {
|
||||
tooltip.log('您未提供iGot的推送IGOT_PUSH_KEY,取消iGot推送消息通知\n');
|
||||
log.warn('发送通知','您未提供iGot的推送IGOT_PUSH_KEY,取消iGot推送消息通知\n');
|
||||
resolve()
|
||||
}
|
||||
})
|
||||
@@ -639,24 +639,24 @@ function pushPlusNotify(text, desp) {
|
||||
try {
|
||||
const data = JSON.parse(res.body);
|
||||
if (data.code === 200) {
|
||||
tooltip.log(`push+发送${PUSH_PLUS_USER ? '一对多' : '一对一'}通知消息完成。\n`)
|
||||
log.info('发送通知',`push+发送${PUSH_PLUS_USER ? '一对多' : '一对一'}通知消息完成。\n`)
|
||||
} else {
|
||||
tooltip.log(`push+发送${PUSH_PLUS_USER ? '一对多' : '一对一'}通知消息失败:${data.msg}\n`)
|
||||
log.error('发送通知',`push+发送${PUSH_PLUS_USER ? '一对多' : '一对一'}通知消息失败:${data.msg}\n`)
|
||||
}
|
||||
} catch (e) {
|
||||
tooltip.log(e);
|
||||
log.error('发送通知',e);
|
||||
} finally {
|
||||
resolve();
|
||||
}
|
||||
},
|
||||
failure: err => {
|
||||
tooltip.log(`push+发送${PUSH_PLUS_USER ? '一对多' : '一对一'}通知消息失败!!\n`)
|
||||
log.error('发送通知',`push+发送${PUSH_PLUS_USER ? '一对多' : '一对一'}通知消息失败!!\n`)
|
||||
resolve();
|
||||
throw new Error(err)
|
||||
}
|
||||
})
|
||||
} else {
|
||||
tooltip.log('您未提供push+推送所需的PUSH_PLUS_TOKEN,取消push+推送消息通知\n');
|
||||
log.warn('发送通知','您未提供push+推送所需的PUSH_PLUS_TOKEN,取消push+推送消息通知\n');
|
||||
resolve()
|
||||
}
|
||||
})
|
||||
@@ -679,12 +679,12 @@ async function email(text, desp) {
|
||||
text: desp,
|
||||
})
|
||||
} catch (e) {
|
||||
tooltip.log(`email发送失败 原因: ${e.message}`);
|
||||
log.error('发送通知',`email发送失败 原因: ${e.message}`);
|
||||
return
|
||||
}
|
||||
tooltip.log('email发送成功');
|
||||
log.info('发送通知','email发送成功');
|
||||
} else {
|
||||
tooltip.log('您未提供email推送所需的所有参数故取消email推送消息通知\n');
|
||||
log.warn('发送通知','您未提供email推送所需的所有参数故取消email推送消息通知\n');
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
+2
-9
@@ -1,12 +1,12 @@
|
||||
const Base = require("./Base");
|
||||
const GlobalVar = require("./GlobalVar");
|
||||
const MyStorage = require("./MyStorage");
|
||||
const config = require("./config");
|
||||
|
||||
const key_map = new Map([['DedeUserID', 'myUID'], ['bili_jct', 'csrf']]);
|
||||
|
||||
/**
|
||||
* 生成全局变量文件
|
||||
* 更新config
|
||||
* @param {string} cookie
|
||||
* @param {number} n
|
||||
*/
|
||||
@@ -24,14 +24,7 @@ async function setVariable(cookie, n) {
|
||||
GlobalVar.set('remoteconfig', await Base.getRemoteConfig());
|
||||
}
|
||||
await Base.createDir('dyids');
|
||||
if (process.env.PAT) {
|
||||
if (process.env.CI) {
|
||||
process.env.NUMBER = 1;
|
||||
}
|
||||
await MyStorage.init()
|
||||
} else {
|
||||
await Base.createFile(n < 2 ? 'dyid.txt' : `dyid${n}.txt`, '', 'a')
|
||||
}
|
||||
await Base.createFile(n < 2 ? 'dyid.txt' : `dyid${n}.txt`, '', 'a')
|
||||
return
|
||||
}
|
||||
|
||||
|
||||
@@ -1,90 +1,127 @@
|
||||
const { env_file, tooltip, delay } = require("./lib/Base");
|
||||
const { env_file, config_file, log, delay, hasFileOrDir } = require("./lib/Base");
|
||||
|
||||
const metainfo = [
|
||||
` _ _ _ _____ _ _ `,
|
||||
` | | | | | | / ____| (_) | | `,
|
||||
` | | ___ | |_| |_ ___ _ __ _ _| (___ ___ _ __ _ _ __ | |_ `,
|
||||
` | | / _ \\| __| __/ _ \\ '__| | | |\\___ \\ / __| '__| | '_ \\| __|`,
|
||||
` | |___| (_) | |_| || __/ | | |_| |____) | (__| | | | |_) | |_ `,
|
||||
` |______\\___/ \\__|\\__\\___|_| \\__, |_____/ \\___|_| |_| .__/ \\__|`,
|
||||
` __/ | | | `,
|
||||
` |___/ |_| `,
|
||||
` `,
|
||||
` by shanmite `,
|
||||
]
|
||||
/**多账号存储 */
|
||||
let multiple_account = [];
|
||||
/**循环等待时间 */
|
||||
let loop_wait = 0;
|
||||
|
||||
if (!process.env.CI) {
|
||||
const { initEnv, multiple_account_parm } = require(env_file);
|
||||
if (multiple_account_parm) {
|
||||
multiple_account = multiple_account_parm;
|
||||
}
|
||||
initEnv()
|
||||
}
|
||||
|
||||
/**
|
||||
* @returns {Promise<string>} 错误信息
|
||||
*/
|
||||
async function main() {
|
||||
const { COOKIE, NUMBER, CLEAR, PAT, LOCALLAUNCH, ENABLE_MULTIPLE_ACCOUNT, MULTIPLE_ACCOUNT } = process.env;
|
||||
if (LOCALLAUNCH || PAT) {
|
||||
if (ENABLE_MULTIPLE_ACCOUNT) {
|
||||
let muti_acco = multiple_account.length
|
||||
? multiple_account
|
||||
: JSON.parse(MULTIPLE_ACCOUNT);
|
||||
const { COOKIE, NUMBER, CLEAR, ENABLE_MULTIPLE_ACCOUNT, MULTIPLE_ACCOUNT_PARM } = process.env;
|
||||
if (ENABLE_MULTIPLE_ACCOUNT) {
|
||||
let muti_acco = multiple_account.length
|
||||
? multiple_account
|
||||
: JSON.parse(MULTIPLE_ACCOUNT_PARM);
|
||||
|
||||
process.env.ENABLE_MULTIPLE_ACCOUNT = '';
|
||||
process.env.ENABLE_MULTIPLE_ACCOUNT = '';
|
||||
|
||||
for (const acco of muti_acco) {
|
||||
process.env.COOKIE = acco.COOKIE;
|
||||
process.env.NUMBER = acco.NUMBER;
|
||||
process.env.CLEAR = acco.CLEAR;
|
||||
await main();
|
||||
await delay(acco.WAIT);
|
||||
}
|
||||
} else {
|
||||
if (COOKIE) {
|
||||
const { setVariable } = require("./lib/setVariable");
|
||||
await setVariable(COOKIE, Number(NUMBER));
|
||||
|
||||
const { start, isMe, checkCookie } = require("./lib/lottery-in-nodejs");
|
||||
const { clear } = require("./lib/clear");
|
||||
|
||||
tooltip.log('[LotteryAutoScript] 账号' + NUMBER);
|
||||
|
||||
if (await checkCookie(NUMBER)) {
|
||||
const mode = process.env.lottery_mode;
|
||||
switch (mode) {
|
||||
case 'start':
|
||||
tooltip.log('开始参与抽奖');
|
||||
await start();
|
||||
break;
|
||||
case 'check':
|
||||
tooltip.log('检查是否中奖');
|
||||
await isMe();
|
||||
break;
|
||||
case 'clear':
|
||||
if (CLEAR) {
|
||||
tooltip.log('开始清理动态');
|
||||
await clear();
|
||||
tooltip.log('清理动态完毕');
|
||||
}
|
||||
break;
|
||||
default:
|
||||
console.log(`Usage: lottery-in-bili [OPTIONS]`)
|
||||
console.log(`错误OPTIONS: ${mode} 正确OPTIONS: start,check,clear`);
|
||||
}
|
||||
}
|
||||
} else {
|
||||
tooltip.log('请查看README文件, 在env.js指定位置填入cookie')
|
||||
}
|
||||
for (const acco of muti_acco) {
|
||||
process.env.COOKIE = acco.COOKIE;
|
||||
process.env.NUMBER = acco.NUMBER;
|
||||
process.env.CLEAR = acco.CLEAR;
|
||||
await main();
|
||||
await delay(acco.WAIT);
|
||||
}
|
||||
} else {
|
||||
tooltip.log('请查看README文件, 填入相应的PAT, 若是本地运行则设LOCALLAUNCH为true');
|
||||
if (!COOKIE) {
|
||||
return '请查看README文件, 在env.js指定位置填入cookie'
|
||||
}
|
||||
const { setVariable } = require("./lib/setVariable");
|
||||
await setVariable(COOKIE, Number(NUMBER));
|
||||
|
||||
const { start, isMe, checkCookie } = require("./lib/lottery-in-nodejs");
|
||||
const { clear } = require("./lib/clear");
|
||||
|
||||
log.info('main', '当前为第' + NUMBER + '个账号');
|
||||
|
||||
if (await checkCookie(NUMBER)) {
|
||||
const mode = process.env.lottery_mode;
|
||||
const help_msg = "用法: lottery [OPTIONS]\n\nOPTIONS:\n\tstart 启动抽奖\n\tcheck 中奖检查\n\tclear 清理动态和关注\n\thelp 帮助信息";
|
||||
const { lottery_loop_wait, check_loop_wait, clear_loop_wait } = require("./lib/config");
|
||||
switch (mode) {
|
||||
case 'start':
|
||||
log.info('抽奖', '开始运行');
|
||||
loop_wait = lottery_loop_wait;
|
||||
await start();
|
||||
break;
|
||||
case 'check':
|
||||
log.info('中奖检测', '检查是否中奖');
|
||||
loop_wait = check_loop_wait;
|
||||
await isMe();
|
||||
break;
|
||||
case 'clear':
|
||||
if (CLEAR) {
|
||||
log.info('清理动态', '开始运行');
|
||||
loop_wait = clear_loop_wait;
|
||||
await clear();
|
||||
}
|
||||
break;
|
||||
case 'help':
|
||||
return help_msg
|
||||
case undefined:
|
||||
return "未提供以下参数\n\t[OPTIONS]\n\n" + help_msg
|
||||
default:
|
||||
return `提供了错误的[OPTIONS] -> ${mode}\n\n` + help_msg
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
(async function () {
|
||||
let metainfo = '';
|
||||
metainfo += ` _ _ _ _____ _ _ \n`;
|
||||
metainfo += ` | | | | | | / ____| (_) | | \n`;
|
||||
metainfo += ` | | ___ | |_| |_ ___ _ __ _ _| (___ ___ _ __ _ _ __ | |_ \n`;
|
||||
metainfo += ` | | / _ \\| __| __/ _ \\ '__| | | |\\___ \\ / __| '__| | '_ \\| __|\n`;
|
||||
metainfo += ` | |___| (_) | |_| || __/ | | |_| |____) | (__| | | | |_) | |_ \n`;
|
||||
metainfo += ` |______\\___/ \\__|\\__\\___|_| \\__, |_____/ \\___|_| |_| .__/ \\__|\n`;
|
||||
metainfo += ` __/ | | | \n`;
|
||||
metainfo += ` |___/ |_| \n`;
|
||||
metainfo += ` \n`;
|
||||
metainfo += ` by shanmite\n`;
|
||||
console.log(metainfo);
|
||||
log.proPrint(metainfo, '\n')
|
||||
|
||||
if (hasFileOrDir(env_file)) {
|
||||
const { initEnv, multiple_account_parm } = require(env_file);
|
||||
if (multiple_account_parm) {
|
||||
multiple_account = multiple_account_parm;
|
||||
}
|
||||
initEnv();
|
||||
log.init();
|
||||
log.info('环境变量初始化', '成功加载env.js文件');
|
||||
} else {
|
||||
log.init();
|
||||
log.warn('环境变量初始化', '未在当前目录下找到env.js文件 也可在环境变量中设置所需参数');
|
||||
return
|
||||
}
|
||||
|
||||
if (hasFileOrDir(config_file)) {
|
||||
require("./lib/config");
|
||||
log.info('配置文件初始化', '成功加载my_config.js文件');
|
||||
} else {
|
||||
log.error('配置文件初始化', '未在当前目录下找到my_config.js文件');
|
||||
return
|
||||
}
|
||||
|
||||
/**OPTIONS */
|
||||
process.env.lottery_mode = process.argv[2]
|
||||
await main();
|
||||
await delay(5 * 1000);
|
||||
process.exit(0)
|
||||
|
||||
const err_msg = await main();
|
||||
|
||||
if (err_msg) {
|
||||
log.error('错误', '\n' + err_msg + '\n');
|
||||
log.warn('结束运行', '5秒后自动退出');
|
||||
await delay(5 * 1000);
|
||||
} else {
|
||||
if (loop_wait > 0) {
|
||||
log.info('程序休眠', `${loop_wait / 1000}秒后再次启动`)
|
||||
await delay(loop_wait);
|
||||
} else {
|
||||
log.info('结束运行', '未设置休眠时间')
|
||||
}
|
||||
}
|
||||
process.exit(0);
|
||||
})()
|
||||
+18
-9
@@ -8,8 +8,8 @@ module.exports = {
|
||||
*/
|
||||
UIDs: [
|
||||
31252386,
|
||||
35719643,
|
||||
689277291
|
||||
689277291,
|
||||
241675899
|
||||
],
|
||||
|
||||
/**
|
||||
@@ -63,12 +63,20 @@ module.exports = {
|
||||
*/
|
||||
maxday: Infinity,
|
||||
|
||||
/**
|
||||
* - 循环等待时间(指所有操作完毕后的休眠时间)
|
||||
* - 单位毫秒
|
||||
*/
|
||||
lottery_loop_wait: 60 * 60 * 1000,
|
||||
check_loop_wait: 0,
|
||||
clear_loop_wait: 0,
|
||||
|
||||
/**
|
||||
* - 转发间隔时间
|
||||
* - 单位毫秒
|
||||
* - 上下浮动50%
|
||||
*/
|
||||
wait: 100000,
|
||||
wait: 100 * 1000,
|
||||
|
||||
/**
|
||||
* - 检索动态间隔
|
||||
@@ -127,7 +135,7 @@ module.exports = {
|
||||
/**
|
||||
* 屏蔽词
|
||||
*/
|
||||
blockword: ["脚本抽奖", "恭喜", "结果", "抽奖号"],
|
||||
blockword: ["脚本抽奖", "恭喜", "结果", "抽奖号", "钓鱼"],
|
||||
|
||||
/**
|
||||
* 取关白名单
|
||||
@@ -151,7 +159,8 @@ module.exports = {
|
||||
],
|
||||
|
||||
/**
|
||||
* 抽奖UP用户分组id(网页端点击分区后地址栏中的tagid)
|
||||
* - 抽奖UP用户分组id(网页端点击分区后地址栏中的tagid)
|
||||
* - 自动获取
|
||||
*/
|
||||
partition_id: 0,
|
||||
|
||||
@@ -161,12 +170,13 @@ module.exports = {
|
||||
is_exception: false,
|
||||
|
||||
/**
|
||||
* 取关分区
|
||||
* - 取关分区
|
||||
* - 默认为: 此处存放因抽奖临时关注的up
|
||||
*/
|
||||
clear_partition: '',
|
||||
|
||||
/**
|
||||
* 清理多少天内的动态或关注
|
||||
* 清理多少天之前的动态或关注
|
||||
*/
|
||||
clear_max_day: 30,
|
||||
|
||||
@@ -207,5 +217,4 @@ module.exports = {
|
||||
config_1: {},
|
||||
config_2: {},
|
||||
config_3: {}
|
||||
}
|
||||
|
||||
}
|
||||
Generated
-2144
File diff suppressed because it is too large
Load Diff
+3
-1
@@ -7,7 +7,8 @@
|
||||
"start": "node main.js start",
|
||||
"clear": "node main.js clear",
|
||||
"check": "node main.js check",
|
||||
"pkg": "npx pkg . && powershell .\\script\\pkg\\pkg.ps1",
|
||||
"pkg_x86": "npx pkg . && PowerShell .\\script\\pkg\\pkg.ps1",
|
||||
"pkg_clean_dist": "PowerShell -Command \"& {Remove-Item -Path .\\dist\\ -Recurse}\"",
|
||||
"pkg_arm": "npx pkg -t linux-arm -o dist/lottery-in-bili-linux-arm main.js"
|
||||
},
|
||||
"bin": "main.js",
|
||||
@@ -38,6 +39,7 @@
|
||||
"pkg": "^5.2.1"
|
||||
},
|
||||
"dependencies": {
|
||||
"chalk": "^4.1.1",
|
||||
"nodemailer": "^6.5.0",
|
||||
"unzipper": "^0.10.11"
|
||||
}
|
||||
|
||||
+18
-18
@@ -6,33 +6,33 @@ $ENV_FILE = "env.js"
|
||||
|
||||
$TARGET_DIR = ".\dist"
|
||||
|
||||
$WIN_BIN = "lottery-in-bili-win.exe"
|
||||
$LINUX_BIN = "lottery-in-bili-linux"
|
||||
$MACOS_BIN = "lottery-in-bili-macos"
|
||||
|
||||
$WIN_X64 = "nlts-win-x64"
|
||||
$LINUX_X64 = "nlts-linux-x64"
|
||||
$MACOS_X64 = "nlts-macos-x64"
|
||||
|
||||
$MAP = @{ $WIN_X64 = $WIN_BIN; $LINUX_X64 = $LINUX_BIN; $MACOS_X64 = $MACOS_BIN}
|
||||
$TRIARR = @(
|
||||
@("lottery-in-bili-win.exe", "lottery.exe", "nlts-win-x64"),
|
||||
@("lottery-in-bili-linux", "lottery", "nlts-linux-x64"),
|
||||
@("lottery-in-bili-macos", "lottery", "nlts-macos-x64")
|
||||
)
|
||||
|
||||
Copy-Item -Path $TEMPLATE_ENV_FILE -Destination $TARGET_DIR -Force
|
||||
Copy-Item -Path $TEMPLATE_CONFIG_FILE -Destination $TARGET_DIR -Force
|
||||
|
||||
Set-Location -Path $TARGET_DIR
|
||||
|
||||
# 重命名文件
|
||||
Move-Item -Path $TEMPLATE_ENV_FILE -Destination $ENV_FILE -Force
|
||||
Move-Item -Path $TEMPLATE_CONFIG_FILE -Destination $CONFIG_FILE -Force
|
||||
|
||||
foreach($X64 in $MAP.Keys) {
|
||||
$BIN = $MAP[$X64]
|
||||
if (!(Test-Path $X64 -PathType Container)) {
|
||||
New-Item -ItemType Directory -Force -Path $X64
|
||||
}
|
||||
Move-Item -Path $BIN -Destination $X64 -Force
|
||||
Copy-Item -Path $ENV_FILE -Destination $X64 -Force
|
||||
Copy-Item -Path $CONFIG_FILE -Destination $X64 -Force
|
||||
Compress-Archive -Path $X64 -DestinationPath $X64 -Force
|
||||
foreach ($TRI in $TRIARR) {
|
||||
$PROTO_BIN,$BIN,$DIR = $TRI
|
||||
|
||||
New-Item -ItemType Directory -Force -Path $DIR
|
||||
|
||||
Move-Item -Path $PROTO_BIN -Destination $BIN -Force
|
||||
|
||||
Move-Item -Path $BIN -Destination $DIR -Force
|
||||
Copy-Item -Path $ENV_FILE -Destination $DIR -Force
|
||||
Copy-Item -Path $CONFIG_FILE -Destination $DIR -Force
|
||||
|
||||
Compress-Archive -Path $DIR -DestinationPath "$($DIR)-$(Get-Date -Format "yyyyMMd")" -Force
|
||||
}
|
||||
|
||||
Remove-Item -Path $ENV_FILE
|
||||
|
||||
@@ -1,6 +0,0 @@
|
||||
const { getDyid } = require("../lib/MyStorage");
|
||||
|
||||
(async () => {
|
||||
let alldyid = await getDyid();
|
||||
console.log(alldyid);
|
||||
})()
|
||||
@@ -1,5 +0,0 @@
|
||||
const { getHiToKoTo } = require("../lib/Base");
|
||||
|
||||
getHiToKoTo().then(h => {
|
||||
console.log(h);
|
||||
})
|
||||
@@ -1,5 +0,0 @@
|
||||
const { getZhihuBillBoard } = require("../lib/Base");
|
||||
|
||||
getZhihuBillBoard().then(x => {
|
||||
console.log(x);
|
||||
})
|
||||
@@ -1,19 +0,0 @@
|
||||
const { HttpRequest } = require("../lib/HttpRequest");
|
||||
|
||||
HttpRequest({
|
||||
method: 'GET',
|
||||
url: 'https://www.www.www',
|
||||
headers: {
|
||||
'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.116 Safari/537.36',
|
||||
accept: 'application/json, text/plain, */*',
|
||||
},
|
||||
config: {
|
||||
wait: 1000
|
||||
},
|
||||
success: res => {
|
||||
console.log(res.body);
|
||||
},
|
||||
failure: err => {
|
||||
console.log(err);
|
||||
}
|
||||
})
|
||||
@@ -1,26 +0,0 @@
|
||||
const { createReadStream, createWriteStream } = require('fs');
|
||||
|
||||
const file = 'test/huge_file/dyid.txt';
|
||||
const test = 'test/huge_file/test.txt';
|
||||
|
||||
const ws = createReadStream(file, { encoding: 'utf8', highWaterMark: 19 * 1000 })
|
||||
|
||||
const rs = createWriteStream(test, { flags: 'a' })
|
||||
|
||||
rs.write(Date.now() + '->', () => {
|
||||
console.log('写入完毕');
|
||||
rs.destroy()
|
||||
})
|
||||
|
||||
let i = 0;
|
||||
ws.on('data', chunk => {
|
||||
i++;
|
||||
if (/000000000000000000/.test(chunk)) {
|
||||
console.log('success')
|
||||
console.log('in ' + i)
|
||||
// 14764824 bytes
|
||||
// success
|
||||
// in 778
|
||||
// [Done] exited with code=0 in 0.331 seconds
|
||||
}
|
||||
})
|
||||
@@ -1 +0,0 @@
|
||||
===1614266851666->
|
||||
Reference in New Issue
Block a user