mirror of
https://github.com/shanmiteko/LotteryAutoScript.git
synced 2026-07-22 21:13:47 +08:00
Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
98948ad7f0 | ||
|
|
a363b4ee34 | ||
|
|
c220ff5d27 | ||
|
|
2b6cc8d602 | ||
|
|
856dd79ee9 | ||
|
|
468300227d | ||
|
|
ae4d1fde91 | ||
|
|
ca1acd21e8 | ||
|
|
dabf8f9d75 | ||
|
|
affe24f441 | ||
|
|
3a5a8d0ded | ||
|
|
5d3103102e | ||
|
|
7ab38f258c | ||
|
|
35fe4481fa | ||
|
|
58edd4129c | ||
|
|
c8e1a328ec | ||
|
|
4f8f50f90b | ||
|
|
3b4b85bc42 | ||
|
|
db11265b28 |
@@ -31,4 +31,4 @@ jobs:
|
||||
with:
|
||||
push: true
|
||||
tags: ${{ secrets.DOCKERHUB_REPO }}
|
||||
platforms: "linux/amd64,linux/386,linux/arm64,linux/arm/v7,linux/arm/v6,linux/riscv64"
|
||||
platforms: "linux/amd64,linux/arm64,linux/arm/v7,linux/arm/v6,linux/ppc64le,linux/s390x"
|
||||
|
||||
+27
-24
@@ -2,6 +2,9 @@ name: "Package Node.js project into an executable"
|
||||
|
||||
on:
|
||||
push:
|
||||
branches:
|
||||
- main
|
||||
- pkg
|
||||
paths:
|
||||
- "lib/**"
|
||||
- "*.js"
|
||||
@@ -50,27 +53,27 @@ jobs:
|
||||
delete_file: "dist/*.zip"
|
||||
tag_name: "v2"
|
||||
overwrite: true
|
||||
arm64:
|
||||
runs-on: ubuntu-latest
|
||||
name: arm64
|
||||
steps:
|
||||
- name: "Checkout codes"
|
||||
uses: actions/checkout@v2
|
||||
- name: "Pkg this"
|
||||
run: |
|
||||
sudo podman run --rm --privileged multiarch/qemu-user-static --reset -p yes
|
||||
npm run pkg arm
|
||||
- name: "Upload to artifact"
|
||||
uses: actions/upload-artifact@v2
|
||||
with:
|
||||
name: arm64
|
||||
path: "dist/*.zip"
|
||||
- name: "Upload to release draft"
|
||||
uses: xresloader/upload-to-github-release@v1
|
||||
env:
|
||||
GITHUB_TOKEN: ${{ secrets.GH_TOKEN }}
|
||||
with:
|
||||
file: "dist/*.zip"
|
||||
delete_file: "dist/*.zip"
|
||||
tag_name: "v2"
|
||||
overwrite: true
|
||||
# arm64:
|
||||
# runs-on: ubuntu-latest
|
||||
# name: arm64
|
||||
# steps:
|
||||
# - name: "Checkout codes"
|
||||
# uses: actions/checkout@v2
|
||||
# - name: "Pkg this"
|
||||
# run: |
|
||||
# sudo podman run --rm --privileged multiarch/qemu-user-static --reset -p yes
|
||||
# npm run pkg arm
|
||||
# - name: "Upload to artifact"
|
||||
# uses: actions/upload-artifact@v2
|
||||
# with:
|
||||
# name: arm64
|
||||
# path: "dist/*.zip"
|
||||
# - name: "Upload to release draft"
|
||||
# uses: xresloader/upload-to-github-release@v1
|
||||
# env:
|
||||
# GITHUB_TOKEN: ${{ secrets.GH_TOKEN }}
|
||||
# with:
|
||||
# file: "dist/*.zip"
|
||||
# delete_file: "dist/*.zip"
|
||||
# tag_name: "v2"
|
||||
# overwrite: true
|
||||
|
||||
@@ -2,6 +2,7 @@ node_modules/
|
||||
.vscode/
|
||||
tests/
|
||||
dyids/
|
||||
lottery_info/
|
||||
dist/
|
||||
.env
|
||||
*.log
|
||||
|
||||
@@ -1,5 +1,33 @@
|
||||
<!-- markdownlint-disable MD036 MD024-->
|
||||
# CHANGELOG
|
||||
## 主要变化(2.6.4)
|
||||
* a363b4e ci: 关闭`arm64`自动打包
|
||||
* c220ff5 feat(多账号优化): 抽奖信息本地保存 (#209)
|
||||
* 2b6cc8d feat: 每条运行结果后面加上当前账号序列号 (#206)
|
||||
* 856dd79 fix: 增加获取关注上限(#207)
|
||||
* 4683002 fix: 青龙执行脚本时出错(#202)
|
||||
|
||||
_如果之前版本小于上一版本,请查看[CHANGELOG](https://github.com/shanmiteko/LotteryAutoScript/blob/main/CHANGELOG.md)变更说明_
|
||||
|
||||
## 主要变化(2.6.3)
|
||||
* ca1acd2 fix: 转发随机动态视频新的错误码(#201)
|
||||
* dabf8f9 fix: 关注出错(#199)
|
||||
* affe24f fix: 发布随机动态显示转发请求不合法(#197)
|
||||
* 3a5a8d0 feat: 青龙面板(#200)
|
||||
|
||||
_如果之前版本小于上一版本,请查看[CHANGELOG](https://github.com/shanmiteko/LotteryAutoScript/blob/main/CHANGELOG.md)变更说明_
|
||||
|
||||
## 主要变化(2.6.2)
|
||||
* 7ab38f2 feat: 弃用`update_loop_wait`(#180)
|
||||
* 35fe448 feat: 预约抽奖参与间隔`reserve_lottery_wait`(#191)
|
||||
* 58edd41 fix: 该动态不能转发分享(#189)
|
||||
* c8e1a32 fix: 关注UP主7天以上的人可发评论(#192)
|
||||
* 4f8f50f ci: docker
|
||||
* 3b4b85b ci: pkg
|
||||
* db11265 docker: change sh to bash
|
||||
|
||||
_如果之前版本小于上一版本,请查看[CHANGELOG](https://github.com/shanmiteko/LotteryAutoScript/blob/main/CHANGELOG.md)变更说明_
|
||||
|
||||
## 主要变化(2.6.1)
|
||||
* 82efbb4 ci: pkg arm64 use podman
|
||||
* 886ccff fix: cookie缺少`buvid3`导致412(#182)(#185)
|
||||
|
||||
+2
-2
@@ -1,4 +1,4 @@
|
||||
FROM --platform=$BUILDPLATFORM node:lts-alpine
|
||||
FROM node:lts-alpine
|
||||
|
||||
LABEL author="shanmite" version="1.1" description="自动参与B站动态抽奖"
|
||||
|
||||
@@ -12,4 +12,4 @@ COPY ["main.js", "./"]
|
||||
COPY ["lib/", "lib/"]
|
||||
|
||||
ENTRYPOINT ["npm", "run"]
|
||||
CMD ["start"]
|
||||
CMD ["start"]
|
||||
|
||||
@@ -6,9 +6,8 @@
|
||||
- [本地运行](#本地运行)
|
||||
- [可执行文件](#可执行文件)
|
||||
- [以源码方式运行](#以源码方式运行)
|
||||
- [Windows](#windows)
|
||||
- [Linux](#linux)
|
||||
- [Docker](#docker)
|
||||
- [青龙面板](#青龙面板)
|
||||
- [防重复转发(可选)](#防重复转发可选)
|
||||
- [检测中奖](#检测中奖)
|
||||
- [检测未读信息, 已读未读信息](#检测未读信息-已读未读信息)
|
||||
@@ -64,7 +63,7 @@ Chrome浏览器:
|
||||
|
||||
(此步骤是为了方便后续采用JS获取Cookies,获取完毕后应再次勾选)
|
||||
|
||||

|
||||

|
||||
|
||||
3. 在Console中复制以下代码回车
|
||||
|
||||
@@ -109,143 +108,40 @@ Chrome浏览器:
|
||||
3. 在`env.js`中填入`COOKIE`和推送参数
|
||||
4. 在`my_config.js`中自定义设置
|
||||
5. 在当前目录下**打开终端**运行可执行文件`lottery`(勿直接点击`lottery`)
|
||||
|
||||
```sh
|
||||
# unix-like
|
||||
## 进入脚本所在目录
|
||||
## 授予执行权限
|
||||
$ chmod u+x lottery
|
||||
## 启动脚本
|
||||
$ ./lottery start
|
||||
## 检测中奖
|
||||
$ ./lottery check
|
||||
## 清理关注动态
|
||||
$ ./lottery clear
|
||||
## 下载最新版本
|
||||
$ ./lottery clear
|
||||
|
||||
# windows
|
||||
## 不需要chmod
|
||||
## 把`./`换成`.\`或去掉
|
||||
## 已自带*.bat可直接点击
|
||||
```
|
||||
- windows 可直接点击对应的`*.bat`文件
|
||||
- unix-like
|
||||
```sh
|
||||
## 进入脚本所在目录
|
||||
## 授予执行权限
|
||||
$ chmod u+x lottery
|
||||
## 启动脚本
|
||||
$ ./lottery start
|
||||
## 检测中奖
|
||||
$ ./lottery check
|
||||
## 清理关注动态
|
||||
$ ./lottery clear
|
||||
## 下载最新版本
|
||||
$ ./lottery update
|
||||
```
|
||||
|
||||
7. 运行截图
|
||||

|
||||

|
||||
|
||||
#### 以源码方式运行
|
||||
|
||||
<details>
|
||||
[点击跳转](doc/run_use_sc.md)
|
||||
|
||||
<summary>点击显示详细说明</summary>
|
||||
|
||||
##### Windows
|
||||
|
||||
step1: 下载代码到本地
|
||||
|
||||
[点此下载](https://github.com/shanmiteko/LotteryAutoScript/archive/refs/heads/main.zip)或如图示下载↓
|
||||
|
||||

|
||||
|
||||
下载的压缩包解压后修改env.example.js文件,详见step3
|
||||
|
||||
step2: 下载并安装Node.js
|
||||
|
||||
[点此进入nodejs下载页面](http://nodejs.cn/download)
|
||||
|
||||

|
||||
|
||||
step3:修改env.example.js文件及创建运行文件(打开扩展名显示)
|
||||
|
||||
1.step1下载的压缩包解压后将其中的`env.example.js`文件重命名为`env.js`
|
||||
|
||||
2.右键`env.js`文件选择编辑或用记事本打开
|
||||
|
||||
3.填入相关参数
|
||||
|
||||
4.`my_config.example.js`同样操作
|
||||
|
||||
5.运行
|
||||
|
||||
注: `npm i`意味安装依赖, 只需运行一次, 为防止依赖有变化遂每次都执行
|
||||
|
||||
命令一: 启动抽奖
|
||||
|
||||
```bash
|
||||
npm i && npm run start
|
||||
```
|
||||
|
||||
命令二: 检查中奖
|
||||
|
||||
```bash
|
||||
npm i && npm run check
|
||||
```
|
||||
|
||||
命令三: 清理动态
|
||||
|
||||
```bash
|
||||
npm i && npm run clear
|
||||
```
|
||||
|
||||
`script`目录下有启动脚本, 点击即可运行
|
||||
|
||||
注: **本地运行时可在设置中增大扫描页数**
|
||||
|
||||
> ~~[windows系统定时运行](./doc/win_schedule.md)~~
|
||||
|
||||
脚本已内置定时运行功能
|
||||
|
||||
##### Linux
|
||||
|
||||
[linux系统配置与定时运行](./doc/linux_schedule.md)
|
||||
|
||||
</details>
|
||||
----------------------------------------
|
||||
|
||||
### Docker
|
||||
|
||||
1.初始化
|
||||
[点击跳转](doc/run_use_docker.md)
|
||||
|
||||
```bash
|
||||
curl -fsSL https://cdn.staticaly.com/gh/shanmiteko/LotteryAutoScript/main/script/docker/init.sh | sudo sh
|
||||
```
|
||||
----------------------------------------
|
||||
|
||||
进入`lottery`文件夹
|
||||
### 青龙面板
|
||||
|
||||
```bash
|
||||
cd lottery
|
||||
```
|
||||
|
||||
编辑`env.js`与`my_config.js`文件
|
||||
|
||||
- env.js 设置必要环境变量
|
||||
- my_config.js 你的设置
|
||||
|
||||
2.执行相应的脚本
|
||||
```
|
||||
$ tree
|
||||
.
|
||||
├── check.sh 检查中奖
|
||||
├── clear.sh 清理动态
|
||||
├── debug.sh 进入临时容器查看内容
|
||||
├── env.js
|
||||
├── my_config.js
|
||||
├── new_env.js
|
||||
├── new_my_config.js
|
||||
├── remove_all.sh 移除对应docker镜像和所有相关容器
|
||||
└── start.sh 启动抽奖
|
||||
```
|
||||
[](https://asciinema.org/a/453237)
|
||||
|
||||
完成配置后
|
||||
|
||||
```sh
|
||||
$ ./start.sh
|
||||
```
|
||||
3.更新
|
||||
|
||||
进入lottery上一级目录
|
||||
|
||||
使用与初始化相同的命令
|
||||
[点击跳转](doc/run_use_ql.md)
|
||||
|
||||
----------------------------------------
|
||||
|
||||
@@ -275,31 +171,31 @@ $ ./start.sh
|
||||
|
||||
以下是支持的推送方式
|
||||
|
||||
| Name | 归属 | 说明 |
|
||||
| :---------------: | :--------------------------------------------------------------------------------: | :--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
||||
| `SCKEY` | 微信server酱推送(于2021/4月下线) | server酱的微信通知[官方文档](http://sc.ftqq.com/3.version) |
|
||||
| `SENDKEY` | 微信server酱(Turbo版)推送 | [获取SENDKEY](https://sct.ftqq.com/sendkey) [选择消息通道](https://sct.ftqq.com/forward) |
|
||||
| `BARK_PUSH` | [BARK推送](https://apps.apple.com/us/app/bark-customed-notifications/id1403753865) | IOS用户下载BARK这个APP,填写内容是app提供的`设备码`,例如:<https://api.day.app/123> ,那么此处的设备码就是`123`,再不懂看 [这个图](https://gitlab.com/shanmiteko/LotteryAutoScript/-/raw/main/doc/pic/bark.jpg)(注:支持自建填完整链接即可) |
|
||||
| `BARK_SOUND` | [BARK推送](https://apps.apple.com/us/app/bark-customed-notifications/id1403753865) | bark推送声音设置,例如`choo`,具体值请在`bark`-`推送铃声`-`查看所有铃声` |
|
||||
| `TG_BOT_TOKEN` | telegram推送 | tg推送(需设备可连接外网),`TG_BOT_TOKEN`和`TG_USER_ID`两者必需,填写自己申请[@BotFather](https://t.me/BotFather)的Token,如`10xxx4:AAFcqxxxxgER5uw` , [具体教程](doc/TG_PUSH.md) |
|
||||
| `TG_USER_ID` | telegram推送 | tg推送(需设备可连接外网),`TG_BOT_TOKEN`和`TG_USER_ID`两者必需,填写[@getuseridbot](https://t.me/getuseridbot)中获取到的纯数字ID, [具体教程](doc/TG_PUSH.md) |
|
||||
| `TG_PROXY_HOST` | Telegram 代理的 IP | 代理类型为 http。例子:http代理 <http://127.0.0.1:1080> 则填写 127.0.0.1 |
|
||||
| `TG_PROXY_PORT` | Telegram 代理的端口 | 例子:http代理 <http://127.0.0.1:1080> 则填写 1080 |
|
||||
| `DD_BOT_TOKEN` | 钉钉推送 | 钉钉推送(`DD_BOT_TOKEN`和`DD_BOT_SECRET`两者必需)[官方文档](https://ding-doc.dingtalk.com/doc#/serverapi2/qf2nxq) ,只需`https://oapi.dingtalk.com/robot/send?access_token=XXX` 等于`=`符号后面的XXX即可 |
|
||||
| `DD_BOT_SECRET` | 钉钉推送 | (`DD_BOT_TOKEN`和`DD_BOT_SECRET`两者必需) ,密钥,机器人安全设置页面,加签一栏下面显示的SEC开头的`SECXXXXXXXXXX`等字符 , 注:钉钉机器人安全设置只需勾选`加签`即可,其他选项不要勾选,再不懂看 [这个图](https://gitlab.com/shanmiteko/LotteryAutoScript/-/raw/main/doc/pic/DD_bot.png) |
|
||||
| `IGOT_PUSH_KEY` | iGot推送 | iGot聚合推送,支持多方式推送,确保消息可达。 [参考文档](https://wahao.github.io/Bark-MP-helper ) |
|
||||
| `QQ_SKEY` | 酷推(Cool Push)推送 | 推送所需的Skey,登录后获取Skey [参考文档](https://cp.xuthus.cc/) |
|
||||
| `QQ_MODE` | 酷推(Cool Push)推送 | 推送方式(send或group或者wx,默认send) [参考文档](https://cp.xuthus.cc/) |
|
||||
| `QYWX_KEY` | 企业微信推送 | 密钥,企业微信推送 webhook 后面的 key [详见官方说明文档](https://work.weixin.qq.com/api/doc/90000/90136/91770) |
|
||||
| `PUSH_PLUS_TOKEN` | pushplus推送 | 微信扫码登录后一对一推送或一对多推送下面的token(您的Token) [官方网站](http://pushplus.hxtrip.com/) |
|
||||
| `PUSH_PLUS_USER` | pushplus推送 | 一对多推送的“群组编码”(一对多推送下面->您的群组(如无则新建)->群组编码)注:(1、需订阅者扫描二维码 2、如果您是创建群组所属人,也需点击“查看二维码”扫描绑定,否则不能接受群组消息推送),只填`PUSH_PLUS_TOKEN`默认为一对一推送 |
|
||||
| `QMSG_KEY` | [Qmsg酱](https://qmsg.zendee.cn)私聊推送 | [Qmsg注册](https://qmsg.zendee.cn/login.html) |
|
||||
| `QMSG_QQ` | 私聊消息推送接口,指定需要接收消息的QQ | 指定的QQ号必须在你的[管理台](https://qmsg.zendee.cn/me.html)已添加 |
|
||||
| `SMTP_HOST` | 电子邮件 | smtp服务器的主机名 如: `smtp.qq.com` |
|
||||
| `SMTP_PORT` | 电子邮件 | smtp服务器的端口 如: `465` |
|
||||
| `SMTP_USER` | 电子邮件 | 发送方的电子邮件 如: `xxxxxxxxx@qq.com` |
|
||||
| `SMTP_PASS` | 电子邮件 | smtp服务对应的授权码 |
|
||||
| `SMTP_TO_USER` | 电子邮件 | 接收方电子邮件 |
|
||||
| Name | 归属 | 说明 |
|
||||
| :---------------: | :--------------------------------------------------------------------------------: | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
||||
| `SCKEY` | 微信server酱推送(于2021/4月下线) | server酱的微信通知[官方文档](http://sc.ftqq.com/3.version) |
|
||||
| `SENDKEY` | 微信server酱(Turbo版)推送 | [获取SENDKEY](https://sct.ftqq.com/sendkey) [选择消息通道](https://sct.ftqq.com/forward) |
|
||||
| `BARK_PUSH` | [BARK推送](https://apps.apple.com/us/app/bark-customed-notifications/id1403753865) | IOS用户下载BARK这个APP,填写内容是app提供的`设备码`,例如:<https://api.day.app/123> ,那么此处的设备码就是`123`,再不懂看 [这个图](https://raw.githubusercontents.com/shanmiteko/LotteryAutoScript/main/doc/pic/bark.jpg)(注:支持自建填完整链接即可) |
|
||||
| `BARK_SOUND` | [BARK推送](https://apps.apple.com/us/app/bark-customed-notifications/id1403753865) | bark推送声音设置,例如`choo`,具体值请在`bark`-`推送铃声`-`查看所有铃声` |
|
||||
| `TG_BOT_TOKEN` | telegram推送 | tg推送(需设备可连接外网),`TG_BOT_TOKEN`和`TG_USER_ID`两者必需,填写自己申请[@BotFather](https://t.me/BotFather)的Token,如`10xxx4:AAFcqxxxxgER5uw` , [具体教程](doc/TG_PUSH.md) |
|
||||
| `TG_USER_ID` | telegram推送 | tg推送(需设备可连接外网),`TG_BOT_TOKEN`和`TG_USER_ID`两者必需,填写[@getuseridbot](https://t.me/getuseridbot)中获取到的纯数字ID, [具体教程](doc/TG_PUSH.md) |
|
||||
| `TG_PROXY_HOST` | Telegram 代理的 IP | 代理类型为 http。例子:http代理 <http://127.0.0.1:1080> 则填写 127.0.0.1 |
|
||||
| `TG_PROXY_PORT` | Telegram 代理的端口 | 例子:http代理 <http://127.0.0.1:1080> 则填写 1080 |
|
||||
| `DD_BOT_TOKEN` | 钉钉推送 | 钉钉推送(`DD_BOT_TOKEN`和`DD_BOT_SECRET`两者必需)[官方文档](https://ding-doc.dingtalk.com/doc#/serverapi2/qf2nxq) ,只需`https://oapi.dingtalk.com/robot/send?access_token=XXX` 等于`=`符号后面的XXX即可 |
|
||||
| `DD_BOT_SECRET` | 钉钉推送 | (`DD_BOT_TOKEN`和`DD_BOT_SECRET`两者必需) ,密钥,机器人安全设置页面,加签一栏下面显示的SEC开头的`SECXXXXXXXXXX`等字符 , 注:钉钉机器人安全设置只需勾选`加签`即可,其他选项不要勾选,再不懂看 [这个图](https://raw.githubusercontents.com/shanmiteko/LotteryAutoScript/main/doc/pic/DD_bot.png) |
|
||||
| `IGOT_PUSH_KEY` | iGot推送 | iGot聚合推送,支持多方式推送,确保消息可达。 [参考文档](https://wahao.github.io/Bark-MP-helper ) |
|
||||
| `QQ_SKEY` | 酷推(Cool Push)推送 | 推送所需的Skey,登录后获取Skey [参考文档](https://cp.xuthus.cc/) |
|
||||
| `QQ_MODE` | 酷推(Cool Push)推送 | 推送方式(send或group或者wx,默认send) [参考文档](https://cp.xuthus.cc/) |
|
||||
| `QYWX_KEY` | 企业微信推送 | 密钥,企业微信推送 webhook 后面的 key [详见官方说明文档](https://work.weixin.qq.com/api/doc/90000/90136/91770) |
|
||||
| `PUSH_PLUS_TOKEN` | pushplus推送 | 微信扫码登录后一对一推送或一对多推送下面的token(您的Token) [官方网站](http://pushplus.hxtrip.com/) |
|
||||
| `PUSH_PLUS_USER` | pushplus推送 | 一对多推送的“群组编码”(一对多推送下面->您的群组(如无则新建)->群组编码)注:(1、需订阅者扫描二维码 2、如果您是创建群组所属人,也需点击“查看二维码”扫描绑定,否则不能接受群组消息推送),只填`PUSH_PLUS_TOKEN`默认为一对一推送 |
|
||||
| `QMSG_KEY` | [Qmsg酱](https://qmsg.zendee.cn)私聊推送 | [Qmsg注册](https://qmsg.zendee.cn/login.html) |
|
||||
| `QMSG_QQ` | 私聊消息推送接口,指定需要接收消息的QQ | 指定的QQ号必须在你的[管理台](https://qmsg.zendee.cn/me.html)已添加 |
|
||||
| `SMTP_HOST` | 电子邮件 | smtp服务器的主机名 如: `smtp.qq.com` |
|
||||
| `SMTP_PORT` | 电子邮件 | smtp服务器的端口 如: `465` |
|
||||
| `SMTP_USER` | 电子邮件 | 发送方的电子邮件 如: `xxxxxxxxx@qq.com` |
|
||||
| `SMTP_PASS` | 电子邮件 | smtp服务对应的授权码 |
|
||||
| `SMTP_TO_USER` | 电子邮件 | 接收方电子邮件 |
|
||||
|
||||
----------------------------------------
|
||||
|
||||
@@ -309,6 +205,8 @@ $ ./start.sh
|
||||
|
||||
详见[my_config.example.js](./my_config.example.js)文件内部注释
|
||||
|
||||
----------------------------------------
|
||||
|
||||
## Awesome
|
||||
相关项目
|
||||
|
||||
|
||||
+3
-3
@@ -4,16 +4,16 @@
|
||||
|
||||
Ⅰ.首先在Telegram上搜索[BotFather](https://t.me/BotFather)机器人<br>
|
||||
|
||||

|
||||

|
||||
|
||||
Ⅱ.利用[BotFather](https://t.me/BotFather)创建一个属于自己的通知机器人,按照下图中的1、2、3步骤拿到token,格式形如```10xxx4:AAFcqxxxxgER5uw```。填入```TG_BOT_TOKEN```<br>
|
||||
|
||||
<br>
|
||||
<br>
|
||||
|
||||
**新创建的机器人需要跟它发一条消息来开启对话,否则可能会遇到secret填对了但是收不到消息的情况**<br>
|
||||
|
||||
Ⅲ.再次在Telegram上搜索[getuserIDbot](https://t.me/getuserIDbot)机器人,获取UserID。填入```TG_USER_ID```<br>
|
||||
|
||||

|
||||

|
||||
|
||||
至此,获取**TG_BOT_TOKEN**以及**TG_USER_ID**的教程结束
|
||||
|
||||
@@ -73,7 +73,7 @@ PATH=/sbin:/bin:/usr/sbin/:/usr/bin
|
||||
|
||||
看看有没有效果
|
||||
|
||||

|
||||

|
||||
|
||||
|
||||
7.如果本地的脚本需要更新
|
||||
|
||||
Binary file not shown.
|
After Width: | Height: | Size: 2.5 MiB |
Binary file not shown.
|
After Width: | Height: | Size: 35 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 188 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 1.9 MiB |
@@ -0,0 +1,43 @@
|
||||
1.初始化
|
||||
|
||||
```bash
|
||||
curl -fsSL https://cdn.staticaly.com/gh/shanmiteko/LotteryAutoScript/main/script/docker/init.sh | sudo sh
|
||||
```
|
||||
|
||||
进入`lottery`文件夹
|
||||
|
||||
```bash
|
||||
cd lottery
|
||||
```
|
||||
|
||||
编辑`env.js`与`my_config.js`文件
|
||||
|
||||
- env.js 设置必要环境变量
|
||||
- my_config.js 你的设置
|
||||
|
||||
2.执行相应的脚本
|
||||
```
|
||||
$ tree
|
||||
.
|
||||
├── check.sh 检查中奖
|
||||
├── clear.sh 清理动态
|
||||
├── debug.sh 进入临时容器查看内容
|
||||
├── env.js
|
||||
├── my_config.js
|
||||
├── new_env.js
|
||||
├── new_my_config.js
|
||||
├── remove_all.sh 移除对应docker镜像和所有相关容器
|
||||
└── start.sh 启动抽奖
|
||||
```
|
||||
[](https://asciinema.org/a/453237)
|
||||
|
||||
完成配置后
|
||||
|
||||
```sh
|
||||
$ ./start.sh
|
||||
```
|
||||
3.更新
|
||||
|
||||
进入lottery上一级目录
|
||||
|
||||
使用与初始化相同的命令
|
||||
@@ -0,0 +1,17 @@
|
||||
1. 脚本初始化
|
||||
|
||||
复制脚本内容[qinglong](../script/qinglong/init.sh)
|
||||
|
||||

|
||||
|
||||
2. 新建任务
|
||||
|
||||

|
||||
|
||||

|
||||
|
||||
3. 填入cookie 修改设置
|
||||
|
||||

|
||||
|
||||
4. 脚本更新即再次运行初始化脚本
|
||||
@@ -0,0 +1,61 @@
|
||||
##### Windows
|
||||
|
||||
step1: 下载代码到本地
|
||||
|
||||
[点此下载](https://github.com/shanmiteko/LotteryAutoScript/archive/refs/heads/main.zip)或如图示下载↓
|
||||
|
||||

|
||||
|
||||
下载的压缩包解压后修改env.example.js文件,详见step3
|
||||
|
||||
step2: 下载并安装Node.js
|
||||
|
||||
[点此进入nodejs下载页面](http://nodejs.cn/download)
|
||||
|
||||

|
||||
|
||||
step3:修改env.example.js文件及创建运行文件(打开扩展名显示)
|
||||
|
||||
1.step1下载的压缩包解压后将其中的`env.example.js`文件重命名为`env.js`
|
||||
|
||||
2.右键`env.js`文件选择编辑或用记事本打开
|
||||
|
||||
3.填入相关参数
|
||||
|
||||
4.`my_config.example.js`同样操作
|
||||
|
||||
5.运行
|
||||
|
||||
注: `npm i`意味安装依赖, 只需运行一次, 为防止依赖有变化遂每次都执行
|
||||
|
||||
命令一: 启动抽奖
|
||||
|
||||
```bash
|
||||
npm i && npm run start
|
||||
```
|
||||
|
||||
命令二: 检查中奖
|
||||
|
||||
```bash
|
||||
npm i && npm run check
|
||||
```
|
||||
|
||||
命令三: 清理动态
|
||||
|
||||
```bash
|
||||
npm i && npm run clear
|
||||
```
|
||||
|
||||
`script`目录下有启动脚本, 点击即可运行
|
||||
|
||||
注: **本地运行时可在设置中增大扫描页数**
|
||||
|
||||
> [windows系统定时运行](./win_schedule.md)
|
||||
|
||||
脚本已内置定时运行功能
|
||||
|
||||
##### Linux
|
||||
|
||||
> [linux系统配置与定时运行](./linux_schedule.md)
|
||||
|
||||
脚本已内置定时运行功能
|
||||
+3
-3
@@ -16,13 +16,13 @@
|
||||
|
||||
7.在`操作`页面中点击`新建`,选择操作为`启动程序`,在设置里点击浏览找到`start.bat`文件并选择,在`起始于(可选)(T):`中的空白框里输入`start.bat`文件的目录地址,也就是`程序或脚本(P):`里`start.bat`的前面那一串目录地址,最后是以`\`结尾的 ,填好东西后按下面`确认`
|
||||
|
||||

|
||||

|
||||
|
||||
8.在`条件`页面中选择`网络`,设定启动条件为任何连接
|
||||
|
||||
9.在`设置`页面中选择如图示选项,或者不修改默认设置
|
||||
|
||||

|
||||

|
||||
|
||||
10.最后按`确定`
|
||||
|
||||
@@ -30,6 +30,6 @@
|
||||
|
||||
最后你可以在任务列表中选择已有的任务,右边的操作框中选择`运行`点击,启动计划的任务,如下图所示
|
||||
|
||||

|
||||

|
||||
|
||||
具体看任务是否正常执行,你可以看看自己的账号动态的最新转发,运行成功每几分钟自动转发抽奖动态
|
||||
|
||||
+15
-6
@@ -32,12 +32,21 @@ module.exports = Object.freeze({
|
||||
|
||||
/**
|
||||
* 为防止环境变量过长, 请将多账号填在此处
|
||||
* 以大括号内容为模板依次复制(包含大括号),逗号分割
|
||||
* ```
|
||||
* ...
|
||||
* NUMBER: 1
|
||||
* ...
|
||||
* NUMBER: 2
|
||||
* 以 **大括号内容** 为模板依次复制(包含大括号),逗号分割
|
||||
*
|
||||
* ```txt
|
||||
* [
|
||||
* {
|
||||
* ...
|
||||
* NUMBER: 1
|
||||
* ...
|
||||
* },
|
||||
* {
|
||||
* ...
|
||||
* NUMBER: 2
|
||||
* ...
|
||||
* }
|
||||
* ]
|
||||
* ```
|
||||
*/
|
||||
multiple_account_parm: [
|
||||
|
||||
+2
-2
@@ -17,7 +17,7 @@ async function getFollowList() {
|
||||
log.info('获取关注列表', '未能成功获取关注分区id');
|
||||
return rmup
|
||||
}
|
||||
for (let index = 1; index < 42; index++) {
|
||||
for (let index = 1; index < 100; index++) {
|
||||
const uids = await bili.getPartitionUID(tagid, index);
|
||||
await delay(get_partition_wait);
|
||||
if (!uids.length) break;
|
||||
@@ -126,4 +126,4 @@ async function clear() {
|
||||
}
|
||||
|
||||
|
||||
module.exports = { clear }
|
||||
module.exports = { clear }
|
||||
|
||||
+12
-4
@@ -1,4 +1,4 @@
|
||||
const { log, hasEnv, shuffle, getRandomOne, delay, try_for_each, retryfn } = require('../utils');
|
||||
const { log, hasEnv, shuffle, getRandomOne, delay, try_for_each, retryfn, appendLotteryInfoFile } = require('../utils');
|
||||
const { send } = require('../net/http');
|
||||
const bili = require('../net/bili');
|
||||
const { sendNotify } = require('../helper/notify');
|
||||
@@ -184,6 +184,7 @@ class Monitor extends Searcher {
|
||||
case 1008:
|
||||
case 1009:
|
||||
case 1010:
|
||||
case 1011:
|
||||
case 2002:
|
||||
case 2003:
|
||||
case 4001:
|
||||
@@ -255,7 +256,7 @@ class Monitor extends Searcher {
|
||||
/** 所有抽奖信息 */
|
||||
let alllotteryinfo = [];
|
||||
const
|
||||
{ check_if_duplicated, set_lottery_info_url, disable_reserve_lottery, sneaktower, key_words, model, chatmodel, chat: chats, relay: relays, block_dynamic_type, max_create_time, is_imitator, only_followed, at_users, blockword, blacklist, use_public_blacklist } = config,
|
||||
{ check_if_duplicated, save_lottery_info_to_file, set_lottery_info_url, disable_reserve_lottery, reserve_lottery_wait, sneaktower, key_words, model, chatmodel, chat: chats, relay: relays, block_dynamic_type, max_create_time, is_imitator, only_followed, at_users, blockword, blacklist, use_public_blacklist } = config,
|
||||
now_ts = Date.now() / 1000;
|
||||
|
||||
/**
|
||||
@@ -286,9 +287,14 @@ class Monitor extends Searcher {
|
||||
log.info('筛选动态', `并发查询本地dyid完毕`);
|
||||
}
|
||||
|
||||
if (lottery_param[0] !== "APIs" && save_lottery_info_to_file && protoLotteryInfo.length) {
|
||||
log.info("保存抽奖信息", "保存开始")
|
||||
appendLotteryInfoFile(lottery_param[1].toString(), protoLotteryInfo)
|
||||
}
|
||||
|
||||
if (lottery_param[0] !== "APIs" && set_lottery_info_url && protoLotteryInfo.length) {
|
||||
log.info("上传抽奖信息", "开始")
|
||||
await new Promise((resolve) => {
|
||||
log.info("上传抽奖信息", "上传开始")
|
||||
new Promise((resolve) => {
|
||||
send({
|
||||
url: set_lottery_info_url,
|
||||
method: "POST",
|
||||
@@ -410,6 +416,7 @@ class Monitor extends Searcher {
|
||||
if (hasEnv('NOT_GO_LOTTERY')) {
|
||||
log.info('NOT_GO_LOTTERY', 'ON');
|
||||
} else {
|
||||
await delay(reserve_lottery_wait);
|
||||
await bili.reserve_lottery(reserve_id)
|
||||
}
|
||||
}
|
||||
@@ -532,6 +539,7 @@ class Monitor extends Searcher {
|
||||
* - 评论 内容包含敏感信息 1008
|
||||
* - 评论 重复评论 1009
|
||||
* - 评论 帐号未登录 1010
|
||||
* - 评论 关注UP主7天以上的人可发评论 1011
|
||||
* - 关注 未知错误 2001
|
||||
* - 关注 您已被对方拉入黑名单 2002
|
||||
* - 关注 黑名单用户无法关注 2003
|
||||
|
||||
+48
-44
@@ -478,64 +478,68 @@ class Searcher {
|
||||
if (api) {
|
||||
const { strToJson } = utils;
|
||||
log.info('获取动态', `开始获取链接(${api})中的抽奖信息`)
|
||||
send({
|
||||
url: api,
|
||||
config: {
|
||||
redirect: true
|
||||
},
|
||||
method: 'GET',
|
||||
success: ({ body }) => {
|
||||
if (body.err_msg) {
|
||||
log.error("从API响应数据中获取抽奖信息", body.err_msg)
|
||||
resolve(null)
|
||||
} else {
|
||||
const raw_lottery_info = strToJson(body).lottery_info;
|
||||
if (api.startsWith("file://")) {
|
||||
utils.readLotteryInfoFile(api.substring(7)).then(resolve)
|
||||
} else {
|
||||
send({
|
||||
url: api,
|
||||
config: {
|
||||
redirect: true
|
||||
},
|
||||
method: 'GET',
|
||||
success: ({ body }) => {
|
||||
if (body.err_msg) {
|
||||
log.error("从API响应数据中获取抽奖信息", body.err_msg)
|
||||
resolve(null)
|
||||
} else {
|
||||
const raw_lottery_info = strToJson(body).lottery_info;
|
||||
|
||||
if (raw_lottery_info) {
|
||||
let { length } = raw_lottery_info;
|
||||
if (length) {
|
||||
const lottery_info = raw_lottery_info
|
||||
.reduce(async (pre, cur) => {
|
||||
let results = await pre
|
||||
, { dyid } = cur;
|
||||
if (raw_lottery_info) {
|
||||
let { length } = raw_lottery_info;
|
||||
if (length) {
|
||||
const lottery_info = raw_lottery_info
|
||||
.reduce(async (pre, cur) => {
|
||||
let results = await pre
|
||||
, { dyid } = cur;
|
||||
|
||||
if (!check_if_duplicated || check_if_duplicated >= 2) {
|
||||
log.info('获取动态', `查看动态(${dyid})是否点赞 (${length--})`)
|
||||
const card = await bili.getOneDynamicByDyid(dyid)
|
||||
if (!check_if_duplicated || check_if_duplicated >= 2) {
|
||||
log.info('获取动态', `查看动态(${dyid})是否点赞 (${length--})`)
|
||||
const card = await bili.getOneDynamicByDyid(dyid)
|
||||
|
||||
if (card) {
|
||||
await utils.delay(get_dynamic_detail_wait)
|
||||
if (card) {
|
||||
await utils.delay(get_dynamic_detail_wait)
|
||||
|
||||
const { is_liked } = parseDynamicCard(card)
|
||||
const { is_liked } = parseDynamicCard(card)
|
||||
|
||||
if (is_liked) {
|
||||
log.info('获取动态', `动态(${dyid})已转发过`)
|
||||
} else {
|
||||
cur.is_liked = is_liked
|
||||
results.push(cur)
|
||||
if (is_liked) {
|
||||
log.info('获取动态', `动态(${dyid})已转发过`)
|
||||
} else {
|
||||
cur.is_liked = is_liked
|
||||
results.push(cur)
|
||||
}
|
||||
}
|
||||
} else {
|
||||
results.push(cur)
|
||||
}
|
||||
} else {
|
||||
results.push(cur)
|
||||
}
|
||||
|
||||
return results
|
||||
return results
|
||||
|
||||
}, Promise.resolve([]))
|
||||
}, Promise.resolve([]))
|
||||
|
||||
resolve(lottery_info)
|
||||
return
|
||||
resolve(lottery_info)
|
||||
return
|
||||
}
|
||||
}
|
||||
log.error("从API响应数据中获取抽奖信息", "非Json数据或没有lottery_info或lottery为空")
|
||||
resolve(null)
|
||||
}
|
||||
log.error("从API响应数据中获取抽奖信息", "非Json数据或没有lottery_info或lottery为空")
|
||||
},
|
||||
failure: err => {
|
||||
log.error("从API响应数据中获取抽奖信息", err)
|
||||
resolve(null)
|
||||
}
|
||||
},
|
||||
failure: err => {
|
||||
log.error("从API响应数据中获取抽奖信息", err)
|
||||
resolve(null)
|
||||
}
|
||||
})
|
||||
})
|
||||
}
|
||||
} else {
|
||||
log.warn('获取动态', `链接为空`)
|
||||
resolve(null)
|
||||
|
||||
+21
-4
@@ -17,7 +17,6 @@ const config = {
|
||||
Articles: [],
|
||||
|
||||
/**
|
||||
* 从API接口中获取抽奖信息
|
||||
* @typedef {object} LotteryInfo
|
||||
* @property {string} lottery_info_type
|
||||
* @property {number} create_time
|
||||
@@ -32,11 +31,19 @@ const config = {
|
||||
* @property {string} des
|
||||
* @property {number} type
|
||||
* @property {boolean} hasOfficialLottery 是否官方
|
||||
* @typedef RespondBody
|
||||
* @typedef {object} RespondBody
|
||||
* @property {string} err_msg 错误信息
|
||||
* @property {LotteryInfo[]} lottery_info
|
||||
* API传回数据类型 {RespondBody}
|
||||
*
|
||||
* - 从API接口中获取抽奖信息
|
||||
* 获取抽奖信息的链接字符串
|
||||
* @example
|
||||
* ["https://github.com/spiritLHL/sync_lottery"]
|
||||
*
|
||||
* - 从当前路径下符合要求的文件中获取
|
||||
* 文件名
|
||||
* @example
|
||||
* ["file://lottery_info_1.json"]
|
||||
*/
|
||||
APIs: [],
|
||||
|
||||
@@ -52,6 +59,11 @@ const config = {
|
||||
*/
|
||||
LotteryOrder: [2, 0, 1, 3],
|
||||
|
||||
/**
|
||||
* 保存抽奖信息至文件
|
||||
*/
|
||||
save_lottery_info_to_file: false,
|
||||
|
||||
/**
|
||||
* API发送数据类型 {LotteryInfo[]}
|
||||
* 上传抽奖信息的链接字符串
|
||||
@@ -170,7 +182,6 @@ const config = {
|
||||
lottery_loop_wait: 0,
|
||||
check_loop_wait: 0,
|
||||
clear_loop_wait: 0,
|
||||
update_loop_wait: 0,
|
||||
|
||||
/**
|
||||
* - 转发间隔时间
|
||||
@@ -221,6 +232,12 @@ const config = {
|
||||
*/
|
||||
random_dynamic_wait: 2000,
|
||||
|
||||
/**
|
||||
* - 预约抽奖间隔
|
||||
* - 单位毫秒
|
||||
*/
|
||||
reserve_lottery_wait: 6000,
|
||||
|
||||
/**
|
||||
* - up主粉丝数限制
|
||||
*/
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
const { getRemoteConfig, createDir, createFile } = require("../utils");
|
||||
const { getRemoteConfig, createDir, createFile, dyids_dir } = require("../utils");
|
||||
const config = require("../data/config");
|
||||
|
||||
let global_var = {
|
||||
@@ -47,7 +47,7 @@ let global_var = {
|
||||
this.set('remoteconfig', await getRemoteConfig());
|
||||
}
|
||||
await createDir('dyids');
|
||||
await createFile(num < 2 ? 'dyid.txt' : `dyid${num}.txt`, '', 'a')
|
||||
await createFile(dyids_dir, num < 2 ? 'dyid.txt' : `dyid${num}.txt`, '', 'a')
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
@@ -30,11 +30,11 @@ async function randomDynamic(num) {
|
||||
await utils.try_for_each(
|
||||
utils.shuffle(dynamics).slice(0, num),
|
||||
async (dynamic) => {
|
||||
await utils.delay(random_dynamic_wait)
|
||||
await utils.delay(random_dynamic_wait);
|
||||
if (dynamic instanceof Array && dynamic.length === 2 && typeof dynamic[0] === "number") {
|
||||
return await bili.shareVideo(...dynamic)
|
||||
await bili.shareVideo(...dynamic)
|
||||
} else {
|
||||
return await bili.createDynamic(dynamic)
|
||||
await bili.createDynamic(dynamic)
|
||||
}
|
||||
}
|
||||
)
|
||||
|
||||
+1
-2
@@ -1,7 +1,6 @@
|
||||
const { isMe } = require('./check');
|
||||
const { clear } = require('./clear');
|
||||
const { start } = require('./lottery');
|
||||
const { update } = require('./update');
|
||||
const global_var = require('./data/global_var')
|
||||
const bili = require('./net/bili')
|
||||
const { log } = require('./utils')
|
||||
@@ -24,4 +23,4 @@ async function checkCookie(num) {
|
||||
}
|
||||
|
||||
|
||||
module.exports = { start, isMe, clear, update, checkCookie }
|
||||
module.exports = { start, isMe, clear, checkCookie }
|
||||
+33
-22
@@ -634,9 +634,9 @@ const bili_client = {
|
||||
(uid) => post({
|
||||
url: API.RELATION_BATCH_MODIFY,
|
||||
contents: {
|
||||
fid: uid,
|
||||
fids: uid,
|
||||
act: 1,
|
||||
re_src: 0,
|
||||
re_src: 1,
|
||||
csrf: GlobalVar.get("csrf")
|
||||
}
|
||||
})
|
||||
@@ -858,7 +858,7 @@ const bili_client = {
|
||||
let
|
||||
contents = {
|
||||
csrf: GlobalVar.get("csrf"),
|
||||
extension: '{"emoji_type":1,"from":{"emoji_type":1},"flag_cfg":{}}'
|
||||
extension: '{"emoji_type":1,"from":{"emoji_type":1},"flag_cfg":{}}',
|
||||
},
|
||||
url = '';
|
||||
if (content instanceof Array) {
|
||||
@@ -873,6 +873,7 @@ const bili_client = {
|
||||
url = API.DYNAMIC_SVR_CREATE
|
||||
contents = {
|
||||
...contents,
|
||||
type: 4,
|
||||
content,
|
||||
}
|
||||
}
|
||||
@@ -916,27 +917,33 @@ const bili_client = {
|
||||
* 分享视频
|
||||
* @param {number} uid
|
||||
* @param {number} aid
|
||||
* @return {boolean} isError true
|
||||
* @return {Promise<boolean>} isError true
|
||||
*/
|
||||
async shareVideo(uid, aid) {
|
||||
const responseText = await post({
|
||||
url: API.DYNAMIC_REPOST_SHARE,
|
||||
contents: {
|
||||
platform: "pc",
|
||||
uid,
|
||||
type: 8,
|
||||
content: "分享视频",
|
||||
repost_code: 20000,
|
||||
rid: aid,
|
||||
csrf_token: GlobalVar.get("csrf")
|
||||
}
|
||||
});
|
||||
if (/^{"code":0/.test(responseText)) {
|
||||
log.info('转发视频', `成功转发视频(av${aid})`);
|
||||
return false
|
||||
} else {
|
||||
log.error('转发视频', `转发失败\n${responseText}`);
|
||||
return true
|
||||
const
|
||||
responseText = await post({
|
||||
url: API.DYNAMIC_REPOST_SHARE,
|
||||
contents: {
|
||||
platform: "pc",
|
||||
uid,
|
||||
type: 8,
|
||||
content: "分享视频",
|
||||
repost_code: 20000,
|
||||
rid: aid,
|
||||
csrf_token: GlobalVar.get("csrf")
|
||||
}
|
||||
}),
|
||||
res = strToJson(responseText);
|
||||
switch (res.code) {
|
||||
case 0:
|
||||
log.info('转发视频', `成功转发视频(av${aid})`);
|
||||
return false
|
||||
case 1101015:
|
||||
log.warn('转发视频', `该动态不能转发分享(av${aid})`);
|
||||
return false
|
||||
default:
|
||||
log.error('转发视频', `转发失败\n${responseText}`);
|
||||
return true
|
||||
}
|
||||
},
|
||||
/**
|
||||
@@ -984,6 +991,7 @@ const bili_client = {
|
||||
* - 评论内容包含敏感信息 8
|
||||
* - 重复评论 9
|
||||
* - 帐号未登录 10
|
||||
* - 关注UP主7天以上的人可发评论 11
|
||||
*/
|
||||
async sendChat(rid, msg, type) {
|
||||
const
|
||||
@@ -1028,6 +1036,9 @@ const bili_client = {
|
||||
case -101:
|
||||
log.error('自动评论', '帐号未登录');
|
||||
return 10;
|
||||
case 12078:
|
||||
log.error('自动评论', '关注UP主7天以上的人可发评论');
|
||||
return 11;
|
||||
default:
|
||||
log.error('自动评论', `未知错误\n${responseText}`);
|
||||
return 1;
|
||||
|
||||
+59
-7
@@ -15,6 +15,8 @@ const utils = {
|
||||
config_file: path.join(process.cwd(), "my_config.js"),
|
||||
/**dyids存放目录 */
|
||||
dyids_dir: path.join(process.cwd(), "dyids"),
|
||||
/**lottery_info存放目录 */
|
||||
lottery_info_dir: path.join(process.cwd(), "lottery_info"),
|
||||
/**dyid长度 */
|
||||
dyid_length: 18,
|
||||
/**
|
||||
@@ -230,20 +232,20 @@ const utils = {
|
||||
debug(context, msg) {
|
||||
if (this._level > 3) {
|
||||
if (msg instanceof Object) msg = JSON.stringify(msg, null, 4);
|
||||
this.proPrint([this._colors[0](`[${this._iso_time()}]`), this._colors[1]("[Debug]"), this._colors[2](`[${context}]`), this._colors[3](`[\n${msg}\n]`)])
|
||||
this.proPrint([this._colors[0](`[${this._iso_time()}]`), this._colors[1]("[Debug]"), this._colors[2](`[帐号${process.env["NUMBER"]} ${context}]`), this._colors[3](`[\n${msg}\n]`)])
|
||||
}
|
||||
},
|
||||
info(context, msg) {
|
||||
if (this._level > 2)
|
||||
this.proPrint([this._colors[0](`[${this._iso_time()}]`), this._colors[1]("[Info]"), this._colors[2](`[${context}]`), this._colors[4](`[${msg}]`)])
|
||||
this.proPrint([this._colors[0](`[${this._iso_time()}]`), this._colors[1]("[Info]"), this._colors[2](`[帐号${process.env["NUMBER"]} ${context}]`), this._colors[4](`[${msg}]`)])
|
||||
},
|
||||
warn(context, msg) {
|
||||
if (this._level > 1)
|
||||
this.proPrint([this._colors[0](`[${this._iso_time()}]`), this._colors[1]("[Warn]"), this._colors[2](`[${context}]`), this._colors[5](`[\n${msg}\n]`)])
|
||||
this.proPrint([this._colors[0](`[${this._iso_time()}]`), this._colors[1]("[Warn]"), this._colors[2](`[帐号${process.env["NUMBER"]} ${context}]`), this._colors[5](`[\n${msg}\n]`)])
|
||||
},
|
||||
error(context, msg) {
|
||||
if (this._level > 0)
|
||||
this.proPrint([this._colors[0](`[${this._iso_time()}]`), this._colors[1]("[Error]"), this._colors[2](`[${context}]`), this._colors[6](`[\n${msg}\n]`)])
|
||||
this.proPrint([this._colors[0](`[${this._iso_time()}]`), this._colors[1]("[Error]"), this._colors[2](`[帐号${process.env["NUMBER"]} ${context}]`), this._colors[6](`[\n${msg}\n]`)])
|
||||
}
|
||||
},
|
||||
/**
|
||||
@@ -343,13 +345,14 @@ const utils = {
|
||||
},
|
||||
/**
|
||||
* CreateFile
|
||||
* @param {string} filepath 相对于dyids的文件路径
|
||||
* @param {string} basename
|
||||
* @param {string} filename
|
||||
* @param {string} [defaultValue] 写入默认值
|
||||
* @param {string} flag
|
||||
* @returns {Promise<void>}
|
||||
*/
|
||||
createFile(filepath, defaultValue, flag) {
|
||||
const fpath = path.join(utils.dyids_dir, filepath);
|
||||
createFile(basename, filename, defaultValue, flag) {
|
||||
const fpath = path.join(basename, filename);
|
||||
const buffer = Buffer.from(defaultValue);
|
||||
return new Promise((resolve, rejects) => {
|
||||
fs.open(fpath, flag, (err, fd) => {
|
||||
@@ -384,6 +387,55 @@ const utils = {
|
||||
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' })
|
||||
},
|
||||
/**
|
||||
* 追加lotteryinfo
|
||||
* @param {string} from
|
||||
* @param {import("./core/searcher").LotteryInfo[]} lottery_info
|
||||
* @return {Promise<void>}
|
||||
*/
|
||||
appendLotteryInfoFile(from, lottery_info) {
|
||||
let all_lottery_info = {};
|
||||
try {
|
||||
all_lottery_info = utils.strToJson(fs.readFileSync(path.join(utils.lottery_info_dir, `lottery_info_${Number(process.env.NUMBER)}.json`)).toString())
|
||||
} catch (_) {
|
||||
all_lottery_info = {}
|
||||
}
|
||||
utils
|
||||
.createDir(utils.lottery_info_dir)
|
||||
.then(() => {
|
||||
if (all_lottery_info[from] instanceof Array) {
|
||||
all_lottery_info[from].push(...lottery_info)
|
||||
} else {
|
||||
all_lottery_info[from] = lottery_info
|
||||
}
|
||||
utils.createFile(utils.lottery_info_dir, `lottery_info_${Number(process.env.NUMBER)}.json`, JSON.stringify(all_lottery_info), "w")
|
||||
})
|
||||
},
|
||||
/**
|
||||
* 读取lottery_info
|
||||
* @param {string} filename
|
||||
* @return {Promise<import("./core/searcher").LotteryInfo[]>}
|
||||
*/
|
||||
readLotteryInfoFile(filename) {
|
||||
return new Promise((resolve) => {
|
||||
fs.readFile(path.join(utils.lottery_info_dir, filename), (err, data) => {
|
||||
if (err) {
|
||||
resolve([])
|
||||
} else {
|
||||
let all_lottery_info = utils.strToJson(data.toString('utf8'));
|
||||
resolve(Object.values(all_lottery_info).flat())
|
||||
}
|
||||
})
|
||||
});
|
||||
},
|
||||
/**
|
||||
* 清空lottery_info
|
||||
*/
|
||||
clearLotteryInfo() {
|
||||
return new Promise((resolve) => {
|
||||
fs.rm(utils.lottery_info_dir, { recursive: true, force: true }, resolve)
|
||||
});
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
const { version: ve, env_file, config_file, log, hasEnv, delay, hasFileOrDir } = require("./lib/utils");
|
||||
const { version: ve, env_file, config_file, log, hasEnv, delay, hasFileOrDir, clearLotteryInfo } = require("./lib/utils");
|
||||
|
||||
const metainfo = [
|
||||
` _ _ _ _____ _ _ `,
|
||||
@@ -49,14 +49,14 @@ async function main() {
|
||||
await global_var.init(COOKIE, NUMBER);
|
||||
|
||||
/**引入基础功能 */
|
||||
const { start, isMe, clear, update, checkCookie } = require("./lib/index");
|
||||
const { start, isMe, clear, checkCookie } = require("./lib/index");
|
||||
|
||||
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\tupdate 检查更新\n\thelp 帮助信息";
|
||||
const { lottery_loop_wait, check_loop_wait, clear_loop_wait, update_loop_wait } = require("./lib/data/config");
|
||||
const { lottery_loop_wait, check_loop_wait, clear_loop_wait } = require("./lib/data/config");
|
||||
switch (mode) {
|
||||
case 'start':
|
||||
log.info('抽奖', '开始运行');
|
||||
@@ -75,11 +75,6 @@ async function main() {
|
||||
await clear();
|
||||
}
|
||||
break;
|
||||
case 'update':
|
||||
log.info('检查更新', '开始')
|
||||
loop_wait = update_loop_wait;
|
||||
await update()
|
||||
break;
|
||||
case 'help':
|
||||
return help_msg
|
||||
case undefined:
|
||||
@@ -150,17 +145,26 @@ function initConfig() {
|
||||
/**OPTIONS */
|
||||
process.env.lottery_mode = process.argv[2]
|
||||
|
||||
if (process.env.lottery_mode === "update") {
|
||||
log.info('检查更新', '开始')
|
||||
await require("./lib/update").update()
|
||||
log.info('检查更新', '请手动解压替换可执行文件')
|
||||
return
|
||||
}
|
||||
|
||||
const err_msg = await main();
|
||||
if (err_msg) {
|
||||
log.error('错误', err_msg);
|
||||
log.warn('结束运行', '5秒后自动退出');
|
||||
await delay(5 * 1000);
|
||||
} else {
|
||||
await clearLotteryInfo();
|
||||
while (loop_wait) {
|
||||
log.info('程序休眠', `${loop_wait / 1000}秒后再次启动`)
|
||||
await delay(loop_wait)
|
||||
if (initEnv() || initConfig()) return;
|
||||
await main()
|
||||
await clearLotteryInfo();
|
||||
}
|
||||
log.info('结束运行', '未在config.js中设置休眠时间')
|
||||
}
|
||||
|
||||
+46
-20
@@ -6,30 +6,19 @@ module.exports = Object.freeze({
|
||||
/**
|
||||
* 监视更转的用户uid
|
||||
*/
|
||||
UIDs: [
|
||||
689277291,
|
||||
241675899
|
||||
],
|
||||
UIDs: [],
|
||||
|
||||
/**
|
||||
* 监视的tag
|
||||
*/
|
||||
TAGs: [
|
||||
'互动抽奖',
|
||||
'转发抽奖',
|
||||
'动态抽奖',
|
||||
'抽奖',
|
||||
],
|
||||
TAGs: [],
|
||||
|
||||
/**
|
||||
* 监视的专栏关键词
|
||||
*/
|
||||
Articles: [
|
||||
'抽奖合集'
|
||||
],
|
||||
Articles: [],
|
||||
|
||||
/**
|
||||
* 从API接口中获取抽奖信息
|
||||
* @typedef {object} LotteryInfo
|
||||
* @property {string} lottery_info_type
|
||||
* @property {number} create_time
|
||||
@@ -44,15 +33,21 @@ module.exports = Object.freeze({
|
||||
* @property {string} des
|
||||
* @property {number} type
|
||||
* @property {boolean} hasOfficialLottery 是否官方
|
||||
* @typedef RespondBody
|
||||
* @typedef {object} RespondBody
|
||||
* @property {string} err_msg 错误信息
|
||||
* @property {LotteryInfo[]} lottery_info
|
||||
* API传回数据类型 {RespondBody}
|
||||
*
|
||||
* - 从API接口中获取抽奖信息
|
||||
* 获取抽奖信息的链接字符串
|
||||
* @example
|
||||
* "https://github.com/spiritLHL/sync_lottery"
|
||||
* ["https://github.com/spiritLHL/sync_lottery"]
|
||||
*
|
||||
* - 从当前路径下符合要求的文件中获取
|
||||
* 文件名
|
||||
* @example
|
||||
* ["file://lottery_info_1.json"]
|
||||
*/
|
||||
APIs: [],
|
||||
APIs: ["file://lottery_info_1.json"],
|
||||
|
||||
/**
|
||||
* 抽奖参与顺序组合
|
||||
@@ -66,6 +61,11 @@ module.exports = Object.freeze({
|
||||
*/
|
||||
LotteryOrder: [2, 0, 1, 3],
|
||||
|
||||
/**
|
||||
* 保存抽奖信息至文件
|
||||
*/
|
||||
save_lottery_info_to_file: false,
|
||||
|
||||
/**
|
||||
* API发送数据类型 {LotteryInfo[]}
|
||||
* 上传抽奖信息的链接字符串
|
||||
@@ -183,7 +183,6 @@ module.exports = Object.freeze({
|
||||
lottery_loop_wait: 0,
|
||||
check_loop_wait: 0,
|
||||
clear_loop_wait: 0,
|
||||
update_loop_wait: 0,
|
||||
|
||||
/**
|
||||
* - 转发间隔时间
|
||||
@@ -234,6 +233,12 @@ module.exports = Object.freeze({
|
||||
*/
|
||||
random_dynamic_wait: 2000,
|
||||
|
||||
/**
|
||||
* - 预约抽奖间隔
|
||||
* - 单位毫秒
|
||||
*/
|
||||
reserve_lottery_wait: 6000,
|
||||
|
||||
/**
|
||||
* - up主粉丝数限制
|
||||
*/
|
||||
@@ -429,7 +434,28 @@ module.exports = Object.freeze({
|
||||
* 针对某一账号的特别设置
|
||||
* config_[数字] 依次类推
|
||||
*/
|
||||
config_1: {},
|
||||
config_1: {
|
||||
/**
|
||||
* 手动添加抽奖号UID
|
||||
* - 抽奖动态下的二级小号
|
||||
*/
|
||||
UIDs: [],
|
||||
|
||||
TAGs: [
|
||||
'互动抽奖',
|
||||
'转发抽奖',
|
||||
'动态抽奖',
|
||||
'抽奖',
|
||||
],
|
||||
|
||||
Articles: [
|
||||
'抽奖合集'
|
||||
],
|
||||
|
||||
APIs: [],
|
||||
|
||||
save_lottery_info_to_file: true,
|
||||
},
|
||||
config_2: {},
|
||||
config_3: {}
|
||||
})
|
||||
|
||||
+1
-1
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "lottery-auto-script",
|
||||
"version": "2.6.1",
|
||||
"version": "2.6.4",
|
||||
"description": "自动参与B站动态抽奖",
|
||||
"main": "main.js",
|
||||
"scripts": {
|
||||
|
||||
@@ -49,7 +49,7 @@ docker -v && docker pull $DOCKER_REPO
|
||||
|
||||
echo "create start.sh"
|
||||
cat >start.sh <<EOF
|
||||
#!/bin/sh
|
||||
#!/bin/env bash
|
||||
NAME=shanmite-lottery-start
|
||||
if [[ -z "\$(docker ps -a | grep \$NAME)" ]]; then
|
||||
docker run \\
|
||||
@@ -70,7 +70,7 @@ chmod +x start.sh
|
||||
|
||||
echo "create check.sh"
|
||||
cat >check.sh <<EOF
|
||||
#!/bin/sh
|
||||
#!/bin/env bash
|
||||
NAME=shanmite-lottery-check
|
||||
if [[ -z "\$(docker ps -a | grep \$NAME)" ]]; then
|
||||
docker run \\
|
||||
@@ -91,7 +91,7 @@ chmod +x check.sh
|
||||
|
||||
echo "create clear.sh"
|
||||
cat >clear.sh <<EOF
|
||||
#!/bin/sh
|
||||
#!/bin/env bash
|
||||
NAME=shanmite-lottery-clear
|
||||
if [[ -z "\$(docker ps -a | grep \$NAME)" ]]; then
|
||||
docker run \\
|
||||
@@ -112,14 +112,14 @@ chmod +x clear.sh
|
||||
|
||||
echo "create debug.sh"
|
||||
cat >debug.sh <<EOF
|
||||
#!/bin/sh
|
||||
#!/bin/env bash
|
||||
NAME=shanmite-lottery-debug
|
||||
echo "create temporary debug container"
|
||||
docker run \\
|
||||
-it \\
|
||||
--name \$NAME \\
|
||||
--entrypoint /bin/sh \\
|
||||
$DOCKER_REPO -c sh
|
||||
--entrypoint /bin/bash \\
|
||||
$DOCKER_REPO -c bash
|
||||
echo "remove temporary debug container"
|
||||
docker rm -v \$NAME
|
||||
EOF
|
||||
@@ -127,7 +127,7 @@ chmod +x debug.sh
|
||||
|
||||
echo "create remove_all.sh"
|
||||
cat >remove_all.sh <<EOF
|
||||
#!/bin/sh
|
||||
#!/bin/env bash
|
||||
echo "remove all containers about $DOCKER_REPO"
|
||||
docker rm -v \$(docker ps -a | awk '/shanmite\/lottery_auto_docker/ {print \$1}')
|
||||
echo "remove image $DOCKER_REPO"
|
||||
|
||||
@@ -0,0 +1,43 @@
|
||||
#!/bin/env bash
|
||||
set -e
|
||||
|
||||
NAME=LotteryAutoScript
|
||||
|
||||
# 视网络情况选择链接
|
||||
GIT_REPO=https://github.com/shanmiteko/${NAME}.git
|
||||
# GIT_REPO=https://ghproxy.com/https://github.com/shanmiteko/${NAME}.git
|
||||
|
||||
if [ -d "$NAME" ]; then
|
||||
cd $NAME
|
||||
git pull
|
||||
cd ..
|
||||
else
|
||||
git clone $GIT_REPO $NAME --depth=1
|
||||
fi
|
||||
|
||||
if [ -f "$NAME/my_config.js" ]; then
|
||||
echo 'my_config 已存在'
|
||||
else
|
||||
cp $NAME/my_config.example.js $NAME/my_config.js
|
||||
fi
|
||||
|
||||
if [ -f "$NAME/env.js" ]; then
|
||||
echo 'env.js 已存在'
|
||||
else
|
||||
cp $NAME/env.example.js $NAME/env.js
|
||||
fi
|
||||
|
||||
function create() {
|
||||
cat >"${NAME}_$1.sh" <<EOF
|
||||
#!/bin/env bash
|
||||
cd $NAME
|
||||
npm run $1
|
||||
EOF
|
||||
}
|
||||
|
||||
create start
|
||||
create check
|
||||
create clear
|
||||
|
||||
cd $NAME
|
||||
npm i
|
||||
+8
-1
@@ -24,8 +24,15 @@ const util = require('./util');
|
||||
1),
|
||||
3
|
||||
)
|
||||
}, async () => {
|
||||
},
|
||||
async () => {
|
||||
assert.notEqual((await bili_client.searchArticlesByKeyword("专栏")).length, 0)
|
||||
},
|
||||
async () => {
|
||||
assert.notEqual(await bili_client.sendChat("703886913053917267", "t", 17), 1)
|
||||
},
|
||||
async () => {
|
||||
// assert(!await bili_client.createDynamic("123"))
|
||||
}
|
||||
])
|
||||
|
||||
|
||||
+1
-1
@@ -3,7 +3,7 @@ const global_var = require("../lib/data/global_var");
|
||||
const { log } = require('../lib/utils');
|
||||
const fs = require('fs');
|
||||
|
||||
log._level = 0
|
||||
log._level = 1
|
||||
env.init()
|
||||
global_var.init(process.env["COOKIE"], 1)
|
||||
|
||||
|
||||
Reference in New Issue
Block a user