Compare commits

...
14 Commits
Author SHA1 Message Date
shanmite 179f4d0d41 fix: 错误码变更(#20) 2021-09-09 04:37:27 +00:00
shanmite 33e55721f6 chore: 修改打包文件名 2021-08-26 15:25:09 +08:00
shanmite aa1aad7ddd fix: copy my_config.js 2021-08-26 15:02:32 +08:00
shanmite 0c0d112aaf feat: arm平台可更新 2021-08-26 14:55:09 +08:00
shanmite b4ec45a48d fix: node16-linuxstatic-armv7 2021-08-26 14:30:31 +08:00
shanmite 1ce8e966e8 fix: 调整arm目标 2021-08-26 14:23:58 +08:00
shanmite f252365809 chore: arm64,armv7 2021-08-26 14:13:45 +08:00
shanmite 30fee87485 chore: 自动打包 2021-08-26 13:53:37 +08:00
shanmite 214abd449f feat: 改变账号异常应对策略 2021-08-26 13:25:18 +08:00
shanmiteandGitHub 79b348d37e Merge pull request #17 from Adamcrg/main
fix: 修改dingtalk签名base64问题
2021-08-26 12:13:17 +08:00
ruigangChen 965734c2f2 修改dingtalk签名base64问题 2021-08-26 11:54:52 +08:00
shanmite 3cc42c0fc5 fix: 获取未读私信接口变化 2021-08-21 18:08:13 +08:00
shanmite b24c32a877 doc: 图片换源 2021-08-20 14:38:14 +08:00
shanmite ef822df5bf fix: 两处潜在问题
- 存储专栏获取结果
- 专栏获取为null
2021-08-17 18:43:59 +08:00
13 changed files with 151 additions and 64 deletions
+72
View File
@@ -0,0 +1,72 @@
name: 'Package Node.js project into an executable'
on:
push:
branches:
- main
paths:
- 'lib/**'
- 'main.js'
pull_request:
branches:
- main
paths:
- 'lib/**'
- 'main.js'
workflow_dispatch:
branches:
- main
jobs:
pkg_x64:
runs-on: windows-latest
steps:
- name: 'Checkout codes'
uses: actions/checkout@v2
- name: 'Use Node.js'
uses: actions/setup-node@v1
with:
node-version: '16'
- name: 'Pkg this'
run: |
npm install
npm run pkg_x64
- name: 'Upload to artifact'
uses: actions/upload-artifact@v2
with:
name: dist_x64
path: dist/
pkg_arm64:
runs-on: ubuntu-latest
steps:
- name: 'Checkout codes'
uses: actions/checkout@v2
- name: 'Use Node.js'
uses: actions/setup-node@v1
with:
node-version: '16'
- name: 'Pkg this'
run: |
npm install
npm run pkg_arm64
- name: 'Upload to artifact'
uses: actions/upload-artifact@v2
with:
name: nlts-linux-arm64
path: dist/
pkg_armv7:
runs-on: ubuntu-latest
steps:
- name: 'Checkout codes'
uses: actions/checkout@v2
- name: 'Use Node.js'
uses: actions/setup-node@v1
with:
node-version: '16'
- name: 'Pkg this'
run: |
npm install
npm run pkg_armv7
- name: 'Upload to artifact'
uses: actions/upload-artifact@v2
with:
name: nlts-linux-armv7
path: dist/
-27
View File
@@ -1,27 +0,0 @@
name: 'Automatic sync'
on:
schedule:
- cron: '0 0 * * *'
workflow_dispatch:
watch:
types: started
repository_dispatch:
types: repo-sync
jobs:
repo-sync:
env:
PAT: ${{ github.event.client_payload.PAT || secrets.PAT }}
runs-on: ubuntu-latest
if: github.event.repository.owner.id == github.event.sender.id
steps:
- uses: actions/checkout@v2
with:
persist-credentials: false
- name: 开始自动同步
uses: repo-sync/github-sync@v2
if: env.PAT
with:
source_repo: "https://github.com/shanmite/LotteryAutoScript.git"
source_branch: "main"
destination_branch: "main"
github_token: ${{ github.event.client_payload.PAT || secrets.PAT }}
+6 -6
View File
@@ -49,7 +49,7 @@ Chrome浏览器:
(此步骤是为了方便后续采用JS获取Cookies,获取完毕后应再次勾选)
![取消httponly](doc/pic/getCookies.png)
![取消httponly](https://gitee.com/shanmite/LotteryAutoScript/raw/main/doc/pic/getCookies.png)
3. 在Console中复制以下代码回车
@@ -96,7 +96,7 @@ Chrome浏览器:
6. 键入`lottery start`启动抽奖|`lottery check`检测中奖|`lottery clear`清理动态
> 或者新建文本文档写入`lottery start`然后更改扩展名为.bat点击运行
7. 运行截图
![lottery_start](doc/pic/lottery_start.png)
![lottery_start](https://gitee.com/shanmite/LotteryAutoScript/raw/main/doc/pic/lottery_start.png)
#### 以源码方式运行
@@ -110,7 +110,7 @@ step1: 下载代码到本地
[点此下载](https://github.com/shanmiteko/LotteryAutoScript/archive/refs/heads/main.zip)或如图示下载↓
![点我加载下载操作图示](doc/pic/download.png)
![点我加载下载操作图示](https://gitee.com/shanmite/LotteryAutoScript/raw/main/doc/pic/download.png)
下载的压缩包解压后修改env.example.js文件,详见step3
@@ -118,7 +118,7 @@ step2: 下载并安装Node.js
[点此进入nodejs下载页面](http://nodejs.cn/download)
![点我加载下载nodejs操作图示](doc/pic/nodejs.png)
![点我加载下载nodejs操作图示](https://gitee.com/shanmite/LotteryAutoScript/raw/main/doc/pic/nodejs.png)
step3:修改env.example.js文件及创建运行文件(打开扩展名显示)
@@ -230,14 +230,14 @@ rm -rf lottery/
| :---------------: | :--------------------------------------------------------------------------------: | ------ | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `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`,再不懂看 [这个图](doc/pic/bark.jpg)(注:支持自建填完整链接即可) |
| `BARK_PUSH` | [BARK推送](https://apps.apple.com/us/app/bark-customed-notifications/id1403753865) | 非必须 | IOS用户下载BARK这个APP,填写内容是app提供的`设备码`,例如:https://api.day.app/123 ,那么此处的设备码就是`123`,再不懂看 [这个图](https://gitee.com/shanmite/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`等字符 , 注:钉钉机器人安全设置只需勾选`加签`即可,其他选项不要勾选,再不懂看 [这个图](doc/pic/DD_bot.png) |
| `DD_BOT_SECRET` | 钉钉推送 | 非必须 | (`DD_BOT_TOKEN`和`DD_BOT_SECRET`两者必需) ,密钥,机器人安全设置页面,加签一栏下面显示的SEC开头的`SECXXXXXXXXXX`等字符 , 注:钉钉机器人安全设置只需勾选`加签`即可,其他选项不要勾选,再不懂看 [这个图](https://gitee.com/shanmite/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/) |
+3 -3
View File
@@ -4,16 +4,16 @@
.首先在Telegram上搜索[BotFather](https://t.me/BotFather)机器人<br>
![TG_PUSH1](pic/TG_PUSH1.png)
![TG_PUSH1](https://gitee.com/shanmite/LotteryAutoScript/raw/main/doc/pic/TG_PUSH1.png)
Ⅱ.利用[BotFather](https://t.me/BotFather)创建一个属于自己的通知机器人,按照下图中的1、2、3步骤拿到token,格式形如```10xxx4:AAFcqxxxxgER5uw```。填入```TG_BOT_TOKEN```<br>
![TG_PUSH2](pic/TG_PUSH2.png)<br>
![TG_PUSH2](https://gitee.com/shanmite/LotteryAutoScript/raw/main/doc/pic/TG_PUSH2.png)<br>
**新创建的机器人需要跟它发一条消息来开启对话,否则可能会遇到secret填对了但是收不到消息的情况**<br>
Ⅲ.再次在Telegram上搜索[getuserIDbot](https://t.me/getuserIDbot)机器人,获取UserID。填入```TG_USER_ID```<br>
![TG_PUSH3](pic/TG_PUSH3.png)
![TG_PUSH3](https://gitee.com/shanmite/LotteryAutoScript/raw/main/doc/pic/TG_PUSH3.png)
至此,获取**TG_BOT_TOKEN**以及**TG_USER_ID**的教程结束
+4 -4
View File
@@ -13,7 +13,7 @@
git clone https://github.com/shanmite/LotteryAutoScript.git
```
![image_download](pic/image_download.png)
![image_download](https://gitee.com/shanmite/LotteryAutoScript/raw/main/doc/pic/image_download.png)
**注意**: github访问下载速度可能很慢, 如果卡住了可以通过Github镜像网站下载
@@ -38,7 +38,7 @@ vim env.js
# 此处可查阅Vim的使用手册
```
![image-envjs](pic/image-envjs.png)
![image-envjs](https://gitee.com/shanmite/LotteryAutoScript/raw/main/doc/pic/image-envjs.png)
说明: `"CLEAR"`项设置为`true`, 才可以开启自动清理动态功能
@@ -55,7 +55,7 @@ vim env.js
crontab -e
```
![crontab](pic/crontab.png)
![crontab](https://gitee.com/shanmite/LotteryAutoScript/raw/main/doc/pic/crontab.png)
`SHELL``PATH`照着填
@@ -74,7 +74,7 @@ crontab -e
看看有没有效果
![image-start](pic/image-start.png)
![image-start](https://gitee.com/shanmite/LotteryAutoScript/raw/main/doc/pic/image-start.png)
7.如果本地的脚本需要更新
+3 -3
View File
@@ -16,13 +16,13 @@
7.在`操作`页面中点击`新建`,选择操作为`启动程序`,在设置里点击浏览找到`start.bat`文件并选择,在`起始于(可选)(T)`中的空白框里输入`start.bat`文件的目录地址,也就是`程序或脚本(P)``start.bat`的前面那一串目录地址,最后是以`\`结尾的 ,填好东西后按下面`确认`
![点我加载步骤7结果图示](pic/step_menu.png)
![点我加载步骤7结果图示](https://gitee.com/shanmite/LotteryAutoScript/raw/main/doc/pic/step_menu.png)
8.在`条件`页面中选择`网络`,设定启动条件为任何连接
9.在`设置`页面中选择如图示选项,或者不修改默认设置
![点我加载步骤9结果图示](pic/shezhi_renwu.png)
![点我加载步骤9结果图示](https://gitee.com/shanmite/LotteryAutoScript/raw/main/doc/pic/shezhi_renwu.png)
10.最后按`确定`
@@ -30,6 +30,6 @@
最后你可以在任务列表中选择已有的任务,右边的操作框中选择`运行`点击,启动计划的任务,如下图所示
![点我加载运行图示](pic/start_renwu.png)
![点我加载运行图示](https://gitee.com/shanmite/LotteryAutoScript/raw/main/doc/pic/start_renwu.png)
具体看任务是否正常执行,你可以看看自己的账号动态的最新转发,运行成功每几分钟自动转发抽奖动态
+16 -6
View File
@@ -55,10 +55,9 @@ class Monitor extends Searcher {
event_bus.emit('Turn_on_the_Monitor')
break
case 22:
config.only_followed = true;
log.warn('账号异常', `UID(${global_var.get('myUID')})临时进入只转已关注模式(异常号只会对部分UP出现关注异常)`)
log.warn('账号异常', `UID(${global_var.get('myUID')})异常号只会对部分UP出现关注异常`)
if (!config.is_exception) {
await sendNotify('[动态抽奖]账号异常通知', `UID: ${global_var.get('myUID')}\n\n临时进入只转已关注模式(异常号只会对部分UP出现关注异常)\n\n可在设置中令is_exception为true关闭此推送`)
await sendNotify('[动态抽奖]账号异常通知', `UID: ${global_var.get('myUID')}\n\n异常号只会对部分UP出现关注异常\n\n可在设置中令is_exception为true关闭此推送`)
}
config.is_exception = true;
event_bus.emit('Turn_on_the_Monitor')
@@ -88,6 +87,7 @@ class Monitor extends Searcher {
log.info('筛选动态', `筛选完毕(${len})`);
if (len) {
let is_exception = false;
for (const Lottery of utils.shuffle(allLottery)) {
let status = 0;
if (Lottery.isOfficialLottery) {
@@ -118,14 +118,24 @@ class Monitor extends Searcher {
}
}
status = await this.go(Lottery)
if (status) {
return status
switch (status) {
case 0:
break;
case 22:
is_exception = true
break;
default:
return status
}
d_storage.updateDyid(Lottery.dyid)
await utils.delay(config.wait * (Math.random() + 0.5));
}
log.info('抽奖', '开始转发下一组动态');
return 0
if (is_exception) {
return 22
} else {
return 0
}
} else {
log.info('抽奖', '无未转发抽奖');
return 0
+10 -3
View File
@@ -294,7 +294,9 @@ class Searcher {
log.info('获取动态', `开始获取含关键词${key_words}的专栏信息`);
const cvs = (await bili.searchArticlesByKeyword(key_words)).slice(0, config.article_scan_page);
/**存储所有专栏中的dyid */
let dyinfos = [];
/**遍历专栏s */
for (const cv of cvs) {
const
content = await bili.getOneArticleByCv(cv),
@@ -304,8 +306,12 @@ class Searcher {
weight = dyids_set.length / 2;
let { length } = dyids_set,
_weight = 0;
/**初始权重 */
_weight = 0,
/**单个专栏中的dyid */
_dyinfos = [];
log.info('获取动态', `提取专栏(${cv})中提及的dyid(${length})`)
/**遍历某专栏中的dyids */
for (const dyid of dyids_set) {
const isRelayed = await d_storage.searchDyid(dyid);
if (isRelayed) {
@@ -313,7 +319,7 @@ class Searcher {
}
if (_weight >= weight) {
log.warn('获取动态', `1/2动态曾经转过,该专栏或已查看,故中止`)
dyinfos = []
_dyinfos = []
break
}
if (dyid.length === utils.dyid_length) {
@@ -331,7 +337,7 @@ class Searcher {
await utils.delay(2000)
if (card) {
dyinfos.push(parseDynamicCard(card));
_dyinfos.push(parseDynamicCard(card));
}
} else {
log.info('获取动态', `动态(${dyid})已转发过 (${length--})`)
@@ -340,6 +346,7 @@ class Searcher {
log.warn('获取动态', `动态(${dyid})无效 (${length--})`)
}
}
dyinfos.push(..._dyinfos)
}
const fomatdata = dyinfos.map(o => {
return {
+1 -1
View File
@@ -430,7 +430,7 @@ function ddBotNotify(text, desp) {
const dateNow = Date.now();
const hmac = crypto.createHmac('sha256', DD_BOT_SECRET);
hmac.update(`${dateNow}\n${DD_BOT_SECRET}`);
const result = encodeURIComponent(hmac.digest('Util64'));
const result = encodeURIComponent(hmac.digest().toString('base64'));
send({
method: 'POST',
url: `https://oapi.dingtalk.com/robot/send`,
+11 -4
View File
@@ -185,7 +185,7 @@ const bili_client = {
}).then(responseText => {
let res = strToJson(responseText);
if (res.code === 0) {
const { unfollow_unread, follow_unread } = res.data;
const { unfollow_unread = 0, follow_unread = 0 } = res.data;
log.info('获取未读私信', `成功 已关注未读数: ${follow_unread}, 未关注未读数 ${unfollow_unread}`);
return { unfollow_unread, follow_unread }
} else {
@@ -349,8 +349,15 @@ const bili_client = {
}).then(responseText => {
const res = JSON.parse(responseText);
if (res.code === 0) {
log.info('搜索专栏', '成功 关键词: ' + keyword)
return res.data.result.map(it => it.id)
let cv_arr = []
try {
log.info('搜索专栏', '成功 关键词: ' + keyword)
cv_arr = res.data.result.map(it => it.id)
} catch (error) {
log.error('搜索专栏', '失败 原因:\n' + responseText)
cv_arr = []
}
return cv_arr
} else {
log.error('搜索专栏', '失败 原因:\n' + responseText)
return []
@@ -756,7 +763,7 @@ const bili_client = {
} else if (res.code === 12015) {
show && log.error('自动评论', '需要输入验证码');
return 1
} else if (res.code === 12053) {
} else if (res.code === 12035) {
show && log.error('自动评论', '黑名单用户无法互动');
return -1
} else {
+12 -3
View File
@@ -27,17 +27,25 @@ function getLatestReleaseDownloadUrl(owner, repo) {
['linux', 'linux'],
['darwin', 'macos']
]).get(process.platform)
if (platform) {
const arch = new Map([
['x64', 'x64']
['arm', 'armv7'],
['arm64', 'arm64']
]).get(process.arch)
if (platform && arch) {
try {
const download_url = assets
.filter(({ name }) => name.includes(platform))
.filter(({ name }) => name.includes(platform) && name.includes(arch))
.map(({ browser_download_url }) => browser_download_url)[0]
if (!download_url) {
reject(`未找到能在此平台(${process.platform})-(${process.arch})上运行的版本`)
}
resolve({ download_url, text })
} catch (err) {
reject(err)
}
} else {
reject(`未找到能在此平台(${process.platform})上运行的版本`)
reject(`未找到能在此平台(${process.platform})-(${process.arch})上运行的版本`)
}
} else {
reject('当前已是最新版本')
@@ -65,6 +73,7 @@ async function update() {
await download(proxy_url.href, 'latest_version.zip')
log.info('自动下载', '成功下载到当前目录')
log.info('更新说明', '\n' + text + '\n')
} catch (error) {
log.error('更新脚本', error)
+12 -3
View File
@@ -1,6 +1,6 @@
{
"name": "lottery-auto-script",
"version": "2.0.9",
"version": "2.1.3",
"description": "自动参与B站动态抽奖",
"main": "main.js",
"scripts": {
@@ -9,9 +9,18 @@
"check": "node main.js check",
"update": "node main.js update",
"pkg_x64": "PowerShell .\\script\\pkg\\pkg.ps1",
"pkg_arm64": "npx pkg -t linux-arm64 -o dist/lottery main.js && cp my_config.example.js my_config.js && cp env.example.js dist/env.js",
"pkg_armv7": "npx pkg -t linux-armv7 -o dist/lottery main.js && cp my_config.example.js my_config.js && cp env.example.js dist/env.js"
"pkg_arm64": "npx pkg -t node16-linux-arm64 -o dist/lottery main.js && cp my_config.example.js dist/my_config.js && cp env.example.js dist/env.js",
"pkg_armv7": "npx pkg -t node16-linuxstatic-armv7 -o dist/lottery main.js && cp my_config.example.js dist/my_config.js && cp env.example.js dist/env.js"
},
"files": [
"lib",
"main.js",
"package.js",
"my_config.example.js",
"env.example.js",
"LICENSE",
"README.md"
],
"bin": "main.js",
"pkg": {
"targets": [
+1 -1
View File
@@ -49,7 +49,7 @@ foreach ($TRI in $TRIARR) {
New-Item -Path $DIR -Name "update.bat" -ItemType File -Value "@echo off && lottery update && pause" -Force
}
Compress-Archive -Path $DIR -DestinationPath "$($DIR)-$(Get-Date -Format "yyyyMMd")" -Force
Compress-Archive -Path $DIR -DestinationPath $DIR -Force
}
Remove-Item -Path $ENV_FILE