├── assets
├── github_star.png
├── install_pull_app.png
├── GET_TELEGRAMBOT_CHATID.png
├── GET_TELEGRAMBOT_TOKEN.png
└── github_actions_run_workflow.png
├── .gitignore
├── .github
├── pull.yml
└── workflows
│ └── work.yaml
├── env.example
├── README.md
└── ssp-autocheckin.sh
/assets/github_star.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/alylz/Auto-check/HEAD/assets/github_star.png
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | .env
2 | */.DS_Store
3 | .DS_Store
4 | ./.ss-autocheckin.cook
5 | ./.ss-autocheckin.tmp
6 |
--------------------------------------------------------------------------------
/assets/install_pull_app.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/alylz/Auto-check/HEAD/assets/install_pull_app.png
--------------------------------------------------------------------------------
/assets/GET_TELEGRAMBOT_CHATID.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/alylz/Auto-check/HEAD/assets/GET_TELEGRAMBOT_CHATID.png
--------------------------------------------------------------------------------
/assets/GET_TELEGRAMBOT_TOKEN.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/alylz/Auto-check/HEAD/assets/GET_TELEGRAMBOT_TOKEN.png
--------------------------------------------------------------------------------
/assets/github_actions_run_workflow.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/alylz/Auto-check/HEAD/assets/github_actions_run_workflow.png
--------------------------------------------------------------------------------
/.github/pull.yml:
--------------------------------------------------------------------------------
1 | version: "1"
2 | rules: # Array of rules
3 | - base: master # Required. Target branch
4 | upstream: isecret:master # Required. Must be in the same fork network.
5 | mergeMethod: merge # Optional, one of [none, merge, squash, rebase, hardreset], Default: none.
6 | mergeUnstable: true # Optional, merge pull request even when the mergeable_state is not clean. Default: false
7 |
--------------------------------------------------------------------------------
/env.example:
--------------------------------------------------------------------------------
1 | # 用户信息。格式:域名----账号----密码,多个账号使用 ; 分隔,支持换行但前后引号不能删掉
2 | USERS="https://abc.com----abc@abc.com----abc123456;
3 | https://abc.com----abc@abc.com----abc123456;
4 | https://abc.com----abc@abc.com----abc123456;"
5 | # Server 酱推送 SC KEY
6 | PUSH_KEY="PUSH_KEY"
7 | # Qmsg 酱推送 QMSG_KEY
8 | QMSG_KEY="QMSG_KEY"
9 | # 钉钉机器人推送 DDBOT_TOKEN
10 | DDBOT_TOKEN="DDBOT_TOKEN"
11 | # TelegramBot 推送 Token
12 | TELEGRAMBOT_TOKEN="TELEGRAMBOT_TOKEN"
13 | # TelegramBot 推送用户 ID
14 | TELEGRAMBOT_CHATID="TELEGRAMBOT_CHATID"
15 | # PushPlus TOKEN
16 | PUSHPLUS_TOKEN="PUSHPLUS_TOKEN"
17 | # 企业微信 ID
18 | WEWORK_ID="WEWORK_ID"
19 | # 企业微信应用 ID
20 | WEWORK_AGENT_ID="WEWORK_AGENT_ID"
21 | # 企业微信 Secret
22 | WEWORK_SECRET="WEWORK_SECRET"
23 | # 执行任务时是否显示签到详情
24 | DISPLAY_CONTEXT=1
--------------------------------------------------------------------------------
/.github/workflows/work.yaml:
--------------------------------------------------------------------------------
1 | name: SSPanel_Auto_Checkin
2 |
3 | on:
4 | workflow_dispatch:
5 | push:
6 | branches:
7 | - master
8 | schedule:
9 | - cron: '20 18 * * *'
10 | watch:
11 | types:
12 | - started
13 |
14 | env:
15 | TZ: Asia/Shanghai
16 | USERS: ${{secrets.USERS}}
17 | PUSH_KEY: ${{secrets.PUSH_KEY}}
18 | PUSH_TURBO_KEY: ${{secrets.PUSH_TURBO_KEY}}
19 | QMSG_KEY: ${{secrets.QMSG_KEY}}
20 | DDBOT_TOKEN: ${{secrets.DDBOT_TOKEN}}
21 | TELEGRAMBOT_TOKEN: ${{secrets.TELEGRAMBOT_TOKEN}}
22 | TELEGRAMBOT_CHATID: ${{secrets.TELEGRAMBOT_CHATID}}
23 | PUSHPLUS_TOKEN: ${{secrets.PUSHPLUS_TOKEN}}
24 | WEWORK_ID: ${{secrets.WEWORK_ID}}
25 | WEWORK_AGENT_ID: ${{secrets.WEWORK_AGENT_ID}}
26 | WEWORK_SECRET: ${{secrets.WEWORK_SECRET}}
27 | DISPLAY_CONTEXT: ${{secrets.DISPLAY_CONTEXT}}
28 |
29 | jobs:
30 | build:
31 | runs-on: ubuntu-latest
32 |
33 | steps:
34 | - name: Checkout codes
35 | uses: actions/checkout@v2
36 |
37 | - name: Install depends
38 | run: |
39 | sudo apt-get update
40 | sudo apt-get -y install curl jq
41 |
42 | - name: Request API
43 | run: |
44 | bash ssp-autocheckin.sh
45 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # SSPanel 自动签到 V2.0 支持多站点多用户1
2 |
3 | 
4 |
5 |
6 | 目录
7 |
8 | - [SSPanel 自动签到 V2.0 支持多站点多用户](#sspanel-自动签到-v20-支持多站点多用户)
9 | - [说明](#说明)
10 | - [升级警告](#升级警告)
11 | - [使用方法](#使用方法)
12 | - [方式一:Github Actions(推荐)](#方式一github-actions推荐)
13 | - [方式二:部署本地或服务器](#方式二部署本地或服务器)
14 | - [安装依赖](#安装依赖)
15 | - [克隆仓库](#克隆仓库)
16 | - [修改配置](#修改配置)
17 | - [运行脚本签到](#运行脚本签到)
18 | - [添加定时任务](#添加定时任务)
19 | - [常见问题](#常见问题)
20 | - [关于定时任务不执行](#关于定时任务不执行)
21 | - [Action 定时任务运行结果只显示推送信息](#action-定时任务运行结果只显示推送信息)
22 | - [TGBot 推送相关参数获取](#tgbot-推送相关参数获取)
23 | - [Fork 之后如何同步原作者的更新内容](#fork-之后如何同步原作者的更新内容)
24 | - [方式一: 保留自己内容](#方式一-保留自己内容)
25 | - [方式二: 源作者内容直接覆盖自己内容](#方式二-源作者内容直接覆盖自己内容)
26 |
27 |
28 |
29 | ## 相关说明
30 |
31 | - 适用于使用 SSPanel 用户管理面板搭建的网站,网站页面底部会有 `Powered by SSPANEL` 字段
32 | - 支持使用配置文件读取账户信息,支持多机场多用户签到
33 | - 支持一日多次签到
34 | - 支持推送签到信息到 QQ、微信和 Telegram
35 | - 若有 bug 请到 [Issues](https://github.com/isecret/sspanel-autocheckin/issues/new) 反馈
36 |
37 | ## 升级警告
38 |
39 | V2.0 版本支持多站点多用户签到,不兼容 V1.0 版本配置,升级脚本后需要重新配置
40 |
41 | ## 使用方法
42 |
43 | ### 方式一:Github Actions(推荐)
44 |
45 | > Fork 后的项目 Github Actions 默认处于关闭状态,需要手动开启 Actions,执行一次工作流。后续定时任务(cron)才会自动执行。具体操作信息看:[关于定时任务不执行](#关于定时任务不执行)。
46 |
47 | Fork 该仓库,进入仓库后点击 `Settings`,右侧栏点击 `Secrets`,点击 `New secret`。按需添加以下值:
48 |
49 | | Secret Name | Secret Value | 参数说明 | 是否可选 |
50 | | -------------------- | ---------------------------------------------- | ------------------------------------------------------------------------------- | ---------------------- |
51 | | `USERS` | `https://abc.com----abc@abc.com----abc123456;` | 用户组,格式为 `签到站点----用户名----密码`,多个站点或用户使用 `;` 分隔 | 必填,至少存在一组 |
52 | | `PUSH_KEY` | `SCxxxxxxxxxxxxx` | 微信推送 ,填写自己申请[Server 酱](http://sc.ftqq.com/?c=code)的`SC KEY` | 可选 |
53 | | `PUSH_TURBO_KEY` | `xxxxxxxxxxxxxxx` | 企业微信推送 ,填写自己申请[Server 酱 Turbo](https://sct.ftqq.com/sendkey)的`SendKey` | 可选 |
54 | | `QMSG_KEY` | `e6fxxxxxxxxxxxx` | QQ 推送 ,填写自己申请[Qmsg 酱](https://qmsg.zendee.cn/me.html#/)的 `QMSG_KEY` | 可选 |
55 | | `DDBOT_TOKEN` | `a1bxxxxxxxxxxxx` | 钉钉机器人推送 ,填写申请[自定义机器人接入](https://qmsg.zendee.cn/me.html#/) 申请的回调地址中 `access_token` 的值 | 可选 |
56 | | `TELEGRAMBOT_TOKEN` | `123456:ABC-DEF1234xxx-xxx123ew11` | TGBot 推送,填写自己向[@BotFather](https://t.me/BotFather) 申请的 Bot Token | 可选,和下面的一起使用 |
57 | | `TELEGRAMBOT_CHATID` | `11xxxxxx03` | TGBot 推送,填写[@getuseridbot](https://t.me/getuseridbot)私聊获取到的纯数字 ID | 可选,和上面一起使用 |
58 | | `PUSHPLUS_TOKEN` | `xxxxxxxxxxxxxxxx` | PUSHPLUS 推送,填写申请的 [pushplus](https://pushplus.hxtrip.com/) TOKEN | 可选 |
59 | | `WEWORK_ID` | `xxxxxx` | 企业微信ID,填写注册的企业微信 ID | 可选,与 `WEWORK_AGENT_ID` 和 `WEWORK_SECRET` 配合使用 |
60 | | `WEWORK_AGENT_ID` | `100001` | 企业微信应用ID,填写申请应用的ID | 可选,与 `WEWORK_ID` 和 `WEWORK_SECRET` 配合使用 |
61 | | `WEWORK_SECRET` | `xxxxxxxxxxxxxxx` | 企业微信对应的 SECRET | 可选,与 `WEWORK_ID` 和 `WEWORK_AGENT_ID` 配合使用 |
62 | | `DISPLAY_CONTEXT` | `1` | 任务执行时是否显示详细信息,`1` 显示 `0` 关闭,默认值 `1` | 可选 |
63 |
64 |
65 | > TGBot 推送相关参数获取步骤可以点击 [TGBot 推送相关参数获取](#tgbot-推送相关参数获取) 查看。
66 |
67 | 定时任务将于每天凌晨 `2:20` 分和晚上 `20:20` 执行,如果需要修改请编辑 `.github/workflows/work.yaml` 中 `on.schedule.cron` 的值(注意,该时间时区为国际标准时区,国内时间需要 -8 Hours)。
68 |
69 | ### 方式二:部署本地或服务器
70 |
71 | #### 安装依赖
72 |
73 | ```bash
74 | # Ubuntu/Debain
75 | apt-get install jq
76 |
77 | # CentOS
78 | yum install jq
79 |
80 | # MacOS
81 | brew install jq
82 | ```
83 |
84 | #### 克隆仓库
85 |
86 | ```bash
87 | git clone --depth=1 https://github.com/isecret/sspanel-autocheckin.git
88 | # 因为国内网络克隆速度不是很理想的,选择下面的
89 | git clone --depth=1 https://hub.fastgit.org/isecret/sspanel-autocheckin.git
90 | ```
91 |
92 | #### 修改配置
93 |
94 | 复制 `env.example` 为 `.env` ,然后编辑 `.env` 文件修改配置。
95 |
96 | ```bash
97 | cp env.example .env
98 | vim .env
99 | ```
100 |
101 | 用户配置格式如下:相关参数获取步骤可看上方表格的**参数说明**列。
102 |
103 | ```ini
104 | # 用户信息。格式:域名----账号----密码,多个账号使用 ; 分隔,支持换行但前后引号不能删掉
105 | USERS="https://abc.com----abc@abc.com----abc123456;
106 | https://abc.com----abc@abc.com----abc123456;
107 | https://abc.com----abc@abc.com----abc123456;"
108 | # Server 酱推送 SC KEY
109 | PUSH_KEY="PUSH_KEY"
110 | # Qmsg 酱推送 QMSG_KEY
111 | QMSG_KEY="QMSG_KEY"
112 | # 钉钉机器人推送 DDBOT_TOKEN
113 | DDBOT_TOKEN="DDBOT_TOKEN"
114 | # TelegramBot 推送 Token
115 | TELEGRAMBOT_TOKEN="TELEGRAMBOT_TOKEN"
116 | # TelegramBot 推送用户 ID
117 | TELEGRAMBOT_CHATID="TELEGRAMBOT_CHATID"
118 | # PUSHPLUS 推送 Token
119 | PUSHPLUS_TOKEN="PUSHPLUS_TOKEN"
120 | # 企业微信 ID
121 | WEWORK_ID="WEWORK_ID"
122 | # 企业微信应用 ID
123 | WEWORK_AGENT_ID="WEWORK_AGENT_ID"
124 | # 企业微信密钥
125 | WEWORK_SECRET="WEWORK_SECRET"
126 | # 执行任务时是否显示签到详情
127 | DISPLAY_CONTEXT=1
128 | ```
129 |
130 | 不会使用 vim 操作的直接复制下面命令(修改相关参数)到终端运行即可。
131 |
132 | > ```bash
133 | > cat > .env < # 用户信息。格式:域名----账号----密码,多个账号使用 ; 分隔,支持换行但前后引号不能删掉
135 | > USERS="https://abc.com----abc@abc.com----abc123456;
136 | > https://abc.com----abc@abc.com----abc123456;
137 | > https://abc.com----abc@abc.com----abc123456;"
138 | > # Server 酱推送 SC KEY
139 | > PUSH_KEY="PUSH_KEY"
140 | > # Qmsg 酱推送 QMSG_KEY
141 | > QMSG_KEY="QMSG_KEY"
142 | > # 钉钉机器人推送 DDBOT_TOKEN
143 | > DDBOT_TOKEN="DDBOT_TOKEN"
144 | > # TelegramBot 推送 Token
145 | > TELEGRAMBOT_TOKEN="TELEGRAMBOT_TOKEN"
146 | > # TelegramBot 推送用户 ID
147 | > TELEGRAMBOT_CHATID="TELEGRAMBOT_CHATID"
148 | > # PUSHPLUS 推送 Token
149 | > PUSHPLUS_TOKEN="PUSHPLUS_TOKEN"
150 | > # 企业微信 ID
151 | > WEWORK_ID="WEWORK_ID"
152 | > # 企业微信应用 ID
153 | > WEWORK_AGENT_ID="WEWORK_AGENT_ID"
154 | > # 企业微信密钥
155 | > WEWORK_SECRET="WEWORK_SECRET"
156 | > # 执行任务时是否显示签到详情
157 | > DISPLAY_CONTEXT=1
158 | > EOF
159 | > ```
160 |
161 | #### 运行脚本签到
162 |
163 | 脚本添加可执行权限后运行。
164 |
165 | ```bash
166 | $ chmod +x ssp-autocheckin.sh && ./ssp-autocheckin.sh
167 | 🚀SSPanel Auto Checkin v2.2.2
168 |
169 | 用户 1
170 | 签到站点: DOMAIN
171 | 签到用户: EMAIL
172 | 签到时间: 2021-05-19 12:46:10
173 | 签到状态: 续命1天, 获得了 111 MB流量.
174 |
175 | 用户 2
176 | 签到站点: DOMAIN
177 | 签到用户: EMAIL
178 | 签到时间: 2021-05-19 12:46:14
179 | 签到状态: 续命1天, 获得了 111 MB流量.
180 | 用户等级: VIP1
181 | 用户余额: 2.98 CNY
182 | 用户限速: 100 Mbps
183 | 总流量: 317.91 GB
184 | 剩余流量: 248.817 GB
185 | 已使用流量: 69.0929 GB
186 | 等级过期时间: 2021-05-12 16:03:35
187 | 账户过期时间: 2021-07-26 16:03:35
188 | 上次签到时间: 2020-12-26 02:53:23
189 |
190 | 通知结果:
191 | Server 酱推送结果: 成功
192 | Qmsg 酱推送结果: 成功
193 | 钉钉机器人推送结果: 成功
194 | TelegramBot 推送结果: 成功
195 | PushPlus 推送结果: 成功
196 | 企业微信推送结果: 成功
197 |
198 | ---------------------------------------
199 | ```
200 |
201 | #### 添加定时任务
202 |
203 | 签到成功后,即可添加定时任务。
204 |
205 | ```bash
206 | 24 10 * * * bash /path/to/ssp-autocheckin.sh >> /path/to/ssp-autocheckin.log 2>&1
207 | ```
208 |
209 | ## 常见问题
210 |
211 | ### 关于定时任务不执行
212 |
213 | 因为 Github 默认 Fork 后的项目 Github Actions 处于关闭状态,定时任务执行需要手动开启 Actions,执行一次工作流。解决方法有三种:
214 |
215 | - 修改项目相关文件,比如这个 `README.md`,新增一个空格也算,然后提交。
216 |
217 | - 进入 Actions,手动执行一次工作流。
218 |
219 | 
220 |
221 | - 进入 **Fork 后的项目**,点击右上角的 star 按钮。
222 |
223 | 
224 |
225 | ### Action 定时任务运行结果只显示推送信息
226 |
227 | 因为签到详细信息涉及用户隐私问题,所以对任务结果中对域名和用户名进行了脱敏处理,如果你仍希望关闭任务结果的显示,可以配置 Secret `DISPLAY_CONTEXT` 的值为 `0` 将只展示任务推送结果,而不显示具体签到详情。
228 |
229 | ### TGBot 推送相关参数获取
230 |
231 | > 需要`TELEGRAMBOT_TOKEN`和`TELEGRAMBOT_CHATID`一起使用,前者用于调用 bot,后者用于指定推送目标。
232 |
233 | | `TELEGRAMBOT_CHATID`获取 | `TELEGRAMBOT_TOKEN`获取 |
234 | | --------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------- |
235 | |  |  |
236 |
237 | ### Fork 之后如何同步原作者的更新内容
238 |
239 | 用户可选手动 PR 同步或者使用插件 Pull App 自动同步原作者的更新内容。手动 PR 同步可以参考 [手动 PR 同步教程](https://www.cnblogs.com/hzhhhbb/p/11488861.html)。自动同步需要安装 [ Pull app](https://github.com/apps/pull) 插件。使用插件 Pull App 自动同步步骤如下。
240 |
241 | 1. 安装 [ Pull app](https://github.com/apps/pull) 插件。
242 |
243 | 2. 安装过程中会让你选择要选择那一种方式;
244 |
245 | - `All repositories`表示同步已经 frok 的仓库以及未来 fork 的仓库;
246 | - `Only select repositories`表示仅选择要自己需要同步的仓库,其他 fork 的仓库不会被同步。
247 |
248 | 根据自己需求选择,实在不知道怎么选择,就选 `All repositories`。
249 |
250 | 点击 `install`,完成安装。
251 |
252 | 
253 |
254 | Pull App 可以指定是否保留自己已经修改的内容,分为下面两种方式,如果你不知道他们的区别,就请选择方式二;如果你知道他们的区别,并且懂得如何解决 git 冲突,可根据需求自由选择任一方式。
255 |
256 | #### 方式一: 保留自己内容
257 |
258 | > 该方式会在上游代码更新后,判断上游更新内容和自己分支代码是否存在冲突,如果有冲突则需要自己手动合并解决(也就是不会直接强制直接覆盖)。如果上游代码更新涉及 `workflow` 里的文件内容改动,这时也需要自己手动合并解决。
259 |
260 | 步骤如下:
261 |
262 | 1. 确认已安装 [ Pull app](https://github.com/apps/pull) 插件。
263 |
264 | 2. 编辑 pull.yml (在 `.github` 目录下) 文件,将第 5 行内容修改为 `mergeMethod: merge`,然后保存提交。 (默认就是 `merge`,如果未修改过,可以不用再次提交)
265 |
266 | 完成后,上游代码更新后 pull 插件就会自动发起 PR 更新自己分支代码!只是如果存在冲突,需要自己手动去合并解决冲突。
267 |
268 | 当然也可以立即手动触发同步:`https://pull.git.ci/process/${owner}/${repo}`
269 |
270 | #### 方式二: 源作者内容直接覆盖自己内容
271 |
272 | > 该方式会将源作者的内容直接强制覆盖到自己的仓库中,也就是不会保留自己已经修改过的内容。
273 |
274 | 步骤如下:
275 |
276 | 1. 确认已安装 [ Pull app](https://github.com/apps/pull) 插件。
277 |
278 | 2. 编辑 pull.yml (在 `.github` 目录下) 文件,将第 5 行内容修改为 `mergeMethod: hardreset`,然后保存提交。
279 |
280 | 完成后,上游代码更新后 pull 插件会自动发起 PR 更新**覆盖**自己仓库的代码!
281 |
282 | 当然也可以立即手动触发同步:`https://pull.git.ci/process/${owner}/${repo}`
283 |
--------------------------------------------------------------------------------
/ssp-autocheckin.sh:
--------------------------------------------------------------------------------
1 | #!/bin/bash
2 | PATH="/usr/local/bin:/usr/bin:/bin"
3 |
4 | #版本、初始化变量
5 | VERSION="2.2.2"
6 | ENV_PATH="$(dirname $0)/.env"
7 | IS_MACOS=$(uname | grep 'Darwin' | wc -l)
8 | IS_DISPLAY_CONTEXT=1
9 | TITLE="🚀SSPanel Auto Checkin v${VERSION}"
10 | users_array=""
11 | log_text=""
12 | COOKIE_PATH="./.ss-autocheckin.cook"
13 | PUSH_TMP_PATH="./.ss-autocheckin.tmp"
14 |
15 | # 本地模式
16 | if [ -f ${ENV_PATH} ]; then
17 | source ${ENV_PATH}
18 | fi
19 |
20 | # 加载用户组配置
21 | users_array=($(echo ${USERS} | tr ';' ' '))
22 |
23 | # 是否显示上下文 默认是
24 | if [ "${DISPLAY_CONTEXT}" == "0" ]; then
25 | IS_DISPLAY_CONTEXT=0
26 | fi
27 |
28 | #检查账户权限
29 | check_root() {
30 | if [ 0 == $UID ]; then
31 | echo -e "当前用户是 ROOT 用户,可以继续操作" && sleep 1
32 | else
33 | echo -e "当前非 ROOT 账号(或没有 ROOT 权限),无法继续操作,请更换 ROOT 账号或使用 su命令获取临时 ROOT 权限" && exit 1
34 | fi
35 | }
36 |
37 | #检查系统
38 | check_sys() {
39 | if [[ -f /etc/redhat-release ]]; then
40 | release="centos"
41 | elif [ ${IS_MACOS} -eq 1 ]; then
42 | release="macos"
43 | elif cat /etc/issue | grep -q -E -i "debian"; then
44 | release="debian"
45 | elif cat /etc/issue | grep -q -E -i "ubuntu"; then
46 | release="ubuntu"
47 | elif cat /etc/issue | grep -q -E -i "centos|red hat|redhat"; then
48 | release="centos"
49 | elif cat /proc/version | grep -q -E -i "debian"; then
50 | release="debian"
51 | elif cat /proc/version | grep -q -E -i "ubuntu"; then
52 | release="ubuntu"
53 | elif cat /proc/version | grep -q -E -i "centos|red hat|redhat"; then
54 | release="centos"
55 | fi
56 | }
57 |
58 | #检查 jq 依赖
59 | check_jq_installed_status() {
60 | if [ -z $(command -v jq) ]; then
61 | echo -e "jq 依赖没有安装,开始安装..."
62 | check_root
63 | if [[ ${release} == "centos" ]]; then
64 | yum update && yum install jq -y
65 | elif [[ ${release} == "macos" ]]; then
66 | brew install jq
67 | else
68 | apt-get update && apt-get install jq -y
69 | fi
70 | if [ -z $(command -v jq) ]; then
71 | echo -e "jq 依赖安装失败,请检查!" && exit 1
72 | else
73 | echo -e "jq 依赖安装成功!"
74 | fi
75 | fi
76 | }
77 |
78 | #消息推送
79 | send_message() {
80 | echo -e "\n通知结果:"
81 | # Server 酱通知
82 | if [ "${PUSH_KEY}" ]; then
83 | echo -e "text=${TITLE}&desp=${log_text}" >${PUSH_TMP_PATH}
84 | push=$(curl -k -s --data-binary @${PUSH_TMP_PATH} "https://sc.ftqq.com/${PUSH_KEY}.send")
85 | push_code=$(echo ${push} | jq -r ".errno" 2>&1)
86 | if [ ${push_code} -eq 0 ]; then
87 | echo -e "Server 酱推送结果: 成功"
88 | else
89 | echo -e "Server 酱推送结果: 失败"
90 | fi
91 | fi
92 |
93 | # Server 酱 Turbo 通知
94 | if [ "${PUSH_TURBO_KEY}" ]; then
95 | echo -e "text=${TITLE}&desp=${log_text}" >${PUSH_TMP_PATH}
96 | push=$(curl -k -s -X POST --data-binary @${PUSH_TMP_PATH} "https://sctapi.ftqq.com/${PUSH_TURBO_KEY}.send")
97 | ###
98 | # push 成功后,获取相关查询参数
99 | ###
100 |
101 | push_code=$(echo ${push} | jq -r ".data.errno" 2>&1)
102 | push_id=$(echo ${push} | jq -r ".data.pushid" 2>&1)
103 | push_readkey=$(echo ${push} | jq -r ".data.readkey" 2>&1)
104 |
105 | ###
106 | # 企业微信推送逻辑修改
107 | # 先放入队列,push_code 为 0 代表放入队列成功不代表推送成功
108 | ###
109 |
110 | if [ "${push_code} -eq 0" ]; then
111 | echo -e "Server 酱Turbo 队列结果: 成功"
112 |
113 | ###
114 | # 推送结果需要异步查询
115 | # 目前每隔两秒查询一次,轮询 10 次检查推送结果
116 | ###
117 |
118 | i=1
119 | while [ $i -le 10 ]; do
120 | wx_status=$(curl -s "https://sctapi.ftqq.com/push?id=${push_id}&readkey=${push_readkey}")
121 | wx_result=$(echo ${wx_status} | jq -r ".data.wxstatus" 2>&1 | sed 's/\"{/{/g'| sed 's/\}"/}/g' | sed 's/\\"/"/g')
122 | if [ "${wx_result}" ]; then
123 | wx_errcode=$(echo ${wx_result} | jq -r ".errcode" 2>&1)
124 | if [ "${wx_errcode} -eq 0" ]; then
125 | echo -e "Server 酱Turbo 推送结果: 成功"
126 | else
127 | echo -e "Server 酱Turbo 推送结果: 失败,错误码:"${wx_errcode}",more info at https:\\open.work.weixin.qq.com\devtool"
128 | fi
129 | break
130 | else
131 | if [ $i -lt 10 ]; then
132 | let 'i++'
133 | Sleep 2s
134 | else
135 | echo -e "Server 酱Turbo 推送结果: 检查超时,请自行确认结果"
136 | fi
137 |
138 | fi
139 |
140 | done
141 | else
142 | echo -e "Server 酱Turbo 队列结果: 失败"
143 | fi
144 | fi
145 |
146 | # 钉钉群机器人通知
147 | if [ "${DDBOT_TOKEN}" ]; then
148 | push=$(curl -k -s "https://oapi.dingtalk.com/robot/send?access_token=${DDBOT_TOKEN}" \
149 | -H 'Content-Type: application/json' \
150 | -d "{
151 | \"msgtype\": \"markdown\",
152 | \"markdown\": {
153 | \"title\":\"${TITLE}\",
154 | \"text\": \"${log_text}\"
155 | }
156 | }")
157 | push_code=$(echo ${push} | jq -r ".errcode" 2>&1)
158 | if [ "${push_code}" -eq 0 ]; then
159 | echo -e "钉钉机器人推送结果: 成功"
160 | else
161 | echo -e "钉钉机器人推送结果: 失败"
162 | fi
163 | fi
164 |
165 |
166 | # Qmsg 酱通知
167 | if [ "${QMSG_KEY}" ]; then
168 | result_qmsg_log_text="${TITLE}${log_text}"
169 | echo -e "msg=${result_qmsg_log_text}" >${PUSH_TMP_PATH}
170 | push=$(curl -k -s --data-binary @${PUSH_TMP_PATH} "https://qmsg.zendee.cn/send/${QMSG_KEY}")
171 | push_code=$(echo ${push} | jq -r ".success" 2>&1)
172 | if [ "${push_code}" == "true" ]; then
173 | echo -e "Qmsg 酱推送结果: 成功"
174 | else
175 | echo -e "Qmsg 酱推送结果: 失败"
176 | fi
177 | fi
178 |
179 | # TelegramBot 通知
180 | if [ "${TELEGRAMBOT_TOKEN}" ] && [ "${TELEGRAMBOT_CHATID}" ]; then
181 | result_tgbot_log_text="${TITLE}${log_text}"
182 | echo -e "chat_id=${TELEGRAMBOT_CHATID}&parse_mode=Markdown&text=${result_tgbot_log_text}" >${PUSH_TMP_PATH}
183 | push=$(curl -k -s --data-binary @${PUSH_TMP_PATH} "https://api.telegram.org/bot${TELEGRAMBOT_TOKEN}/sendMessage")
184 | push_code=$(echo ${push} | grep -o '"ok":true')
185 | if [ ${push_code} ]; then
186 | echo -e "TelegramBot 推送结果: 成功"
187 | else
188 | echo -e "TelegramBot 推送结果: 失败"
189 | fi
190 | fi
191 |
192 | # PushPlus 通知
193 | if [ "${PUSHPLUS_TOKEN}" ]; then
194 | echo -e "token=${PUSHPLUS_TOKEN}&title=${TITLE}&content=${log_text}" >${PUSH_TMP_PATH}
195 | push=$(curl -k -s --data-binary @${PUSH_TMP_PATH} "http://pushplus.hxtrip.com/send")
196 | push_code=$(echo ${push} | jq -r ".code" 2>&1)
197 | if [ ${push_code} -eq 200 ]; then
198 | echo -e "PushPlus 推送结果: 成功"
199 | else
200 | echo -e "PushPlus 推送结果: 失败"
201 | fi
202 | fi
203 |
204 | # 企业微信通知
205 | if [ "${WEWORK_ID}" ] && [ "${WEWORK_AGENT_ID}" ] && [ "${WEWORK_SECRET}" ]; then
206 | # 获取 token
207 | token=$(curl -k -s -G "https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid=${WEWORK_ID}&corpsecret=${WEWORK_SECRET}")
208 | access_token=$(echo ${token} | jq -r ".access_token" 2>&1)
209 |
210 | if [ "${access_token}" ]; then
211 | result_wework_log_text="${TITLE}${log_text}"
212 | push=$(curl -k -s "https://qyapi.weixin.qq.com/cgi-bin/message/send?access_token=${access_token}" \
213 | -H 'Content-Type: application/json' \
214 | -d "{
215 | \"touser\": \"@all\",
216 | \"msgtype\": \"text\",
217 | \"agentid\": \"${WEWORK_AGENT_ID}\",
218 | \"text\": {
219 | \"content\":\"${result_wework_log_text}\"
220 | }
221 | }")
222 | push_code=$(echo ${push} | jq -r ".errcode" 2>&1)
223 | if [ "${push_code}" -eq 0 ]; then
224 | echo -e "企业微信推送结果: 成功"
225 | else
226 | echo -e "企业微信推送结果: 失败"
227 | fi
228 | else
229 | echo -e "企业微信推送结果: 失败 原因: token 获取失败"
230 | fi
231 | fi
232 | }
233 |
234 | #签到
235 | ssp_autochenkin() {
236 | echo -e "${TITLE}"
237 | if [ "${users_array}" ]; then
238 | user_count=1
239 | for user in ${users_array[@]}; do
240 | domain=$(echo ${user} | awk -F'----' '{print $1}')
241 | username=$(echo ${user} | awk -F'----' '{print $2}')
242 | passwd=$(echo ${user} | awk -F'----' '{print $3}')
243 |
244 | # 邮箱、域名脱敏处理
245 | username_prefix="${username%%@*}"
246 | username_suffix="${username#*@}"
247 | username_root="${username_suffix#*.}"
248 | username_text="${username_prefix:0:2}🙈@${username_suffix:0:2}🙈.${username_root}"
249 |
250 | domain_protocol="${domain%%://*}"
251 | domain_context="${domain##*//}"
252 | domain_root="${domain##*.}"
253 | domain_text="${domain_protocol}://${domain_context:0:2}🙈.${domain_root}"
254 |
255 | if [ -z "${domain}" ] || [ -z "${username}" ] || [ -z "${passwd}" ]; then
256 | echo "账号信息配置异常,请检查配置" && exit 1
257 | fi
258 |
259 | login=$(curl "${domain}/auth/login" -d "email=${username}&passwd=${passwd}&code=" -c ${COOKIE_PATH} -L -k -s)
260 |
261 | start_time=$(date '+%Y-%m-%d %H:%M:%S')
262 | login_code=$(echo ${login} | jq -r '.ret' 2>&1)
263 | login_status=$(echo ${login} | jq -r '.msg' 2>&1)
264 |
265 | login_log_text="\n用户 ${user_count}\n"
266 | login_log_text="${login_log_text}签到站点: ${domain_text}\n"
267 | login_log_text="${login_log_text}签到用户: ${username_text}\n"
268 | login_log_text="${login_log_text}签到时间: ${start_time}\n"
269 |
270 | if [ "${login_code}" == "1" ]; then
271 | userinfo=$(curl -k -s -G -b ${COOKIE_PATH} "${domain}/getuserinfo")
272 | user=$(echo ${userinfo} | tr '\r\n' ' ' | jq -r ".info.user" 2>&1)
273 |
274 | if [ "${user}" ]; then
275 | # 用户等级
276 | clasx=$(echo ${user} | jq -r ".class" 2>&1)
277 | # 等级过期时间
278 | class_expire=$(echo ${user} | jq -r ".class_expire" 2>&1)
279 | # 账户过期时间
280 | expire_in=$(echo ${user} | jq -r ".expire_in" 2>&1)
281 | # 上次签到时间
282 | last_check_in_time=$(echo ${user} | jq -r ".last_check_in_time" 2>&1)
283 | # 用户余额
284 | money=$(echo ${user} | jq -r ".money" 2>&1)
285 | # 用户限速
286 | node_speedlimit=$(echo ${user} | jq -r ".node_speedlimit" 2>&1)
287 | # 总流量
288 | transfer_enable=$(echo ${user} | jq -r ".transfer_enable" 2>&1)
289 | # 总共使用流量
290 | last_day_t=$(echo ${user} | jq -r ".last_day_t" 2>&1)
291 | # 剩余流量
292 | transfer_used=$(expr ${transfer_enable} - ${last_day_t})
293 | # 转换 GB
294 | transfer_enable_text=$(echo ${transfer_enable} | awk '{ byte =$1 /1024/1024**2 ; print byte " GB" }')
295 | last_day_t_text=$(echo ${last_day_t} | awk '{ byte =$1 /1024/1024**2 ; print byte " GB" }')
296 | transfer_used_text=$(echo ${transfer_used} | awk '{ byte =$1 /1024/1024**2 ; print byte " GB" }')
297 | # 转换上次签到时间
298 | if [ ${IS_MACOS} -eq 0 ]; then
299 | last_check_in_time_text=$(date -d "1970-01-01 UTC ${last_check_in_time} seconds" "+%F %T")
300 | else
301 | last_check_in_time_text=$(date -r ${last_check_in_time} '+%Y-%m-%d %H:%M:%S')
302 | fi
303 |
304 | user_log_text="\n用户等级: VIP${clasx}\n"
305 | user_log_text="${user_log_text}用户余额: ${money} CNY\n"
306 | user_log_text="${user_log_text}用户限速: ${node_speedlimit} Mbps\n"
307 | user_log_text="${user_log_text}总流量: ${transfer_enable_text}\n"
308 | user_log_text="${user_log_text}剩余流量: ${transfer_used_text}\n"
309 | user_log_text="${user_log_text}已使用流量: ${last_day_t_text}\n"
310 | user_log_text="${user_log_text}等级过期时间: ${class_expire}\n"
311 | user_log_text="${user_log_text}账户过期时间: ${expire_in}\n"
312 | user_log_text="${user_log_text}上次签到时间: ${last_check_in_time_text}"
313 | else
314 | user_log_text=""
315 | fi
316 |
317 | checkin=$(curl -k -s -d "" -b ${COOKIE_PATH} "${domain}/user/checkin")
318 | chechin_code=$(echo ${checkin} | jq -r ".ret" 2>&1)
319 | checkin_status=$(echo ${checkin} | jq -r ".msg" 2>&1)
320 |
321 | if [ "${checkin_status}" ]; then
322 | checkin_log_text="签到状态: ${checkin_status}"
323 | else
324 | checkin_log_text="签到状态: 签到失败, 请检查是否存在签到验证码"
325 | fi
326 |
327 | result_log_text="${login_log_text}${checkin_log_text}${user_log_text}"
328 | else
329 |
330 | result_log_text="${login_log_text}签到状态: 登录失败, 请检查配置"
331 | fi
332 |
333 | if [ ${IS_DISPLAY_CONTEXT} == 1 ]; then
334 | echo -e ${result_log_text}
335 | else
336 | echo -e "\nHidden the logs, please view notify messages."
337 | fi
338 |
339 | log_text="${log_text}\n${result_log_text}"
340 |
341 | user_count=$(expr ${user_count} + 1)
342 | done
343 |
344 | log_text="${log_text}\n\n免费使用自: https://github.com/isecret/sspanel-autocheckin"
345 |
346 | send_message
347 |
348 | rm -rf ${COOKIE_PATH}
349 | rm -rf ${PUSH_TMP_PATH}
350 | else
351 | echo "用户组环境变量未配置" && exit 1
352 | fi
353 | }
354 |
355 | check_sys
356 | check_jq_installed_status
357 | ssp_autochenkin
358 |
--------------------------------------------------------------------------------