├── 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 | ![SSPanel_Auto_Checkin](https://github.com/isecret/sspanel-autocheckin/workflows/SSPanel_Auto_Checkin/badge.svg) 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 | ![Github Action Run Workflow](https://cdn.jsdelivr.net/gh/isecret/sspanel-autocheckin@master/assets/github_actions_run_workflow.png) 220 | 221 | - 进入 **Fork 后的项目**,点击右上角的 star 按钮。 222 | 223 | ![Github Star](https://cdn.jsdelivr.net/gh/isecret/sspanel-autocheckin@master/assets/github_star.png) 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 | | ![GET_TELEGRAMBOT_CHATID](https://cdn.jsdelivr.net/gh/isecret/sspanel-autocheckin@master/assets/GET_TELEGRAMBOT_CHATID.png) | ![GET_TELEGRAMBOT_TOKEN](https://cdn.jsdelivr.net/gh/isecret/sspanel-autocheckin@master/assets/GET_TELEGRAMBOT_TOKEN.png) | 236 | 237 | ### Fork 之后如何同步原作者的更新内容 238 | 239 | 用户可选手动 PR 同步或者使用插件 Pull App 自动同步原作者的更新内容。手动 PR 同步可以参考 [手动 PR 同步教程](https://www.cnblogs.com/hzhhhbb/p/11488861.html)。自动同步需要安装 [![](https://prod.download/pull-18h-svg) Pull app](https://github.com/apps/pull) 插件。使用插件 Pull App 自动同步步骤如下。 240 | 241 | 1. 安装 [![](https://prod.download/pull-18h-svg) 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 | ![Install Pull App](https://cdn.jsdelivr.net/gh/isecret/sspanel-autocheckin@master/assets/install_pull_app.png) 253 | 254 | Pull App 可以指定是否保留自己已经修改的内容,分为下面两种方式,如果你不知道他们的区别,就请选择方式二;如果你知道他们的区别,并且懂得如何解决 git 冲突,可根据需求自由选择任一方式。 255 | 256 | #### 方式一: 保留自己内容 257 | 258 | > 该方式会在上游代码更新后,判断上游更新内容和自己分支代码是否存在冲突,如果有冲突则需要自己手动合并解决(也就是不会直接强制直接覆盖)。如果上游代码更新涉及 `workflow` 里的文件内容改动,这时也需要自己手动合并解决。 259 | 260 | 步骤如下: 261 | 262 | 1. 确认已安装 [![pull](https://prod.download/pull-18h-svg) 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](https://prod.download/pull-18h-svg) 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 | --------------------------------------------------------------------------------