├── Aaron-lv.sh ├── Aaron-lv ├── TS_USER_AGENTS.ts ├── auth.json ├── ckck3.sh ├── config.sample.sh ├── crypto-js.js ├── curtinlv_JD-Script_jd_tool_dl.py ├── disableDuplicateTasksImplement.py ├── doocode.py ├── extra.sh ├── jd │ ├── 1-5.sh │ ├── 6-10.sh │ └── jd_sms_login.py ├── jdCookie.js ├── jd_Evaluation.py ├── jd_OpenCard.py ├── jd_cfd_loop.js ├── jd_cfd_sharecodes.ts ├── jd_cleancartAll.js ├── jd_get_share_code.js ├── jd_jxmc_sharecodes.ts ├── jd_sms_login.py ├── ksjsb_423.js ├── utils │ ├── jd_jxmc.js │ └── jd_jxmcToken.js └── wskey.py ├── Config.json ├── LICENSE ├── MaiARKarm ├── MaiARKx86 ├── README.md ├── adong ├── adong.sh └── env.properties ├── docker.sh ├── feverrun.sh ├── feverrun ├── auth.json ├── authbk.json ├── ckck3.sh ├── config.sample.sh ├── crypto-js.js ├── curtinlv_JD-Script_jd_tool_dl.py ├── disableDuplicateTasksImplement.py ├── doocode.py ├── extra.sh ├── jd │ ├── 1-5.sh │ ├── 6-10.sh │ └── jd_sms_login.py ├── jdCookie.js ├── jd_Evaluation.py ├── jd_OpenCard.py ├── jd_exchangejxbeans.js ├── jd_get_share_code.js ├── jd_sms_login.py ├── ksjsb_NC.js ├── lang.py ├── nginx.conf ├── vip2.sh └── wskey.py ├── image ├── img.js ├── img.png ├── img1.png └── img2.png ├── ip.sh ├── ipip.sh ├── jd_sms_login.py ├── json.sh ├── lang1.sh ├── npm.sh ├── nvjdc.sh ├── pro.sh ├── python3.sh ├── rabbit.sh ├── ssh.sh └── timesync.sh /Aaron-lv.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | # 3 | # 4 | TIME() { 5 | [[ -z "$1" ]] && { 6 | echo -ne " " 7 | } || { 8 | case $1 in 9 | r) export Color="\e[31;1m";; 10 | g) export Color="\e[32;1m";; 11 | b) export Color="\e[34;1m";; 12 | y) export Color="\e[33;1m";; 13 | z) export Color="\e[35;1m";; 14 | l) export Color="\e[36;1m";; 15 | esac 16 | [[ $# -lt 2 ]] && echo -e "\e[36m\e[0m ${1}" || { 17 | echo -e "\e[36m\e[0m ${Color}${2}\e[0m" 18 | } 19 | } 20 | } 21 | if [ "$(grep -c \"token\" /ql/config/auth.json)" = 0 ]; then 22 | echo 23 | TIME r "提示:请先登录青龙面板再执行命令安装任务!" 24 | echo 25 | exit 1 26 | fi 27 | #mkdir -p /run/nginx 28 | #nginx -c /etc/nginx/nginx.conf 29 | 30 | dir_shell=/ql/config 31 | dir_script=/ql/scripts 32 | config_shell_path=$dir_shell/config.sh 33 | extra_shell_path=$dir_shell/extra.sh 34 | code_shell_path=$dir_shell/code.sh 35 | disable_shell_path=$dir_script/disableDuplicateTasksImplement.py 36 | wskey_shell_path=$dir_script/wskey.py 37 | crypto_shell_path=$dir_script/crypto-js.js 38 | wx_jysz_shell_path=$dir_script/wx_jysz.js 39 | ckck3_shell_path=$dir_script/ckck3.sh 40 | OpenCard_shell_path=$dir_script/raw_jd_OpenCard.py 41 | task_before_shell_path=$dir_shell/task_before.sh 42 | sample_shell_path=/ql/sample/config.sample.sh 43 | chmod +x /ql/repo/ghproxy.sh && source /ql/repo/ghproxy.sh 44 | rm -rf /ql/repo/ghproxy.sh 45 | mkdir -p /ql/qlwj 46 | 47 | mkdir -p /ql/scripts/utils 48 | curl -fsSL ${curlurl}/Aaron-lv/utils/jd_jxmc.js > /ql/scripts/utils/jd_jxmc.js 49 | curl -fsSL ${curlurl}/Aaron-lv/utils/jd_jxmcToken.js > /ql/scripts/utils/jd_jxmcToken.js 50 | curl -fsSL ${curlurl}/Aaron-lv/jd_cfd_sharecodes.ts > /ql/scripts/jd_cfd_sharecodes.ts 51 | curl -fsSL ${curlurl}/Aaron-lv/jd_jxmc_sharecodes.ts > /ql/scripts/jd_jxmc_sharecodes.ts 52 | curl -fsSL ${curlurl}/Aaron-lv/TS_USER_AGENTS.ts > /ql/scripts/TS_USER_AGENTS.ts 53 | 54 | TIME l "拉取crypto-js.js" 55 | curl -fsSL ${curlurl}/Aaron-lv/crypto-js.js > /ql/qlwj/crypto-js.js 56 | TIME l "拉取config.sample.sh" 57 | curl -fsSL ${curlurl}/Aaron-lv/config.sample.sh > /ql/qlwj/config.sample.sh 58 | TIME l "拉取extra.sh" 59 | curl -fsSL ${curlurl}/Aaron-lv/extra.sh > /ql/qlwj/extra.sh 60 | TIME l "拉取jd_OpenCard.py" 61 | curl -fsSL ${curlurl}/Aaron-lv/jd_OpenCard.py > /ql/qlwj/raw_jd_OpenCard.py 62 | TIME l "拉取wskey.py" 63 | curl -fsSL ${curlurl}/Aaron-lv/wskey.py > /ql/qlwj/wskey.py 64 | TIME l "拉取disableDuplicateTasksImplement.py" 65 | curl -fsSL ${curlurl}/Aaron-lv/disableDuplicateTasksImplement.py > /ql/qlwj/disableDuplicateTasksImplement.py 66 | TIME l "拉取jd_get_share_code.js" 67 | curl -fsSL ${curlurl}/Aaron-lv/jd_get_share_code.js > /ql/qlwj/jd_get_share_code.js 68 | TIME l "拉取jdCookie.js" 69 | curl -fsSL ${curlurl}/Aaron-lv/jdCookie.js > /ql/qlwj/jdCookie.js 70 | TIME l "拉取jd_cleancartAll.js" 71 | curl -fsSL ${curlurl}/Aaron-lv/jd_cleancartAll.js > /ql/qlwj/jd_cleancartAll.js 72 | TIME l "拉取1-5.sh" 73 | curl -fsSL ${curlurl}/Aaron-lv/jd/1-5.sh > /ql/jd/1-5.sh 74 | TIME l "拉取6-10.sh" 75 | curl -fsSL ${curlurl}/Aaron-lv/jd/6-10.sh > /ql/jd/6-10.sh 76 | TIME l "拉取jd_sms_login.py" 77 | curl -fsSL ${curlurl}/Aaron-lv/jd_sms_login.py > /ql/qlwj/jd_sms_login.py 78 | TIME l "拉取ckck3.sh" 79 | curl -fsSL ${curlurl}/Aaron-lv/ckck3.sh > /ql/qlwj/ckck3.sh 80 | chmod -R +x /ql/qlwj 81 | cp -Rf /ql/qlwj/config.sample.sh /ql/config/config.sh 82 | cp -Rf /ql/qlwj/config.sample.sh /ql/sample/config.sample.sh 83 | cp -Rf /ql/qlwj/extra.sh /ql/config/extra.sh 84 | cp -Rf /ql/qlwj/extra.sh /ql/sample/extra.sample.sh 85 | cp -Rf /ql/qlwj/raw_jd_OpenCard.py /ql/scripts/raw_jd_OpenCard.py 86 | cp -Rf /ql/qlwj/wskey.py /ql/scripts/wskey.py 87 | cp -Rf /ql/qlwj/disableDuplicateTasksImplement.py /ql/scripts/disableDuplicateTasksImplement.py 88 | cp -Rf /ql/qlwj/jd_get_share_code.js /ql/scripts/jd_get_share_code.js 89 | cp -Rf /ql/qlwj/jdCookie.js /ql/scripts/jdCookie.js 90 | cp -Rf /ql/qlwj/jd_cleancartAll.js /ql/scripts/jd_cleancartAll.js 91 | cp -Rf /ql/qlwj/ckck3.sh /ql/scripts/ckck3.sh 92 | cp -Rf /ql/qlwj/jd_sms_login.py /ql/scripts/jd_sms_login.py 93 | echo 94 | # 将 extra.sh 添加到定时任务 95 | if [ "$(grep -c extra /ql/config/crontab.list)" = 0 ]; then 96 | echo 97 | TIME g "添加任务 [每4小时更新任务]" 98 | echo 99 | # 获取token 100 | token=$(cat /ql/config/auth.json | jq --raw-output .token) 101 | curl -s -H 'Accept: application/json' -H "Authorization: Bearer $token" -H 'Content-Type: application/json;charset=UTF-8' -H 'Accept-Language: zh-CN,zh;q=0.9' --data-binary '{"name":"每4小时更新任务","command":"ql extra","schedule":"40 0-23/3 * * *"}' --compressed 'http://127.0.0.1:5700/api/crons?t=1624782068473' 102 | fi 103 | sleep 1 104 | echo 105 | if [ "$(grep -c wskey.py /ql/config/crontab.list)" = 0 ]; then 106 | echo 107 | TIME g "添加任务 [每4小时转换WSKEY]" 108 | echo 109 | # 获取token 110 | token=$(cat /ql/config/auth.json | jq --raw-output .token) 111 | curl -s -H 'Accept: application/json' -H "Authorization: Bearer $token" -H 'Content-Type: application/json;charset=UTF-8' -H 'Accept-Language: zh-CN,zh;q=0.9' --data-binary '{"name":"每4小时转换WSKEY","command":"task wskey.py","schedule":"58 0-23/4 * * *"}' --compressed 'http://127.0.0.1:5700/api/crons?t=1633428022377' 112 | fi 113 | sleep 1 114 | echo 115 | # 将 bot 添加到定时任务 116 | if [ "$(grep -c bot /ql/config/crontab.list)" = 0 ]; then 117 | echo 118 | TIME g "添加任务 [拉取机器人]" 119 | echo 120 | # 获取token 121 | token=$(cat /ql/config/auth.json | jq --raw-output .token) 122 | curl -s -H 'Accept: application/json' -H "Authorization: Bearer $token" -H 'Content-Type: application/json;charset=UTF-8' -H 'Accept-Language: zh-CN,zh;q=0.9' --data-binary '{"name":"拉取机器人","command":"ql bot","schedule":"30 11 * * 6"}' --compressed 'http://127.0.0.1:5700/api/crons?t=1626247933219' 123 | fi 124 | sleep 1 125 | echo 126 | # 将 ckck3.sh 添加到定时任务 127 | if [ "$(grep -c ckck3.sh /ql/config/crontab.list)" = 0 ]; then 128 | echo 129 | TIME g "添加任务 [wskey新转换]" 130 | echo 131 | # 获取token 132 | token=$(cat /ql/config/auth.json | jq --raw-output .token) 133 | curl -s -H 'Accept: application/json' -H "Authorization: Bearer $token" -H 'Content-Type: application/json;charset=UTF-8' -H 'Accept-Language: zh-CN,zh;q=0.9' --data-binary '{"name":"wskey新转换","command":"task ckck3.sh","schedule":"8 8,15,20 * * *"}' --compressed 'http://127.0.0.1:5700/api/crons?t=1634041221437' 134 | fi 135 | sleep 1 136 | echo 137 | # 将 1-5.sh 添加到定时任务 138 | if [ "$(grep -c 1-5.sh /ql/config/crontab.list)" = 0 ]; then 139 | echo 140 | TIME g "添加任务 [1-5.sh]" 141 | echo 142 | # 获取token 143 | token=$(cat /ql/config/auth.json | jq --raw-output .token) 144 | curl -s -H 'Accept: application/json' -H "Authorization: Bearer $token" -H 'Content-Type: application/json;charset=UTF-8' -H 'Accept-Language: zh-CN,zh;q=0.9' --data-binary '{"name":"1-5.sh","command":"task 1-5.sh","schedule":"8 8,15,20 * * *"}' --compressed 'http://127.0.0.1:5700/api/crons?t=1634041221447' 145 | fi 146 | sleep 1 147 | echo 148 | # 将 raw_jd_OpenCard.py 添加到定时任务 149 | if [ "$(grep -c raw_jd_OpenCard.py /ql/config/crontab.list)" = 0 ]; then 150 | echo 151 | TIME g "添加任务 [JD入会开卡领取京豆]" 152 | echo 153 | # 获取token 154 | token=$(cat /ql/config/auth.json | jq --raw-output .token) 155 | curl -s -H 'Accept: application/json' -H "Authorization: Bearer $token" -H 'Content-Type: application/json;charset=UTF-8' -H 'Accept-Language: zh-CN,zh;q=0.9' --data-binary '{"name":"JD入会开卡领取京豆","command":"task raw_jd_OpenCard.py","schedule":"8 8,15,20 * * *"}' --compressed 'http://127.0.0.1:5700/api/crons?t=1634041221437' 156 | fi 157 | sleep 1 158 | echo 159 | # 将 jd_sms_login.py 添加到定时任务 160 | if [ "$(grep -c jd_sms_login.py /ql/config/crontab.list)" = 0 ]; then 161 | echo 162 | TIME g "添加任务 [获取CK脚本]" 163 | echo 164 | # 获取token 165 | token=$(cat /ql/config/auth.json | jq --raw-output .token) 166 | curl -s -H 'Accept: application/json' -H "Authorization: Bearer $token" -H 'Content-Type: application/json;charset=UTF-8' -H 'Accept-Language: zh-CN,zh;q=0.9' --data-binary '{"name":"获取CK脚本","command":"task jd_sms_login.py","schedule":"8 8,15,20 * * *"}' --compressed 'http://127.0.0.1:5700/api/crons?t=1634041221417' 167 | fi 168 | sleep 1 169 | echo 170 | # 将 jd_get_share_code.js 添加到定时任务 171 | if [ "$(grep -c jd_get_share_code.js /ql/config/crontab.list)" = 0 ]; then 172 | echo 173 | TIME g "添加任务 [获取助力码]" 174 | echo 175 | # 获取token 176 | token=$(cat /ql/config/auth.json | jq --raw-output .token) 177 | curl -s -H 'Accept: application/json' -H "Authorization: Bearer $token" -H 'Content-Type: application/json;charset=UTF-8' -H 'Accept-Language: zh-CN,zh;q=0.9' --data-binary '{"name":"获取助力码","command":"task jd_get_share_code.js","schedule":"20 13 * * 6"}' --compressed 'http://127.0.0.1:5700/api/crons?t=1637505495835' 178 | fi 179 | sleep 1 180 | echo 181 | # 将 jd_jxmc_sharecodes.ts 添加到定时任务 182 | if [ "$(grep -c jd_jxmc_sharecodes.ts /ql/config/crontab.list)" = 0 ]; then 183 | echo 184 | TIME g "添加任务 [京喜牧场上车]" 185 | echo 186 | # 获取token 187 | token=$(cat /ql/config/auth.json | jq --raw-output .token) 188 | curl -s -H 'Accept: application/json' -H "Authorization: Bearer $token" -H 'Content-Type: application/json;charset=UTF-8' -H 'Accept-Language: zh-CN,zh;q=0.9' --data-binary '{"name":"京喜牧场上车","command":"task jd_jxmc_sharecodes.ts","schedule":"1 0 * * *"}' --compressed 'http://127.0.0.1:5700/api/crons?t=1639071292827' 189 | fi 190 | sleep 1 191 | echo 192 | # 将 jd_cfd_sharecodes.ts 添加到定时任务 193 | if [ "$(grep -c jd_cfd_sharecodes.ts /ql/config/crontab.list)" = 0 ]; then 194 | echo 195 | TIME g "添加任务 [京喜财富岛上车]" 196 | echo 197 | # 获取token 198 | token=$(cat /ql/config/auth.json | jq --raw-output .token) 199 | curl -s -H 'Accept: application/json' -H "Authorization: Bearer $token" -H 'Content-Type: application/json;charset=UTF-8' -H 'Accept-Language: zh-CN,zh;q=0.9' --data-binary '{"name":"京喜财富岛上车","command":"task jd_cfd_sharecodes.ts","schedule":"2 0 * * *"}' --compressed 'http://127.0.0.1:5700/api/crons?t=1639071050874' 200 | fi 201 | sleep 1 202 | echo 203 | # 将 jd_cleancartAll.js 添加到定时任务 204 | if [ "$(grep -c jd_cleancartAll.js /ql/config/crontab.list)" = 0 ]; then 205 | echo 206 | TIME g "添加任务 [清空购物车]" 207 | echo 208 | # 获取token 209 | token=$(cat /ql/config/auth.json | jq --raw-output .token) 210 | curl -s -H 'Accept: application/json' -H "Authorization: Bearer $token" -H 'Content-Type: application/json;charset=UTF-8' -H 'Accept-Language: zh-CN,zh;q=0.9' --data-binary '{"name":"清空购物车","command":"task jd_cleancartAll.js","schedule":"3 6,12,23 * * *"}' --compressed 'http://127.0.0.1:5700/api/crons?t=1639110553549' 211 | fi 212 | sleep 1 213 | echo 214 | # 将 7天删除日志 添加到定时任务 215 | if [ "$(grep -c jd_cleancartAll.js /ql/config/crontab.list)" = 0 ]; then 216 | echo 217 | TIME g "添加任务 [每隔7天删除日志]" 218 | echo 219 | # 获取token 220 | token=$(cat /ql/config/auth.json | jq --raw-output .token) 221 | curl -s -H 'Accept: application/json' -H "Authorization: Bearer $token" -H 'Content-Type: application/json;charset=UTF-8' -H 'Accept-Language: zh-CN,zh;q=0.9' --data-binary '{"name":"每隔7天删除日志","command":"ql rmlog 7","schedule":"0 2 */7 * *"}' --compressed 'http://127.0.0.1:5700/api/crons?t=1640581005650' 222 | fi 223 | task wskey.py |tee azcg.log 224 | echo 225 | TIME y "拉取zero205和yyds两个脚本(用TG机器人每周提交助力码)" 226 | echo 227 | echo 228 | rm -fr /ql/azcg.log 229 | ql extra |tee azcg.log 230 | TIME y "拉取机器人" 231 | ql bot 232 | if [[ `ls -a |grep -c "成功" /ql/azcg.log` -ge '1' ]]; then 233 | rm -fr /ql/azcg.log 234 | else 235 | TIME r "脚本安装失败,请再次执行一键安装脚本尝试安装,或看看青龙面板有没有[每x小时更新任务],有的话执行这个拉取任务试试" 236 | rm -fr /ql/azcg.log 237 | echo "Error" > /ql/config/Error 238 | fi 239 | exit 0 240 | -------------------------------------------------------------------------------- /Aaron-lv/TS_USER_AGENTS.ts: -------------------------------------------------------------------------------- 1 | import axios from "axios" 2 | import {Md5} from "ts-md5" 3 | import {format} from 'date-fns' 4 | import * as dotenv from "dotenv" 5 | import {existsSync, readFileSync, writeFileSync} from "fs" 6 | 7 | const CryptoJS = require('crypto-js') 8 | dotenv.config() 9 | 10 | let fingerprint: string | number, token: string = '', enCryptMethodJD: any 11 | 12 | const USER_AGENTS: Array = [ 13 | "jdapp;android;10.0.2;10;network/wifi;Mozilla/5.0 (Linux; Android 10; ONEPLUS A5010 Build/QKQ1.191014.012; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/77.0.3865.120 MQQBrowser/6.2 TBS/045230 Mobile Safari/537.36", 14 | "jdapp;iPhone;10.0.2;14.3;network/4g;Mozilla/5.0 (iPhone; CPU iPhone OS 14_3 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148;supportJDSHWK/1", 15 | "jdapp;android;10.0.2;9;network/4g;Mozilla/5.0 (Linux; Android 9; Mi Note 3 Build/PKQ1.181007.001; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/66.0.3359.126 MQQBrowser/6.2 TBS/045131 Mobile Safari/537.36", 16 | "jdapp;android;10.0.2;10;network/wifi;Mozilla/5.0 (Linux; Android 10; GM1910 Build/QKQ1.190716.003; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/77.0.3865.120 MQQBrowser/6.2 TBS/045230 Mobile Safari/537.36", 17 | "jdapp;android;10.0.2;9;network/wifi;Mozilla/5.0 (Linux; Android 9; 16T Build/PKQ1.190616.001; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/66.0.3359.126 MQQBrowser/6.2 TBS/044942 Mobile Safari/537.36", 18 | "jdapp;iPhone;10.0.2;13.6;network/wifi;Mozilla/5.0 (iPhone; CPU iPhone OS 13_6 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148;supportJDSHWK/1", 19 | "jdapp;iPhone;10.0.2;13.6;network/wifi;Mozilla/5.0 (iPhone; CPU iPhone OS 13_6 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148;supportJDSHWK/1", 20 | "jdapp;iPhone;10.0.2;13.5;network/wifi;Mozilla/5.0 (iPhone; CPU iPhone OS 13_5 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148;supportJDSHWK/1", 21 | "jdapp;iPhone;10.0.2;14.1;network/wifi;Mozilla/5.0 (iPhone; CPU iPhone OS 14_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148;supportJDSHWK/1", 22 | "jdapp;iPhone;10.0.2;13.3;network/wifi;Mozilla/5.0 (iPhone; CPU iPhone OS 13_3 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148;supportJDSHWK/1", 23 | "jdapp;iPhone;10.0.2;13.7;network/wifi;Mozilla/5.0 (iPhone; CPU iPhone OS 13_7 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148;supportJDSHWK/1", 24 | "jdapp;iPhone;10.0.2;14.1;network/wifi;Mozilla/5.0 (iPhone; CPU iPhone OS 14_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148;supportJDSHWK/1", 25 | "jdapp;iPhone;10.0.2;13.3;network/wifi;Mozilla/5.0 (iPhone; CPU iPhone OS 13_3 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148;supportJDSHWK/1", 26 | "jdapp;iPhone;10.0.2;13.4;network/wifi;Mozilla/5.0 (iPhone; CPU iPhone OS 13_4 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148;supportJDSHWK/1", 27 | "jdapp;iPhone;10.0.2;14.3;network/wifi;Mozilla/5.0 (iPhone; CPU iPhone OS 14_3 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148;supportJDSHWK/1", 28 | "jdapp;android;10.0.2;9;network/wifi;Mozilla/5.0 (Linux; Android 9; MI 6 Build/PKQ1.190118.001; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/66.0.3359.126 MQQBrowser/6.2 TBS/044942 Mobile Safari/537.36", 29 | "jdapp;android;10.0.2;11;network/wifi;Mozilla/5.0 (Linux; Android 11; Redmi K30 5G Build/RKQ1.200826.002; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/77.0.3865.120 MQQBrowser/6.2 TBS/045511 Mobile Safari/537.36", 30 | "jdapp;iPhone;10.0.2;11.4;network/wifi;Mozilla/5.0 (iPhone; CPU iPhone OS 11_4 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15F79", 31 | "jdapp;android;10.0.2;10;;network/wifi;Mozilla/5.0 (Linux; Android 10; M2006J10C Build/QP1A.190711.020; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/77.0.3865.120 MQQBrowser/6.2 TBS/045230 Mobile Safari/537.36", 32 | "jdapp;android;10.0.2;10;network/wifi;Mozilla/5.0 (Linux; Android 10; M2006J10C Build/QP1A.190711.020; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/77.0.3865.120 MQQBrowser/6.2 TBS/045230 Mobile Safari/537.36", 33 | "jdapp;android;10.0.2;10;network/wifi;Mozilla/5.0 (Linux; Android 10; ONEPLUS A6000 Build/QKQ1.190716.003; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/77.0.3865.120 MQQBrowser/6.2 TBS/045224 Mobile Safari/537.36", 34 | "jdapp;android;10.0.2;9;network/wifi;Mozilla/5.0 (Linux; Android 9; MHA-AL00 Build/HUAWEIMHA-AL00; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/66.0.3359.126 MQQBrowser/6.2 TBS/044942 Mobile Safari/537.36", 35 | "jdapp;android;10.0.2;8.1.0;network/wifi;Mozilla/5.0 (Linux; Android 8.1.0; 16 X Build/OPM1.171019.026; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/66.0.3359.126 MQQBrowser/6.2 TBS/044942 Mobile Safari/537.36", 36 | "jdapp;android;10.0.2;8.0.0;network/wifi;Mozilla/5.0 (Linux; Android 8.0.0; HTC U-3w Build/OPR6.170623.013; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/66.0.3359.126 MQQBrowser/6.2 TBS/044942 Mobile Safari/537.36", 37 | "jdapp;iPhone;10.0.2;14.0.1;network/wifi;Mozilla/5.0 (iPhone; CPU iPhone OS 14_0_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148;supportJDSHWK/1", 38 | "jdapp;android;10.0.2;10;network/wifi;Mozilla/5.0 (Linux; Android 10; LYA-AL00 Build/HUAWEILYA-AL00L; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/77.0.3865.120 MQQBrowser/6.2 TBS/045230 Mobile Safari/537.36", 39 | "jdapp;iPhone;10.0.2;14.2;network/wifi;Mozilla/5.0 (iPhone; CPU iPhone OS 14_2 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148;supportJDSHWK/1", 40 | "jdapp;iPhone;10.0.2;14.3;network/wifi;Mozilla/5.0 (iPhone; CPU iPhone OS 14_3 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148;supportJDSHWK/1", 41 | "jdapp;iPhone;10.0.2;14.2;network/wifi;Mozilla/5.0 (iPhone; CPU iPhone OS 14_2 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148;supportJDSHWK/1", 42 | "jdapp;android;10.0.2;8.1.0;network/wifi;Mozilla/5.0 (Linux; Android 8.1.0; MI 8 Build/OPM1.171019.026; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/66.0.3359.126 MQQBrowser/6.2 TBS/045131 Mobile Safari/537.36", 43 | "jdapp;android;10.0.2;10;network/wifi;Mozilla/5.0 (Linux; Android 10; Redmi K20 Pro Premium Edition Build/QKQ1.190825.002; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/77.0.3865.120 MQQBrowser/6.2 TBS/045227 Mobile Safari/537.36", 44 | "jdapp;iPhone;10.0.2;14.3;network/wifi;Mozilla/5.0 (iPhone; CPU iPhone OS 14_3 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148;supportJDSHWK/1", 45 | "jdapp;iPhone;10.0.2;14.3;network/4g;Mozilla/5.0 (iPhone; CPU iPhone OS 14_3 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148;supportJDSHWK/1", 46 | "jdapp;android;10.0.2;11;network/wifi;Mozilla/5.0 (Linux; Android 11; Redmi K20 Pro Premium Edition Build/RKQ1.200826.002; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/77.0.3865.120 MQQBrowser/6.2 TBS/045513 Mobile Safari/537.36", 47 | "jdapp;android;10.0.2;10;network/wifi;Mozilla/5.0 (Linux; Android 10; MI 8 Build/QKQ1.190828.002; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/77.0.3865.120 MQQBrowser/6.2 TBS/045227 Mobile Safari/537.36", 48 | "jdapp;iPhone;10.0.2;14.1;network/wifi;Mozilla/5.0 (iPhone; CPU iPhone OS 14_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148;supportJDSHWK/1", 49 | ] 50 | 51 | function TotalBean(cookie: string) { 52 | return { 53 | cookie: cookie, 54 | isLogin: true, 55 | nickName: '' 56 | } 57 | } 58 | 59 | function getRandomNumberByRange(start: number, end: number) { 60 | return Math.floor(Math.random() * (end - start) + start) 61 | } 62 | 63 | let USER_AGENT = USER_AGENTS[getRandomNumberByRange(0, USER_AGENTS.length)] 64 | 65 | async function getBeanShareCode(cookie: string) { 66 | let {data}: any = await axios.post('https://api.m.jd.com/client.action', 67 | `functionId=plantBeanIndex&body=${escape( 68 | JSON.stringify({version: "9.0.0.1", "monitor_source": "plant_app_plant_index", "monitor_refer": ""}) 69 | )}&appid=ld&client=apple&area=5_274_49707_49973&build=167283&clientVersion=9.1.0`, { 70 | headers: { 71 | Cookie: cookie, 72 | Host: "api.m.jd.com", 73 | Accept: "*/*", 74 | Connection: "keep-alive", 75 | "User-Agent": USER_AGENT 76 | } 77 | }) 78 | if (data.data?.jwordShareInfo?.shareUrl) 79 | return data.data.jwordShareInfo.shareUrl.split('Uuid=')![1] 80 | else 81 | return '' 82 | } 83 | 84 | async function getFarmShareCode(cookie: string) { 85 | let {data}: any = await axios.post('https://api.m.jd.com/client.action?functionId=initForFarm', `body=${escape(JSON.stringify({"version": 4}))}&appid=wh5&clientVersion=9.1.0`, { 86 | headers: { 87 | "cookie": cookie, 88 | "origin": "https://home.m.jd.com", 89 | "referer": "https://home.m.jd.com/myJd/newhome.action", 90 | "User-Agent": USER_AGENT, 91 | "Content-Type": "application/x-www-form-urlencoded" 92 | } 93 | }) 94 | 95 | if (data.farmUserPro) 96 | return data.farmUserPro.shareCode 97 | else 98 | return '' 99 | } 100 | 101 | async function requireConfig(index: number = -1) { 102 | let cookiesArr: string[] = [] 103 | const jdCookieNode = require('./jdCookie.js') 104 | Object.keys(jdCookieNode).forEach((item) => { 105 | if (jdCookieNode[item]) { 106 | cookiesArr.push(jdCookieNode[item]) 107 | } 108 | }) 109 | console.log(`共${cookiesArr.length}个京东账号\n`) 110 | if (index != -1) { 111 | return [cookiesArr[index]] 112 | } else { 113 | return cookiesArr 114 | } 115 | } 116 | 117 | function wait(timeout: number) { 118 | return new Promise(resolve => { 119 | setTimeout(resolve, timeout) 120 | }) 121 | } 122 | 123 | async function requestAlgo(appId: number | string = 10032) { 124 | fingerprint = generateFp() 125 | return new Promise(async resolve => { 126 | let {data}: any = await axios.post('https://cactus.jd.com/request_algo?g_ty=ajax', { 127 | "version": "1.0", 128 | "fp": fingerprint, 129 | "appId": appId, 130 | "timestamp": Date.now(), 131 | "platform": "web", 132 | "expandParams": "" 133 | }, { 134 | "headers": { 135 | 'Authority': 'cactus.jd.com', 136 | 'Pragma': 'no-cache', 137 | 'Cache-Control': 'no-cache', 138 | 'Accept': 'application/json', 139 | 'User-Agent': USER_AGENT, 140 | 'Content-Type': 'application/json', 141 | 'Origin': 'https://st.jingxi.com', 142 | 'Sec-Fetch-Site': 'cross-site', 143 | 'Sec-Fetch-Mode': 'cors', 144 | 'Sec-Fetch-Dest': 'empty', 145 | 'Referer': 'https://st.jingxi.com/', 146 | 'Accept-Language': 'zh-CN,zh;q=0.9,zh-TW;q=0.8,en;q=0.7' 147 | }, 148 | }) 149 | if (data['status'] === 200) { 150 | token = data.data.result.tk 151 | console.log('token:', token) 152 | let enCryptMethodJDString = data.data.result.algo 153 | if (enCryptMethodJDString) enCryptMethodJD = new Function(`return ${enCryptMethodJDString}`)() 154 | } else { 155 | console.log(`fp: ${fingerprint}`) 156 | console.log('request_algo 签名参数API请求失败:') 157 | } 158 | resolve() 159 | }) 160 | } 161 | 162 | function generateFp() { 163 | let e = "0123456789" 164 | let a = 13 165 | let i = '' 166 | for (; a--;) 167 | i += e[Math.random() * e.length | 0] 168 | return (i + Date.now()).slice(0, 16) 169 | } 170 | 171 | function getQueryString(url: string, name: string) { 172 | let reg = new RegExp("(^|&)" + name + "=([^&]*)(&|$)", "i") 173 | let r = url.split('?')[1].match(reg) 174 | if (r != null) return unescape(r[2]) 175 | return '' 176 | } 177 | 178 | function decrypt(stk: string, url: string, appId: number) { 179 | const timestamp = (format(new Date(), 'yyyyMMddhhmmssSSS')) 180 | let hash1: string 181 | if (fingerprint && token && enCryptMethodJD) { 182 | hash1 = enCryptMethodJD(token, fingerprint.toString(), timestamp.toString(), appId.toString(), CryptoJS).toString(CryptoJS.enc.Hex) 183 | } else { 184 | const random = '5gkjB6SpmC9s' 185 | token = `tk01wcdf61cb3a8nYUtHcmhSUFFCfddDPRvKvYaMjHkxo6Aj7dhzO+GXGFa9nPXfcgT+mULoF1b1YIS1ghvSlbwhE0Xc` 186 | fingerprint = 9686767825751161 187 | const str = `${token}${fingerprint}${timestamp}${appId}${random}` 188 | hash1 = CryptoJS.SHA512(str, token).toString(CryptoJS.enc.Hex) 189 | } 190 | let st: string = '' 191 | stk.split(',').map((item, index) => { 192 | st += `${item}:${getQueryString(url, item)}${index === stk.split(',').length - 1 ? '' : '&'}` 193 | }) 194 | const hash2 = CryptoJS.HmacSHA256(st, hash1.toString()).toString(CryptoJS.enc.Hex) 195 | return encodeURIComponent(["".concat(timestamp.toString()), "".concat(fingerprint.toString()), "".concat(appId.toString()), "".concat(token), "".concat(hash2)].join(";")) 196 | } 197 | 198 | function h5st(url: string, stk: string, params: object, appId: number = 10032) { 199 | for (const [key, val] of Object.entries(params)) { 200 | url += `&${key}=${val}` 201 | } 202 | url += '&h5st=' + decrypt(stk, url, appId) 203 | return url 204 | } 205 | 206 | function getJxToken(cookie: string) { 207 | function generateStr(input: number) { 208 | let src = 'abcdefghijklmnopqrstuvwxyz1234567890' 209 | let res = '' 210 | for (let i = 0; i < input; i++) { 211 | res += src[Math.floor(src.length * Math.random())] 212 | } 213 | return res 214 | } 215 | 216 | let phoneId = generateStr(40) 217 | let timestamp = Date.now().toString() 218 | let nickname = cookie.match(/pt_pin=([^;]*)/)![1] 219 | let jstoken = Md5.hashStr('' + decodeURIComponent(nickname) + timestamp + phoneId + 'tPOamqCuk9NLgVPAljUyIHcPRmKlVxDy') 220 | return { 221 | 'strPgtimestamp': timestamp, 222 | 'strPhoneID': phoneId, 223 | 'strPgUUNum': jstoken 224 | } 225 | } 226 | 227 | function exceptCookie(filename: string = 'x.ts') { 228 | let except: any = [] 229 | if (existsSync('./utils/exceptCookie.json')) { 230 | try { 231 | except = JSON.parse(readFileSync('./utils/exceptCookie.json').toString() || '{}')[filename] || [] 232 | } catch (e) { 233 | console.log('./utils/exceptCookie.json JSON格式错误') 234 | } 235 | } 236 | return except 237 | } 238 | 239 | function randomString(e: number, word?: number) { 240 | e = e || 32 241 | let t = word === 26 ? "012345678abcdefghijklmnopqrstuvwxyz" : "0123456789abcdef", a = t.length, n = "" 242 | for (let i = 0; i < e; i++) 243 | n += t.charAt(Math.floor(Math.random() * a)) 244 | return n 245 | } 246 | 247 | function resetHosts() { 248 | try { 249 | writeFileSync('/etc/hosts', '') 250 | } catch (e) { 251 | } 252 | } 253 | 254 | function o2s(arr: object) { 255 | console.log(JSON.stringify(arr)) 256 | } 257 | 258 | function randomNumString(e: number) { 259 | e = e || 32 260 | let t = '0123456789', a = t.length, n = "" 261 | for (let i = 0; i < e; i++) 262 | n += t.charAt(Math.floor(Math.random() * a)) 263 | return n 264 | } 265 | 266 | async function getshareCodeHW(key: string) { 267 | let shareCodeHW: string[] = [] 268 | for (let i = 0; i < 5; i++) { 269 | try { 270 | let {data}: any = await axios.get('https://api.jdsharecode.xyz/api/HW_CODES') 271 | shareCodeHW = data[key] || [] 272 | if (shareCodeHW.length !== 0) { 273 | break 274 | } 275 | } catch (e) { 276 | console.log("getshareCodeHW Error, Retry...") 277 | await wait(getRandomNumberByRange(2000, 6000)) 278 | } 279 | } 280 | return shareCodeHW 281 | } 282 | 283 | async function getShareCodePool(key: string, num: number) { 284 | let shareCode: string[] = [] 285 | for (let i = 0; i < 2; i++) { 286 | try { 287 | let {data}: any = await axios.get(`https://api.jdsharecode.xyz/api/${key}/${num}`) 288 | shareCode = data.data || [] 289 | console.log(`随机获取${num}个${key}成功:${JSON.stringify(shareCode)}`) 290 | if (shareCode.length !== 0) { 291 | break 292 | } 293 | } catch (e) { 294 | console.log("getShareCodePool Error, Retry...") 295 | await wait(getRandomNumberByRange(2000, 6000)) 296 | } 297 | } 298 | return shareCode 299 | } 300 | 301 | export default USER_AGENT 302 | export { 303 | TotalBean, 304 | getBeanShareCode, 305 | getFarmShareCode, 306 | requireConfig, 307 | wait, 308 | getRandomNumberByRange, 309 | requestAlgo, 310 | decrypt, 311 | getJxToken, 312 | h5st, 313 | exceptCookie, 314 | randomString, 315 | resetHosts, 316 | o2s, 317 | randomNumString, 318 | getshareCodeHW, 319 | getShareCodePool 320 | } 321 | -------------------------------------------------------------------------------- /Aaron-lv/auth.json: -------------------------------------------------------------------------------- 1 | {"username":"admin","password":"admin"} 2 | -------------------------------------------------------------------------------- /Aaron-lv/curtinlv_JD-Script_jd_tool_dl.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python3 2 | # -*- coding: utf-8 -* 3 | ''' 4 | Author: Curtin 5 | 功能:脚本依赖下载 6 | TG交流 https://t.me/topstyle996 7 | TG频道 https://t.me/TopStyle2021 8 | cron: 0 5 * * * 9 | new Env('脚本依赖下载 for Curtinlv 仓库'); 10 | ''' 11 | 12 | try: 13 | import requests 14 | except Exception as e: 15 | print(e, "\n缺少requests 模块,请执行命令安装:pip3 install requests") 16 | exit(3) 17 | import os 18 | def getTool(toolName, a=0): 19 | if a == 0: 20 | a += 1 21 | try: 22 | url = 'https://ghproxy.com/https://raw.githubusercontent.com/curtinlv/JD-Script/main/' + toolName 23 | response = requests.get(url) 24 | if response.status_code == 404: 25 | print(f"[{toolName}] 下载连接有误!") 26 | print(f"下载失败:[{toolName}]") 27 | return 28 | if 'urtinlv' in response.text: 29 | with open(toolName, "w+", encoding="utf-8") as f: 30 | f.write(response.text) 31 | print(f"已添加依赖:{toolName}") 32 | else: 33 | if a < 5: 34 | a += 1 35 | return getTool(toolName, a) 36 | else: 37 | print(f"下载失败:{toolName}") 38 | except: 39 | if a < 5: 40 | a += 1 41 | return getTool(toolName, a) 42 | else: 43 | print(f"下载失败:{toolName}") 44 | 45 | if __name__ == '__main__': 46 | file_name = ['jd_cookie.py', 'msg.py', 'sendNotify.py'] 47 | for f in file_name: 48 | if os.path.exists(f): 49 | os.remove(f) 50 | print(f"开始下载依赖:{f}") 51 | getTool(f) 52 | 53 | -------------------------------------------------------------------------------- /Aaron-lv/disableDuplicateTasksImplement.py: -------------------------------------------------------------------------------- 1 | # -*- coding:utf-8 -*- 2 | # 环境变量 3 | #1️⃣RES_SUB 4 | #2️⃣RES_ONLY 5 | #说明 6 | #1️⃣需保留的脚本前缀列表(不管是否重复),用 & 分割,默认保留 shufflewzc_faker2&JDHelloWorld_jd_scripts 7 | #2️⃣保留后是否禁用重复的带其他前缀脚本,默认禁用 8 | 9 | #示例 10 | #1️⃣Aaron-lv_sync&smiek2121_scripts 11 | #2️⃣true 或 false 12 | """ 13 | cron: 20 10 */7 * * 14 | new Env('禁用重复任务'); 15 | """ 16 | 17 | import json 18 | import logging 19 | import os 20 | import sys 21 | import time 22 | import traceback 23 | 24 | import requests 25 | 26 | logger = logging.getLogger(name=None) # 创建一个日志对象 27 | logging.Formatter("%(message)s") # 日志内容格式化 28 | logger.setLevel(logging.INFO) # 设置日志等级 29 | logger.addHandler(logging.StreamHandler()) # 添加控制台日志 30 | # logger.addHandler(logging.FileHandler(filename="text.log", mode="w")) # 添加文件日志 31 | 32 | 33 | ip = "localhost" 34 | sub_str = os.getenv("RES_SUB", "shidahuilang_f2&JDHelloWorld_jd_scripts") 35 | sub_list = sub_str.split("&") 36 | res_only = os.getenv("RES_ONLY", True) 37 | headers = { 38 | "Accept": "application/json", 39 | "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.131 Safari/537.36", 40 | } 41 | 42 | 43 | def load_send() -> None: 44 | logger.info("加载推送功能中...") 45 | global send 46 | send = None 47 | cur_path = os.path.abspath(os.path.dirname(__file__)) 48 | sys.path.append(cur_path) 49 | if os.path.exists(cur_path + "/notify.py"): 50 | try: 51 | from notify import send 52 | except Exception: 53 | send = None 54 | logger.info(f"❌加载通知服务失败!!!\n{traceback.format_exc()}") 55 | 56 | 57 | def get_tasklist() -> list: 58 | tasklist = [] 59 | t = round(time.time() * 1000) 60 | url = f"http://{ip}:5700/api/crons?searchValue=&t={t}" 61 | response = requests.get(url=url, headers=headers) 62 | datas = json.loads(response.content.decode("utf-8")) 63 | if datas.get("code") == 200: 64 | tasklist = datas.get("data") 65 | return tasklist 66 | 67 | 68 | def filter_res_sub(tasklist: list) -> tuple: 69 | filter_list = [] 70 | res_list = [] 71 | for task in tasklist: 72 | for sub in sub_list: 73 | if task.get("command").find(sub) == -1: 74 | flag = False 75 | else: 76 | flag = True 77 | break 78 | if flag: 79 | res_list.append(task) 80 | else: 81 | filter_list.append(task) 82 | return filter_list, res_list 83 | 84 | 85 | def get_index(lst: list, item: str) -> list: 86 | return [index for (index, value) in enumerate(lst) if value == item] 87 | 88 | 89 | def get_duplicate_list(tasklist: list) -> tuple: 90 | logger.info("\n=== 第一轮初筛开始 ===") 91 | 92 | ids = [] 93 | names = [] 94 | cmds = [] 95 | for task in tasklist: 96 | ids.append(task.get("_id")) 97 | names.append(task.get("name")) 98 | cmds.append(task.get("command")) 99 | 100 | name_list = [] 101 | for i, name in enumerate(names): 102 | if name not in name_list: 103 | name_list.append(name) 104 | 105 | tem_tasks = [] 106 | tem_ids = [] 107 | dup_ids = [] 108 | for name2 in name_list: 109 | name_index = get_index(names, name2) 110 | for i in range(len(name_index)): 111 | if i == 0: 112 | logger.info(f"【✅保留】{cmds[name_index[0]]}") 113 | tem_tasks.append(tasklist[name_index[0]]) 114 | tem_ids.append(ids[name_index[0]]) 115 | else: 116 | logger.info(f"【🚫禁用】{cmds[name_index[i]]}") 117 | dup_ids.append(ids[name_index[i]]) 118 | logger.info("") 119 | 120 | logger.info("=== 第一轮初筛结束 ===") 121 | 122 | return tem_ids, tem_tasks, dup_ids 123 | 124 | 125 | def reserve_task_only( 126 | tem_ids: list, tem_tasks: list, dup_ids: list, res_list: list 127 | ) -> list: 128 | if len(tem_ids) == 0: 129 | return tem_ids 130 | 131 | logger.info("\n=== 最终筛选开始 ===") 132 | task3 = None 133 | for task1 in tem_tasks: 134 | for task2 in res_list: 135 | if task1.get("name") == task2.get("name"): 136 | dup_ids.append(task1.get("_id")) 137 | logger.info(f"【✅保留】{task2.get('command')}") 138 | task3 = task1 139 | if task3: 140 | logger.info(f"【🚫禁用】{task3.get('command')}\n") 141 | task3 = None 142 | logger.info("=== 最终筛选结束 ===") 143 | return dup_ids 144 | 145 | 146 | def disable_duplicate_tasks(ids: list) -> None: 147 | t = round(time.time() * 1000) 148 | url = f"http://{ip}:5700/api/crons/disable?t={t}" 149 | data = json.dumps(ids) 150 | headers["Content-Type"] = "application/json;charset=UTF-8" 151 | response = requests.put(url=url, headers=headers, data=data) 152 | datas = json.loads(response.content.decode("utf-8")) 153 | if datas.get("code") != 200: 154 | logger.info(f"❌出错!!!错误信息为:{datas}") 155 | else: 156 | logger.info("🎉成功禁用重复任务~") 157 | 158 | 159 | def get_token() -> str or None: 160 | try: 161 | with open("/ql/config/auth.json", "r", encoding="utf-8") as f: 162 | data = json.load(f) 163 | except Exception: 164 | logger.info(f"❌无法获取 token!!!\n{traceback.format_exc()}") 165 | send("💔禁用重复任务失败", "无法获取 token!!!") 166 | exit(1) 167 | return data.get("token") 168 | 169 | 170 | if __name__ == "__main__": 171 | logger.info("===> 禁用重复任务开始 <===") 172 | load_send() 173 | token = get_token() 174 | headers["Authorization"] = f"Bearer {token}" 175 | 176 | # 获取过滤后的任务列表 177 | sub_str = "\n".join(sub_list) 178 | logger.info(f"\n=== 你选择过滤的任务前缀为 ===\n{sub_str}") 179 | tasklist = get_tasklist() 180 | if len(tasklist) == 0: 181 | logger.info("❌无法获取 tasklist!!!") 182 | exit(1) 183 | filter_list, res_list = filter_res_sub(tasklist) 184 | 185 | tem_ids, tem_tasks, dup_ids = get_duplicate_list(filter_list) 186 | # 是否在重复任务中只保留设置的前缀 187 | if res_only: 188 | ids = reserve_task_only(tem_ids, tem_tasks, dup_ids, res_list) 189 | else: 190 | ids = dup_ids 191 | logger.info("你选择保留除了设置的前缀以外的其他任务") 192 | 193 | sum = f"所有任务数量为:{len(tasklist)}" 194 | filter = f"过滤的任务数量为:{len(res_list)}" 195 | disable = f"禁用的任务数量为:{len(ids)}" 196 | logging.info("\n=== 禁用数量统计 ===\n" + sum + "\n" + filter + "\n" + disable) 197 | 198 | if len(ids) == 0: 199 | logger.info("😁没有重复任务~") 200 | else: 201 | disable_duplicate_tasks(ids) 202 | if send: 203 | send("💖禁用重复任务成功", f"\n{sum}\n{filter}\n{disable}") 204 | -------------------------------------------------------------------------------- /Aaron-lv/doocode.py: -------------------------------------------------------------------------------- 1 | #调度配置 0,1 0 * * 1 python3 /ql/config/doocode.py 2 | from telethon import TelegramClient 3 | import os 4 | 5 | 6 | current_path = os.path.dirname(os.path.abspath(__file__)) 7 | os.chdir(current_path) 8 | client = TelegramClient("bot", "你的APIID", "你的IP秘钥", connection_retries=None).start() 9 | 10 | async def main(): 11 | await client.send_message("@JDShareCodebot", "要发送的互助码命令") 12 | await client.send_message("@JDShareCodebot", "要发送的互助码命令") 13 | await client.send_message("@JDShareCodebot", "要发送的互助码命令") 14 | await client.send_message("@JDShareCodebot", "要发送的互助码命令") 15 | await client.send_message("@JDShareCodebot", "要发送的互助码命令") 16 | await client.send_message("@JDShareCodebot", "要发送的互助码命令") 17 | await client.send_message("@JDShareCodebot", "要发送的互助码命令") 18 | await client.send_read_acknowledge("@JDShareCodebot") 19 | 20 | 21 | with client: 22 | client.loop.run_until_complete(main()) 23 | -------------------------------------------------------------------------------- /Aaron-lv/extra.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | 3 | ## 添加你需要重启自动执行的任意命令,比如 ql repo 4 | ## 安装node依赖使用 pnpm install -g xxx xxx 5 | ## 安装python依赖使用 pip3 install xxx 6 | 7 | ql repo https://github.com/smiek2121/scripts.git "jd_|gua_" "" "ZooFaker_Necklace.js|JDJRValidator_Pure.js|sign_graphics_validate.js|cleancart_activity.js|jdCookie.js|sendNotify.js" 8 | ql repo https://github.com/shufflewzc/faker3.git "jd_|jx_|gua_|jddj_|jdCookie" "activity|backUp" "^jd[^_]|USER|function|utils|sendNotify|ZooFaker_Necklace.js|JDJRValidator_|sign_graphics_validate|ql|JDSignValidator|magic|depend|h5sts" "main" 9 | 10 | -------------------------------------------------------------------------------- /Aaron-lv/jd/1-5.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | 3 | # 需要修改的变量,把1-5改成6-10就是提取6-10帐号的助力码,类推,11-15、16-20,一个文件5个助力码,一个TG号 4 | # API提取网站< https://my.telegram.org/auth >,没有API的ID跟密匙的就别修改 api_id 跟 api_hash 的说明内容,有就填写正确的ID跟密匙 5 | 6 | export TG="1-5" 7 | export api_id="填写您Telegram的API的ID" 8 | export api_hash="填写您Telegram的API的密匙" 9 | 10 | export RWWJ="${TG}rw.sh" 11 | export CRON="$(date +163764742%M%S)" 12 | export CRON1="$(date +163764761%M%S)" 13 | export CRON2="$(date +%M)" 14 | export token=$(cat /ql/config/auth.json | jq --raw-output .token) 15 | [[ -d '/ql/log/jd_get_share_code' ]] && rm -rf /ql/log/jd_get_share_code/* 16 | if [[ ! "${api_id}" == "填写您Telegram的API的ID" ]] && [[ ! "${api_hash}" == "填写您Telegram的API的密匙" ]]; then 17 | task jd_get_share_code.js desi JD_COOKIE "${TG}" 18 | lOGName="$(ls -a /ql/log/jd_get_share_code |egrep -o [0-9]+-[0-9]+-[0-9]+-[0-9]+-[0-9]+-[0-9]+.log |awk 'END {print}')" 19 | FARM="$(grep '/farm' /ql/log/jd_get_share_code/${lOGName})" 20 | PET="$(grep '/pet' /ql/log/jd_get_share_code/${lOGName})" 21 | BEAN="$(grep '/bean' /ql/log/jd_get_share_code/${lOGName})" 22 | JXFACTORY="$(grep '/jxfactory' /ql/log/jd_get_share_code/${lOGName})" 23 | SGMH="$(grep '/sgmh' /ql/log/jd_get_share_code/${lOGName})" 24 | HEALTH="$(grep '/health' /ql/log/jd_get_share_code/${lOGName})" 25 | cat >/ql/jd/${TG}.py <<-EOF 26 | #调度配置 0,1 0 * * 1 python3 /ql/jd/${TG}.py 27 | from telethon import TelegramClient 28 | import os 29 | current_path = os.path.dirname(os.path.abspath(__file__)) 30 | os.chdir(current_path) 31 | client = TelegramClient("bot${TG}", "${api_id}", "${api_hash}", connection_retries=None).start() 32 | async def main(): 33 | await client.send_message("@chriszhuli_bot", "${FARM}") 34 | await client.send_message("@chriszhuli_bot", "${PET}") 35 | await client.send_message("@chriszhuli_bot", "${BEAN}") 36 | await client.send_message("@chriszhuli_bot", "${JXFACTORY}") 37 | await client.send_message("@chriszhuli_bot", "${SGMH}") 38 | await client.send_message("@chriszhuli_bot", "${HEALTH}") 39 | await client.send_read_acknowledge("@chriszhuli_bot") 40 | with client: 41 | client.loop.run_until_complete(main()) 42 | EOF 43 | 44 | cat >/ql/jd/${TG}-2.py <<-EOF 45 | #调度配置 0,1 21 * * 6 python3 /ql/jd/${TG}-2.py 46 | from telethon import TelegramClient 47 | import os 48 | current_path = os.path.dirname(os.path.abspath(__file__)) 49 | os.chdir(current_path) 50 | client = TelegramClient("bot${TG}", "${api_id}", "${api_hash}", connection_retries=None).start() 51 | async def main(): 52 | await client.send_message("@JD_ShareCode_Bot", "${FARM}") 53 | await client.send_message("@JD_ShareCode_Bot", "${PET}") 54 | await client.send_message("@JD_ShareCode_Bot", "${BEAN}") 55 | await client.send_message("@JD_ShareCode_Bot", "${JXFACTORY}") 56 | await client.send_message("@JD_ShareCode_Bot", "${SGMH}") 57 | await client.send_message("@JD_ShareCode_Bot", "${HEALTH}") 58 | await client.send_read_acknowledge("@JD_ShareCode_Bot") 59 | with client: 60 | client.loop.run_until_complete(main()) 61 | EOF 62 | cat >/ql/jd/"${RWWJ}" <<-EOF 63 | #!/usr/bin/env bash 64 | if [ "$(grep -c ${TG}.py /ql/config/crontab.list)" = 0 ]; then 65 | echo 66 | echo "添加任务 [自动提交助力码${TG}]" 67 | echo 68 | curl -s -H 'Accept: application/json' -H "Authorization: Bearer ${token}" -H 'Content-Type: application/json;charset=UTF-8' -H 'Accept-Language: zh-CN,zh;q=0.9' --data-binary '{"name":"自动提交助力码${TG}","command":"python3 /ql/jd/${TG}.py","schedule":"1 0,8 * * 1"}' --compressed 'http://127.0.0.1:5700/api/crons?t=${CRON}' 69 | fi 70 | sleep 2 71 | if [ "$(grep -c ${TG}-2.py /ql/config/crontab.list)" = 0 ]; then 72 | echo 73 | echo "添加任务 [自动提交助力码${TG}-2]" 74 | echo 75 | curl -s -H 'Accept: application/json' -H "Authorization: Bearer ${token}" -H 'Content-Type: application/json;charset=UTF-8' -H 'Accept-Language: zh-CN,zh;q=0.9' --data-binary '{"name":"自动提交助力码${TG}-2","command":"python3 /ql/jd/${TG}-2.py","schedule":"0,1 21 * * 6"}' --compressed 'http://127.0.0.1:5700/api/crons?t=${CRON}' 76 | fi 77 | sleep 2 78 | echo 79 | if [ "$(grep -c ${TG}.sh /ql/config/crontab.list)" = 0 ]; then 80 | echo 81 | echo "添加任务 [获取互助码${TG}]" 82 | echo 83 | curl -s -H 'Accept: application/json' -H "Authorization: Bearer ${token}" -H 'Content-Type: application/json;charset=UTF-8' -H 'Accept-Language: zh-CN,zh;q=0.9' --data-binary '{"name":"获取互助码${TG}","command":"task /ql/jd/${TG}.sh","schedule":"${CRON2} 13 * * 6"}' --compressed 'http://127.0.0.1:5700/api/crons?t=${CRON1}' 84 | fi 85 | EOF 86 | task /ql/jd/"${RWWJ}" 87 | rm -rf /ql/jd/"${RWWJ}" 88 | fi 89 | -------------------------------------------------------------------------------- /Aaron-lv/jd/6-10.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | 3 | # 需要修改的变量,把1-5改成6-10就是提取6-10帐号的助力码,类推,11-15、16-20,一个文件5个助力码,一个TG号 4 | # API提取网站< https://my.telegram.org/auth >,没有API的ID跟密匙的就别修改 api_id 跟 api_hash 的说明内容,有就填写正确的ID跟密匙 5 | 6 | export TG="6-10" 7 | export api_id="填写您Telegram的API的ID" 8 | export api_hash="填写您Telegram的API的密匙" 9 | 10 | export RWWJ="${TG}rw.sh" 11 | export CRON="$(date +163764742%M%S)" 12 | export CRON1="$(date +163764761%M%S)" 13 | export CRON2="$(date +%M)" 14 | export token=$(cat /ql/config/auth.json | jq --raw-output .token) 15 | [[ -d '/ql/log/jd_get_share_code' ]] && rm -rf /ql/log/jd_get_share_code/* 16 | if [[ ! "${api_id}" == "填写您Telegram的API的ID" ]] && [[ ! "${api_hash}" == "填写您Telegram的API的密匙" ]]; then 17 | task jd_get_share_code.js desi JD_COOKIE "${TG}" 18 | lOGName="$(ls -a /ql/log/jd_get_share_code |egrep -o [0-9]+-[0-9]+-[0-9]+-[0-9]+-[0-9]+-[0-9]+.log |awk 'END {print}')" 19 | FARM="$(grep '/farm' /ql/log/jd_get_share_code/${lOGName})" 20 | PET="$(grep '/pet' /ql/log/jd_get_share_code/${lOGName})" 21 | BEAN="$(grep '/bean' /ql/log/jd_get_share_code/${lOGName})" 22 | JXFACTORY="$(grep '/jxfactory' /ql/log/jd_get_share_code/${lOGName})" 23 | SGMH="$(grep '/sgmh' /ql/log/jd_get_share_code/${lOGName})" 24 | HEALTH="$(grep '/health' /ql/log/jd_get_share_code/${lOGName})" 25 | cat >/ql/jd/${TG}.py <<-EOF 26 | #调度配置 0,1 0 * * 1 python3 /ql/jd/${TG}.py 27 | from telethon import TelegramClient 28 | import os 29 | current_path = os.path.dirname(os.path.abspath(__file__)) 30 | os.chdir(current_path) 31 | client = TelegramClient("bot${TG}", "${api_id}", "${api_hash}", connection_retries=None).start() 32 | async def main(): 33 | await client.send_message("@chriszhuli_bot", "${FARM}") 34 | await client.send_message("@chriszhuli_bot", "${PET}") 35 | await client.send_message("@chriszhuli_bot", "${BEAN}") 36 | await client.send_message("@chriszhuli_bot", "${JXFACTORY}") 37 | await client.send_message("@chriszhuli_bot", "${SGMH}") 38 | await client.send_message("@chriszhuli_bot", "${HEALTH}") 39 | await client.send_read_acknowledge("@chriszhuli_bot") 40 | with client: 41 | client.loop.run_until_complete(main()) 42 | EOF 43 | 44 | cat >/ql/jd/${TG}-2.py <<-EOF 45 | #调度配置 0,1 21 * * 6 python3 /ql/jd/${TG}-2.py 46 | from telethon import TelegramClient 47 | import os 48 | current_path = os.path.dirname(os.path.abspath(__file__)) 49 | os.chdir(current_path) 50 | client = TelegramClient("bot${TG}", "${api_id}", "${api_hash}", connection_retries=None).start() 51 | async def main(): 52 | await client.send_message("@JD_ShareCode_Bot", "${FARM}") 53 | await client.send_message("@JD_ShareCode_Bot", "${PET}") 54 | await client.send_message("@JD_ShareCode_Bot", "${BEAN}") 55 | await client.send_message("@JD_ShareCode_Bot", "${JXFACTORY}") 56 | await client.send_message("@JD_ShareCode_Bot", "${SGMH}") 57 | await client.send_message("@JD_ShareCode_Bot", "${HEALTH}") 58 | await client.send_read_acknowledge("@JD_ShareCode_Bot") 59 | with client: 60 | client.loop.run_until_complete(main()) 61 | EOF 62 | cat >/ql/jd/"${RWWJ}" <<-EOF 63 | #!/usr/bin/env bash 64 | if [ "$(grep -c ${TG}.py /ql/config/crontab.list)" = 0 ]; then 65 | echo 66 | echo "添加任务 [自动提交助力码${TG}]" 67 | echo 68 | curl -s -H 'Accept: application/json' -H "Authorization: Bearer ${token}" -H 'Content-Type: application/json;charset=UTF-8' -H 'Accept-Language: zh-CN,zh;q=0.9' --data-binary '{"name":"自动提交助力码${TG}","command":"python3 /ql/jd/${TG}.py","schedule":"1 0,8 * * 1"}' --compressed 'http://127.0.0.1:5700/api/crons?t=${CRON}' 69 | fi 70 | sleep 2 71 | if [ "$(grep -c ${TG}-2.py /ql/config/crontab.list)" = 0 ]; then 72 | echo 73 | echo "添加任务 [自动提交助力码${TG}-2]" 74 | echo 75 | curl -s -H 'Accept: application/json' -H "Authorization: Bearer ${token}" -H 'Content-Type: application/json;charset=UTF-8' -H 'Accept-Language: zh-CN,zh;q=0.9' --data-binary '{"name":"自动提交助力码${TG}-2","command":"python3 /ql/jd/${TG}-2.py","schedule":"0,1 21 * * 6"}' --compressed 'http://127.0.0.1:5700/api/crons?t=${CRON}' 76 | fi 77 | sleep 2 78 | echo 79 | if [ "$(grep -c ${TG}.sh /ql/config/crontab.list)" = 0 ]; then 80 | echo 81 | echo "添加任务 [获取互助码${TG}]" 82 | echo 83 | curl -s -H 'Accept: application/json' -H "Authorization: Bearer ${token}" -H 'Content-Type: application/json;charset=UTF-8' -H 'Accept-Language: zh-CN,zh;q=0.9' --data-binary '{"name":"获取互助码${TG}","command":"task /ql/jd/${TG}.sh","schedule":"${CRON2} 13 * * 6"}' --compressed 'http://127.0.0.1:5700/api/crons?t=${CRON1}' 84 | fi 85 | EOF 86 | task /ql/jd/"${RWWJ}" 87 | rm -rf /ql/jd/"${RWWJ}" 88 | fi 89 | -------------------------------------------------------------------------------- /Aaron-lv/jd/jd_sms_login.py: -------------------------------------------------------------------------------- 1 | import os 2 | import sys 3 | import hashlib 4 | import time 5 | 6 | import requests 7 | 8 | mobile = input('请输入手机号:') 9 | appid = 959 10 | qversion = '1.0.0' 11 | country_code = 86 12 | 13 | ts = round(time.time() * 1000) 14 | sub_cmd = 1 15 | gsign = hashlib.md5(f"{appid}{qversion}{ts}36{sub_cmd}sb2cwlYyaCSN1KUv5RHG3tmqxfEb8NKN".encode()).hexdigest() 16 | data = f"client_ver=1.0.0&gsign={gsign}&appid={appid}&return_page=https%3A%2F%2Fcrpl.jd.com%2Fn%2Fmine%3FpartnerId%3DWBTF0KYY%26ADTAG%3Dkyy_mrqd%26token%3D&cmd=36&sdk_ver=1.0.0&sub_cmd={sub_cmd}&qversion={qversion}&ts={ts}" 17 | headers = { 18 | 'Host': 'qapplogin.m.jd.com', 19 | 'user-agent': 'Mozilla/5.0 (Linux; Android 10; V1838T Build/QP1A.190711.020; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/98.0.4758.87 Mobile Safari/537.36 hap/1.9/vivo com.vivo.hybrid/1.9.6.302 com.jd.crplandroidhap/1.0.3 ({packageName:com.vivo.hybrid,type:deeplink,extra:{}})', 20 | 'accept-language': 'zh-CN,zh;q=0.9,en;q=0.8', 21 | 'content-type': 'application/x-www-form-urlencoded; charset=utf-8', 22 | 'content-length': str(len(data)), 23 | } 24 | 25 | try: 26 | res = requests.post('https://qapplogin.m.jd.com/cgi-bin/qapp/quick', headers=headers, data=data).json() 27 | gsalt = res['data']['gsalt'] 28 | guid = res['data']['guid'] 29 | lsid = res['data']['lsid'] 30 | rsa_modulus = res['data']['rsa_modulus'] 31 | 32 | cookie = f"guid={guid}; lsid={lsid}; gsalt={gsalt}; rsa_modulus={rsa_modulus}" 33 | 34 | ts = round(time.time() * 1000) 35 | sub_cmd = 2 36 | gsign = hashlib.md5(f"{appid}{qversion}{ts}36{sub_cmd}{gsalt}".encode()).hexdigest() 37 | sign = hashlib.md5(f"{appid}{qversion}{country_code}{mobile}4dtyyzKF3w6o54fJZnmeW3bVHl0$PbXj".encode()).hexdigest() 38 | data = f"country_code={country_code}&client_ver=1.0.0&gsign={gsign}&appid={appid}&mobile={mobile}&sign={sign}&cmd=36&sub_cmd={sub_cmd}&qversion={qversion}&ts={ts}" 39 | headers.update({ 40 | 'cookie': cookie, 41 | 'content-length': str(len(data)), 42 | }) 43 | requests.post('https://qapplogin.m.jd.com/cgi-bin/qapp/quick', headers=headers, data=data) 44 | 45 | code = input('请输入验证码:') 46 | ts = round(time.time() * 1000) 47 | sub_cmd = 3 48 | gsign = hashlib.md5(f"{appid}{qversion}{ts}36{sub_cmd}{gsalt}".encode()).hexdigest() 49 | data = f"country_code={country_code}&client_ver=1.0.0&gsign={gsign}&smscode={code}&appid={appid}&mobile={mobile}&cmd=36&sub_cmd={sub_cmd}&qversion={qversion}&ts={ts}" 50 | headers.update({ 51 | 'cookie': cookie, 52 | 'content-length': str(len(data)), 53 | }) 54 | data = { 55 | 'country_code': country_code, 56 | 'client_ver': '1.0.0', 57 | 'gsign': gsign, 58 | 'smscode': code, 59 | 'appid': appid, 60 | 'mobile': mobile, 61 | 'cmd': '36', 62 | 'sub_cmd': sub_cmd, 63 | 'qversion': qversion, 64 | 'ts': ts 65 | } 66 | res = requests.post('https://qapplogin.m.jd.com/cgi-bin/qapp/quick', headers=headers, data=data).json() 67 | pt_key = res['data']['pt_key'] 68 | pt_pin = res['data']['pt_pin'] 69 | 70 | # pt_key = '4dtyyzKF3w6o54fJZnmeW3bVHl0$PbXj' 71 | # pt_pin = 'jd_crpl_kyy_mrqd' 72 | 73 | print('获取成功,请勿泄漏!\n') 74 | print(f"pt_key={pt_key}; pt_pin={pt_pin}") 75 | 76 | except Exception as e: 77 | print('程序错误:', e) 78 | time.sleep(5) 79 | 80 | if sys.platform == 'win32': 81 | os.system('pause') 82 | 83 | -------------------------------------------------------------------------------- /Aaron-lv/jdCookie.js: -------------------------------------------------------------------------------- 1 | /* 2 | 此文件为Node.js专用。其他用户请忽略 3 | */ 4 | //此处填写京东账号cookie。 5 | let CookieJDs = [ 6 | '',//账号一ck,例:pt_key=XXX;pt_pin=XXX; 7 | '',//账号二ck,例:pt_key=XXX;pt_pin=XXX;如有更多,依次类推 8 | ] 9 | // 判断环境变量里面是否有京东ck 10 | if (process.env.JD_COOKIE) { 11 | if (process.env.JD_COOKIE.indexOf('&') > -1) { 12 | console.log(`您的cookie选择的是用&隔开\n`) 13 | CookieJDs = process.env.JD_COOKIE.split('&'); 14 | } else if (process.env.JD_COOKIE.indexOf('\n') > -1) { 15 | console.log(`您的cookie选择的是用换行隔开\n`) 16 | CookieJDs = process.env.JD_COOKIE.split('\n'); 17 | } else { 18 | CookieJDs = [process.env.JD_COOKIE]; 19 | } 20 | } 21 | /* 22 | if (JSON.stringify(process.env).indexOf('GITHUB')>-1) { 23 | console.log(`请勿使用github action运行此脚本,无论你是从你自己的私库还是其他哪里拉取的源代码,都会导致我被封号\n`); 24 | !(async () => { 25 | // await require('./sendNotify').sendNotify('提醒', `请勿使用github action、滥用github资源会封我仓库以及账号`) 26 | // await process.exit(0); 27 | })() 28 | } 29 | */ 30 | CookieJDs = [...new Set(CookieJDs.filter(item => !!item))] 31 | console.log(`\n====================共有${CookieJDs.length}个京东账号Cookie=========\n`); 32 | console.log(`==================脚本执行- 北京时间(UTC+8):${new Date(new Date().getTime() + new Date().getTimezoneOffset()*60*1000 + 8*60*60*1000).toLocaleString()}=====================\n`) 33 | if (process.env.JD_DEBUG && process.env.JD_DEBUG === 'false') console.log = () => {}; 34 | for (let i = 0; i < CookieJDs.length; i++) { 35 | const index = (i + 1 === 1) ? '' : (i + 1); 36 | exports['CookieJD' + index] = CookieJDs[i].trim(); 37 | } 38 | -------------------------------------------------------------------------------- /Aaron-lv/jd_cfd_sharecodes.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * 京喜财富岛 3 | * 包含雇佣导游,建议每小时1次 4 | * 使用jd_env_copy.js同步js环境变量到ts 5 | * 使用jd_ts_test.ts测试环境变量 6 | * 7 | * cron: 0 * * * * 8 | */ 9 | 10 | import axios from 'axios' 11 | import {Md5} from 'ts-md5' 12 | import {getDate} from 'date-fns' 13 | import {requireConfig, wait, requestAlgo, h5st, getJxToken, getBeanShareCode, getFarmShareCode, o2s, randomString} from './TS_USER_AGENTS.ts' 14 | 15 | const axi = axios.create({timeout: 10000}) 16 | 17 | let cookie: string = '', res: any = '', UserName: string, index: number 18 | let shareCodes: string[] = [], shareCodesSelf: string[] = [], shareCodesHW: string[] = [], isCollector: Boolean = false, token: any = {} 19 | 20 | interface Params { 21 | strBuildIndex?: string, 22 | ddwCostCoin?: number, 23 | taskId?: number, 24 | dwType?: string, 25 | configExtra?: string, 26 | strStoryId?: string, 27 | triggerType?: number, 28 | ddwTriggerDay?: number, 29 | ddwConsumeCoin?: number, 30 | dwIsFree?: number, 31 | ddwTaskId?: string, 32 | strShareId?: string, 33 | strMarkList?: string, 34 | dwSceneId?: string, 35 | strTypeCnt?: string, 36 | dwUserId?: number, 37 | ddwCoin?: number, 38 | ddwMoney?: number, 39 | dwPrizeLv?: number, 40 | dwPrizeType?: number, 41 | strPrizePool?: string, 42 | dwFirst?: any, 43 | dwIdentityType?: number, 44 | strBussKey?: string, 45 | strMyShareId?: string, 46 | ddwCount?: number, 47 | __t?: number, 48 | strBT?: string, 49 | dwCurStageEndCnt?: number, 50 | dwRewardType?: number, 51 | dwRubbishId?: number, 52 | strPgtimestamp?: number, 53 | strPhoneID?: string, 54 | strPgUUNum?: string, 55 | showAreaTaskFlag?: number, 56 | strVersion?: string, 57 | strIndex?: string 58 | strToken?: string 59 | dwGetType?: number, 60 | ddwSeaonStart?: number, 61 | size?: number, 62 | type?: number, 63 | strLT?: string, 64 | dwQueryType?: number, 65 | dwPageIndex?: number, 66 | dwPageSize?: number, 67 | dwProperty?: number, 68 | bizCode?: string, 69 | dwCardType?: number, 70 | strCardTypeIndex?: string, 71 | dwIsReJoin?: number, 72 | } 73 | 74 | !(async () => { 75 | await requestAlgo() 76 | let cookiesArr: any = await requireConfig() 77 | for (let i = 0; i < cookiesArr.length; i++) { 78 | cookie = cookiesArr[i] 79 | UserName = decodeURIComponent(cookie.match(/pt_pin=([^;]*)/)![1]) 80 | index = i + 1 81 | console.log(`\n开始【京东账号${index}】${UserName}\n`) 82 | 83 | token = getJxToken(cookie) 84 | try { 85 | await makeShareCodes() 86 | } catch (e) { 87 | console.log("上车?错误!") 88 | continue 89 | } 90 | } 91 | 92 | })() 93 | 94 | async function api(fn: string, stk: string, params: Params = {}, taskPosition = '') { 95 | let url: string 96 | if (['GetUserTaskStatusList', 'Award', 'DoTask'].includes(fn)) { 97 | let bizCode: string 98 | if (!params.bizCode) { 99 | bizCode = taskPosition === 'right' ? 'jxbfddch' : 'jxbfd' 100 | } else { 101 | bizCode = params.bizCode 102 | } 103 | url = `https://m.jingxi.com/newtasksys/newtasksys_front/${fn}?strZone=jxbfd&bizCode=${bizCode}&source=jxbfd&dwEnv=7&_cfd_t=${Date.now()}&ptag=&_stk=${encodeURIComponent(stk)}&_ste=1&_=${Date.now()}&sceneval=2&g_login_type=1&callback=jsonpCBK${String.fromCharCode(Math.floor(Math.random() * 26) + "A".charCodeAt(0))}&g_ty=ls` 104 | } else { 105 | url = `https://m.jingxi.com/jxbfd/${fn}?strZone=jxbfd&bizCode=jxbfd&source=jxbfd&dwEnv=7&_cfd_t=${Date.now()}&ptag=&_stk=${encodeURIComponent(stk)}&_ste=1&_=${Date.now()}&sceneval=2&g_login_type=1&callback=jsonpCBK${String.fromCharCode(Math.floor(Math.random() * 26) + "A".charCodeAt(0))}&g_ty=ls` 106 | } 107 | url = h5st(url, stk, params, 10032) 108 | let {data} = await axios.get(url, { 109 | headers: { 110 | 'Host': 'm.jingxi.com', 111 | 'Accept': '*/*', 112 | 'Connection': 'keep-alive', 113 | 'Accept-Language': 'zh-CN,zh-Hans;q=0.9', 114 | 'User-Agent': `jdpingou;iPhone;4.13.0;14.4.2;${randomString(40)};network/wifi;model/iPhone10,2;appBuild/100609;supportApplePay/1;hasUPPay/0;pushNoticeIsOpen/1;hasOCPay/0;supportBestPay/0;session/${Math.random() * 98 + 1};pap/JA2019_3111789;brand/apple;supportJDSHWK/1;Mozilla/5.0 (iPhone; CPU iPhone OS 14_6 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148`, 115 | 'Referer': 'https://st.jingxi.com/', 116 | 'Cookie': cookie 117 | } 118 | }) 119 | if (typeof data === 'string') { 120 | try { 121 | return JSON.parse(data.replace(/\n/g, '').match(/jsonpCBK.?\(([^)]*)/)![1]) 122 | } catch (e) { 123 | console.log(data) 124 | return '' 125 | } 126 | } else { 127 | return data 128 | } 129 | } 130 | 131 | async function task() { 132 | console.log('刷新任务列表') 133 | res = await api('GetUserTaskStatusList', '_cfd_t,bizCode,dwEnv,ptag,showAreaTaskFlag,source,strZone,taskId', {taskId: 0, showAreaTaskFlag: 1}) 134 | await wait(2000) 135 | for (let t of res.data.userTaskStatusList) { 136 | if (t.awardStatus === 2 && t.completedTimes === t.targetTimes) { 137 | console.log('可领奖:', t.taskName) 138 | res = await api('Award', '_cfd_t,bizCode,dwEnv,ptag,source,strZone,taskId', {taskId: t.taskId, bizCode: t.bizCode}) 139 | await wait(2000) 140 | if (res.ret === 0) { 141 | try { 142 | res = JSON.parse(res.data.prizeInfo) 143 | console.log(`领奖成功:`, res.ddwCoin, res.ddwMoney) 144 | } catch (e) { 145 | console.log('领奖成功:', res.data) 146 | } 147 | await wait(1000) 148 | return 1 149 | } else { 150 | console.log('领奖失败:', res) 151 | return 0 152 | } 153 | } 154 | if (t.dateType === 2 && t.awardStatus === 2 && t.completedTimes < t.targetTimes && t.taskCaller === 1) { 155 | console.log('做任务:', t.taskId, t.taskName, t.completedTimes, t.targetTimes) 156 | res = await api('DoTask', '_cfd_t,bizCode,configExtra,dwEnv,ptag,source,strZone,taskId', {taskId: t.taskId, configExtra: '', bizCode: t.bizCode}) 157 | await wait(5000) 158 | if (res.ret === 0) { 159 | console.log('任务完成') 160 | return 1 161 | } else { 162 | console.log('任务失败') 163 | return 0 164 | } 165 | } 166 | } 167 | return 0 168 | } 169 | 170 | async function makeShareCodes() { 171 | try { 172 | res = await api('user/QueryUserInfo', '_cfd_t,bizCode,ddwTaskId,dwEnv,ptag,source,strPgUUNum,strPgtimestamp,strPhoneID,strShareId,strVersion,strZone', { 173 | ddwTaskId: '', 174 | strShareId: '', 175 | strMarkList: 'undefined', 176 | strPgUUNum: token.strPgUUNum, 177 | strPgtimestamp: token.strPgtimestamp, 178 | strPhoneID: token.strPhoneID, 179 | strVersion: '1.0.1' 180 | }) 181 | console.log('助力码:', res.strMyShareId) 182 | shareCodesSelf.push(res.strMyShareId) 183 | let bean: string = await getBeanShareCode(cookie) 184 | let farm: string = await getFarmShareCode(cookie) 185 | let pin: string = Md5.hashStr(cookie.match(/pt_pin=([^;]*)/)![1]) 186 | let {data}: any = await axios.get(`https://api.jdsharecode.xyz/api/autoInsert/jxcfd?sharecode=${res.strMyShareId}&bean=${bean}&farm=${farm}&pin=${pin}`) 187 | console.log(data.message) 188 | } catch (e) { 189 | console.log('自动提交失败') 190 | //console.log(e) 191 | } 192 | } 193 | 194 | async function getCodesHW() { 195 | try { 196 | let {data}: any = await axi.get(`https://api.jdsharecode.xyz/api/HW_CODES`, {timeout: 10000}) 197 | shareCodesHW = data['jxcfd'] || [] 198 | } catch (e) { 199 | } 200 | } -------------------------------------------------------------------------------- /Aaron-lv/jd_jxmc_sharecodes.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * 京喜牧场 3 | * cron: 10 0,12,18 * * * 4 | */ 5 | 6 | import axios from 'axios' 7 | import {Md5} from "ts-md5" 8 | import * as path from 'path' 9 | import {sendNotify} from './sendNotify' 10 | import {requireConfig, getBeanShareCode, getFarmShareCode, wait, requestAlgo, h5st, exceptCookie, o2s} from './TS_USER_AGENTS' 11 | 12 | const token = require('./utils/jd_jxmc.js').token 13 | 14 | let cookie: string = '', res: any = '', shareCodes: string[] = [], homePageInfo: any, jxToken: any, UserName: string, index: number 15 | let shareCodesHbSelf: string[] = [], shareCodesHbHw: string[] = [], shareCodesSelf: string[] = [], shareCodesHW: string[] = [] 16 | 17 | !(async () => { 18 | await requestAlgo() 19 | let cookiesArr: any = await requireConfig() 20 | if (process.argv[2]) { 21 | console.log('收到命令行cookie') 22 | cookiesArr = [decodeURIComponent(process.argv[2])] 23 | } 24 | let except: string[] = exceptCookie(path.basename(__filename)) 25 | 26 | for (let i = 0; i < cookiesArr.length; i++) { 27 | cookie = cookiesArr[i] 28 | UserName = decodeURIComponent(cookie.match(/pt_pin=([^;]*)/)![1]) 29 | index = i + 1 30 | console.log(`\n开始【京东账号${index}】${UserName}\n`) 31 | 32 | if (except.includes(encodeURIComponent(UserName))) { 33 | console.log('已设置跳过') 34 | continue 35 | } 36 | 37 | jxToken = await token(cookie) 38 | homePageInfo = await api('queryservice/GetHomePageInfo', 'activeid,activekey,channel,isgift,isqueryinviteicon,isquerypicksite,jxmc_jstoken,phoneid,sceneid,timestamp', {isgift: 1, isquerypicksite: 1, isqueryinviteicon: 1}) 39 | await wait(5000) 40 | if (homePageInfo.data.maintaskId !== 'pause') { 41 | console.log('init...') 42 | for (let j = 0; j < 20; j++) { 43 | res = await api('operservice/DoMainTask', 'activeid,activekey,channel,jxmc_jstoken,phoneid,sceneid,step,timestamp', {step: homePageInfo.data.maintaskId}) 44 | if (res.data.maintaskId === 'pause') 45 | break 46 | await wait(2000) 47 | } 48 | } 49 | 50 | homePageInfo = await api('queryservice/GetHomePageInfo', 'activeid,activekey,channel,isgift,isqueryinviteicon,isquerypicksite,jxmc_jstoken,phoneid,sceneid,timestamp', {isgift: 1, isquerypicksite: 1, isqueryinviteicon: 1}) 51 | let lastgettime: number 52 | if (homePageInfo.data?.cow?.lastgettime) { 53 | lastgettime = homePageInfo.data.cow.lastgettime 54 | } else { 55 | continue 56 | } 57 | 58 | console.log('助力码:', homePageInfo.data.sharekey) 59 | shareCodesSelf.push(homePageInfo.data.sharekey) 60 | try { 61 | await makeShareCodes(homePageInfo.data.sharekey) 62 | } catch (e: any) { 63 | console.log(e) 64 | } 65 | 66 | // 红包 67 | res = await api('operservice/GetInviteStatus', 'activeid,activekey,channel,jxmc_jstoken,phoneid,sceneid,timestamp') 68 | console.log('红包助力:', res.data.sharekey) 69 | shareCodesHbSelf.push(res.data.sharekey) 70 | try { 71 | await makeShareCodesHb(res.data.sharekey) 72 | } catch (e: any) { 73 | } 74 | await wait(1000) 75 | } 76 | await wait(1000) 77 | })() 78 | 79 | interface Params { 80 | isgift?: number, 81 | isquerypicksite?: number, 82 | petid?: string, 83 | itemid?: string, 84 | type?: string, 85 | taskId?: number 86 | configExtra?: string, 87 | sharekey?: string, 88 | currdate?: string, 89 | token?: string, 90 | isqueryinviteicon?: number, 91 | showAreaTaskFlag?: number, 92 | jxpp_wxapp_type?: number, 93 | dateType?: string, 94 | step?: string, 95 | cardtype?: number, 96 | } 97 | 98 | async function getTask() { 99 | console.log('刷新任务列表') 100 | res = await api('GetUserTaskStatusList', 'bizCode,dateType,jxpp_wxapp_type,showAreaTaskFlag,source', {dateType: '', showAreaTaskFlag: 0, jxpp_wxapp_type: 7}) 101 | for (let t of res.data.userTaskStatusList) { 102 | if (t.completedTimes == t.targetTimes && t.awardStatus === 2) { 103 | res = await api('Award', 'bizCode,source,taskId', {taskId: t.taskId}) 104 | if (res.ret === 0) { 105 | let awardCoin = res.data.prizeInfo.match(/:(.*)}/)![1] * 1 106 | console.log('领奖成功:', awardCoin) 107 | await wait(4000) 108 | return 1 109 | } else { 110 | console.log('领奖失败:', res) 111 | return 0 112 | } 113 | } 114 | 115 | if (t.dateType === 2 && t.completedTimes < t.targetTimes && t.awardStatus === 2 && t.taskType === 2) { 116 | res = await api('DoTask', 'bizCode,configExtra,source,taskId', {taskId: t.taskId, configExtra: ''}) 117 | if (res.ret === 0) { 118 | console.log('任务完成') 119 | await wait(5000) 120 | return 1 121 | } else { 122 | console.log('任务失败:', res) 123 | return 0 124 | } 125 | } 126 | } 127 | return 0 128 | } 129 | 130 | async function api(fn: string, stk: string, params: Params = {}, temporary: boolean = false) { 131 | let url: string 132 | if (['GetUserTaskStatusList', 'DoTask', 'Award'].indexOf(fn) > -1) { 133 | if (temporary) 134 | url = h5st(`https://m.jingxi.com/newtasksys/newtasksys_front/${fn}?_=${Date.now()}&source=jxmc_zanaixin&bizCode=jxmc_zanaixin&_stk=${encodeURIComponent(stk)}&_ste=1&sceneval=2&g_login_type=1&callback=jsonpCBK${String.fromCharCode(Math.floor(Math.random() * 26) + "A".charCodeAt(0))}&g_ty=ls`, stk, params, 10028) 135 | else 136 | url = h5st(`https://m.jingxi.com/newtasksys/newtasksys_front/${fn}?_=${Date.now()}&source=jxmc&bizCode=jxmc&_stk=${encodeURIComponent(stk)}&_ste=1&sceneval=2&g_login_type=1&callback=jsonpCBK${String.fromCharCode(Math.floor(Math.random() * 26) + "A".charCodeAt(0))}&g_ty=ls`, stk, params, 10028) 137 | } else { 138 | url = h5st(`https://m.jingxi.com/jxmc/${fn}?channel=7&sceneid=1001&activeid=jxmc_active_0001&activekey=null&jxmc_jstoken=${jxToken['farm_jstoken']}×tamp=${jxToken['timestamp']}&phoneid=${jxToken['phoneid']}&_stk=${encodeURIComponent(stk)}&_ste=1&_=${Date.now()}&sceneval=2`, stk, params, 10028) 139 | } 140 | try { 141 | let {data}: any = await axios.get(url, { 142 | headers: { 143 | 'Host': 'm.jingxi.com', 144 | 'User-Agent': `jdpingou;`, 145 | 'Referer': 'https://st.jingxi.com/pingou/jxmc/index.html', 146 | 'Cookie': cookie 147 | } 148 | }) 149 | if (typeof data === 'string') 150 | return JSON.parse(data.replace(/\n/g, '').match(/jsonpCBK.?\(([^)]*)/)![1]) 151 | return data 152 | } catch (e: any) { 153 | return {} 154 | } 155 | } 156 | 157 | async function makeShareCodes(code: string) { 158 | try { 159 | let bean: string = await getBeanShareCode(cookie) 160 | let farm: string = await getFarmShareCode(cookie) 161 | let pin: string = Md5.hashStr(cookie.match(/pt_pin=([^;]*)/)![1]) 162 | let {data}: any = await axios.get(`https://api.jdsharecode.xyz/api/autoInsert/jxmc?sharecode=${code}&bean=${bean}&farm=${farm}&pin=${pin}`) 163 | console.log(data.message) 164 | } catch (e) { 165 | console.log('自动提交失败') 166 | console.log(e) 167 | } 168 | } 169 | 170 | async function makeShareCodesHb(code: string) { 171 | try { 172 | let bean: string = await getBeanShareCode(cookie) 173 | let farm: string = await getFarmShareCode(cookie) 174 | let pin: string = Md5.hashStr(cookie.match(/pt_pin=([^;]*)/)![1]) 175 | let {data}: any = await axios.get(`https://api.jdsharecode.xyz/api/autoInsert/jxmchb?sharecode=${code}&bean=${bean}&farm=${farm}&pin=${pin}`, {timeout: 10000}) 176 | console.log(data.message) 177 | } catch (e) { 178 | console.log('自动提交失败') 179 | console.log(e) 180 | } 181 | } 182 | 183 | async function getCodes() { 184 | try { 185 | let {data}: any = await axios.get('https://api.jdsharecode.xyz/api/HW_CODES') 186 | shareCodesHW = data.jxmc || [] 187 | shareCodesHbHw = data.jxmchb || [] 188 | } catch (e) { 189 | } 190 | } -------------------------------------------------------------------------------- /Aaron-lv/jd_sms_login.py: -------------------------------------------------------------------------------- 1 | import os 2 | import sys 3 | import hashlib 4 | import time 5 | 6 | import requests 7 | 8 | mobile = input('请输入手机号:') 9 | appid = 959 10 | qversion = '1.0.0' 11 | country_code = 86 12 | 13 | ts = round(time.time() * 1000) 14 | sub_cmd = 1 15 | gsign = hashlib.md5(f"{appid}{qversion}{ts}36{sub_cmd}sb2cwlYyaCSN1KUv5RHG3tmqxfEb8NKN".encode()).hexdigest() 16 | data = f"client_ver=1.0.0&gsign={gsign}&appid={appid}&return_page=https%3A%2F%2Fcrpl.jd.com%2Fn%2Fmine%3FpartnerId%3DWBTF0KYY%26ADTAG%3Dkyy_mrqd%26token%3D&cmd=36&sdk_ver=1.0.0&sub_cmd={sub_cmd}&qversion={qversion}&ts={ts}" 17 | headers = { 18 | 'Host': 'qapplogin.m.jd.com', 19 | 'user-agent': 'Mozilla/5.0 (Linux; Android 10; V1838T Build/QP1A.190711.020; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/98.0.4758.87 Mobile Safari/537.36 hap/1.9/vivo com.vivo.hybrid/1.9.6.302 com.jd.crplandroidhap/1.0.3 ({packageName:com.vivo.hybrid,type:deeplink,extra:{}})', 20 | 'accept-language': 'zh-CN,zh;q=0.9,en;q=0.8', 21 | 'content-type': 'application/x-www-form-urlencoded; charset=utf-8', 22 | 'content-length': str(len(data)), 23 | } 24 | 25 | try: 26 | res = requests.post('https://qapplogin.m.jd.com/cgi-bin/qapp/quick', headers=headers, data=data).json() 27 | gsalt = res['data']['gsalt'] 28 | guid = res['data']['guid'] 29 | lsid = res['data']['lsid'] 30 | rsa_modulus = res['data']['rsa_modulus'] 31 | 32 | cookie = f"guid={guid}; lsid={lsid}; gsalt={gsalt}; rsa_modulus={rsa_modulus}" 33 | 34 | ts = round(time.time() * 1000) 35 | sub_cmd = 2 36 | gsign = hashlib.md5(f"{appid}{qversion}{ts}36{sub_cmd}{gsalt}".encode()).hexdigest() 37 | sign = hashlib.md5(f"{appid}{qversion}{country_code}{mobile}4dtyyzKF3w6o54fJZnmeW3bVHl0$PbXj".encode()).hexdigest() 38 | data = f"country_code={country_code}&client_ver=1.0.0&gsign={gsign}&appid={appid}&mobile={mobile}&sign={sign}&cmd=36&sub_cmd={sub_cmd}&qversion={qversion}&ts={ts}" 39 | headers.update({ 40 | 'cookie': cookie, 41 | 'content-length': str(len(data)), 42 | }) 43 | requests.post('https://qapplogin.m.jd.com/cgi-bin/qapp/quick', headers=headers, data=data) 44 | 45 | code = input('请输入验证码:') 46 | ts = round(time.time() * 1000) 47 | sub_cmd = 3 48 | gsign = hashlib.md5(f"{appid}{qversion}{ts}36{sub_cmd}{gsalt}".encode()).hexdigest() 49 | data = f"country_code={country_code}&client_ver=1.0.0&gsign={gsign}&smscode={code}&appid={appid}&mobile={mobile}&cmd=36&sub_cmd={sub_cmd}&qversion={qversion}&ts={ts}" 50 | headers.update({ 51 | 'cookie': cookie, 52 | 'content-length': str(len(data)), 53 | }) 54 | data = { 55 | 'country_code': country_code, 56 | 'client_ver': '1.0.0', 57 | 'gsign': gsign, 58 | 'smscode': code, 59 | 'appid': appid, 60 | 'mobile': mobile, 61 | 'cmd': '36', 62 | 'sub_cmd': sub_cmd, 63 | 'qversion': qversion, 64 | 'ts': ts 65 | } 66 | res = requests.post('https://qapplogin.m.jd.com/cgi-bin/qapp/quick', headers=headers, data=data).json() 67 | pt_key = res['data']['pt_key'] 68 | pt_pin = res['data']['pt_pin'] 69 | 70 | # pt_key = '4dtyyzKF3w6o54fJZnmeW3bVHl0$PbXj' 71 | # pt_pin = 'jd_crpl_kyy_mrqd' 72 | 73 | print('获取成功,请勿泄漏!\n') 74 | print(f"pt_key={pt_key}; pt_pin={pt_pin}") 75 | 76 | except Exception as e: 77 | print('程序错误:', e) 78 | time.sleep(5) 79 | 80 | if sys.platform == 'win32': 81 | os.system('pause') 82 | 83 | -------------------------------------------------------------------------------- /Aaron-lv/utils/jd_jxmcToken.js: -------------------------------------------------------------------------------- 1 | function t(n, t) { 2 | var r = (65535 & n) + (65535 & t); 3 | return (n >> 16) + (t >> 16) + (r >> 16) << 16 | 65535 & r 4 | } 5 | 6 | function r(n, t) { 7 | return n << t | n >>> 32 - t 8 | } 9 | 10 | function e(n, e, o, u, c, f) { 11 | return t(r(t(t(e, n), t(u, f)), c), o) 12 | } 13 | 14 | function o(n, t, r, o, u, c, f) { 15 | return e(t & r | ~t & o, n, t, u, c, f) 16 | } 17 | 18 | function u(n, t, r, o, u, c, f) { 19 | return e(t & o | r & ~o, n, t, u, c, f) 20 | } 21 | 22 | function c(n, t, r, o, u, c, f) { 23 | return e(t ^ r ^ o, n, t, u, c, f) 24 | } 25 | 26 | function f(n, t, r, o, u, c, f) { 27 | return e(r ^ (t | ~o), n, t, u, c, f) 28 | } 29 | 30 | function i(n, r) { 31 | n[r >> 5] |= 128 << r % 32, n[14 + (r + 64 >>> 9 << 4)] = r; 32 | var e, i, a, d, h, l = 1732584193, g = -271733879, v = -1732584194, m = 271733878; 33 | for (e = 0; e < n.length; e += 16) i = l, a = g, d = v, h = m, g = f(g = f(g = f(g = f(g = c(g = c(g = c(g = c(g = u(g = u(g = u(g = u(g = o(g = o(g = o(g = o(g, v = o(v, m = o(m, l = o(l, g, v, m, n[e], 7, -680876936), g, v, n[e + 1], 12, -389564586), l, g, n[e + 2], 17, 606105819), m, l, n[e + 3], 22, -1044525330), v = o(v, m = o(m, l = o(l, g, v, m, n[e + 4], 7, -176418897), g, v, n[e + 5], 12, 1200080426), l, g, n[e + 6], 17, -1473231341), m, l, n[e + 7], 22, -45705983), v = o(v, m = o(m, l = o(l, g, v, m, n[e + 8], 7, 1770035416), g, v, n[e + 9], 12, -1958414417), l, g, n[e + 10], 17, -42063), m, l, n[e + 11], 22, -1990404162), v = o(v, m = o(m, l = o(l, g, v, m, n[e + 12], 7, 1804603682), g, v, n[e + 13], 12, -40341101), l, g, n[e + 14], 17, -1502002290), m, l, n[e + 15], 22, 1236535329), v = u(v, m = u(m, l = u(l, g, v, m, n[e + 1], 5, -165796510), g, v, n[e + 6], 9, -1069501632), l, g, n[e + 11], 14, 643717713), m, l, n[e], 20, -373897302), v = u(v, m = u(m, l = u(l, g, v, m, n[e + 5], 5, -701558691), g, v, n[e + 10], 9, 38016083), l, g, n[e + 15], 14, -660478335), m, l, n[e + 4], 20, -405537848), v = u(v, m = u(m, l = u(l, g, v, m, n[e + 9], 5, 568446438), g, v, n[e + 14], 9, -1019803690), l, g, n[e + 3], 14, -187363961), m, l, n[e + 8], 20, 1163531501), v = u(v, m = u(m, l = u(l, g, v, m, n[e + 13], 5, -1444681467), g, v, n[e + 2], 9, -51403784), l, g, n[e + 7], 14, 1735328473), m, l, n[e + 12], 20, -1926607734), v = c(v, m = c(m, l = c(l, g, v, m, n[e + 5], 4, -378558), g, v, n[e + 8], 11, -2022574463), l, g, n[e + 11], 16, 1839030562), m, l, n[e + 14], 23, -35309556), v = c(v, m = c(m, l = c(l, g, v, m, n[e + 1], 4, -1530992060), g, v, n[e + 4], 11, 1272893353), l, g, n[e + 7], 16, -155497632), m, l, n[e + 10], 23, -1094730640), v = c(v, m = c(m, l = c(l, g, v, m, n[e + 13], 4, 681279174), g, v, n[e], 11, -358537222), l, g, n[e + 3], 16, -722521979), m, l, n[e + 6], 23, 76029189), v = c(v, m = c(m, l = c(l, g, v, m, n[e + 9], 4, -640364487), g, v, n[e + 12], 11, -421815835), l, g, n[e + 15], 16, 530742520), m, l, n[e + 2], 23, -995338651), v = f(v, m = f(m, l = f(l, g, v, m, n[e], 6, -198630844), g, v, n[e + 7], 10, 1126891415), l, g, n[e + 14], 15, -1416354905), m, l, n[e + 5], 21, -57434055), v = f(v, m = f(m, l = f(l, g, v, m, n[e + 12], 6, 1700485571), g, v, n[e + 3], 10, -1894986606), l, g, n[e + 10], 15, -1051523), m, l, n[e + 1], 21, -2054922799), v = f(v, m = f(m, l = f(l, g, v, m, n[e + 8], 6, 1873313359), g, v, n[e + 15], 10, -30611744), l, g, n[e + 6], 15, -1560198380), m, l, n[e + 13], 21, 1309151649), v = f(v, m = f(m, l = f(l, g, v, m, n[e + 4], 6, -145523070), g, v, n[e + 11], 10, -1120210379), l, g, n[e + 2], 15, 718787259), m, l, n[e + 9], 21, -343485551), l = t(l, i), g = t(g, a), v = t(v, d), m = t(m, h); 34 | return [l, g, v, m] 35 | } 36 | 37 | function a(n) { 38 | var t, r = "", e = 32 * n.length; 39 | for (t = 0; t < e; t += 8) r += String.fromCharCode(n[t >> 5] >>> t % 32 & 255); 40 | return r 41 | } 42 | 43 | function d(n) { 44 | var t, r = []; 45 | for (r[(n.length >> 2) - 1] = void 0, t = 0; t < r.length; t += 1) r[t] = 0; 46 | var e = 8 * n.length; 47 | for (t = 0; t < e; t += 8) r[t >> 5] |= (255 & n.charCodeAt(t / 8)) << t % 32; 48 | return r 49 | } 50 | 51 | function h(n) { 52 | return a(i(d(n), 8 * n.length)) 53 | } 54 | 55 | function l(n, t) { 56 | var r, e, o = d(n), u = [], c = []; 57 | for (u[15] = c[15] = void 0, o.length > 16 && (o = i(o, 8 * n.length)), r = 0; r < 16; r += 1) u[r] = 909522486 ^ o[r], c[r] = 1549556828 ^ o[r]; 58 | return e = i(u.concat(d(t)), 512 + 8 * t.length), a(i(c.concat(e), 640)) 59 | } 60 | 61 | function g(n) { 62 | var t, r, e = ""; 63 | for (r = 0; r < n.length; r += 1) t = n.charCodeAt(r), e += "0123456789abcdef".charAt(t >>> 4 & 15) + "0123456789abcdef".charAt(15 & t); 64 | return e 65 | } 66 | 67 | function v(n) { 68 | return unescape(encodeURIComponent(n)) 69 | } 70 | 71 | function m(n) { 72 | return h(v(n)) 73 | } 74 | 75 | function p(n) { 76 | return g(m(n)) 77 | } 78 | 79 | function s(n, t) { 80 | return l(v(n), v(t)) 81 | } 82 | 83 | function C(n, t) { 84 | return g(s(n, t)) 85 | } 86 | 87 | function A(n, t, r) { 88 | return t ? r ? s(t, n) : C(t, n) : r ? m(n) : p(n) 89 | } 90 | 91 | module.exports = A -------------------------------------------------------------------------------- /Aaron-lv/wskey.py: -------------------------------------------------------------------------------- 1 | """ 2 | new Env('青龙全自动更新cookie'); 3 | """ 4 | 5 | import requests 6 | import time 7 | import json 8 | import re 9 | import uuid 10 | import os 11 | 12 | requests.packages.urllib3.disable_warnings() 13 | 14 | token = "" 15 | username = "" 16 | password = "" 17 | pdtoken = os.environ['PandaToken'] 18 | if username == "" or password == "": 19 | f = open("/ql/config/auth.json") 20 | auth = f.read() 21 | auth = json.loads(auth) 22 | username = auth["username"] 23 | password = auth["password"] 24 | token = auth["token"] 25 | f.close() 26 | 27 | 28 | def gettimestamp(): 29 | return str(int(time.time() * 1000)) 30 | 31 | 32 | def login(username, password): 33 | url = "http://127.0.0.1:5700/api/login?t=%s" % gettimestamp() 34 | data = {"username": username, "password": password} 35 | r = s.post(url, data) 36 | s.headers.update({"authorization": "Bearer " + json.loads(r.text)["data"]["token"]}) 37 | 38 | 39 | def getitem(key): 40 | url = "http://127.0.0.1:5700/api/envs?searchValue=%s&t=%s" % (key, gettimestamp()) 41 | r = s.get(url) 42 | item = json.loads(r.text)["data"] 43 | return item 44 | 45 | 46 | def getckitem(key): 47 | url = "http://127.0.0.1:5700/api/envs?searchValue=JD_COOKIE&t=%s" % gettimestamp() 48 | r = s.get(url) 49 | for i in json.loads(r.text)["data"]: 50 | if key in i["value"]: 51 | return i 52 | return [] 53 | 54 | 55 | def genToken(wsCookie): 56 | headers = { 57 | 'user-agent': 'Mozilla/5.0 (Windows NT 6.3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.93 Safari/537.36', 58 | 'Content-Type': 'application/json', 59 | 'Authorization': 'Bearer '+ pdtoken, 60 | } 61 | data = '{ "url": "https://home.m.jd.com/myJd/newhome.action" }' 62 | r = requests.post('https://api.jds.codes/jd/gentoken', headers=headers, data=data) 63 | r = json.loads(r.text) 64 | request_time = r["request_times"] 65 | print("💎接口访问次数:%s" % (request_time)) 66 | data=r["data"].split("&") 67 | jduuid = data[1] 68 | clientVersion = data[3] 69 | client = data[2] 70 | sign = data[4] + "&" + data[5] + "&" + data[6] 71 | url = "https://api.m.jd.com/client.action?functionId=genToken&%s&%s&%s&%s" % (clientVersion, client, jduuid, sign) 72 | headers = { 73 | "Host": 'api.m.jd.com', 74 | "Cookie": wsCookie, 75 | "accept": '*/*', 76 | "referer": '', 77 | 'user-agent': "okhttp/3.12.1;jdmall;apple;version/9.4.0;build/88830;screen/1440x3007;os/11;network/wifi;" + str( 78 | uuid.uuid4()), 79 | 'accept-language': 'zh-Hans-CN;q=1, en-CN;q=0.9', 80 | 'content-type': 'application/x-www-form-urlencoded;', 81 | } 82 | r = requests.post(url, headers=headers, data="body=%7B%22to%22%3A%20%22https%3A//home.m.jd.com/myJd/newhome.action%22%2C%20%22action%22%3A%20%22to%22%7D") 83 | r = json.loads(r.text)["tokenKey"] 84 | return r 85 | 86 | 87 | def getJDCookie(tokenKey): 88 | url = "https://un.m.jd.com/cgi-bin/app/appjmp?tokenKey=%s&to=https://home.m.jd.com/myJd/newhome.action" % tokenKey 89 | headers = { 90 | "Connection": 'Keep-Alive', 91 | 'Content-Type': 'application/x-www-form-urlencoded', 92 | "Accept": 'application/json, text/plain, */*', 93 | 'Accept-Language': 'zh-cn', 94 | "User-Agent": 'okhttp/3.12.1;jdmall;apple;version/9.4.0;build/88830;screen/1440x3007;os/11;network/wifi;' + str( 95 | uuid.uuid4()) 96 | } 97 | r = requests.get(url, headers=headers, allow_redirects=False,) 98 | pt_pin = re.findall(r"pt_pin=(.*?);", str(r.headers))[0] 99 | pt_key = re.findall(r"pt_key=(.*?);", str(r.headers))[0] 100 | return "pt_key=" + pt_key + ";pt_pin=" + pt_pin + ";" 101 | 102 | 103 | def wstopt(wskey): 104 | try: 105 | token = genToken(wskey) 106 | r = getJDCookie(token) 107 | return r 108 | except: 109 | return "error" 110 | 111 | 112 | def update(text, qlid): 113 | url = "http://127.0.0.1:5700/api/envs?t=%s" % gettimestamp() 114 | s.headers.update({"Content-Type": "application/json;charset=UTF-8"}) 115 | data = { 116 | "name": "JD_COOKIE", 117 | "value": text, 118 | "_id": qlid 119 | } 120 | r = s.put(url, data=json.dumps(data)) 121 | if json.loads(r.text)["code"] == 200: 122 | return True 123 | else: 124 | return False 125 | 126 | 127 | def insert(text): 128 | url = "http://127.0.0.1:5700/api/envs?t=%s" % gettimestamp() 129 | s.headers.update({"Content-Type": "application/json;charset=UTF-8"}) 130 | data = [] 131 | data_json = { 132 | "value": text, 133 | "name": "JD_COOKIE" 134 | } 135 | data.append(data_json) 136 | r = s.post(url, json.dumps(data)) 137 | if json.loads(r.text)["code"] == 200: 138 | return True 139 | else: 140 | return False 141 | 142 | 143 | if __name__ == '__main__': 144 | s = requests.session() 145 | if token == "": 146 | login(username, password) 147 | else: 148 | s.headers.update({"authorization": "Bearer " + token}) 149 | wskeys = getitem("JD_WSCK") 150 | count = 1 151 | for i in wskeys: 152 | if i["status"] == 0: 153 | r = wstopt(i["value"]) 154 | if r == "error": 155 | print("api请求错误") 156 | else: 157 | ptck = r 158 | try: 159 | wspin = re.findall(r"pin=(.*?);", i["value"])[0] 160 | if ptck == "wskey错误": 161 | print("第%s个wskey可能过期了,pin为%s" % (count, wspin)) 162 | elif ptck == "未知错误" or ptck == "error": 163 | print("第%s个wskey发生了未知错误,pin为%s" % (count, wspin)) 164 | elif "" in ptck: 165 | print("你的ip被cloudflare拦截") 166 | else: 167 | ptpin = re.findall(r"pt_pin=(.*?);", ptck)[0] 168 | item = getckitem("pt_pin=" + ptpin) 169 | if item != []: 170 | qlid = item["_id"] 171 | if update(ptck, qlid): 172 | print("第%s个wskey更新成功,pin为%s" % (count, wspin)) 173 | else: 174 | print("第%s个wskey更新失败,pin为%s" % (count, wspin)) 175 | else: 176 | if insert(ptck): 177 | print("第%s个wskey添加成功" % count) 178 | else: 179 | print("第%s个wskey添加失败" % count) 180 | except: 181 | print("第%s个wskey出现异常错误" % count) 182 | count += 1 183 | else: 184 | print("有一个wskey被禁用了") 185 | -------------------------------------------------------------------------------- /Config.json: -------------------------------------------------------------------------------- 1 | { 2 | ///浏览器最多几个网页 3 | "MaxTab": "4", 4 | //网站标题 5 | "Title": "NARK", 6 | //回收时间分钟 不填默认3分钟 7 | "Closetime": "5", 8 | //不要修改 9 | "Captchaurl": "http://127.0.0.1:5000", 10 | //网站公告 参考写法:https://www.aobacore.com/archives/nolanjdc-notice-code.html 11 | "Announcement": "请关闭免密支付", 12 | //Proxy 支持不带密码的socks5 以及http 13 | ///http Proxy 只需要填写 ip:端 14 | /// Socks5 需要填写socks5://ip:端口 不能填写下方账户密码 15 | "Proxy": "", 16 | //Proxy帐号 17 | "ProxyUser": "", 18 | //Proxy密码 19 | "ProxyPass": "", 20 | ///开启打印等待日志卡短信验证登陆 可开启 拿到日志群里回复 默认不要填写 21 | "Debug": "", 22 | ///自动滑块次数5次 5次后手动滑块 可设置为0默认手动滑块 23 | "AutoCaptchaCount": "5", 24 | ///XDD PLUS Url http://IP地址:端口/api/login/smslogin 25 | "XDDurl": "", 26 | ///xddToken 27 | "XDDToken": "", 28 | ///登陆预警 0 0 12 * * ? 每天中午十二点 https://www.bejson.com/othertools/cron/ 表达式在线生成网址 29 | "ExpirationCron": "0 00 19 * * ?", 30 | ///个人资产 0 0 10,20 * * ? 早十点晚上八点 31 | "BeanCron": "0 0 08,20, * * ?", 32 | // ======================================= WxPusher 通知设置区域 =========================================== 33 | // 此处填你申请的 appToken. 官方文档:https://wxpusher.zjiecode.com/docs 34 | // WP_APP_TOKEN 可在管理台查看: https://wxpusher.zjiecode.com/admin/main/app/appToken 35 | // MainWP_UID 填你自己uid 36 | ///这里的通知只用于用户登陆 删除 是给你的通知 37 | ///需要推送的参考:https://www.kejiwanjia.com/jiaocheng/58178.html 38 | "WP_APP_TOKEN": "换成你的", 39 | "MainWP_UID": "换成你的", 40 | // ======================================= pushplus 通知设置区域 =========================================== 41 | ///Push Plus官方网站:http" //www.pushplus.plus  只有青龙模式有用 42 | ///下方填写您的Token,微信扫码登录后一对一推送或一对多推送下面的token,只填" "PUSH_PLUS_TOKEN", 43 | "PUSH_PLUS_TOKEN": "", 44 | //下方填写您的一对多推送的 "群组编码" ,(一对多推送下面->您的群组(如无则新建)->群组编码) 45 | "PUSH_PLUS_USER": "", 46 | ///青龙配置 注意:对接XDD或对接傻妞 设置为"Config":[] 网页和机器人二选一 否则报错出现选择服务器 47 | "Config": [ 48 | { 49 | //序号必填从1 开始 50 | "QLkey": 1, 51 | //服务器名称 52 | "QLName": "腾讯云", 53 | //青龙地址 54 | "QLurl": "换成你的", 55 | //青龙2,9 OpenApi Client ID 56 | "QL_CLIENTID": "换成你的", 57 | //青龙2,9 OpenApi Client Secret 58 | "QL_SECRET": "换成你的", 59 | //CK最大数量 60 | "QL_CAPACITY": 999, 61 | ///建议一个青龙一个WxPusher 应用 62 | "WP_APP_TOKEN": "换成你的" 63 | } 64 | ] 65 | 66 | } 67 | -------------------------------------------------------------------------------- /MaiARKarm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/shidahuilang/QL-/8117a4c686c5e3fd09ee247e2c226bf86fccd509/MaiARKarm -------------------------------------------------------------------------------- /MaiARKx86: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/shidahuilang/QL-/8117a4c686c5e3fd09ee247e2c226bf86fccd509/MaiARKx86 -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | 2 | #### 🚩 一键安装青龙面板命令 3 | 4 | ![img.png](image/img.png) 5 | 6 | ![img1.png](image/img1.png) 7 | #### 🚩 全自动提交助力码到互助池 8 | ![img2.png](image/img2.png) 9 | 10 | - 使用方式 11 | ```sh 12 | docker exec -it qinglong bash -c "task /ql/jd/1-5.sh && python3 /ql/jd/1-5.py" 13 | docker exec -it qinglong bash -c "task /ql/jd/6-10.sh && python3 /ql/jd/6-10.py" 14 | 运行命令后,显示 Please enter your phone (or bot token): 15 | 就输入您的注册TG的电话,如果是大陆的格式就是+8613666666666 16 | 然后TG接收到验证码填上,再下来,如果TG有密码就输入密码 17 | ``` 18 | # 19 | - 为防止系统没安装curl,使用不了一键命令,使用一键安装青龙面板命令之前先执行一次安装curl命令 20 | 21 | - 安装curl请注意区分系统,openwrt千万别另外安装curl,openwrt本身自带了,另外安装还会用不了 22 | # 23 | 24 | - 使用root用户登录ubuntu或者debian系统,后执行以下命令安装curl 25 | ```sh 26 | apt -y update && apt -y install curl wget sudo 27 | ``` 28 | 29 | - 使用root用户登录centos系统,后执行以下命令安装curl 30 | ```sh 31 | yum install -y curl wget 32 | ``` 33 | # 34 | - 国外鸡地址,执行下面一键命令安装青龙+依赖+任务+maiark自由选择(安装完毕后再次使用命令可以对应用进行升级) 35 | ```sh 36 | bash -c "$(curl -fsSL https://raw.githubusercontent.com/shidahuilang/QL-/main/lang1.sh)" 37 | ``` 38 | - 国内鸡地址,执行下面一键命令安装青龙+依赖+任务+maiark自由选择(安装完毕后再次使用命令可以对应用进行升级) 39 | ```sh 40 | bash -c "$(curl -fsSL https://raw.githubusercontent.com/shidahuilang/QL-/main/lang1.sh)" 41 | ``` 42 | 43 | 44 | ## 第二步 45 | 46 | #### 🚩 如果上面的命令运行成功会有提示,按提示操作登录面板 47 | 48 | 49 | - 登录面板后,在‘ 环境变量 ’项添加 WSKEY 或者 PT_KEY 50 | 51 | - 添加 wskey 或者 pt_key 都要注意KEY里面的分号,英文分号,记得别省略了,WSKEY和PT_KEY二选一即可 52 | 53 | - 格式如下: 54 | 55 | ```sh 56 | # > 添加 wskey 57 | 58 | 名称 59 | JD_WSCK 60 | 61 | 值 62 | pin=您的账号;wskey=您的wskey值; 63 | 64 | 65 | 66 | # > 添加PT_KEY 67 | 68 | 名称 69 | JD_COOKIE 70 | 71 | 值 72 | pt_key=您的pt_key值;pt_pin=您的账号; 73 | ``` 74 | 75 | # 76 | #### 🚩 青龙面板安装依赖方法 77 | - #### 依赖管理 --> 添加依赖 --> 依赖类型(NodeJs) --> 自动拆分(是) --> 名称(把下面依赖名称全复制粘贴) --> 确定 78 | ```sh 79 | date-fns 80 | axios 81 | ts-node 82 | typescript 83 | png-js 84 | crypto-js 85 | md5 86 | dotenv 87 | got 88 | ts-md5 89 | tslib 90 | @types/node 91 | requests 92 | tough-cookie 93 | jsdom 94 | download 95 | tunnel 96 | fs 97 | ws 98 | js-base64 99 | jieba 100 | canvas 101 | ``` 102 | # 103 | #### 🚩 单独安装某项的一键脚本 104 | 105 | 106 | - 一键单独安装docker 107 | ```sh 108 | bash -c "$(curl -fsSL https://raw.githubusercontent.com/shidahuilang/QL-/main/docker.sh)" 109 | ``` 110 | ``` 111 | wget -qO- https://get.docker.com/ | sh 112 | ``` 113 | - 一键安装单独青龙的依赖 114 | ```sh 115 | docker exec -it qinglong bash -c "$(curl -fsSL https://raw.githubusercontent.com/shidahuilang/QL-/main/npm.sh)" 116 | ``` 117 | #### 🚩 单独F2拉库 118 | F2库 119 | ```sh 120 | ql repo https://github.com/shufflewzc/faker2.git "jd_|jx_|gua_|jddj_|jdCookie" "activity|backUp" "^jd[^_]|USER|function|utils|sendNotify|ZooFaker_Necklace.js|JDJRValidator_|sign_graphics_validate|ql|JDSignValidator" "main" 121 | task disableDuplicateTasksImplement.py 122 | 123 | ``` 124 | 大灰狼备份库 125 | ```sh 126 | ql repo https://github.com/shidahuilang/f2.git "jd_|jx_|gua_|jddj_|jdCookie" "activity|backUp" "^jd[^_]|USER|function|utils|sendNotify|ZooFaker_Necklace.js|JDJRValidator_|sign_graphics_validate|ql|JDSignValidator|magic|depend|h5sts" "main" 127 | ``` 128 | # 129 | - 傻妞一键安装 130 | ``` 131 | s=sillyGirl;a=arm64;if [[ $(uname -a | grep "x86_64") != "" ]];then a=amd64;fi ;if [ ! -d $s ];then mkdir $s;fi ;cd $s;wget http://gitee.yanyuge.workers.dev/https://github.com/cdle/${s}/releases/download/main/${s}_linux_$a -O $s && chmod 777 $s;pkill -9 $s;$(pwd)/$s 132 | ``` 133 | - 配置文件模板进`etc/sillyGirl`目录执行 134 | ``` 135 | wget https://gitee.com/yanyuwangluo/onekey/raw/master/sets.conf 136 | ``` 137 | - 傻妞docker版交互模式 ```docker attach sillygirl``` 138 | ``` 139 | docker run \ 140 | -itd \ 141 | --name sillygirl \ 142 | --restart always \ 143 | -v "$(pwd)"/sillyGirl:/etc/sillyGirl \ 144 | mzzsfy/sillygirl:latest 145 | ``` 146 | - 单独安装Maiark 147 | - X86 148 | ``` 149 | wget -N --no-check-certificate https://github.com/shidahuilang/QL-/raw/main/MaiARKx86 && chmod 777 MaiARKx86 && ./MaiARKx86 150 | ``` 151 | - 后台运行 152 | ``` 153 | nohup ./MaiARKx86 & 154 | ``` 155 | - Maiarkdocker版 156 | ``` 157 | docker run -d \ 158 | --name MaiARK \ 159 | --hostname MaiARK \ 160 | --restart=always \ 161 | -v /opt/maiark:/MaiARK \ 162 | -p 5701:8082 \ 163 | kissyouhunter/maiark 164 | ``` 165 | 166 | - 单独安装Pro一键脚本 167 | ```sh 168 | bash -c "$(curl -fsSL https://raw.githubusercontent.com/shidahuilang/QL-/main/pro.sh)" 169 | ``` 170 | - 单独安装JDX 171 | ```sh 172 | docker run -d --restart always -p 5705:80 -v /root/jdx/config:/jdx/config --name jdx aaron8/jdx 173 | ``` 174 | 175 | - 单独安装阿东一键脚本(免费有限制,一天扫码2次,低调使用,如有批量需求,请捐赠原作者) 176 | ```sh 177 | bash -c "$(curl -fsSL https://raw.githubusercontent.com/shidahuilang/QL-/main/adong/adong.sh)" 178 | ``` 179 | 180 | - 人形bot Docker 一键安装: 181 | ```sh 182 | wget https://raw.githubusercontent.com/TeamPGM/PagerMaid-Pyro/development/utils/docker.sh -O docker.sh && chmod +x docker.sh && bash docker.sh 183 | ``` 184 | ## 感谢! 185 | 186 | 187 | > [`whyour`] 188 | > [`danshui`] 189 | > [`feverrun`] 190 | > [`Aaron-lv`] 191 | > [`faker2`] 192 | 193 | -------------------------------------------------------------------------------- /adong/adong.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | stty erase ^H 3 | PORT=0 4 | #判断当前端口是否被占用,没被占用返回0,反之1 5 | function Listening() { 6 | TCPListeningnum=$(netstat -an | grep ":$1 " | awk '$1 == "tcp" && $NF == "LISTEN" {print $0}' | wc -l) 7 | UDPListeningnum=$(netstat -an | grep ":$1 " | awk '$1 == "udp" && $NF == "0.0.0.0:*" {print $0}' | wc -l) 8 | ((Listeningnum = TCPListeningnum + UDPListeningnum)) 9 | if [ $Listeningnum == 0 ]; then 10 | echo "0" 11 | else 12 | echo "1" 13 | fi 14 | } 15 | 16 | case $(uname -m) in 17 | x86_64) is_x86=1 ;; 18 | aarch64) is_x86=0 ;; 19 | esac 20 | 21 | synology=0 22 | if [[ $(uname -a) == *synology* ]]; then 23 | synology=1 24 | fi 25 | 26 | #指定区间随机数 27 | function random_range() { 28 | shuf -i $1-$2 -n1 29 | } 30 | 31 | #得到随机端口 32 | function get_random_port() { 33 | templ=0 34 | while [ $PORT == 0 ]; do 35 | temp1=$(random_range $1 $2) 36 | if [ $(Listening $temp1) == 0 ]; then 37 | PORT=$temp1 38 | fi 39 | done 40 | echo "port=$PORT" 41 | } 42 | 43 | TIME() { 44 | [[ -z "$1" ]] && { 45 | echo -ne " " 46 | } || { 47 | case $1 in 48 | r) export Color="\e[31;1m" ;; 49 | g) export Color="\e[32;1m" ;; 50 | b) export Color="\e[34;1m" ;; 51 | y) export Color="\e[33;1m" ;; 52 | z) export Color="\e[35;1m" ;; 53 | l) export Color="\e[36;1m" ;; 54 | esac 55 | [[ $# -lt 2 ]] && echo -e "\e[36m\e[0m ${1}" || { 56 | echo -e "\e[36m\e[0m ${Color}${2}\e[0m" 57 | } 58 | } 59 | } 60 | 61 | [[ ! "$USER" == "root" ]] && { 62 | echo 63 | TIME y "警告:请使用root用户操作!~~" 64 | echo 65 | exit 1 66 | } 67 | 68 | if [[ $synology == 1 ]]; then 69 | echo 70 | TIME y "你是群晖nas" 71 | echo 72 | elif [[ "$(. /etc/os-release && echo "$ID")" == "centos" ]]; then 73 | export Aptget="yum" 74 | yum -y update 75 | yum install -y sudo wget curl psmisc net-tools 76 | export XITONG="cent_os" 77 | elif [[ "$(. /etc/os-release && echo "$ID")" == "ubuntu" ]]; then 78 | export Aptget="apt-get" 79 | apt-get -y update 80 | apt-get install -y sudo wget curl psmisc net-tools 81 | export XITONG="ubuntu_os" 82 | elif [[ "$(. /etc/os-release && echo "$ID")" == "debian" || "$(. /etc/os-release && echo "$ID")" == "Deepin" ]]; then 83 | export Aptget="apt" 84 | apt-get -y update 85 | apt-get install -y sudo wget curl psmisc net-tools 86 | export XITONG="debian_os" 87 | elif [[ -f /etc/openwrt_release ]] && [[ -f /rom/etc/openwrt_release ]]; then 88 | export Aptget="opkg" 89 | opkg update 90 | opkg install git-http > /dev/null 2>&1 91 | opkg install ca-bundle > /dev/null 2>&1 92 | opkg install coreutils-timeout > /dev/null 2>&1 93 | opkg install findutils-xargs > /dev/null 2>&1 94 | opkg install unzip 95 | else 96 | echo 97 | TIME y "本一键安装docker脚本只支持(centos、ubuntu和debian,NAS,OpenWrt)!" 98 | echo 99 | exit 1 100 | fi 101 | 102 | ignore_install_docker=0 103 | if [[ $(docker --version | grep -c "version") -ge '1' ]]; then 104 | echo 105 | if [[ $synology == 1 ]]; then 106 | TIME y "已安装docker,进行下一步" 107 | ignore_install_docker=1 108 | else 109 | TIME y "检测到docker存在,是否重新安装?" 110 | echo 111 | TIME g "重新安装会把您现有的所有容器及镜像全部删除,请慎重!" 112 | echo 113 | while :; do 114 | read -p " [输入[ N/n ]回车跳过安装docker,输入[ Y/y ]回车重新安装docker]: " ANDK 115 | case $ANDK in 116 | [Yy]) 117 | TIME g "正在御载老版本docker" 118 | export CHONGXIN="YES" 119 | docker stop $(docker ps -a -q) 120 | docker rm $(docker ps -a -q) 121 | docker rmi $(docker images -q) 122 | sudo "${Aptget}" remove -y docker docker-engine docker.io containerd runc 123 | sudo "${Aptget}" remove -y docker 124 | sudo "${Aptget}" remove -y docker-ce 125 | sudo "${Aptget}" remove -y docker-ce-cli 126 | sudo "${Aptget}" remove -y docker-ce-rootless-extras 127 | sudo "${Aptget}" remove -y docker-scan-plugin 128 | sudo "${Aptget}" remove -y --auto-remove docker 129 | sudo rm -rf /var/lib/docker 130 | sudo rm -rf /etc/docker 131 | sudo rm -rf /lib/systemd/system/{docker.service,docker.socket} 132 | rm /var/lib/dpkg/info/$nomdupaquet* -f 133 | break 134 | ;; 135 | [Nn]) 136 | echo 137 | TIME r "跳过安装docker!" 138 | echo 139 | sleep 1 140 | ignore_install_docker=1 141 | break 142 | ;; 143 | *) 144 | echo 145 | TIME b "提示:请输入正确的选择!" 146 | echo 147 | ;; 148 | esac 149 | done 150 | fi 151 | fi 152 | 153 | if [ $ignore_install_docker == 0 ]; then 154 | echo 155 | TIME y "正在安装docker,请耐心等候..." 156 | echo 157 | if [[ ${XITONG} == "cent_os" ]]; then 158 | sudo yum install -y yum-utils device-mapper-persistent-data lvm2 159 | sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo 160 | sudo yum -y update 161 | sudo yum install -y docker-ce 162 | sudo yum install -y docker-ce-cli 163 | sudo yum install -y containerd.io 164 | fi 165 | if [[ ${XITONG} == "ubuntu_os" ]]; then 166 | if [ $is_x86 == 1 ]; then 167 | sudo apt install -y apt-transport-https ca-certificates curl gnupg2 software-properties-common 168 | curl -fsSL https://mirrors.ustc.edu.cn/docker-ce/linux/ubuntu/gpg | sudo apt-key add - 169 | if [[ $? -ne 0 ]]; then 170 | curl -fsSL https://mirrors.ustc.edu.cn/docker-ce/linux/ubuntu/gpg | sudo apt-key add - 171 | fi 172 | sudo apt-key fingerprint 0EBFCD88 173 | if [[ $(sudo apt-key fingerprint 0EBFCD88 | grep -c "0EBF CD88") == '0' ]]; then 174 | TIME r "密匙验证出错,或者没下载到密匙了,请检查网络,或者源有问题" 175 | sleep 5 176 | exit 1 177 | sleep 5 178 | fi 179 | sudo add-apt-repository -y "deb [arch=amd64] https://mirrors.ustc.edu.cn/docker-ce/linux/ubuntu $(lsb_release -cs) stable" 180 | sudo apt-get update 181 | sudo apt-get install -y docker-ce 182 | sudo apt-get install -y docker-ce-cli 183 | sudo apt-get install -y containerd.io 184 | else 185 | sudo apt-get update 186 | sudo apt-get install -y \ 187 | ca-certificates \ 188 | curl \ 189 | gnupg \ 190 | lsb-release 191 | curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg -f --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg 192 | echo \ 193 | "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu \ 194 | $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list >/dev/null 195 | sudo apt-get update 196 | sudo apt-get install -y docker-ce docker-ce-cli containerd.io 197 | fi 198 | fi 199 | if [[ ${XITONG} == "debian_os" ]]; then 200 | sudo apt-get install -y apt-transport-https ca-certificates curl gnupg2 software-properties-common 201 | curl -fsSL https://mirrors.ustc.edu.cn/docker-ce/linux/debian/gpg | sudo apt-key add - 202 | if [[ $? -ne 0 ]]; then 203 | curl -fsSL https://mirrors.ustc.edu.cn/docker-ce/linux/debian/gpg | sudo apt-key add - 204 | fi 205 | sudo apt-key fingerprint 0EBFCD88 206 | if [[ $(sudo apt-key fingerprint 0EBFCD88 | grep -c "0EBF CD88") == '0' ]]; then 207 | TIME r "密匙验证出错,或者没下载到密匙了,请检查网络,或者上游有问题" 208 | sleep 5 209 | exit 1 210 | sleep 5 211 | fi 212 | sudo add-apt-repository -y "deb [arch=amd64] https://mirrors.ustc.edu.cn/docker-ce/linux/debian $(lsb_release -cs) stable" 213 | sudo apt-get update 214 | sudo apt-get install -y docker-ce 215 | sudo apt-get install -y docker-ce-cli 216 | sudo apt-get install -y containerd.io 217 | fi 218 | sudo rm -fr /etc/systemd/system/docker.service.d 219 | sed -i 's#ExecStart=/usr/bin/dockerd -H fd://#ExecStart=/usr/bin/dockerd#g' /lib/systemd/system/docker.service 220 | sudo systemctl daemon-reload 221 | sudo rm -fr docker.sh 222 | if [[ $(docker --version | grep -c "version") == '0' ]]; then 223 | TIME y "docker安装失败" 224 | sleep 2 225 | exit 1 226 | else 227 | # 1.创建一个目录 228 | sudo mkdir -p /etc/docker 229 | 230 | # 2.编写配置文件 231 | sudo tee /etc/docker/daemon.json <<-'EOF' 232 | { 233 | "registry-mirrors": ["http://hub-mirror.c.163.com", 234 | "https://docker.mirrors.ustc.edu.cn", 235 | "https://mirror.ccs.tencentyun.com" 236 | ] 237 | } 238 | EOF 239 | 240 | TIME y "" 241 | TIME g "docker安装成功,正在启动docker,请稍后..." 242 | sudo systemctl restart docker 243 | sudo systemctl start docker 244 | sudo systemctl enable docker.service 245 | sleep 12 246 | TIME y "" 247 | TIME g "测试docker拉取镜像是否成功" 248 | TIME y "" 249 | sudo docker run hello-world | tee build.log 250 | if [[ $(docker ps -a | grep -c "hello-world") -ge '1' ]] && [[ $(grep -c "docs.docker" build.log) -ge '1' ]]; then 251 | echo 252 | TIME g "测试镜像拉取成功,正在删除测试镜像..." 253 | echo 254 | docker stop $(docker ps -a -q) 255 | docker rm $(docker ps -a -q) 256 | docker rmi $(docker images -q) 257 | echo 258 | TIME y "测试镜像删除完毕,docker安装成功!" 259 | echo 260 | else 261 | echo 262 | TIME y "docker虽然安装成功但是拉取镜像失败,这个原因很多是因为以前的docker没御载完全造成的,或者容器网络问题" 263 | echo 264 | TIME y "重启服务器后,用 sudo docker run hello-world 命令测试吧,能拉取成功就成了" 265 | echo 266 | sleep 2 267 | exit 1 268 | fi 269 | fi 270 | rm -fr build.log 271 | fi 272 | 273 | dir='jd-qinglong' 274 | TIME y "请指定保存数据的目录,已存在的请指定名字,回车默认jd-qinglong" 275 | read input 276 | if [ -z "${input}" ]; then 277 | input=$dir 278 | fi 279 | dir=$input 280 | 281 | if [ ! -d $dir ]; then 282 | mkdir $dir 283 | fi 284 | 285 | cd $dir || exit 286 | 287 | rm -f adbot/adbot 288 | 289 | file=env.properties 290 | if [ ! -f "$file" ]; then 291 | wget -O env.properties https://ghproxy.com/https://raw.githubusercontent.com/shidahuilang/QL-/main/adong/env.properties 292 | else 293 | echo "env.properties已存在" 294 | fi 295 | 296 | sudo docker rm -f webapp 297 | if [ $is_x86 == 1 ]; then 298 | sudo docker pull rubyangxg/jd-qinglong 299 | else 300 | sudo docker pull rubyangxg/jd-qinglong:arm 301 | fi 302 | 303 | ad_port1=5701 304 | TIME y "请设置阿东网页登录端口:(数字80~65535),回车默认5701" 305 | while [ 1 ]; do 306 | read input 307 | if [ -z "${input}" ]; then 308 | input=5701 309 | fi 310 | if [ $input -gt 79 -a $input -lt 65536 ]; then 311 | grep_port=$(netstat -tlpn | grep "\b$input\b") 312 | if [ -n "$grep_port" ]; then 313 | get_random_port 5701 5800 314 | ad_port1=$PORT 315 | echo -e "端口 $input 已被占用,生成随机端口$ad_port1,配置成功\n" 316 | else 317 | echo -e "端口 $input 未被使用,配置成功\n" 318 | ad_port1=$input 319 | fi 320 | break 321 | else 322 | TIME r "别瞎搞,请输入端口:(数字80~65535)" 323 | fi 324 | done 325 | 326 | ad_port2=9527 327 | grep_port=$(netstat -tlpn | grep "\b$ad_port2\b") 328 | if [ -n "$grep_port" ]; then 329 | get_random_port 9527 9600 330 | ad_port2=$PORT 331 | TIME -e "端口 9527 已被占用,生成随机端口$ad_port2,配置成功\n" 332 | fi 333 | 334 | 335 | adbotDir="$(pwd)"/adbot 336 | if [ $synology == 1 ]; then 337 | if [ ! -d $adbotDir ]; then 338 | mkdir $adbotDir 339 | fi 340 | fi 341 | 342 | if [ $is_x86 == 1 ]; then 343 | docker run -d -p $ad_port1:8080 -p $ad_port2:8090 --name=webapp -e TZ=Asia/Shanghai --privileged=true -v "$(pwd)"/env.properties:/env.properties:rw -v "$(pwd)"/adbot:/adbot --restart always rubyangxg/jd-qinglong 344 | else 345 | docker run -d -p $ad_port1:8080 -p $ad_port2:8090 --name=webapp -e TZ=Asia/Shanghai -e "SPRING_PROFILES_ACTIVE=arm" --privileged=true -v "$(pwd)"/env.properties:/env.properties:rw -v "$(pwd)"/adbot:/adbot --restart always rubyangxg/jd-qinglong:arm 346 | fi 347 | 348 | while [ 1 ]; do 349 | if [ -f "./adbot/adbot" ]; then 350 | sleep 1s 351 | echo "阿东启动成功" 352 | break 353 | else 354 | echo "等待阿东启动完成,生成必要文件" 355 | sleep 1s 356 | fi 357 | done 358 | 359 | json='{"server_groups":[{"name":"webapp","disabled":false,"json":false,"urls":["ws://localhost:'$ad_port1'/ws/cq/"],"event_filter":[],"regex_filter":"","regex_replace":"","extra_header":{"User-Agent":["GMC"]}},{"name":"webapp_admin","disabled":false,"json":false,"urls":["ws://localhost:'$ad_port2'/ws/cq/"],"event_filter":[],"regex_filter":"","regex_replace":"","extra_header":{"User-Agent":["GMC"]}}]}' 360 | echo $json >./adbot/gmc_config.json 361 | 362 | cd adbot || exit 363 | chmod +x adbot 364 | 365 | echo "请创建一个机器人管理页面用户名:(字母数字下划线),回车默认admin" 366 | while [ 1 ]; do 367 | read input 368 | if [ -z "${input}" ]; then 369 | input="admin" 370 | fi 371 | if [[ $input =~ ^[A-Za-z0-9_]+$ ]]; then 372 | username=$input 373 | break 374 | else 375 | echo "别瞎搞,请输入用户名:(字母数字下划线),回车默认随机字符" 376 | fi 377 | done 378 | 379 | echo "请设置机器人管理页面密码:(字母数字下划线),回车默认adbotadmin" 380 | while [ 1 ]; do 381 | read input 382 | if [ -z "${input}" ]; then 383 | input="adbotadmin" 384 | fi 385 | if [[ $input =~ ^[A-Za-z0-9_]+$ ]]; then 386 | password=$input 387 | break 388 | else 389 | echo "别瞎搞,请输入密码:(字母数字下划线),回车默认随机字符" 390 | fi 391 | done 392 | 393 | killall adbot 394 | 395 | port=8100 396 | echo "请设置机器人管理页面登录端口:(数字80~65535),回车默认8100" 397 | while [ 1 ]; do 398 | read input 399 | if [ -z "${input}" ]; then 400 | input=8100 401 | fi 402 | if [ $input -gt 79 -a $input -lt 65536 ]; then 403 | grep_port=$(netstat -tlpn | grep "\b$input\b") 404 | if [ -n "$grep_port" ]; then 405 | get_random_port 8100 8200 406 | port=$PORT 407 | echo -e "端口 $input 已被占用,生成随机端口$port,配置成功\n" 408 | else 409 | echo -e "端口 $input 未被使用,配置成功\n" 410 | port=$input 411 | fi 412 | break 413 | else 414 | echo "别瞎搞,请输入端口:(数字80~65535)" 415 | fi 416 | done 417 | 418 | echo "机器人管理页面用户名是$username" 419 | echo "机器人管理页面密码是$password" 420 | echo "机器人管理页面端口是$port" 421 | echo "阿东网页登录端口$ad_port1" 422 | 423 | sed -i "s#^username=.*#username=$username#g" ./start-adbot.sh 424 | sed -i "s#^password=.*#password=$password#g" ./start-adbot.sh 425 | sed -i "s#^port=.*#port=$port#g" ./start-adbot.sh 426 | 427 | chmod +x ./start-adbot.sh 428 | bash ./start-adbot.sh restart 429 | 430 | hasError1=1 431 | for i in {1..10}; do 432 | urlstatus=$(curl -s -m 5 -IL http://localhost:$ad_port1/ping | grep 200) 433 | if [ "$urlstatus" == "" ]; then 434 | echo "检查是否可访问阿东页面...第 $i 次(共10次),如果机器太慢可能会检查超时,请自行确认服务正常。" 435 | sleep 5s 436 | else 437 | hasError1=0 438 | break 439 | fi 440 | done 441 | 442 | hasError2=1 443 | for i in {1..10}; do 444 | urlstatus=$(curl -u $username:$password -s -m 5 -IL http://localhost:$port | grep 200) 445 | if [ "$urlstatus" == "" ]; then 446 | echo "检查是否可访问机器人管理页面...第 $i 次(共10次)" 447 | sleep 6s 448 | else 449 | hasError2=0 450 | break 451 | fi 452 | done 453 | 454 | if [ $hasError1 == 1 -o $hasError2 == 1 ]; then 455 | echo "出错了,请联系作者,查看日志docker logs -f webapp" 456 | else 457 | sed -i '/^ADONG.URL.*/d' ../env.properties 458 | sed -i '$aADONG.URL=http://localhost:'$ad_port1'' ../env.properties 459 | echo "恭喜你安装完成,阿东网页:http://localhost:$ad_port1,阿东机器人登录入口:http://localhost:$port,外部访问请打开防火墙并且开放 $ad_port1 和 $port 端口!" 460 | fi 461 | 462 | -------------------------------------------------------------------------------- /adong/env.properties: -------------------------------------------------------------------------------- 1 | #请根据机器配置合理调整大小,最小为2,该值表示可以同时多少人使用 2 | SE_NODE_MAX_SESSIONS=4 3 | #青龙上传模式 4 | #1 对接阿东QQ/微信机器人,对接xdd等用户请配置1 5 | #0 对接阿东QQ/微信机器人,对接青龙面板的用户,请配置0 6 | #2 都传送,配置了xdd传xdd,配置了青龙传青龙 7 | QL_UPLOAD_DIRECT=0 8 | #########青龙######### 9 | #指定获取到的ck要上传到哪个青龙面板 10 | 11 | QL_URL_1=http://青龙ip或域名:5700 12 | QL_CLIENTID_1= 13 | QL_SECRET_1= 14 | #自定义名称,用于展示 15 | QL_LABEL_1=腾讯云 16 | #青龙面板ck最大容量,超量不上传 17 | QL_CAPACITY_1=40 18 | 19 | 20 | #第2套青龙(openid登录) 21 | QL_LABEL_2=阿里云 22 | QL_URL_2=http://10.0.0.200:5700 23 | QL_CLIENTID_2=dd 24 | QL_SECRET_2=dd 25 | #青龙面板ck最大容量,超量不上传 26 | QL_CAPACITY_2=40 27 | 28 | #########推送,这里面的推送是指有人上传了ck更新了ck会告知,类似青龙的通知。######### 29 | ## 通知环境变量 30 | ## 1. Server酱 31 | ## https://sct.ftqq.com 32 | ## 下方填写 SCHKEY 值或 SendKey 值 33 | PUSH_KEY="" 34 | 35 | ## 2. BARK 36 | ## 下方填写app提供的设备码,例如:https://api.day.app/123 那么此处的设备码就是123 37 | BARK_PUSH="" 38 | ## 下方填写推送声音设置,例如choo,具体值请在bark-推送铃声-查看所有铃声 39 | BARK_SOUND="" 40 | ## 下方填写推送消息分组,默认为"QingLong" 41 | BARK_GROUP="QingLong" 42 | 43 | ## 3. Telegram 44 | ## 下方填写自己申请@BotFather的Token,如10xxx4:AAFcqxxxxgER5uw 45 | TG_BOT_TOKEN="" 46 | ## 下方填写 @getuseridbot 中获取到的纯数字ID 47 | TG_USER_ID="" 48 | ## Telegram 代理IP(选填) 49 | ## 下方填写代理IP地址,代理类型为 http,比如您代理是 http://127.0.0.1:1080,则填写 "127.0.0.1" 50 | ## 如需使用,请自行解除下一行的注释 51 | TG_PROXY_HOST="" 52 | ## Telegram 代理端口(选填) 53 | ## 下方填写代理端口号,代理类型为 http,比如您代理是 http://127.0.0.1:1080,则填写 "1080" 54 | ## 如需使用,请自行解除下一行的注释 55 | TG_PROXY_PORT="" 56 | ## Telegram 代理的认证参数(选填) 57 | TG_PROXY_AUTH="" 58 | ## Telegram api自建反向代理地址(选填) 59 | ## 教程:https://www.hostloc.com/thread-805441-1-1.html 60 | ## 如反向代理地址 http://aaa.bbb.ccc 则填写 aaa.bbb.ccc 61 | ## 如需使用,请赋值代理地址链接,并自行解除下一行的注释 62 | TG_API_HOST="" 63 | 64 | ## 4. 钉钉 65 | ## 官方文档:https://developers.dingtalk.com/document/app/custom-robot-access 66 | ## 下方填写token后面的内容,只需 https://oapi.dingtalk.com/robot/send?access_token=XXX 等于=符号后面的XXX即可 67 | DD_BOT_TOKEN="" 68 | DD_BOT_SECRET="" 69 | 70 | ## 5. 企业微信机器人 71 | ## 官方说明文档:https://work.weixin.qq.com/api/doc/90000/90136/91770 72 | ## 下方填写密钥,企业微信推送 webhook 后面的 key 73 | QYWX_KEY="" 74 | 75 | ## 6. 企业微信应用 76 | ## 参考文档:http://note.youdao.com/s/HMiudGkb 77 | ## 下方填写素材库图片id(corpid,corpsecret,touser,agentid),素材库图片填0为图文消息, 填1为纯文本消息 78 | QYWX_AM="" 79 | 80 | ## 7. iGot聚合 81 | ## 参考文档:https://wahao.github.io/Bark-MP-helper 82 | ## 下方填写iGot的推送key,支持多方式推送,确保消息可达 83 | IGOT_PUSH_KEY="" 84 | 85 | ## 8. Push Plus 86 | ## 官方网站:http://www.pushplus.plus 87 | ## 下方填写您的Token,微信扫码登录后一对一推送或一对多推送下面的token,只填 PUSH_PLUS_TOKEN 默认为一对一推送 88 | PUSH_PLUS_TOKEN="" 89 | ## 一对一多推送(选填) 90 | ## 下方填写您的一对多推送的 "群组编码" ,(一对多推送下面->您的群组(如无则新建)->群组编码) 91 | ## 1. 需订阅者扫描二维码 2、如果您是创建群组所属人,也需点击“查看二维码”扫描绑定,否则不能接受群组消息推送 92 | PUSH_PLUS_USER="" 93 | 94 | ## 9. adbot 95 | ## gobot_url 推送到个人QQ: http://127.0.0.1/send_private_msg 群:http://127.0.0.1/send_group_msg 96 | ## gobot_token 填写在adbot文件设置的访问密钥 97 | ## gobot_qq 如果GOBOT_URL设置 /send_private_msg 则需要填入 user_id=个人QQ 相反如果是 /send_group_msg 则需要填入 group_id=QQ群 98 | ## adbot相关API https://docs.adbot.org/api 99 | GOBOT_URL="" 100 | GOBOT_TOKEN="" 101 | GOBOT_QQ="" 102 | ##################### 103 | 104 | #########XDD######### 105 | XDD_URL= 106 | XDD_TOKEN= 107 | ##################### 108 | 109 | #########页面自定义######### 110 | INDEX.TITLE=你的首页标题 111 | INDEX.NOTICE=你的公告 112 | ##################### 113 | 114 | #########自定义操作时限,单位 秒######### 115 | OP_TIME=180 116 | ##################### 117 | 118 | #########以下功能仅打赏可用######### 119 | 120 | #########打赏用户请配置######### 121 | VIP_CODE= 122 | ##################### 123 | 124 | #########QQBot监控群聊,此处配置qq群号######### 125 | MONITOR.QQ.GROUPID= 126 | ##################### 127 | 128 | #########qq机器人管理员######### 129 | MONITOR.QQ.MASTER= 130 | ##################### 131 | 132 | #########定时一对一推送######### 133 | #########资产一对一推送,,小时[0-23], 分钟[0-59],不要写00 02这种, 不支持同一天多时间段######### 134 | PUSH.QQ.ZICHAN=11 135 | PUSH.QQ.ZICHAN.MINUTES=24 136 | ########1表示同时给管理员发一份 137 | PUSH.MASTER=1 138 | #########个人白嫖榜一对一推送,小时[0-23], 分钟[0-59],不要写00 02这种, 不支持同一天多时间段######### 139 | PUSH.BP=15 140 | PUSH.BP.MINUTES=24 141 | ########1表示同时给管理员发一份 142 | PUSH.BP.MASTER=1 143 | #########CK失效一对一推送######### 144 | #########这个例子会每11:00 11:30 12:00 12:30检测CK失效并推送到绑定的微信或qq######## 145 | PUSH.CK.EXPIRE.HOUR=11,12 146 | PUSH.CK.EXPIRE.MINUTES=0,30 147 | ########1表示同时给管理员发一份,0不发给管理员 148 | PUSH.CK.EXPIRE.MASTER=1 149 | ##################### 150 | 151 | #########机器人管理平台用户名密码######### 152 | AD_ADMIN_USERNAME=admin 153 | AD_ADMIN_PASSWORD=adbotadmin 154 | ##################### 155 | 156 | #########机器人qq号和密码,必须配置######### 157 | ADBOT_QQ= 158 | ADBOT_QQ_PASSWORD= 159 | ##################### 160 | 161 | #########机器人回复消息模式,0私聊,1群聊######### 162 | ADBOT_REPLY_TYPE=0 163 | ##################### 164 | 165 | #########青龙选择模式 166 | # 0:显示青龙概要信息,让用户自己选择######### 167 | # 1:自动上传所有青龙中容量最大的,容量相同的,按配置顺序######### 168 | # 2:按配置顺序上传,满了则下一个######### 169 | QL_CHOOSE_TYPE=2 170 | ##################### 171 | 172 | #########微信机器人 173 | #########注意0:依赖于qq机器人的指令,所以qq机器人也要配置,先确保qq机器人能用,然后给MONITOR.QQ.MASTER(见上方配置)发送登录微信指令 174 | #########注意1:碰到提示在其他地方登陆,请打开微信机器人首页,点击【桌面微信已登陆】退出,然后再重新登陆。没有已登录提示的话,就重新扫码登陆一次 175 | #########注意2:微信的查询是靠昵称+备注识别的,如果机器人通讯录有多个昵称相同的,则会找备注,所以务必确保昵称+备注唯一性。 176 | #1启用微信机器人,0禁用 177 | WXBOT=0 178 | #微信机器人通讯录,管理员的备注 179 | WXBOT.MASTER=管理员123456 180 | #微信自动同意好友验证关键词,必须包含此关键词才自动同意,留空表示都能加 181 | WXBOT.ADDFRIEND.KEYWORD=阿东 182 | ##################### 183 | 184 | #########网页备注输入框,提示语,自行对应############ 185 | WEB.REMARK1.PLACEHOLDER=qq号绑定,方便查询 186 | WEB.REMARK2.PLACEHOLDER=qq号绑定,方便查询,填入此项忽略下面备注 187 | ####################################### 188 | 189 | #########是否启用公众号,1启用,0禁用 190 | #########公众号后台-》服务器配置-》服务器地址(URL)填写http(s)://阿东:端口/wx/portal/开发者ID(AppID),微信限制端口必须是80,自己搞下吧,用nginx方便一点 191 | WXMP=0 192 | #########公众号管理员openid,通过指令(设置管理员 [AD_ADMIN_USERNAME] [AD_ADMIN_PASSWORD])发送给公众号进行设置 193 | WXMP.MASTER=123456 194 | #########只适用于已认证的公众号,公众号后台-》设置与开发-》公众号设置-》注册信息-》原始ID 195 | WXMP.RZ= 196 | #########只适用于已认证的公众号,阿东的网页登录url,用于配置菜单,配置基本菜单请访问http://阿东服务器:端口/wx/menu/[你的公众号appId]/create 197 | WX.MP.WEBLOGIN.URL= 198 | 199 | wx.mp.configs[0].appId= 200 | wx.mp.configs[0].secret= 201 | wx.mp.configs[0].token= 202 | wx.mp.configs[0].aesKey= 203 | 204 | #阿东网页登录访问地址,http://localhost:5701 205 | ADONG.URL=http://localhost:5701 206 | 207 | #代理服务器,格式IP:端口,注意没有http(s):// 208 | #自己搭建的代理一定要配置上用户名密码做安全校验,否则被别人扫去偷跑流量了 209 | #代理搭建推荐tinyproxy(https://github.com/tinyproxy/tinyproxy),安装教程参考网上 210 | PROXY.URL= 211 | PROXY.USERNAME= 212 | PROXY.PASSWORD= 213 | 214 | # 215 | WXPUSHER.APPTOKEN= 216 | #WXPUSHER.MASTER= 217 | 218 | #是否允许用户自定义备注,0禁用自定义,1启用自定义,不配置默认1 219 | REMARK.ENABLED=1 -------------------------------------------------------------------------------- /docker.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | 3 | # 字体颜色配置 4 | Green="\033[32;1m" 5 | Red="\033[31m" 6 | Yellow="\033[33;1m" 7 | Blue="\033[36;1m" 8 | Font="\033[0m" 9 | GreenBG="\033[42;37m" 10 | RedBG="\033[41;37m" 11 | OK="${Green}[OK]${Font}" 12 | ERROR="${Red}[ERROR]${Font}" 13 | 14 | function print_ok() { 15 | echo 16 | echo -e " ${OK} ${Blue} $1 ${Font}" 17 | echo 18 | } 19 | function print_error() { 20 | echo 21 | echo -e "${ERROR} ${RedBG} $1 ${Font}" 22 | echo 23 | } 24 | 25 | function ECHOY() { 26 | echo 27 | echo -e "${Yellow} $1 ${Font}" 28 | echo 29 | } 30 | function ECHOB() { 31 | echo -e "${Blue} $1 ${Font}" 32 | } 33 | function ECHOG() { 34 | echo 35 | echo -e "${Green} $1 ${Font}" 36 | echo 37 | } 38 | 39 | if [[ ! "$USER" == "root" ]]; then 40 | print_error "警告:请使用root用户操作!~~" 41 | exit 1 42 | fi 43 | 44 | function system_check() { 45 | if [[ "$(. /etc/os-release && echo "$ID")" == "centos" ]]; then 46 | yum install -y sudo wget curl 47 | [[ ${CHONGXIN} == "YES" ]] && uninstall_centos_dk 48 | install_centos_dk 49 | elif [[ "$(. /etc/os-release && echo "$ID")" == "ubuntu" ]]; then 50 | apt-get -y update 51 | apt-get install -y sudo wget curl 52 | [[ ${CHONGXIN} == "YES" ]] && uninstall_ubuntu_dk 53 | install_ubuntu_dk 54 | elif [[ "$(. /etc/os-release && echo "$ID")" == "debian" ]]; then 55 | apt-get -y update 56 | apt-get install -y sudo wget curl 57 | [[ ${CHONGXIN} == "YES" ]] && uninstall_debian_dk 58 | install_debian_dk 59 | else 60 | print_error "本一键安装docker脚本只支持(centos、ubuntu和debian)!" 61 | exit 1 62 | fi 63 | } 64 | 65 | function jiance_dk() { 66 | if [[ -x "$(command -v docker)" ]]; then 67 | ECHOY "检测到docker存在,是否重新安装?" 68 | ECHOG "重新安装会把您现有的所有容器及镜像全部删除,请慎重!" 69 | while :; do 70 | export CHONGXIN="" 71 | read -p " 输入[ N/n ]退出安装,输入[ Y/y ]回车继续: " ANDK 72 | case $ANDK in 73 | [Yy]) 74 | export CHONGXIN="YES" 75 | break 76 | ;; 77 | [Nn]) 78 | export CHONGXIN="NO" 79 | ECHOG "您选择了退出安装程序!" 80 | sleep 1 81 | exit 1 82 | break 83 | ;; 84 | *) 85 | ECHOB "提示:请输入正确的选择!" 86 | ;; 87 | esac 88 | done 89 | fi 90 | } 91 | 92 | function install_centos_dk() { 93 | ECHOY "正在安装docker,请耐心等候..." 94 | sudo yum install -y yum-utils device-mapper-persistent-data lvm2 95 | yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo 96 | sudo yum install -y docker-ce docker-ce-cli containerd.io 97 | sed -i 's#ExecStart=/usr/bin/dockerd -H fd://#ExecStart=/usr/bin/dockerd#g' /lib/systemd/system/docker.service 98 | docker_daemon 99 | sudo systemctl daemon-reload 100 | sudo systemctl enable docker 101 | sudo systemctl restart docker 102 | if [[ -x "$(command -v docker)" ]]; then 103 | print_ok "docker安装完成" 104 | else 105 | print_error "docker安装失败" 106 | exit 1 107 | fi 108 | } 109 | 110 | function uninstall_centos_dk() { 111 | ECHOY "正在御载docker..." 112 | docker stop $(docker ps -a -q) 113 | docker rm $(docker ps -a -q) 114 | docker rmi $(docker images -q) 115 | sudo yum -y remove docker-ce.x86_64 116 | sudo yum -y remove docker-* 117 | sudo rm -rf /var/lib/docker 118 | sudo rm -rf /etc/docker /etc/systemd/system/docker.service.d 119 | sudo rm -rf /lib/systemd/system/{docker.service,docker.socket} 120 | rm /var/lib/dpkg/info/$nomdupaquet* -f 121 | } 122 | 123 | 124 | function install_ubuntu_dk() { 125 | ECHOY "正在安装docker,请耐心等候..." 126 | sudo apt-get install -y apt-transport-https ca-certificates curl gnupg2 software-properties-common 127 | curl -fsSL https://mirrors.ustc.edu.cn/docker-ce/linux/ubuntu/gpg | sudo apt-key add - 128 | if [[ $? -ne 0 ]];then 129 | curl -fsSL https://mirrors.ustc.edu.cn/docker-ce/linux/ubuntu/gpg | sudo apt-key add - 130 | fi 131 | sudo apt-key fingerprint 0EBFCD88 132 | if [[ `sudo apt-key fingerprint 0EBFCD88 | grep -c "0EBF CD88"` = '0' ]]; then 133 | print_error "密匙验证出错,或者没下载到密匙了,请检查网络,或者源有问题" 134 | exit 1 135 | fi 136 | sudo add-apt-repository -y "deb [arch=amd64] https://mirrors.ustc.edu.cn/docker-ce/linux/ubuntu $(lsb_release -cs) stable" 137 | sudo apt-get update 138 | sudo apt-get install -y docker-ce docker-ce-cli containerd.io 139 | sed -i 's#ExecStart=/usr/bin/dockerd -H fd://#ExecStart=/usr/bin/dockerd#g' /lib/systemd/system/docker.service 140 | docker_daemon 141 | sudo systemctl daemon-reload 142 | sudo systemctl restart docker 143 | if [[ -x "$(command -v docker)" ]]; then 144 | print_ok "docker安装完成" 145 | else 146 | print_error "docker安装失败" 147 | exit 1 148 | fi 149 | } 150 | 151 | function uninstall_ubuntu_dk() { 152 | ECHOY "正在御载docker..." 153 | docker stop $(docker ps -a -q) 154 | docker rm $(docker ps -a -q) 155 | docker rmi $(docker images -q) 156 | sudo apt-get -y autoremove docker-* --purge 157 | sudo apt-get -y autoremove --purge 158 | sudo apt-get -y clean 159 | sudo rm -rf /var/lib/docker 160 | sudo rm -rf /etc/docker /etc/systemd/system/docker.service.d 161 | sudo rm -rf /lib/systemd/system/{docker.service,docker.socket} 162 | rm /var/lib/dpkg/info/$nomdupaquet* -f 163 | } 164 | 165 | function install_debian_dk() { 166 | ECHOY "正在安装docker,请耐心等候..." 167 | sudo apt install -y apt-transport-https ca-certificates curl gnupg2 software-properties-common 168 | curl -fsSL https://mirrors.ustc.edu.cn/docker-ce/linux/debian/gpg | sudo apt-key add - 169 | if [[ $? -ne 0 ]];then 170 | curl -fsSL https://mirrors.ustc.edu.cn/docker-ce/linux/debian/gpg | sudo apt-key add - 171 | fi 172 | sudo apt-key fingerprint 0EBFCD88 173 | if [[ `sudo apt-key fingerprint 0EBFCD88 | grep -c "0EBF CD88"` = '0' ]]; then 174 | print_error "密匙验证出错,或者没下载到密匙了,请检查网络,或者上游有问题" 175 | exit 1 176 | fi 177 | sudo add-apt-repository -y "deb [arch=amd64] https://mirrors.ustc.edu.cn/docker-ce/linux/debian $(lsb_release -cs) stable" 178 | sudo apt update 179 | sudo apt install -y docker-ce docker-ce-cli containerd.io 180 | sed -i 's#ExecStart=/usr/bin/dockerd -H fd://#ExecStart=/usr/bin/dockerd#g' /lib/systemd/system/docker.service 181 | docker_daemon 182 | sudo systemctl daemon-reload 183 | sudo systemctl restart docker 184 | if [[ -x "$(command -v docker)" ]]; then 185 | print_ok "docker安装完成" 186 | else 187 | print_error "docker安装失败" 188 | exit 1 189 | fi 190 | } 191 | 192 | function uninstall_debian_dk() { 193 | ECHOY "正在御载docker..." 194 | docker stop $(docker ps -a -q) 195 | docker rm $(docker ps -a -q) 196 | docker rmi $(docker images -q) 197 | sudo apt -y autoremove docker-* --purge 198 | sudo apt -y autoremove --purge 199 | sudo apt -y clean 200 | sudo rm -rf /var/lib/docker 201 | sudo rm -rf /etc/docker /etc/systemd/system/docker.service.d 202 | sudo rm -rf /lib/systemd/system/{docker.service,docker.socket} 203 | rm /var/lib/dpkg/info/$nomdupaquet* -f 204 | } 205 | 206 | function hello_world() { 207 | ECHOY "测试docker拉取镜像是否成功" 208 | sudo docker run hello-world |tee build.log 209 | if [[ `docker ps -a | grep -c "hello-world"` -ge '1' ]] && [[ `grep -c "hub.docker.com" build.log` -ge '1' ]]; then 210 | ECHOG "测试镜像拉取成功,正在删除测试镜像..." 211 | docker stop $(docker ps -a -q) 212 | docker rm $(docker ps -a -q) 213 | docker rmi $(docker images -q) 214 | rm -fr build.log 215 | ECHOY "测试镜像删除完毕" 216 | print_ok "docker安装成功" 217 | else 218 | ECHOY "docker虽然安装成功但是拉取镜像失败,这个原因很多是因为以前的docker没御载完全造成的,或者容器网络问题" 219 | ECHOY "重启服务器后,用 sudo docker run hello-world 命令测试吧,能拉取成功就成了" 220 | rm -fr build.log 221 | sleep 2 222 | exit 1 223 | fi 224 | } 225 | 226 | function docker_daemon() { 227 | sudo mkdir -p /etc/docker 228 | cat >/etc/docker/daemon.json <<-EOF 229 | { 230 | "registry-mirrors": ["https://qndprgwv.mirror.aliyuncs.com"], 231 | "runtimes": { 232 | "nvidia": { 233 | "path": "/usr/bin/nvidia-container-runtime", 234 | "runtimeArgs": [] 235 | } 236 | } 237 | } 238 | EOF 239 | chmod +x /etc/docker/daemon.json 240 | } 241 | 242 | memu() { 243 | jiance_dk 244 | system_check 245 | hello_world 246 | } 247 | 248 | memu "$@" 249 | -------------------------------------------------------------------------------- /feverrun.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | 3 | TIME() { 4 | [[ -z "$1" ]] && { 5 | echo -ne " " 6 | } || { 7 | case $1 in 8 | r) export Color="\e[31;1m";; 9 | g) export Color="\e[32;1m";; 10 | b) export Color="\e[34;1m";; 11 | y) export Color="\e[33;1m";; 12 | z) export Color="\e[35;1m";; 13 | l) export Color="\e[36;1m";; 14 | esac 15 | [[ $# -lt 2 ]] && echo -e "\e[36m\e[0m ${1}" || { 16 | echo -e "\e[36m\e[0m ${Color}${2}\e[0m" 17 | } 18 | } 19 | } 20 | if [ "$(grep -c \"token\" /ql/config/auth.json)" = 0 ]; then 21 | echo 22 | TIME r "提示:请先登录青龙面板再执行命令安装任务!" 23 | echo 24 | exit 1 25 | fi 26 | dir_shell=/ql/config 27 | dir_script=/ql/scripts 28 | config_shell_path=$dir_shell/config.sh 29 | extra_shell_path=$dir_shell/extra.sh 30 | code_shell_path=$dir_shell/code.sh 31 | disable_shell_path=$dir_script/disableDuplicateTasksImplement.py 32 | wskey_shell_path=$dir_script/wskey.py 33 | crypto_shell_path=$dir_script/crypto-js.js 34 | wx_jysz_shell_path=$dir_script/wx_jysz.js 35 | OpenCard_shell_path=$dir_script/raw_jd_OpenCard.py 36 | task_before_shell_path=$dir_shell/task_before.sh 37 | sample_shell_path=/ql/sample/config.sample.sh 38 | chmod +x /ql/repo/ghproxy.sh && source /ql/repo/ghproxy.sh 39 | rm -rf /ql/repo/ghproxy.sh 40 | mkdir -p /ql/qlwj 41 | 42 | mkdir -p /ql/scripts/utils 43 | curl -fsSL ${curlurl}/Aaron-lv/utils/jd_jxmc.js > /ql/scripts/utils/jd_jxmc.js 44 | curl -fsSL ${curlurl}/Aaron-lv/utils/jd_jxmcToken.js > /ql/scripts/utils/jd_jxmcToken.js 45 | curl -fsSL ${curlurl}/Aaron-lv/jd_cfd_sharecodes.ts > /ql/scripts/jd_cfd_sharecodes.ts 46 | curl -fsSL ${curlurl}/Aaron-lv/jd_jxmc_sharecodes.ts > /ql/scripts/jd_jxmc_sharecodes.ts 47 | curl -fsSL ${curlurl}/Aaron-lv/TS_USER_AGENTS.ts > /ql/scripts/TS_USER_AGENTS.ts 48 | 49 | TIME l "拉取crypto-js.js" 50 | curl -fsSL ${curlurl}/Aaron-lv/crypto-js.js > /ql/qlwj/crypto-js.js 51 | TIME l "拉取config.sample.sh" 52 | curl -fsSL ${curlurl}/feverrun/config.sample.sh > /ql/qlwj/config.sample.sh 53 | TIME l "拉取extra.sh" 54 | curl -fsSL ${curlurl}/feverrun/extra.sh > /ql/qlwj/extra.sh 55 | TIME l "拉取jd_OpenCard.py" 56 | curl -fsSL ${curlurl}/Aaron-lv/jd_OpenCard.py > /ql/qlwj/raw_jd_OpenCard.py 57 | TIME l "拉取wskey.py" 58 | curl -fsSL ${curlurl}/Aaron-lv/wskey.py > /ql/qlwj/wskey.py 59 | TIME l "拉取disableDuplicateTasksImplement.py" 60 | curl -fsSL ${curlurl}/Aaron-lv/disableDuplicateTasksImplement.py > /ql/qlwj/disableDuplicateTasksImplement.py 61 | TIME l "拉取jd_get_share_code.js" 62 | curl -fsSL ${curlurl}/Aaron-lv/jd_get_share_code.js > /ql/qlwj/jd_get_share_code.js 63 | TIME l "拉取jdCookie.js" 64 | curl -fsSL ${curlurl}/Aaron-lv/jdCookie.js > /ql/qlwj/jdCookie.js 65 | TIME l "拉取jd_cleancartAll.js" 66 | curl -fsSL ${curlurl}/Aaron-lv/jd_cleancartAll.js > /ql/qlwj/jd_cleancartAll.js 67 | TIME l "拉取1-5.sh" 68 | curl -fsSL ${curlurl}/Aaron-lv/jd/1-5.sh > /ql/jd/1-5.sh 69 | TIME l "拉取6-10.sh" 70 | curl -fsSL ${curlurl}/Aaron-lv/jd/6-10.sh > /ql/jd/6-10.sh 71 | TIME l "拉取jd_sms_login.py" 72 | curl -fsSL ${curlurl}/Aaron-lv/jd/jd_sms_login.py > /ql/jd/jd_sms_login.py 73 | TIME l "拉取jd_sms_login.py" 74 | curl -fsSL ${curlurl}/Aaron-lv/jd_sms_login.py > /ql/qlwj/jd_sms_login.py 75 | TIME l "拉取ckck3.sh" 76 | curl -fsSL ${curlurl}/Aaron-lv/ckck3.sh > /ql/qlwj/ckck3.sh 77 | chmod -R +x /ql/qlwj 78 | cp -Rf /ql/qlwj/config.sample.sh /ql/config/config.sh 79 | cp -Rf /ql/qlwj/config.sample.sh /ql/sample/config.sample.sh 80 | cp -Rf /ql/qlwj/extra.sh /ql/config/extra.sh 81 | cp -Rf /ql/qlwj/extra.sh /ql/sample/extra.sample.sh 82 | cp -Rf /ql/qlwj/raw_jd_OpenCard.py /ql/scripts/raw_jd_OpenCard.py 83 | cp -Rf /ql/qlwj/wskey.py /ql/scripts/wskey.py 84 | cp -Rf /ql/qlwj/disableDuplicateTasksImplement.py /ql/scripts/disableDuplicateTasksImplement.py 85 | cp -Rf /ql/qlwj/jd_get_share_code.js /ql/scripts/jd_get_share_code.js 86 | cp -Rf /ql/qlwj/jdCookie.js /ql/scripts/jdCookie.js 87 | cp -Rf /ql/qlwj/jd_cleancartAll.js /ql/scripts/jd_cleancartAll.js 88 | cp -Rf /ql/qlwj/ckck3.sh /ql/scripts/ckck3.sh 89 | cp -Rf /ql/qlwj/jd_sms_login.py /ql/scripts/jd_sms_login.py 90 | echo 91 | # 将 extra.sh 添加到定时任务 92 | if [ "$(grep -c extra /ql/config/crontab.list)" = 0 ]; then 93 | echo 94 | TIME g "添加任务 [每2小时更新任务]" 95 | echo 96 | # 获取token 97 | token=$(cat /ql/config/auth.json | jq --raw-output .token) 98 | curl -s -H 'Accept: application/json' -H "Authorization: Bearer $token" -H 'Content-Type: application/json;charset=UTF-8' -H 'Accept-Language: zh-CN,zh;q=0.9' --data-binary '{"name":"每4小时更新任务","command":"ql extra","schedule":"40 0-23/2 * * *"}' --compressed 'http://127.0.0.1:5700/api/crons?t=1624782068473' 99 | fi 100 | sleep 1 101 | echo 102 | if [ "$(grep -c wskey.py /ql/config/crontab.list)" = 0 ]; then 103 | echo 104 | TIME g "添加任务 [每4小时转换WSKEY]" 105 | echo 106 | # 获取token 107 | token=$(cat /ql/config/auth.json | jq --raw-output .token) 108 | curl -s -H 'Accept: application/json' -H "Authorization: Bearer $token" -H 'Content-Type: application/json;charset=UTF-8' -H 'Accept-Language: zh-CN,zh;q=0.9' --data-binary '{"name":"每4小时转换WSKEY","command":"task wskey.py","schedule":"58 0-23/4 * * *"}' --compressed 'http://127.0.0.1:5700/api/crons?t=1633428022377' 109 | fi 110 | sleep 1 111 | echo 112 | # 将 bot 添加到定时任务 113 | if [ "$(grep -c bot /ql/config/crontab.list)" = 0 ]; then 114 | echo 115 | TIME g "添加任务 [拉取机器人]" 116 | echo 117 | # 获取token 118 | token=$(cat /ql/config/auth.json | jq --raw-output .token) 119 | curl -s -H 'Accept: application/json' -H "Authorization: Bearer $token" -H 'Content-Type: application/json;charset=UTF-8' -H 'Accept-Language: zh-CN,zh;q=0.9' --data-binary '{"name":"拉取机器人","command":"ql bot","schedule":"13 14 * * 0"}' --compressed 'http://127.0.0.1:5700/api/crons?t=1626247933219' 120 | fi 121 | sleep 1 122 | echo 123 | # 将 jd_sms_login.py 添加到定时任务 124 | if [ "$(grep -c jd_sms_login.py /ql/config/crontab.list)" = 0 ]; then 125 | echo 126 | TIME g "添加任务 [获取CK脚本]" 127 | echo 128 | # 获取token 129 | token=$(cat /ql/config/auth.json | jq --raw-output .token) 130 | curl -s -H 'Accept: application/json' -H "Authorization: Bearer $token" -H 'Content-Type: application/json;charset=UTF-8' -H 'Accept-Language: zh-CN,zh;q=0.9' --data-binary '{"name":"获取CK脚本","command":"task jd_sms_login.py","schedule":"8 8,15,20 * * *"}' --compressed 'http://127.0.0.1:5700/api/crons?t=1634041221417' 131 | fi 132 | sleep 1 133 | echo 134 | # 将 ckck3.sh 添加到定时任务 135 | if [ "$(grep -c ckck3.sh /ql/config/crontab.list)" = 0 ]; then 136 | echo 137 | TIME g "添加任务 [wskey新转换]" 138 | echo 139 | # 获取token 140 | token=$(cat /ql/config/auth.json | jq --raw-output .token) 141 | curl -s -H 'Accept: application/json' -H "Authorization: Bearer $token" -H 'Content-Type: application/json;charset=UTF-8' -H 'Accept-Language: zh-CN,zh;q=0.9' --data-binary '{"name":"wskey新转换","command":"task ckck3.sh","schedule":"8 8,15,20 * * *"}' --compressed 'http://127.0.0.1:5700/api/crons?t=1634041221467' 142 | fi 143 | sleep 1 144 | echo 145 | # 将 jd_OpenCard.py 添加到定时任务 146 | if [ "$(grep -c jd_OpenCard.py /ql/config/crontab.list)" = 0 ]; then 147 | echo 148 | TIME g "添加任务 [JD入会开卡领取京豆]" 149 | echo 150 | # 获取token 151 | token=$(cat /ql/config/auth.json | jq --raw-output .token) 152 | curl -s -H 'Accept: application/json' -H "Authorization: Bearer $token" -H 'Content-Type: application/json;charset=UTF-8' -H 'Accept-Language: zh-CN,zh;q=0.9' --data-binary '{"name":"JD入会开卡领取京豆","command":"task jd_OpenCard.py","schedule":"8 8,15,20 * * *"}' --compressed 'http://127.0.0.1:5700/api/crons?t=1634041221437' 153 | fi 154 | sleep 1 155 | echo 156 | # 将 7天删除日志 添加到定时任务 157 | if [ "$(grep -c rmlog /ql/config/crontab.list)" = 0 ]; then 158 | echo 159 | TIME g "添加任务 [每隔7天删除日志]" 160 | echo 161 | # 获取token 162 | token=$(cat /ql/config/auth.json | jq --raw-output .token) 163 | curl -s -H 'Accept: application/json' -H "Authorization: Bearer $token" -H 'Content-Type: application/json;charset=UTF-8' -H 'Accept-Language: zh-CN,zh;q=0.9' --data-binary '{"name":"每隔7天删除日志","command":"ql rmlog 7","schedule":"0 2 */7 * *"}' --compressed 'http://127.0.0.1:5700/api/crons?t=1640581005650' 164 | fi 165 | task wskey.py 166 | echo 167 | TIME y "拉取feverrun大佬的自动提交助力码脚本(要找库的作者过白名单)" 168 | echo 169 | rm -fr /ql/azcg.log 170 | ql extra |tee azcg.log 171 | if [[ `ls -a |grep -c "成功" /ql/azcg.log` -ge '1' ]]; then 172 | rm -fr /ql/azcg.log 173 | else 174 | TIME r "脚本安装失败,请再次执行一键安装脚本尝试安装,或看看青龙面板有没有[每x小时更新任务],有的话执行这个拉取任务试试" 175 | rm -fr /ql/azcg.log 176 | echo "Error" > /ql/config/Error 177 | fi 178 | exit 0 179 | -------------------------------------------------------------------------------- /feverrun/auth.json: -------------------------------------------------------------------------------- 1 | {"username":"admin","password":"admin"} 2 | -------------------------------------------------------------------------------- /feverrun/authbk.json: -------------------------------------------------------------------------------- 1 | {"username":"admin","password":"123456","token":"eyJhbGciOiJIUzM4NCIsInR5cCI6IkpXVCJ9.eyJkYXRhIjoiWXM2bERhaU5rUzFqQkRGcTJ1aWJnVW9NZzF5dVRTdTVoaTY1b1QtUVluWjdiSV8xcEt2WEI4b3pyVzJlc0NDWCIsImlhdCI6MTYzNzQ5MzkyMSwiZXhwIjoxNjM3NzUzMTIxfQ.fKpo18dQ_zEL9tWwqylWJoTrSE2a0ggd3SayWLuh1JRX-TTubbGJV6zTi6tmb5Cf","tokens":{"desktop":"eyJhbGciOiJIUzM4NCIsInR5cCI6IkpXVCJ9.eyJkYXRhIjoiWXM2bERhaU5rUzFqQkRGcTJ1aWJnVW9NZzF5dVRTdTVoaTY1b1QtUVluWjdiSV8xcEt2WEI4b3pyVzJlc0NDWCIsImlhdCI6MTYzNzQ5MzkyMSwiZXhwIjoxNjM3NzUzMTIxfQ.fKpo18dQ_zEL9tWwqylWJoTrSE2a0ggd3SayWLuh1JRX-TTubbGJV6zTi6tmb5Cf"},"lastlogon":1637493921646,"retries":0,"lastip":" 223.74.131.203","lastaddr":" 骞夸笢鐪佹儬宸炲競 | 绉诲姩","platform":"desktop","isTwoFactorChecking":false} 2 | -------------------------------------------------------------------------------- /feverrun/curtinlv_JD-Script_jd_tool_dl.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python3 2 | # -*- coding: utf-8 -* 3 | ''' 4 | Author: Curtin 5 | 功能:脚本依赖下载 6 | TG交流 https://t.me/topstyle996 7 | TG频道 https://t.me/TopStyle2021 8 | cron: 0 5 * * * 9 | new Env('脚本依赖下载 for Curtinlv 仓库'); 10 | ''' 11 | 12 | try: 13 | import requests 14 | except Exception as e: 15 | print(e, "\n缺少requests 模块,请执行命令安装:pip3 install requests") 16 | exit(3) 17 | import os 18 | def getTool(toolName, a=0): 19 | if a == 0: 20 | a += 1 21 | try: 22 | url = 'https://ghproxy.com/https://raw.githubusercontent.com/curtinlv/JD-Script/main/' + toolName 23 | response = requests.get(url) 24 | if response.status_code == 404: 25 | print(f"[{toolName}] 下载连接有误!") 26 | print(f"下载失败:[{toolName}]") 27 | return 28 | if 'urtinlv' in response.text: 29 | with open(toolName, "w+", encoding="utf-8") as f: 30 | f.write(response.text) 31 | print(f"已添加依赖:{toolName}") 32 | else: 33 | if a < 5: 34 | a += 1 35 | return getTool(toolName, a) 36 | else: 37 | print(f"下载失败:{toolName}") 38 | except: 39 | if a < 5: 40 | a += 1 41 | return getTool(toolName, a) 42 | else: 43 | print(f"下载失败:{toolName}") 44 | 45 | if __name__ == '__main__': 46 | file_name = ['jd_cookie.py', 'msg.py', 'sendNotify.py'] 47 | for f in file_name: 48 | if os.path.exists(f): 49 | os.remove(f) 50 | print(f"开始下载依赖:{f}") 51 | getTool(f) 52 | 53 | -------------------------------------------------------------------------------- /feverrun/disableDuplicateTasksImplement.py: -------------------------------------------------------------------------------- 1 | # -*- coding:utf-8 -*- 2 | 3 | # -*- coding:utf-8 -*- 4 | # 环境变量 5 | #1️⃣RES_SUB 6 | #2️⃣RES_ONLY 7 | #说明 8 | #1️⃣需保留的脚本前缀列表(不管是否重复),用 & 分割,默认保留 feverrun_my_scripts&JDHelloWorld_jd_scripts 9 | #2️⃣保留后是否禁用重复的带其他前缀脚本,默认禁用 10 | 11 | #示例 12 | #1️⃣Aaron-lv_sync&smiek2121_scripts 13 | #2️⃣true 或 false 14 | """ 15 | cron: 20 10 */7 * * 16 | new Env('禁用重复任务'); 17 | """ 18 | 19 | import json 20 | import logging 21 | import os 22 | import sys 23 | import time 24 | import traceback 25 | 26 | import requests 27 | 28 | logger = logging.getLogger(name=None) # 创建一个日志对象 29 | logging.Formatter("%(message)s") # 日志内容格式化 30 | logger.setLevel(logging.INFO) # 设置日志等级 31 | logger.addHandler(logging.StreamHandler()) # 添加控制台日志 32 | # logger.addHandler(logging.FileHandler(filename="text.log", mode="w")) # 添加文件日志 33 | 34 | 35 | ip = "localhost" 36 | sub_str = os.getenv("RES_SUB", "feverrun") 37 | sub_list = sub_str.split("&") 38 | res_only = os.getenv("RES_ONLY", True) 39 | headers = { 40 | "Accept": "application/json", 41 | "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.131 Safari/537.36", 42 | } 43 | 44 | 45 | def load_send() -> None: 46 | logger.info("加载推送功能中...") 47 | global send 48 | send = None 49 | cur_path = os.path.abspath(os.path.dirname(__file__)) 50 | sys.path.append(cur_path) 51 | if os.path.exists(cur_path + "/notify.py"): 52 | try: 53 | from notify import send 54 | except Exception: 55 | send = None 56 | logger.info(f"❌加载通知服务失败!!!\n{traceback.format_exc()}") 57 | 58 | 59 | def get_tasklist() -> list: 60 | tasklist = [] 61 | t = round(time.time() * 1000) 62 | url = f"http://{ip}:5700/api/crons?searchValue=&t={t}" 63 | response = requests.get(url=url, headers=headers) 64 | datas = json.loads(response.content.decode("utf-8")) 65 | if datas.get("code") == 200: 66 | tasklist = datas.get("data") 67 | return tasklist 68 | 69 | 70 | def filter_res_sub(tasklist: list) -> tuple: 71 | filter_list = [] 72 | res_list = [] 73 | for task in tasklist: 74 | for sub in sub_list: 75 | if task.get("command").find(sub) == -1: 76 | flag = False 77 | else: 78 | flag = True 79 | break 80 | if flag: 81 | res_list.append(task) 82 | else: 83 | filter_list.append(task) 84 | return filter_list, res_list 85 | 86 | 87 | def get_index(lst: list, item: str) -> list: 88 | return [index for (index, value) in enumerate(lst) if value == item] 89 | 90 | 91 | def get_duplicate_list(tasklist: list) -> tuple: 92 | logger.info("\n=== 第一轮初筛开始 ===") 93 | 94 | ids = [] 95 | names = [] 96 | cmds = [] 97 | for task in tasklist: 98 | ids.append(task.get("_id")) 99 | names.append(task.get("name")) 100 | cmds.append(task.get("command")) 101 | 102 | name_list = [] 103 | for i, name in enumerate(names): 104 | if name not in name_list: 105 | name_list.append(name) 106 | 107 | tem_tasks = [] 108 | tem_ids = [] 109 | dup_ids = [] 110 | for name2 in name_list: 111 | name_index = get_index(names, name2) 112 | for i in range(len(name_index)): 113 | if i == 0: 114 | logger.info(f"【✅保留】{cmds[name_index[0]]}") 115 | tem_tasks.append(tasklist[name_index[0]]) 116 | tem_ids.append(ids[name_index[0]]) 117 | else: 118 | logger.info(f"【🚫禁用】{cmds[name_index[i]]}") 119 | dup_ids.append(ids[name_index[i]]) 120 | logger.info("") 121 | 122 | logger.info("=== 第一轮初筛结束 ===") 123 | 124 | return tem_ids, tem_tasks, dup_ids 125 | 126 | 127 | def reserve_task_only( 128 | tem_ids: list, tem_tasks: list, dup_ids: list, res_list: list 129 | ) -> list: 130 | if len(tem_ids) == 0: 131 | return tem_ids 132 | 133 | logger.info("\n=== 最终筛选开始 ===") 134 | task3 = None 135 | for task1 in tem_tasks: 136 | for task2 in res_list: 137 | if task1.get("name") == task2.get("name"): 138 | dup_ids.append(task1.get("_id")) 139 | logger.info(f"【✅保留】{task2.get('command')}") 140 | task3 = task1 141 | if task3: 142 | logger.info(f"【🚫禁用】{task3.get('command')}\n") 143 | task3 = None 144 | logger.info("=== 最终筛选结束 ===") 145 | return dup_ids 146 | 147 | 148 | def disable_duplicate_tasks(ids: list) -> None: 149 | t = round(time.time() * 1000) 150 | url = f"http://{ip}:5700/api/crons/disable?t={t}" 151 | data = json.dumps(ids) 152 | headers["Content-Type"] = "application/json;charset=UTF-8" 153 | response = requests.put(url=url, headers=headers, data=data) 154 | datas = json.loads(response.content.decode("utf-8")) 155 | if datas.get("code") != 200: 156 | logger.info(f"❌出错!!!错误信息为:{datas}") 157 | else: 158 | logger.info("🎉成功禁用重复任务~") 159 | 160 | 161 | def get_token() -> str or None: 162 | try: 163 | with open("/ql/config/auth.json", "r", encoding="utf-8") as f: 164 | data = json.load(f) 165 | except Exception: 166 | logger.info(f"❌无法获取 token!!!\n{traceback.format_exc()}") 167 | send("💔禁用重复任务失败", "无法获取 token!!!") 168 | exit(1) 169 | return data.get("token") 170 | 171 | 172 | if __name__ == "__main__": 173 | logger.info("===> 禁用重复任务开始 <===") 174 | load_send() 175 | token = get_token() 176 | headers["Authorization"] = f"Bearer {token}" 177 | 178 | # 获取过滤后的任务列表 179 | sub_str = "\n".join(sub_list) 180 | logger.info(f"\n=== 你选择过滤的任务前缀为 ===\n{sub_str}") 181 | tasklist = get_tasklist() 182 | if len(tasklist) == 0: 183 | logger.info("❌无法获取 tasklist!!!") 184 | exit(1) 185 | filter_list, res_list = filter_res_sub(tasklist) 186 | 187 | tem_ids, tem_tasks, dup_ids = get_duplicate_list(filter_list) 188 | # 是否在重复任务中只保留设置的前缀 189 | if res_only: 190 | ids = reserve_task_only(tem_ids, tem_tasks, dup_ids, res_list) 191 | else: 192 | ids = dup_ids 193 | logger.info("你选择保留除了设置的前缀以外的其他任务") 194 | 195 | sum = f"所有任务数量为:{len(tasklist)}" 196 | filter = f"过滤的任务数量为:{len(res_list)}" 197 | disable = f"禁用的任务数量为:{len(ids)}" 198 | logging.info("\n=== 禁用数量统计 ===\n" + sum + "\n" + filter + "\n" + disable) 199 | 200 | if len(ids) == 0: 201 | logger.info("😁没有重复任务~") 202 | else: 203 | disable_duplicate_tasks(ids) 204 | if send: 205 | send("💖禁用重复任务成功", f"\n{sum}\n{filter}\n{disable}") 206 | -------------------------------------------------------------------------------- /feverrun/doocode.py: -------------------------------------------------------------------------------- 1 | #调度配置 0,1 0 * * 1 python3 /ql/config/doocode.py 2 | from telethon import TelegramClient 3 | import os 4 | 5 | 6 | current_path = os.path.dirname(os.path.abspath(__file__)) 7 | os.chdir(current_path) 8 | client = TelegramClient("bot", "你的APIID", "你的IP秘钥", connection_retries=None).start() 9 | 10 | async def main(): 11 | await client.send_message("@JDShareCodebot", "要发送的互助码命令") 12 | await client.send_message("@JDShareCodebot", "要发送的互助码命令") 13 | await client.send_message("@JDShareCodebot", "要发送的互助码命令") 14 | await client.send_message("@JDShareCodebot", "要发送的互助码命令") 15 | await client.send_message("@JDShareCodebot", "要发送的互助码命令") 16 | await client.send_message("@JDShareCodebot", "要发送的互助码命令") 17 | await client.send_message("@JDShareCodebot", "要发送的互助码命令") 18 | await client.send_read_acknowledge("@JDShareCodebot") 19 | 20 | 21 | with client: 22 | client.loop.run_until_complete(main()) 23 | -------------------------------------------------------------------------------- /feverrun/extra.sh: -------------------------------------------------------------------------------- 1 | 2 | #!/usr/bin/env bash 3 | 4 | ## 添加你需要重启自动执行的任意命令,比如 ql repo 5 | ## 安装node依赖使用 pnpm install -g xxx xxx 6 | ## 安装python依赖使用 pip3 install PrettyTable 7 | #pip3 install PrettyTable 8 | ql repo https://github.com/feverrun/my_scripts.git "jd_|jx_|jddj|getCookie|getJDCookie" "backUp" "^(jd|JD|JS)[^_]|USER|sendNotify|utils" 9 | ql repo https://github.com/smiek2121/scripts.git "jd_|gua_" "" "ZooFaker_Necklace.js|JDJRValidator_Pure.js|sign_graphics_validate.js|cleancart_activity.js|jdCookie.js|sendNotify.js" 10 | task disableDuplicateTasksImplement.py 11 | -------------------------------------------------------------------------------- /feverrun/jd/1-5.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | 3 | # 需要修改的变量,把1-5改成6-10就是提取6-10帐号的助力码,类推,11-15、16-20,一个文件5个助力码,一个TG号 4 | # API提取网站< https://my.telegram.org/auth >,没有API的ID跟密匙的就别修改 api_id 跟 api_hash 的说明内容,有就填写正确的ID跟密匙 5 | 6 | export TG="1-5" 7 | export api_id="填写您Telegram的API的ID" 8 | export api_hash="填写您Telegram的API的密匙" 9 | 10 | export RWWJ="${TG}rw.sh" 11 | export CRON="$(date +163764742%M%S)" 12 | export CRON1="$(date +163764761%M%S)" 13 | export CRON2="$(date +%M)" 14 | export token=$(cat /ql/config/auth.json | jq --raw-output .token) 15 | [[ -d '/ql/log/jd_get_share_code' ]] && rm -rf /ql/log/jd_get_share_code/* 16 | if [[ ! "${api_id}" == "填写您Telegram的API的ID" ]] && [[ ! "${api_hash}" == "填写您Telegram的API的密匙" ]]; then 17 | task jd_get_share_code.js desi JD_COOKIE "${TG}" 18 | lOGName="$(ls -a /ql/log/jd_get_share_code |egrep -o [0-9]+-[0-9]+-[0-9]+-[0-9]+-[0-9]+-[0-9]+.log |awk 'END {print}')" 19 | FARM="$(grep '/farm' /ql/log/jd_get_share_code/${lOGName})" 20 | PET="$(grep '/pet' /ql/log/jd_get_share_code/${lOGName})" 21 | BEAN="$(grep '/bean' /ql/log/jd_get_share_code/${lOGName})" 22 | JXFACTORY="$(grep '/jxfactory' /ql/log/jd_get_share_code/${lOGName})" 23 | SGMH="$(grep '/sgmh' /ql/log/jd_get_share_code/${lOGName})" 24 | HEALTH="$(grep '/health' /ql/log/jd_get_share_code/${lOGName})" 25 | cat >/ql/jd/${TG}.py <<-EOF 26 | #调度配置 0,1 0 * * 1 python3 /ql/jd/${TG}.py 27 | from telethon import TelegramClient 28 | import os 29 | current_path = os.path.dirname(os.path.abspath(__file__)) 30 | os.chdir(current_path) 31 | client = TelegramClient("bot${TG}", "${api_id}", "${api_hash}", connection_retries=None).start() 32 | async def main(): 33 | await client.send_message("@chriszhuli_bot", "${FARM}") 34 | await client.send_message("@chriszhuli_bot", "${PET}") 35 | await client.send_message("@chriszhuli_bot", "${BEAN}") 36 | await client.send_message("@chriszhuli_bot", "${JXFACTORY}") 37 | await client.send_message("@chriszhuli_bot", "${SGMH}") 38 | await client.send_message("@chriszhuli_bot", "${HEALTH}") 39 | await client.send_read_acknowledge("@chriszhuli_bot") 40 | with client: 41 | client.loop.run_until_complete(main()) 42 | EOF 43 | 44 | cat >/ql/jd/${TG}-2.py <<-EOF 45 | #调度配置 0,1 21 * * 6 python3 /ql/jd/${TG}-2.py 46 | from telethon import TelegramClient 47 | import os 48 | current_path = os.path.dirname(os.path.abspath(__file__)) 49 | os.chdir(current_path) 50 | client = TelegramClient("bot${TG}", "${api_id}", "${api_hash}", connection_retries=None).start() 51 | async def main(): 52 | await client.send_message("@JD_ShareCode_Bot", "${FARM}") 53 | await client.send_message("@JD_ShareCode_Bot", "${PET}") 54 | await client.send_message("@JD_ShareCode_Bot", "${BEAN}") 55 | await client.send_message("@JD_ShareCode_Bot", "${JXFACTORY}") 56 | await client.send_message("@JD_ShareCode_Bot", "${SGMH}") 57 | await client.send_message("@JD_ShareCode_Bot", "${HEALTH}") 58 | await client.send_read_acknowledge("@JD_ShareCode_Bot") 59 | with client: 60 | client.loop.run_until_complete(main()) 61 | EOF 62 | cat >/ql/jd/"${RWWJ}" <<-EOF 63 | #!/usr/bin/env bash 64 | if [ "$(grep -c ${TG}.py /ql/config/crontab.list)" = 0 ]; then 65 | echo 66 | echo "添加任务 [自动提交助力码${TG}]" 67 | echo 68 | curl -s -H 'Accept: application/json' -H "Authorization: Bearer ${token}" -H 'Content-Type: application/json;charset=UTF-8' -H 'Accept-Language: zh-CN,zh;q=0.9' --data-binary '{"name":"自动提交助力码${TG}","command":"python3 /ql/jd/${TG}.py","schedule":"1 0,8 * * 1"}' --compressed 'http://127.0.0.1:5700/api/crons?t=${CRON}' 69 | fi 70 | sleep 2 71 | if [ "$(grep -c ${TG}-2.py /ql/config/crontab.list)" = 0 ]; then 72 | echo 73 | echo "添加任务 [自动提交助力码${TG}-2]" 74 | echo 75 | curl -s -H 'Accept: application/json' -H "Authorization: Bearer ${token}" -H 'Content-Type: application/json;charset=UTF-8' -H 'Accept-Language: zh-CN,zh;q=0.9' --data-binary '{"name":"自动提交助力码${TG}-2","command":"python3 /ql/jd/${TG}-2.py","schedule":"0,1 21 * * 6"}' --compressed 'http://127.0.0.1:5700/api/crons?t=${CRON}' 76 | fi 77 | sleep 2 78 | echo 79 | if [ "$(grep -c ${TG}.sh /ql/config/crontab.list)" = 0 ]; then 80 | echo 81 | echo "添加任务 [获取互助码${TG}]" 82 | echo 83 | curl -s -H 'Accept: application/json' -H "Authorization: Bearer ${token}" -H 'Content-Type: application/json;charset=UTF-8' -H 'Accept-Language: zh-CN,zh;q=0.9' --data-binary '{"name":"获取互助码${TG}","command":"task /ql/jd/${TG}.sh","schedule":"${CRON2} 13 * * 6"}' --compressed 'http://127.0.0.1:5700/api/crons?t=${CRON1}' 84 | fi 85 | EOF 86 | task /ql/jd/"${RWWJ}" 87 | rm -rf /ql/jd/"${RWWJ}" 88 | fi 89 | -------------------------------------------------------------------------------- /feverrun/jd/6-10.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | 3 | # 需要修改的变量,把1-5改成6-10就是提取6-10帐号的助力码,类推,11-15、16-20,一个文件5个助力码,一个TG号 4 | # API提取网站< https://my.telegram.org/auth >,没有API的ID跟密匙的就别修改 api_id 跟 api_hash 的说明内容,有就填写正确的ID跟密匙 5 | 6 | export TG="6-10" 7 | export api_id="填写您Telegram的API的ID" 8 | export api_hash="填写您Telegram的API的密匙" 9 | 10 | export RWWJ="${TG}rw.sh" 11 | export CRON="$(date +163764742%M%S)" 12 | export CRON1="$(date +163764761%M%S)" 13 | export CRON2="$(date +%M)" 14 | export token=$(cat /ql/config/auth.json | jq --raw-output .token) 15 | [[ -d '/ql/log/jd_get_share_code' ]] && rm -rf /ql/log/jd_get_share_code/* 16 | if [[ ! "${api_id}" == "填写您Telegram的API的ID" ]] && [[ ! "${api_hash}" == "填写您Telegram的API的密匙" ]]; then 17 | task jd_get_share_code.js desi JD_COOKIE "${TG}" 18 | lOGName="$(ls -a /ql/log/jd_get_share_code |egrep -o [0-9]+-[0-9]+-[0-9]+-[0-9]+-[0-9]+-[0-9]+.log |awk 'END {print}')" 19 | FARM="$(grep '/farm' /ql/log/jd_get_share_code/${lOGName})" 20 | PET="$(grep '/pet' /ql/log/jd_get_share_code/${lOGName})" 21 | BEAN="$(grep '/bean' /ql/log/jd_get_share_code/${lOGName})" 22 | JXFACTORY="$(grep '/jxfactory' /ql/log/jd_get_share_code/${lOGName})" 23 | SGMH="$(grep '/sgmh' /ql/log/jd_get_share_code/${lOGName})" 24 | HEALTH="$(grep '/health' /ql/log/jd_get_share_code/${lOGName})" 25 | cat >/ql/jd/${TG}.py <<-EOF 26 | #调度配置 0,1 0 * * 1 python3 /ql/jd/${TG}.py 27 | from telethon import TelegramClient 28 | import os 29 | current_path = os.path.dirname(os.path.abspath(__file__)) 30 | os.chdir(current_path) 31 | client = TelegramClient("bot${TG}", "${api_id}", "${api_hash}", connection_retries=None).start() 32 | async def main(): 33 | await client.send_message("@chriszhuli_bot", "${FARM}") 34 | await client.send_message("@chriszhuli_bot", "${PET}") 35 | await client.send_message("@chriszhuli_bot", "${BEAN}") 36 | await client.send_message("@chriszhuli_bot", "${JXFACTORY}") 37 | await client.send_message("@chriszhuli_bot", "${SGMH}") 38 | await client.send_message("@chriszhuli_bot", "${HEALTH}") 39 | await client.send_read_acknowledge("@chriszhuli_bot") 40 | with client: 41 | client.loop.run_until_complete(main()) 42 | EOF 43 | 44 | cat >/ql/jd/${TG}-2.py <<-EOF 45 | #调度配置 0,1 21 * * 6 python3 /ql/jd/${TG}-2.py 46 | from telethon import TelegramClient 47 | import os 48 | current_path = os.path.dirname(os.path.abspath(__file__)) 49 | os.chdir(current_path) 50 | client = TelegramClient("bot${TG}", "${api_id}", "${api_hash}", connection_retries=None).start() 51 | async def main(): 52 | await client.send_message("@JD_ShareCode_Bot", "${FARM}") 53 | await client.send_message("@JD_ShareCode_Bot", "${PET}") 54 | await client.send_message("@JD_ShareCode_Bot", "${BEAN}") 55 | await client.send_message("@JD_ShareCode_Bot", "${JXFACTORY}") 56 | await client.send_message("@JD_ShareCode_Bot", "${SGMH}") 57 | await client.send_message("@JD_ShareCode_Bot", "${HEALTH}") 58 | await client.send_read_acknowledge("@JD_ShareCode_Bot") 59 | with client: 60 | client.loop.run_until_complete(main()) 61 | EOF 62 | cat >/ql/jd/"${RWWJ}" <<-EOF 63 | #!/usr/bin/env bash 64 | if [ "$(grep -c ${TG}.py /ql/config/crontab.list)" = 0 ]; then 65 | echo 66 | echo "添加任务 [自动提交助力码${TG}]" 67 | echo 68 | curl -s -H 'Accept: application/json' -H "Authorization: Bearer ${token}" -H 'Content-Type: application/json;charset=UTF-8' -H 'Accept-Language: zh-CN,zh;q=0.9' --data-binary '{"name":"自动提交助力码${TG}","command":"python3 /ql/jd/${TG}.py","schedule":"1 0,8 * * 1"}' --compressed 'http://127.0.0.1:5700/api/crons?t=${CRON}' 69 | fi 70 | sleep 2 71 | if [ "$(grep -c ${TG}-2.py /ql/config/crontab.list)" = 0 ]; then 72 | echo 73 | echo "添加任务 [自动提交助力码${TG}-2]" 74 | echo 75 | curl -s -H 'Accept: application/json' -H "Authorization: Bearer ${token}" -H 'Content-Type: application/json;charset=UTF-8' -H 'Accept-Language: zh-CN,zh;q=0.9' --data-binary '{"name":"自动提交助力码${TG}-2","command":"python3 /ql/jd/${TG}-2.py","schedule":"0,1 21 * * 6"}' --compressed 'http://127.0.0.1:5700/api/crons?t=${CRON}' 76 | fi 77 | sleep 2 78 | echo 79 | if [ "$(grep -c ${TG}.sh /ql/config/crontab.list)" = 0 ]; then 80 | echo 81 | echo "添加任务 [获取互助码${TG}]" 82 | echo 83 | curl -s -H 'Accept: application/json' -H "Authorization: Bearer ${token}" -H 'Content-Type: application/json;charset=UTF-8' -H 'Accept-Language: zh-CN,zh;q=0.9' --data-binary '{"name":"获取互助码${TG}","command":"task /ql/jd/${TG}.sh","schedule":"${CRON2} 13 * * 6"}' --compressed 'http://127.0.0.1:5700/api/crons?t=${CRON1}' 84 | fi 85 | EOF 86 | task /ql/jd/"${RWWJ}" 87 | rm -rf /ql/jd/"${RWWJ}" 88 | fi 89 | -------------------------------------------------------------------------------- /feverrun/jd/jd_sms_login.py: -------------------------------------------------------------------------------- 1 | import os 2 | import sys 3 | import hashlib 4 | import time 5 | 6 | import requests 7 | 8 | mobile = input('请输入手机号:') 9 | appid = 959 10 | qversion = '1.0.0' 11 | country_code = 86 12 | 13 | ts = round(time.time() * 1000) 14 | sub_cmd = 1 15 | gsign = hashlib.md5(f"{appid}{qversion}{ts}36{sub_cmd}sb2cwlYyaCSN1KUv5RHG3tmqxfEb8NKN".encode()).hexdigest() 16 | data = f"client_ver=1.0.0&gsign={gsign}&appid={appid}&return_page=https%3A%2F%2Fcrpl.jd.com%2Fn%2Fmine%3FpartnerId%3DWBTF0KYY%26ADTAG%3Dkyy_mrqd%26token%3D&cmd=36&sdk_ver=1.0.0&sub_cmd={sub_cmd}&qversion={qversion}&ts={ts}" 17 | headers = { 18 | 'Host': 'qapplogin.m.jd.com', 19 | 'user-agent': 'Mozilla/5.0 (Linux; Android 10; V1838T Build/QP1A.190711.020; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/98.0.4758.87 Mobile Safari/537.36 hap/1.9/vivo com.vivo.hybrid/1.9.6.302 com.jd.crplandroidhap/1.0.3 ({packageName:com.vivo.hybrid,type:deeplink,extra:{}})', 20 | 'accept-language': 'zh-CN,zh;q=0.9,en;q=0.8', 21 | 'content-type': 'application/x-www-form-urlencoded; charset=utf-8', 22 | 'content-length': str(len(data)), 23 | } 24 | 25 | try: 26 | res = requests.post('https://qapplogin.m.jd.com/cgi-bin/qapp/quick', headers=headers, data=data).json() 27 | gsalt = res['data']['gsalt'] 28 | guid = res['data']['guid'] 29 | lsid = res['data']['lsid'] 30 | rsa_modulus = res['data']['rsa_modulus'] 31 | 32 | cookie = f"guid={guid}; lsid={lsid}; gsalt={gsalt}; rsa_modulus={rsa_modulus}" 33 | 34 | ts = round(time.time() * 1000) 35 | sub_cmd = 2 36 | gsign = hashlib.md5(f"{appid}{qversion}{ts}36{sub_cmd}{gsalt}".encode()).hexdigest() 37 | sign = hashlib.md5(f"{appid}{qversion}{country_code}{mobile}4dtyyzKF3w6o54fJZnmeW3bVHl0$PbXj".encode()).hexdigest() 38 | data = f"country_code={country_code}&client_ver=1.0.0&gsign={gsign}&appid={appid}&mobile={mobile}&sign={sign}&cmd=36&sub_cmd={sub_cmd}&qversion={qversion}&ts={ts}" 39 | headers.update({ 40 | 'cookie': cookie, 41 | 'content-length': str(len(data)), 42 | }) 43 | requests.post('https://qapplogin.m.jd.com/cgi-bin/qapp/quick', headers=headers, data=data) 44 | 45 | code = input('请输入验证码:') 46 | ts = round(time.time() * 1000) 47 | sub_cmd = 3 48 | gsign = hashlib.md5(f"{appid}{qversion}{ts}36{sub_cmd}{gsalt}".encode()).hexdigest() 49 | data = f"country_code={country_code}&client_ver=1.0.0&gsign={gsign}&smscode={code}&appid={appid}&mobile={mobile}&cmd=36&sub_cmd={sub_cmd}&qversion={qversion}&ts={ts}" 50 | headers.update({ 51 | 'cookie': cookie, 52 | 'content-length': str(len(data)), 53 | }) 54 | data = { 55 | 'country_code': country_code, 56 | 'client_ver': '1.0.0', 57 | 'gsign': gsign, 58 | 'smscode': code, 59 | 'appid': appid, 60 | 'mobile': mobile, 61 | 'cmd': '36', 62 | 'sub_cmd': sub_cmd, 63 | 'qversion': qversion, 64 | 'ts': ts 65 | } 66 | res = requests.post('https://qapplogin.m.jd.com/cgi-bin/qapp/quick', headers=headers, data=data).json() 67 | pt_key = res['data']['pt_key'] 68 | pt_pin = res['data']['pt_pin'] 69 | 70 | # pt_key = '4dtyyzKF3w6o54fJZnmeW3bVHl0$PbXj' 71 | # pt_pin = 'jd_crpl_kyy_mrqd' 72 | 73 | print('获取成功,请勿泄漏!\n') 74 | print(f"pt_key={pt_key}; pt_pin={pt_pin}") 75 | 76 | except Exception as e: 77 | print('程序错误:', e) 78 | time.sleep(5) 79 | 80 | if sys.platform == 'win32': 81 | os.system('pause') 82 | 83 | -------------------------------------------------------------------------------- /feverrun/jdCookie.js: -------------------------------------------------------------------------------- 1 | /* 2 | 此文件为Node.js专用。其他用户请忽略 3 | */ 4 | //此处填写京东账号cookie。 5 | let CookieJDs = [ 6 | '',//账号一ck,例:pt_key=XXX;pt_pin=XXX; 7 | '',//账号二ck,例:pt_key=XXX;pt_pin=XXX;如有更多,依次类推 8 | ] 9 | // 判断环境变量里面是否有京东ck 10 | if (process.env.JD_COOKIE) { 11 | if (process.env.JD_COOKIE.indexOf('&') > -1) { 12 | console.log(`您的cookie选择的是用&隔开\n`) 13 | CookieJDs = process.env.JD_COOKIE.split('&'); 14 | } else if (process.env.JD_COOKIE.indexOf('\n') > -1) { 15 | console.log(`您的cookie选择的是用换行隔开\n`) 16 | CookieJDs = process.env.JD_COOKIE.split('\n'); 17 | } else { 18 | CookieJDs = [process.env.JD_COOKIE]; 19 | } 20 | } 21 | /* 22 | if (JSON.stringify(process.env).indexOf('GITHUB')>-1) { 23 | console.log(`请勿使用github action运行此脚本,无论你是从你自己的私库还是其他哪里拉取的源代码,都会导致我被封号\n`); 24 | !(async () => { 25 | // await require('./sendNotify').sendNotify('提醒', `请勿使用github action、滥用github资源会封我仓库以及账号`) 26 | // await process.exit(0); 27 | })() 28 | } 29 | */ 30 | CookieJDs = [...new Set(CookieJDs.filter(item => !!item))] 31 | console.log(`\n====================共有${CookieJDs.length}个京东账号Cookie=========\n`); 32 | console.log(`==================脚本执行- 北京时间(UTC+8):${new Date(new Date().getTime() + new Date().getTimezoneOffset()*60*1000 + 8*60*60*1000).toLocaleString()}=====================\n`) 33 | if (process.env.JD_DEBUG && process.env.JD_DEBUG === 'false') console.log = () => {}; 34 | for (let i = 0; i < CookieJDs.length; i++) { 35 | const index = (i + 1 === 1) ? '' : (i + 1); 36 | exports['CookieJD' + index] = CookieJDs[i].trim(); 37 | } 38 | -------------------------------------------------------------------------------- /feverrun/jd_sms_login.py: -------------------------------------------------------------------------------- 1 | import os 2 | import sys 3 | import hashlib 4 | import time 5 | 6 | import requests 7 | 8 | mobile = input('请输入手机号:') 9 | appid = 959 10 | qversion = '1.0.0' 11 | country_code = 86 12 | 13 | ts = round(time.time() * 1000) 14 | sub_cmd = 1 15 | gsign = hashlib.md5(f"{appid}{qversion}{ts}36{sub_cmd}sb2cwlYyaCSN1KUv5RHG3tmqxfEb8NKN".encode()).hexdigest() 16 | data = f"client_ver=1.0.0&gsign={gsign}&appid={appid}&return_page=https%3A%2F%2Fcrpl.jd.com%2Fn%2Fmine%3FpartnerId%3DWBTF0KYY%26ADTAG%3Dkyy_mrqd%26token%3D&cmd=36&sdk_ver=1.0.0&sub_cmd={sub_cmd}&qversion={qversion}&ts={ts}" 17 | headers = { 18 | 'Host': 'qapplogin.m.jd.com', 19 | 'user-agent': 'Mozilla/5.0 (Linux; Android 10; V1838T Build/QP1A.190711.020; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/98.0.4758.87 Mobile Safari/537.36 hap/1.9/vivo com.vivo.hybrid/1.9.6.302 com.jd.crplandroidhap/1.0.3 ({packageName:com.vivo.hybrid,type:deeplink,extra:{}})', 20 | 'accept-language': 'zh-CN,zh;q=0.9,en;q=0.8', 21 | 'content-type': 'application/x-www-form-urlencoded; charset=utf-8', 22 | 'content-length': str(len(data)), 23 | } 24 | 25 | try: 26 | res = requests.post('https://qapplogin.m.jd.com/cgi-bin/qapp/quick', headers=headers, data=data).json() 27 | gsalt = res['data']['gsalt'] 28 | guid = res['data']['guid'] 29 | lsid = res['data']['lsid'] 30 | rsa_modulus = res['data']['rsa_modulus'] 31 | 32 | cookie = f"guid={guid}; lsid={lsid}; gsalt={gsalt}; rsa_modulus={rsa_modulus}" 33 | 34 | ts = round(time.time() * 1000) 35 | sub_cmd = 2 36 | gsign = hashlib.md5(f"{appid}{qversion}{ts}36{sub_cmd}{gsalt}".encode()).hexdigest() 37 | sign = hashlib.md5(f"{appid}{qversion}{country_code}{mobile}4dtyyzKF3w6o54fJZnmeW3bVHl0$PbXj".encode()).hexdigest() 38 | data = f"country_code={country_code}&client_ver=1.0.0&gsign={gsign}&appid={appid}&mobile={mobile}&sign={sign}&cmd=36&sub_cmd={sub_cmd}&qversion={qversion}&ts={ts}" 39 | headers.update({ 40 | 'cookie': cookie, 41 | 'content-length': str(len(data)), 42 | }) 43 | requests.post('https://qapplogin.m.jd.com/cgi-bin/qapp/quick', headers=headers, data=data) 44 | 45 | code = input('请输入验证码:') 46 | ts = round(time.time() * 1000) 47 | sub_cmd = 3 48 | gsign = hashlib.md5(f"{appid}{qversion}{ts}36{sub_cmd}{gsalt}".encode()).hexdigest() 49 | data = f"country_code={country_code}&client_ver=1.0.0&gsign={gsign}&smscode={code}&appid={appid}&mobile={mobile}&cmd=36&sub_cmd={sub_cmd}&qversion={qversion}&ts={ts}" 50 | headers.update({ 51 | 'cookie': cookie, 52 | 'content-length': str(len(data)), 53 | }) 54 | data = { 55 | 'country_code': country_code, 56 | 'client_ver': '1.0.0', 57 | 'gsign': gsign, 58 | 'smscode': code, 59 | 'appid': appid, 60 | 'mobile': mobile, 61 | 'cmd': '36', 62 | 'sub_cmd': sub_cmd, 63 | 'qversion': qversion, 64 | 'ts': ts 65 | } 66 | res = requests.post('https://qapplogin.m.jd.com/cgi-bin/qapp/quick', headers=headers, data=data).json() 67 | pt_key = res['data']['pt_key'] 68 | pt_pin = res['data']['pt_pin'] 69 | 70 | # pt_key = '4dtyyzKF3w6o54fJZnmeW3bVHl0$PbXj' 71 | # pt_pin = 'jd_crpl_kyy_mrqd' 72 | 73 | print('获取成功,请勿泄漏!\n') 74 | print(f"pt_key={pt_key}; pt_pin={pt_pin}") 75 | 76 | except Exception as e: 77 | print('程序错误:', e) 78 | time.sleep(5) 79 | 80 | if sys.platform == 'win32': 81 | os.system('pause') 82 | 83 | -------------------------------------------------------------------------------- /feverrun/lang.py: -------------------------------------------------------------------------------- 1 | docker exec -it qinglong bash -c "task /ql/jd/1-5.sh && python3 /ql/jd/1-5.py" 2 | docker exec -it qinglong bash -c "task /ql/jd/6-10.sh && python3 /ql/jd/6-10.py" 3 | -------------------------------------------------------------------------------- /feverrun/nginx.conf: -------------------------------------------------------------------------------- 1 | user root; 2 | worker_processes auto; 3 | pcre_jit on; 4 | error_log /var/log/nginx/error.log warn; 5 | include /etc/nginx/modules/*.conf; 6 | 7 | events { 8 | worker_connections 1024; 9 | } 10 | 11 | http { 12 | include /etc/nginx/mime.types; 13 | default_type application/octet-stream; 14 | 15 | server_tokens off; 16 | 17 | client_max_body_size 20m; 18 | client_body_buffer_size 20m; 19 | 20 | keepalive_timeout 65; 21 | 22 | sendfile on; 23 | 24 | tcp_nodelay on; 25 | 26 | ssl_prefer_server_ciphers on; 27 | 28 | ssl_session_cache shared:SSL:2m; 29 | 30 | gzip on; 31 | gzip_static on; 32 | gzip_types text/plain application/json application/javascript application/x-javascript text/css application/xml text/javascript; 33 | gzip_proxied any; 34 | gzip_vary on; 35 | gzip_comp_level 6; 36 | gzip_buffers 16 8k; 37 | gzip_http_version 1.0; 38 | 39 | log_format main '$remote_addr - $remote_user [$time_local] "$request" ' 40 | '$status $body_bytes_sent "$http_referer" ' 41 | '"$http_user_agent" "$http_x_forwarded_for"'; 42 | 43 | access_log /var/log/nginx/access.log main; 44 | include /etc/nginx/conf.d/*.conf; 45 | } 46 | -------------------------------------------------------------------------------- /feverrun/vip2.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | # 3 | TIME() { 4 | [[ -z "$1" ]] && { 5 | echo -ne " " 6 | } || { 7 | case $1 in 8 | r) export Color="\e[31;1m";; 9 | g) export Color="\e[32;1m";; 10 | b) export Color="\e[34;1m";; 11 | y) export Color="\e[33;1m";; 12 | z) export Color="\e[35;1m";; 13 | l) export Color="\e[36;1m";; 14 | esac 15 | [[ $# -lt 2 ]] && echo -e "\e[36m\e[0m ${1}" || { 16 | echo -e "\e[36m\e[0m ${Color}${2}\e[0m" 17 | } 18 | } 19 | } 20 | if [[ "$USER" == "root" ]]; then 21 | clear 22 | echo 23 | echo 24 | TIME g " 您选择了自动提交助力码库" 25 | echo 26 | TIME y " 请选择网络类型" 27 | echo 28 | echo 29 | TIME l " 1. bridge [默认类型]" 30 | echo 31 | TIME l " 2. host [一般为openwrt旁路由才选择的]" 32 | echo 33 | scqlbianma="[输入您选择的编码]" 34 | while :; do 35 | read -p " ${scqlbianma}: " SCQL 36 | case $SCQL in 37 | 1) 38 | export QL_PORT="5700" 39 | export QING_PORT="YES" 40 | export NETWORK="-p ${QL_PORT}:5700" 41 | break 42 | ;; 43 | 2) 44 | export NETWORK="--net host" 45 | export QL_PORT="5700" 46 | break 47 | ;; 48 | *) 49 | scqlbianma="[请输入正确的编码]" 50 | ;; 51 | esac 52 | done 53 | else 54 | echo 55 | TIME y "警告:请使用root用户操作!~~" 56 | fi 57 | echo 58 | echo 59 | [[ "${QING_PORT}" == "YES" ]] && { 60 | TIME g "请设置端口,默认端口为[5700],不懂设置的话,直接回车使用默认[5700]端口" 61 | read -p " 请输入端口:" QL_PORT 62 | export QL_PORT=${QL_PORT:-"5700"} 63 | TIME y "您端口为:${QL_PORT}" 64 | export NETWORK="-p ${QL_PORT}:5700" 65 | } 66 | echo 67 | echo 68 | rm -fr ql.sh 69 | echo 70 | if [[ "$(. /etc/os-release && echo "$ID")" == "centos" ]]; then 71 | TIME g "正在安装宿主机所需要的依赖,请稍后..." 72 | export QL_PATH="/opt" 73 | yum -y update 74 | yum -y install unzip 75 | yum -y install sudo wget git 76 | yum -y install net-tools.x86_64 subversion 77 | elif [[ "$(. /etc/os-release && echo "$ID")" == "ubuntu" ]]; then 78 | TIME g "正在安装宿主机所需要的依赖,请稍后..." 79 | export QL_PATH="/opt" 80 | apt-get -y update 81 | apt-get -y install unzip 82 | apt-get -y install sudo wget git 83 | apt-get -y install net-tools subversion 84 | elif [[ "$(. /etc/os-release && echo "$ID")" == "debian" ]]; then 85 | TIME g "正在安装宿主机所需要的依赖,请稍后..." 86 | export QL_PATH="/opt" 87 | apt -y update 88 | apt -y install unzip 89 | apt -y install sudo wget git 90 | apt -y install net-tools subversion 91 | elif [[ "$(. /etc/os-release && echo "$ID")" == "openwrt" ]]; then 92 | XTong="openwrt" 93 | if [[ -d /opt/docker ]]; then 94 | export QL_PATH="/opt" 95 | export QL_Kongjian="/opt/docker" 96 | elif [[ -d /mnt/mmcblk2p4/docker ]]; then 97 | export QL_PATH="/root" 98 | export QL_Kongjian="/mnt/mmcblk2p4/docker" 99 | else 100 | TIME g "没找到/opt/docker或者/mnt/mmcblk2p4/docker" 101 | exit 1 102 | fi 103 | else 104 | TIME r "不支持您的系统" 105 | exit 1 106 | fi 107 | IP="$(ifconfig -a|grep inet|grep -v 127|grep -v 172|grep -v inet6|awk '{print $2}'|tr -d "addr:")" 108 | if [[ -z "${IP}" ]]; then 109 | IP="IP" 110 | fi 111 | if [[ "${XTong}" == "openwrt" ]]; then 112 | if [[ -x "$(command -v docker)" ]]; then 113 | echo 114 | else 115 | echo 116 | TIME r "没检测到docker,openwrt请自行安装docker,如果空间太小请挂载好[opt]路径的硬盘,N1或者其他晶晨系列的挂载到的挂载到[mnt]" 117 | echo 118 | sleep 3 119 | exit 1 120 | fi 121 | else 122 | if [[ `docker --version | grep -c "version"` -eq '0' ]]; then 123 | echo 124 | TIME y "没发现有docker,正在安装docker,请稍后..." 125 | bash -c "$(curl -fsSL https://ghproxy.com/https://raw.githubusercontent.com/shidahuilang/QL-/main/docker.sh)" 126 | 127 | fi 128 | fi 129 | if [[ "${XTong}" == "openwrt" ]]; then 130 | if [[ -x "$(command -v docker)" ]]; then 131 | echo 132 | else 133 | echo 134 | TIME r "没检测到docker,openwrt请自行安装docker,如果空间太小请挂载好[opt]路径的硬盘,N1或者其他晶晨系列的挂载到的挂载到[mnt]" 135 | echo 136 | sleep 3 137 | exit 1 138 | fi 139 | else 140 | if [[ `docker --version | grep -c "version"` -eq '0' ]]; then 141 | echo 142 | TIME y "没检测到docker,请先安装docker" 143 | bash -c "$(curl -fsSL https://ghproxy.com/https://raw.githubusercontent.com/shidahuilang/QL-/main/docker.sh)" 144 | echo 145 | sleep 3 146 | exit 1 147 | else 148 | systemctl start docker 149 | sleep 5 150 | fi 151 | fi 152 | if [[ `docker ps -a | grep -c "qinglong"` -ge '1' ]]; then 153 | echo 154 | TIME y "检测到已有青龙面板,正在删除旧的青龙容器和镜像,请稍后..." 155 | if [[ -z "$(ls -A "$QL_PATH/qlbeifen1" 2>/dev/null)" ]]; then 156 | if [[ -n "$(ls -A "$QL_PATH/ql/config" 2>/dev/null)" ]]; then 157 | echo 158 | TIME g "检测到 $QL_PATH/ql ,为避免损失,正在把 $QL_PATH/ql 备份到 $QL_PATH/qlbeifen 文件夹" 159 | echo 160 | TIME y "如有需要备份文件的请到 $QL_PATH/qlbeifen 文件夹查看" 161 | echo 162 | rm -fr $QL_PATH/qlbeifen && mkdir -p $QL_PATH/qlbeifen 163 | cp -r $QL_PATH/ql $QL_PATH/qlbeifen/ql > /dev/null 2>&1 164 | cp -r $QL_PATH/qlbeifen $QL_PATH/qlbeifen1 > /dev/null 2>&1 165 | rm -rf $QL_PATH/ql 166 | sleep 3 167 | fi 168 | fi 169 | docker=$(docker ps -a|grep qinglong) && dockerid=$(awk '{print $(1)}' <<<${docker}) 170 | images=$(docker images|grep qinglong) && imagesid=$(awk '{print $(3)}' <<<${images}) 171 | docker stop -t=5 "${dockerid}" > /dev/null 2>&1 172 | docker rm "${dockerid}" 173 | docker rmi "${imagesid}" 174 | fi 175 | if [[ "$(. /etc/os-release && echo "$ID")" == "openwrt" ]]; then 176 | Available="$(df -h | grep "${QL_Kongjian}" | awk '{print $4}' | awk 'NR==1')" 177 | FINAL=`echo ${Available: -1}` 178 | if [[ "${FINAL}" =~ (M|K) ]]; then 179 | echo 180 | TIME r "敬告:可用空间小于[ 2G ],不支持安装青龙,请挂载好大于2G的硬盘" 181 | echo 182 | sleep 1 183 | exit 1 184 | echo 185 | fi 186 | else 187 | Ubunkj="$(df -h|grep -v tmpfs |grep "/dev/.*" |awk '{print $4}' |awk 'NR==1')" 188 | FINAL=`echo ${Ubunkj: -1}` 189 | if [[ "${FINAL}" =~ (M|K) ]]; then 190 | echo 191 | TIME r "敬告:可用空间小于[ 2G ],不支持安装青龙,请加大磁盘空间容量" 192 | echo 193 | sleep 1 194 | exit 1 195 | echo 196 | fi 197 | fi 198 | if [[ "$(. /etc/os-release && echo "$ID")" == "openwrt" ]]; then 199 | Overlay_Available="$(df -h | grep "${QL_Kongjian}" | awk '{print $4}' | awk 'NR==1' | sed 's/.$//g')" 200 | Kongjian="$(awk -v num1=${Overlay_Available} -v num2=2 'BEGIN{print(num1>num2)?"0":"1"}')" 201 | echo 202 | TIME y "您当前系统可用空间为${Overlay_Available}G" 203 | echo 204 | if [[ "${Kongjian}" == "1" ]];then 205 | echo 206 | TIME r "敬告:可用空间小于[ 2G ],不支持安装青龙,请挂载好[opt]路径的硬盘" 207 | echo 208 | sleep 1 209 | exit 1 210 | fi 211 | else 212 | Ubuntu_kj="$(df -h|grep -v tmpfs |grep "/dev/.*" |awk '{print $4}' |awk 'NR==1' |sed 's/.$//g')" 213 | Kongjian="$(awk -v num1=${Ubuntu_kj} -v num2=2 'BEGIN{print(num1>num2)?"0":"1"}')" 214 | echo 215 | TIME y "您当前系统可用空间为${Ubuntu_kj}G" 216 | echo 217 | if [[ "${Kongjian}" == "1" ]];then 218 | echo 219 | TIME r "敬告:可用空间小于[ 2G ],不支持安装青龙,请加大磁盘空间" 220 | echo 221 | sleep 1 222 | exit 1 223 | fi 224 | fi 225 | echo 226 | echo 227 | TIME g "正在安装青龙面板,请稍后..." 228 | echo 229 | docker run -dit \ 230 | -v $QL_PATH/ql/config:/ql/config \ 231 | -v $QL_PATH/ql/log:/ql/log \ 232 | -v $QL_PATH/ql/db:/ql/db \ 233 | -v $QL_PATH/ql/scripts:/ql/scripts \ 234 | -v $QL_PATH/ql/jbot:/ql/jbot \ 235 | -v $QL_PATH/ql/raw:/ql/raw \ 236 | -v $QL_PATH/ql/jd:/ql/jd \ 237 | -v $QL_PATH/ql/deps:/ql/deps \ 238 | -v $QL_PATH/ql/repo:/ql/repo \ 239 | ${NETWORK} \ 240 | --name qinglong \ 241 | --hostname qinglong \ 242 | --restart always \ 243 | whyour/qinglong:latest 244 | export local_ip="$(curl -sS --connect-timeout 10 -m 60 https://www.bt.cn/Api/getIpAddress)" 245 | if [[ `docker ps -a | grep -c "qinglong"` -ge '1' ]]; then 246 | if [[ -n "$(ls -A "${QL_PATH}/qlbeifen1" 2>/dev/null)" ]]; then 247 | docker cp ${QL_PATH}/qlbeifen1/ql/config/env.sh qinglong:/ql/config/env.sh 248 | docker cp ${QL_PATH}/qlbeifen1/ql/db/env.db qinglong:/ql/db/env.db 249 | docker cp ${QL_PATH}/qlbeifen1/ql/config/auth.json qinglong:/ql/config/auth.json 250 | docker cp ${QL_PATH}/qlbeifen1/ql/db/auth.db qinglong:/ql/db/auth.db 251 | docker cp ${QL_PATH}/qlbeifen1/ql/config/bot.json qinglong:/ql/config/bot.json 252 | fi 253 | docker restart qinglong 254 | clear 255 | echo 256 | echo 257 | TIME y "青龙面板安装完成,下一步进入安装任务程序,请耐心等候..." 258 | if [[ `docker exec -it qinglong bash -c "cat /ql/config/auth.json" | grep -c "\"token\""` -ge '1' ]]; then 259 | echo 260 | TIME g "检测到你已有配置,继续使用您的[帐号密码文件]和[环境变量文件]来安装使用,免除您设置烦恼!" 261 | echo 262 | sleep 5 263 | docker exec -it qinglong bash -c "$(curl -fsSL https://raw.githubusercontent.com/shidahuilang/QL-/main/feverrun.sh)" 264 | [[ -f ${QL_PATH}/qlbeifen1/ql/config/bot.json ]] && docker cp ${QL_PATH}/qlbeifen1/ql/config/bot.json qinglong:/ql/config/bot.json 265 | if [[ -d ${QL_PATH}/qlbeifen1/ql/jd ]]; then 266 | docker cp ${QL_PATH}/qlbeifen1/ql/jd qinglong:/ql/ 267 | for X in $(ls -a $QL_PATH/ql/jd |egrep -o [0-9]+-[0-9]+.sh); do docker exec -it qinglong bash -c "task /ql/jd/${X}"; done 268 | fi 269 | echo 270 | docker cp /qlbeifen1/ql/config/auth.json qinglong:/ql/config/auth.json 271 | docker restart qinglong > /dev/null 2>&1 272 | rm -fr ${QL_PATH}/qlbeifen1 > /dev/null 2>&1 273 | docker exec -it qinglong bash -c "rm -rf /ql/qlwj" 274 | sleep 2 275 | clear 276 | echo 277 | echo 278 | TIME y "${IP}:${QL_PORT} ,如果是VPS请用 ${local_ip}:${QL_PORT} (IP检测因数太多,不一定准确,仅供参考)" 279 | echo 280 | TIME y "请确保您系统已放行${QL_PORT}端口,然后使用您的 IP:${QL_PORT} 在浏览器打开页面,登录青龙面板" 281 | echo 282 | TIME y "点击[开始安装],[通知方式]跳过,设置好[用户名]跟[密码],然后点击[提交],然后点击[去登录],输入帐号密码完成登录!" 283 | echo 284 | TIME y "输入 docker exec -it qinglong cat /qinglong/config/auth.json 可以查看初始化密码" 285 | exit 0 286 | else 287 | echo 288 | TIME y "${IP}:${QL_PORT} ,如果是VPS请用 ${local_ip}:${QL_PORT} (IP检测因数太多,不一定准确,仅供参考)" 289 | echo 290 | TIME g "请使用您的 IP:"${QL_PORT}" 在浏览器打开控制面板" 291 | echo 292 | TIME y "点击[开始安装],[通知方式]跳过,设置好[用户名]跟[密码],然后点击[提交],然后点击[去登录],输入帐号密码完成登录!" 293 | echo 294 | TIME g "登录进入后在左侧[环境变量]添加WSKEY或者PT_KEY,不添加也没所谓,以后添加一样,但是一定要登录进入后才能继续下一步操作" 295 | echo 296 | QLMEUN="[ N/n ]退出程序,登录后按回车继续安装脚本" 297 | while :; do 298 | read -p " ${QLMEUN}: " MENU 299 | if [[ `docker exec -it qinglong bash -c "cat /ql/config/auth.json" | grep -c "\"token\""` -ge '1' ]]; then 300 | S="Y" 301 | fi 302 | if [[ ${MENU} == "N" ]] || [[ ${MENU} == "n" ]]; then 303 | S="N" 304 | fi 305 | case $S in 306 | Y) 307 | echo 308 | TIME y "开始安装脚本,请耐心等待..." 309 | docker exec -it qinglong bash -c "$(curl -fsSL https://raw.githubusercontent.com/shidahuilang/QL-/main/feverrun.sh)" 310 | break 311 | ;; 312 | N) 313 | echo 314 | TIME r "退出安装程序!" 315 | echo 316 | sleep 2 317 | exit 1 318 | break 319 | ;; 320 | *) 321 | QLMEUN="请先登录后按回车继续安装脚本,或者现在按[ N/n ]退出程序" 322 | ;; 323 | esac 324 | done 325 | [[ -f ${QL_PATH}/qlbeifen1/ql/config/bot.json ]] && docker cp ${QL_PATH}/qlbeifen1/ql/config/bot.json qinglong:/ql/config/bot.json 326 | if [[ -d ${QL_PATH}/qlbeifen1/ql/jd ]]; then 327 | docker cp ${QL_PATH}/qlbeifen1/ql/jd qinglong:/ql/ 328 | for X in $(ls -a $QL_PATH/ql/jd |egrep -o [0-9]+-[0-9]+.sh); do docker exec -it qinglong bash -c "task /ql/jd/${X}"; done 329 | fi 330 | docker restart qinglong > /dev/null 2>&1 331 | rm -fr ${QL_PATH}/qlbeifen1 > /dev/null 2>&1 332 | docker exec -it qinglong bash -c "rm -rf /ql/qlwj" 333 | TIME g "安装完成" 334 | fi 335 | else 336 | echo 337 | echo 338 | TIME y "青龙面板安装失败!" 339 | echo 340 | sleep 2 341 | exit 1 342 | fi 343 | exit 0 344 | -------------------------------------------------------------------------------- /feverrun/wskey.py: -------------------------------------------------------------------------------- 1 | """ 2 | new Env('青龙全自动更新cookie'); 3 | """ 4 | 5 | import requests 6 | import time 7 | import json 8 | import re 9 | import uuid 10 | import os 11 | 12 | requests.packages.urllib3.disable_warnings() 13 | 14 | token = "" 15 | username = "" 16 | password = "" 17 | pdtoken = os.environ['PandaToken'] 18 | if username == "" or password == "": 19 | f = open("/ql/config/auth.json") 20 | auth = f.read() 21 | auth = json.loads(auth) 22 | username = auth["username"] 23 | password = auth["password"] 24 | token = auth["token"] 25 | f.close() 26 | 27 | 28 | def gettimestamp(): 29 | return str(int(time.time() * 1000)) 30 | 31 | 32 | def login(username, password): 33 | url = "http://127.0.0.1:5700/api/login?t=%s" % gettimestamp() 34 | data = {"username": username, "password": password} 35 | r = s.post(url, data) 36 | s.headers.update({"authorization": "Bearer " + json.loads(r.text)["data"]["token"]}) 37 | 38 | 39 | def getitem(key): 40 | url = "http://127.0.0.1:5700/api/envs?searchValue=%s&t=%s" % (key, gettimestamp()) 41 | r = s.get(url) 42 | item = json.loads(r.text)["data"] 43 | return item 44 | 45 | 46 | def getckitem(key): 47 | url = "http://127.0.0.1:5700/api/envs?searchValue=JD_COOKIE&t=%s" % gettimestamp() 48 | r = s.get(url) 49 | for i in json.loads(r.text)["data"]: 50 | if key in i["value"]: 51 | return i 52 | return [] 53 | 54 | 55 | def genToken(wsCookie): 56 | headers = { 57 | 'user-agent': 'Mozilla/5.0 (Windows NT 6.3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.93 Safari/537.36', 58 | 'Content-Type': 'application/json', 59 | 'Authorization': 'Bearer '+ pdtoken, 60 | } 61 | data = '{ "url": "https://home.m.jd.com/myJd/newhome.action" }' 62 | r = requests.post('https://api.jds.codes/jd/gentoken', headers=headers, data=data) 63 | r = json.loads(r.text) 64 | request_time = r["request_times"] 65 | print("💎接口访问次数:%s" % (request_time)) 66 | data=r["data"].split("&") 67 | jduuid = data[1] 68 | clientVersion = data[3] 69 | client = data[2] 70 | sign = data[4] + "&" + data[5] + "&" + data[6] 71 | url = "https://api.m.jd.com/client.action?functionId=genToken&%s&%s&%s&%s" % (clientVersion, client, jduuid, sign) 72 | headers = { 73 | "Host": 'api.m.jd.com', 74 | "Cookie": wsCookie, 75 | "accept": '*/*', 76 | "referer": '', 77 | 'user-agent': "okhttp/3.12.1;jdmall;apple;version/9.4.0;build/88830;screen/1440x3007;os/11;network/wifi;" + str( 78 | uuid.uuid4()), 79 | 'accept-language': 'zh-Hans-CN;q=1, en-CN;q=0.9', 80 | 'content-type': 'application/x-www-form-urlencoded;', 81 | } 82 | r = requests.post(url, headers=headers, data="body=%7B%22to%22%3A%20%22https%3A//home.m.jd.com/myJd/newhome.action%22%2C%20%22action%22%3A%20%22to%22%7D") 83 | r = json.loads(r.text)["tokenKey"] 84 | return r 85 | 86 | 87 | def getJDCookie(tokenKey): 88 | url = "https://un.m.jd.com/cgi-bin/app/appjmp?tokenKey=%s&to=https://home.m.jd.com/myJd/newhome.action" % tokenKey 89 | headers = { 90 | "Connection": 'Keep-Alive', 91 | 'Content-Type': 'application/x-www-form-urlencoded', 92 | "Accept": 'application/json, text/plain, */*', 93 | 'Accept-Language': 'zh-cn', 94 | "User-Agent": 'okhttp/3.12.1;jdmall;apple;version/9.4.0;build/88830;screen/1440x3007;os/11;network/wifi;' + str( 95 | uuid.uuid4()) 96 | } 97 | r = requests.get(url, headers=headers, allow_redirects=False,) 98 | pt_pin = re.findall(r"pt_pin=(.*?);", str(r.headers))[0] 99 | pt_key = re.findall(r"pt_key=(.*?);", str(r.headers))[0] 100 | return "pt_key=" + pt_key + ";pt_pin=" + pt_pin + ";" 101 | 102 | 103 | def wstopt(wskey): 104 | try: 105 | token = genToken(wskey) 106 | r = getJDCookie(token) 107 | return r 108 | except: 109 | return "error" 110 | 111 | 112 | def update(text, qlid): 113 | url = "http://127.0.0.1:5700/api/envs?t=%s" % gettimestamp() 114 | s.headers.update({"Content-Type": "application/json;charset=UTF-8"}) 115 | data = { 116 | "name": "JD_COOKIE", 117 | "value": text, 118 | "_id": qlid 119 | } 120 | r = s.put(url, data=json.dumps(data)) 121 | if json.loads(r.text)["code"] == 200: 122 | return True 123 | else: 124 | return False 125 | 126 | 127 | def insert(text): 128 | url = "http://127.0.0.1:5700/api/envs?t=%s" % gettimestamp() 129 | s.headers.update({"Content-Type": "application/json;charset=UTF-8"}) 130 | data = [] 131 | data_json = { 132 | "value": text, 133 | "name": "JD_COOKIE" 134 | } 135 | data.append(data_json) 136 | r = s.post(url, json.dumps(data)) 137 | if json.loads(r.text)["code"] == 200: 138 | return True 139 | else: 140 | return False 141 | 142 | 143 | if __name__ == '__main__': 144 | s = requests.session() 145 | if token == "": 146 | login(username, password) 147 | else: 148 | s.headers.update({"authorization": "Bearer " + token}) 149 | wskeys = getitem("JD_WSCK") 150 | count = 1 151 | for i in wskeys: 152 | if i["status"] == 0: 153 | r = wstopt(i["value"]) 154 | if r == "error": 155 | print("api请求错误") 156 | else: 157 | ptck = r 158 | try: 159 | wspin = re.findall(r"pin=(.*?);", i["value"])[0] 160 | if ptck == "wskey错误": 161 | print("第%s个wskey可能过期了,pin为%s" % (count, wspin)) 162 | elif ptck == "未知错误" or ptck == "error": 163 | print("第%s个wskey发生了未知错误,pin为%s" % (count, wspin)) 164 | elif "" in ptck: 165 | print("你的ip被cloudflare拦截") 166 | else: 167 | ptpin = re.findall(r"pt_pin=(.*?);", ptck)[0] 168 | item = getckitem("pt_pin=" + ptpin) 169 | if item != []: 170 | qlid = item["_id"] 171 | if update(ptck, qlid): 172 | print("第%s个wskey更新成功,pin为%s" % (count, wspin)) 173 | else: 174 | print("第%s个wskey更新失败,pin为%s" % (count, wspin)) 175 | else: 176 | if insert(ptck): 177 | print("第%s个wskey添加成功" % count) 178 | else: 179 | print("第%s个wskey添加失败" % count) 180 | except: 181 | print("第%s个wskey出现异常错误" % count) 182 | count += 1 183 | else: 184 | print("有一个wskey被禁用了") 185 | -------------------------------------------------------------------------------- /image/img.js: -------------------------------------------------------------------------------- 1 | docker exec -it qinglong bash -c "task /ql/jd/1-5.sh && python3 /ql/jd/1-5.py" 2 | docker exec -it qinglong bash -c "task /ql/jd/6-10.sh && python3 /ql/jd/6-10.py" 3 | 运行命令后,显示 Please enter your phone (or bot token): 4 | 就输入您的注册TG的电话,如果是大陆的格式就是+8613666666666 5 | 然后TG接收到验证码填上,再下来,如果TG有密码就输入密码 6 | 7 | 8 | 9 | 10 | python3 /opt/ql/scripts/jd_sms_login.py 11 | -------------------------------------------------------------------------------- /image/img.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/shidahuilang/QL-/8117a4c686c5e3fd09ee247e2c226bf86fccd509/image/img.png -------------------------------------------------------------------------------- /image/img1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/shidahuilang/QL-/8117a4c686c5e3fd09ee247e2c226bf86fccd509/image/img1.png -------------------------------------------------------------------------------- /image/img2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/shidahuilang/QL-/8117a4c686c5e3fd09ee247e2c226bf86fccd509/image/img2.png -------------------------------------------------------------------------------- /ip.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | dirfile='/volume1/docker/nark/ip_change' 3 | new_ip=`curl ip.3322.net` #获取新公网ip 4 | log="/volume1/docker/nark/tool.log" 5 | datetime=`date '+%Y-%m-%d %H:%M:%S'` 6 | #判断文件是否存在 7 | if [ ! -f "$dirfile" ]; then 8 | touch "$file" 9 | echo "1.1.1.1" > $dirfile 10 | fi 11 | #判断new_ip是否获取 12 | 13 | if [ ! -n "$new_ip" ]; then 14 | echo "$datetime 公网IP获取失败,检查'curl ip.3322.net' " >> $log 15 | exit 1 16 | fi 17 | old_ip=`cat $dirfile` #查看旧ip 18 | if [ "$new_ip" = "$old_ip" ]; then 19 | echo "$datetime IP正常 - true " >> $log 20 | else 21 | echo $new_ip > $dirfile 22 | echo "IP已经发生变化, 新IP: $new_ip 旧IP: $old_ip " | docker restart nark 23 | echo "$datetime IP已经发生变化 - error 新IP :$new_ip IP: $old_ip " >> $log 24 | fi 25 | 26 | curl "http://43.1XX.XX.XX:20086/push?token=dahuilang&message=IP变动检测,新IP:$new_ip,旧IP:$old_ip" 27 | -------------------------------------------------------------------------------- /ipip.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | # IP检测,微信TG通知 3 | 4 | #---------------------------- 5 | # 计划任务,每隔5分钟运行脚本 6 | # */5 * * * * /bash/ip.sh #IP检测,微信TG通知 7 | # 手动运行脚本 8 | # /bash/ip.sh 9 | # 添加运行权限 10 | # chmod +x /bash/ip.sh 11 | #---------------------------- 12 | 13 | wx_api="43.XX.XX.XXX:20086" 14 | wx_sckey="dahuilang" 15 | tg_api="silent-term-lang.workers.dev" ##TG接口或者cf反代 16 | tg_id="120908d333" 17 | tg_sckey="162333353:AAGeQmivyLJjVjgjhghix45tZbWyY_LGY" 18 | drivers="NAS" 19 | dirfile='/volume1/docker/ip/IP' 20 | log='/volume1/docker/ip/log/IP.log' 21 | # 获取时间 22 | TIME=『$(date +"%m月%d日 %H:%M:%S")』 23 | 24 | # 判断文件是否存在,不存在就新建 25 | if [ ! -f "$dirfile" ];then 26 | touch $dirfile 27 | fi 28 | 29 | # 读取最近外网地址 30 | IPAddress() { 31 | cat $dirfile 32 | } 33 | 34 | curltest=`which curl` 35 | ping_text=`ping -4 114.114.114.114 -c 1 -w 2 -q` 36 | ping_TIME=`echo $ping_text | awk -F '/' '{print $4}'| awk -F '.' '{print $1}'` 37 | ping_loss=`echo $ping_text | awk -F ', ' '{print $3}' | awk '{print $1}'` 38 | if [ ! -z "$ping_TIME" ] ; then 39 | echo "$TIME ping:$ping_TIME ms 丢包率:$ping_loss" >> $log 40 | else 41 | echo "$TIME ping:失效" >> $log 42 | 43 | fi 44 | if [ ! -z "$ping_TIME" ] ; then 45 | echo "$TIME Internet online 互联网在线" >> $log 46 | 47 | # 获得外网地址 48 | if [ "$hostIP"x = "x" ] ; then 49 | curltest=`which curl` 50 | if [ -z "$curltest" ] || [ ! -s "`which curl`" ] ; then 51 | [ "$hostIP"x = "x" ] && hostIP=`wget -T 5 -t 3 --no-check-certificate --quiet --output-document=- "ip.6655.com/ip.aspx" | grep -E -o '([0-9]+\.){3}[0-9]+' | head -n1 | cut -d' ' -f1` 52 | [ "$hostIP"x = "x" ] && hostIP=`wget -T 5 -t 3 --no-check-certificate --quiet --output-document=- "http://members.3322.org/dyndns/getip" | grep -E -o '([0-9]+\.){3}[0-9]+' | head -n1 | cut -d' ' -f1` 53 | [ "$hostIP"x = "x" ] && hostIP=`wget -T 5 -t 3 --no-check-certificate --quiet --output-document=- "ip.3322.net" | grep -E -o '([0-9]+\.){3}[0-9]+' | head -n1 | cut -d' ' -f1` 54 | [ "$hostIP"x = "x" ] && hostIP=`wget -T 5 -t 3 --no-check-certificate --quiet --output-document=- "https://www.ipip.net/" | grep "IP地址" | grep -E -o '([0-9]+\.){3}[0-9]+' | head -n1 | cut -d' ' -f1` 55 | [ "$hostIP"x = "x" ] && hostIP=`wget -T 5 -t 3 --no-check-certificate --quiet --output-document=- "ip.cip.cc" | grep -E -o '([0-9]+\.){3}[0-9]+' | head -n1 | cut -d' ' -f1` 56 | #[ "$hostIP"x = "x" ] && hostIP=`wget -T 5 -t 3 --no-check-certificate --quiet --output-document=- "icanhazip.com" | grep -E -o '([0-9]+\.){3}[0-9]+' | head -n1 | cut -d' ' -f1` 57 | else 58 | [ "$hostIP"x = "x" ] && hostIP=`curl -L -k -s ip.6655.com/ip.aspx | grep -E -o '([0-9]+\.){3}[0-9]+' | head -n1 | cut -d' ' -f1` 59 | [ "$hostIP"x = "x" ] && hostIP=`curl -L -k -s "http://members.3322.org/dyndns/getip" | grep -E -o '([0-9]+\.){3}[0-9]+' | head -n1 | cut -d' ' -f1` 60 | [ "$hostIP"x = "x" ] && hostIP=`curl -L -k -s ip.3322.net | grep -E -o '([0-9]+\.){3}[0-9]+' | head -n1 | cut -d' ' -f1` 61 | [ "$hostIP"x = "x" ] && hostIP=`curl -L -k -s "https://www.ipip.net" | grep "IP地址" | grep -E -o '([0-9]+\.){3}[0-9]+' | head -n1 | cut -d' ' -f1` 62 | [ "$hostIP"x = "x" ] && hostIP=`curl -L -k -s ip.cip.cc | grep -E -o '([0-9]+\.){3}[0-9]+' | head -n1 | cut -d' ' -f1` 63 | #[ "$hostIP"x = "x" ] && hostIP=`curl icanhazip.com | grep -E -o '([0-9]+\.){3}[0-9]+' | head -n1 | cut -d' ' -f1` 64 | fi 65 | lastIP=$(IPAddress) 66 | if [ "$lastIP" != "$hostIP" ] && [ ! -z "$hostIP" ] ; then 67 | sleep 1 68 | hostIP=`echo $hostIP | head -n1 | cut -d' ' -f1` 69 | lastIP=$(IPAddress) 70 | fi 71 | if [ "$lastIP" != "$hostIP" ] && [ ! -z "$hostIP" ] ; then 72 | echo "$TIME 【互联网 IP 变动】" "目前 IP: ${hostIP}" >> $log 73 | echo "$TIME 【互联网 IP 变动】" "上次 IP: ${lastIP}" >> $log 74 | echo "$TIME 【通知推送】" "互联网IP变动:${hostIP}" >> $log 75 | curl -L -s "http://$wx_api/push?token=$wx_sckey&message=【${drivers}】你的设备IP发生变动,新的IP:${hostIP},上次IP:${lastIP}" >> $log 76 | curl -L -s "https://$tg_api/bot$tg_sckey/sendMessage" -d "chat_id=$tg_id&text=【${drivers}】你的设备IP发生变动""`echo -e " \n "`""新的IP:${hostIP},上次 IP: ${lastIP}" >> $log 77 | echo -n $hostIP > $dirfile 78 | echo 79 | ##ip变化重启nark容器 80 | docker restart nark 81 | else 82 | echo "$TIME 【互联网 IP 正常】" "目前 IP: ${hostIP}" >> $log 83 | fi 84 | fi 85 | 86 | else 87 | echo "$TIME Internet down 互联网断开" >> $log 88 | 89 | fi 90 | -------------------------------------------------------------------------------- /jd_sms_login.py: -------------------------------------------------------------------------------- 1 | import os 2 | import sys 3 | import hashlib 4 | import time 5 | 6 | import requests 7 | 8 | mobile = input('请输入手机号:') 9 | appid = 959 10 | qversion = '1.0.0' 11 | country_code = 86 12 | 13 | ts = round(time.time() * 1000) 14 | sub_cmd = 1 15 | gsign = hashlib.md5(f"{appid}{qversion}{ts}36{sub_cmd}sb2cwlYyaCSN1KUv5RHG3tmqxfEb8NKN".encode()).hexdigest() 16 | data = f"client_ver=1.0.0&gsign={gsign}&appid={appid}&return_page=https%3A%2F%2Fcrpl.jd.com%2Fn%2Fmine%3FpartnerId%3DWBTF0KYY%26ADTAG%3Dkyy_mrqd%26token%3D&cmd=36&sdk_ver=1.0.0&sub_cmd={sub_cmd}&qversion={qversion}&ts={ts}" 17 | headers = { 18 | 'Host': 'qapplogin.m.jd.com', 19 | 'user-agent': 'Mozilla/5.0 (Linux; Android 10; V1838T Build/QP1A.190711.020; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/98.0.4758.87 Mobile Safari/537.36 hap/1.9/vivo com.vivo.hybrid/1.9.6.302 com.jd.crplandroidhap/1.0.3 ({packageName:com.vivo.hybrid,type:deeplink,extra:{}})', 20 | 'accept-language': 'zh-CN,zh;q=0.9,en;q=0.8', 21 | 'content-type': 'application/x-www-form-urlencoded; charset=utf-8', 22 | 'content-length': str(len(data)), 23 | } 24 | 25 | try: 26 | res = requests.post('https://qapplogin.m.jd.com/cgi-bin/qapp/quick', headers=headers, data=data).json() 27 | gsalt = res['data']['gsalt'] 28 | guid = res['data']['guid'] 29 | lsid = res['data']['lsid'] 30 | rsa_modulus = res['data']['rsa_modulus'] 31 | 32 | cookie = f"guid={guid}; lsid={lsid}; gsalt={gsalt}; rsa_modulus={rsa_modulus}" 33 | 34 | ts = round(time.time() * 1000) 35 | sub_cmd = 2 36 | gsign = hashlib.md5(f"{appid}{qversion}{ts}36{sub_cmd}{gsalt}".encode()).hexdigest() 37 | sign = hashlib.md5(f"{appid}{qversion}{country_code}{mobile}4dtyyzKF3w6o54fJZnmeW3bVHl0$PbXj".encode()).hexdigest() 38 | data = f"country_code={country_code}&client_ver=1.0.0&gsign={gsign}&appid={appid}&mobile={mobile}&sign={sign}&cmd=36&sub_cmd={sub_cmd}&qversion={qversion}&ts={ts}" 39 | headers.update({ 40 | 'cookie': cookie, 41 | 'content-length': str(len(data)), 42 | }) 43 | requests.post('https://qapplogin.m.jd.com/cgi-bin/qapp/quick', headers=headers, data=data) 44 | 45 | code = input('请输入验证码:') 46 | ts = round(time.time() * 1000) 47 | sub_cmd = 3 48 | gsign = hashlib.md5(f"{appid}{qversion}{ts}36{sub_cmd}{gsalt}".encode()).hexdigest() 49 | data = f"country_code={country_code}&client_ver=1.0.0&gsign={gsign}&smscode={code}&appid={appid}&mobile={mobile}&cmd=36&sub_cmd={sub_cmd}&qversion={qversion}&ts={ts}" 50 | headers.update({ 51 | 'cookie': cookie, 52 | 'content-length': str(len(data)), 53 | }) 54 | data = { 55 | 'country_code': country_code, 56 | 'client_ver': '1.0.0', 57 | 'gsign': gsign, 58 | 'smscode': code, 59 | 'appid': appid, 60 | 'mobile': mobile, 61 | 'cmd': '36', 62 | 'sub_cmd': sub_cmd, 63 | 'qversion': qversion, 64 | 'ts': ts 65 | } 66 | res = requests.post('https://qapplogin.m.jd.com/cgi-bin/qapp/quick', headers=headers, data=data).json() 67 | pt_key = res['data']['pt_key'] 68 | pt_pin = res['data']['pt_pin'] 69 | 70 | # pt_key = '4dtyyzKF3w6o54fJZnmeW3bVHl0$PbXj' 71 | # pt_pin = 'jd_crpl_kyy_mrqd' 72 | 73 | print('获取成功,请勿泄漏!\n') 74 | print(f"pt_key={pt_key}; pt_pin={pt_pin}") 75 | 76 | except Exception as e: 77 | print('程序错误:', e) 78 | time.sleep(5) 79 | 80 | if sys.platform == 'win32': 81 | os.system('pause') 82 | 83 | -------------------------------------------------------------------------------- /json.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | cat > ${Config}/Config.json << EOF 3 | { 4 | ///浏览器最多几个网页 5 | "MaxTab": "8", 6 | //网站标题 7 | "Title": "${NVJDCNAME}", 8 | //回收时间分钟 不填默认3分钟 9 | "Closetime": "3", 10 | //网站公告 11 | "Announcement": "为提高账户的安全性,请关闭京东免密支付。", 12 | ///开启打印等待日志卡短信验证登陆 可开启 拿到日志群里回复 默认不要填写 13 | "Debug": "", 14 | ///自动滑块次数5次 5次后手动滑块 可设置为0默认手动滑块 15 | "AutoCaptchaCount": "5", 16 | ///XDD PLUS Url http://IP地址:端口/api/login/smslogin 17 | "XDDurl": "", 18 | ///xddToken 19 | "XDDToken": "", 20 | ///登陆预警 0 0 12 * * ? 每天中午十二点 https://www.bejson.com/othertools/cron/ 表达式在线生成网址 21 | "ExpirationCron": " 0 0 12 * * ?", 22 | ///个人资产 0 0 10,20 * * ? 早十点晚上八点 23 | "BeanCron": "0 0 10,20 * * ?", 24 | // ======================================= WxPusher 通知设置区域 =========================================== 25 | // 此处填你申请的 appToken. 官方文档:https://wxpusher.zjiecode.com/docs 26 | // WP_APP_TOKEN 可在管理台查看: https://wxpusher.zjiecode.com/admin/main/app/appToken 27 | // MainWP_UID 填你自己uid 28 | ///这里的通知只用于用户登陆 删除 是给你的通知 29 | "WP_APP_TOKEN": "", 30 | "MainWP_UID": "", 31 | // ======================================= pushplus 通知设置区域 =========================================== 32 | ///Push Plus官方网站:http" //www.pushplus.plus  只有青龙模式有用 33 | ///下方填写您的Token,微信扫码登录后一对一推送或一对多推送下面的token,只填" "PUSH_PLUS_TOKEN", 34 | "PUSH_PLUS_TOKEN": "", 35 | //下方填写您的一对多推送的 "群组编码" ,(一对多推送下面->您的群组(如无则新建)->群组编码) 36 | "PUSH_PLUS_USER": "", 37 | ///青龙配置 注意对接XDD 对接芝士 设置为"Config":[] 38 | "Config": [ 39 | { 40 | //序号必填从1 开始 41 | "QLkey": 1, 42 | //服务器名称 43 | "QLName": "${MANEID}", 44 | //青龙地址 45 | "QLurl": "${QLurl}", 46 | //青龙2,9 OpenApi Client ID 47 | "QL_CLIENTID": "${CLIENTID}", 48 | //青龙2,9 OpenApi Client Secret 49 | "QL_SECRET": "${CLIENTID_SECRET}", 50 | //CK最大数量 51 | "QL_CAPACITY": ${CAPACITY}, 52 | ///建议一个青龙一个WxPusher 应用 53 | "WP_APP_TOKEN": "" 54 | } 55 | ] 56 | 57 | } 58 | EOF 59 | -------------------------------------------------------------------------------- /npm.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | # 3 | 4 | TIME() { 5 | [[ -z "$1" ]] && { 6 | echo -ne " " 7 | } || { 8 | case $1 in 9 | r) export Color="\e[31;1m";; 10 | g) export Color="\e[32;1m";; 11 | b) export Color="\e[34;1m";; 12 | y) export Color="\e[33;1m";; 13 | z) export Color="\e[35;1m";; 14 | l) export Color="\e[36;1m";; 15 | esac 16 | [[ $# -lt 2 ]] && echo -e "\e[36m\e[0m ${1}" || { 17 | echo -e "\e[36m\e[0m ${Color}${2}\e[0m" 18 | } 19 | } 20 | } 21 | echo 22 | TIME l "安装依赖..." 23 | echo 24 | TIME y "安装依赖需要时间,请耐心等待!" 25 | echo 26 | sleep 2 27 | npm config set registry https://mirrors.huaweicloud.com/repository/npm/ 28 | npm config get registry 29 | latest_ver="$(wget -qO- -t1 -T2 "https://api.github.com/repos/npm/cli/releases/latest" |grep "tag_name" |head -n 1 |awk -F ":" '{print $2}' |sed 's/\"//g;s/,//g;s/ //g' |sed 's/^v//')" 30 | npm install -g npm 31 | TIME l "升级npm至${latest_ver}" 32 | npm install -g npm@${latest_ver} --force 33 | TIME l "安装yarn" 34 | npm install -g yarn --force 35 | TIME l "安装依赖date-fns" 36 | yarn add date-fns 37 | TIME l "安装依赖axios" 38 | yarn add axios 39 | TIME l "安装依赖ts-node" 40 | yarn add ts-node 41 | TIME l "安装依赖typescript" 42 | yarn add typescript 43 | TIME l "安装依赖png-js" 44 | npm install -g png-js 45 | TIME l "安装依赖crypto-js" 46 | npm install -g crypto-js 47 | TIME l "安装依赖md5" 48 | npm install -g md5 49 | TIME l "安装依赖ts-md5" 50 | npm install -g ts-md5 51 | TIME l "安装依赖tslib" 52 | npm install -g tslib 53 | TIME l "安装依赖@types/node" 54 | npm install -g @types/node 55 | TIME l "安装依赖requests" 56 | pip3 install requests 57 | TIME l "安装依赖tough-cookie" 58 | npm install -g tough-cookie 59 | TIME l "安装依赖jsdom" 60 | npm install -g jsdom 61 | TIME l "安装依赖download" 62 | pip3 install download 63 | TIME l "安装依赖tunnel" 64 | npm install -g tunnel 65 | TIME l "安装依赖fs" 66 | npm install -g fs 67 | TIME l "安装依赖ws" 68 | npm install -g ws 69 | TIME l "安装依赖js-base64" 70 | npm install -g js-base64 71 | TIME l "安装依赖jieba" 72 | pip3 install jieba 73 | TIME l "安装cairo-dev" 74 | npm install -g got 75 | cd /ql/scripts/ && apk add --no-cache build-base g++ cairo-dev pango-dev giflib-dev 76 | cd /ql 77 | pip3 install canvas 78 | cd /ql 79 | TIME l "安装python3" 80 | apk add python3 zlib-dev gcc jpeg-dev python3-dev musl-dev freetype-dev 81 | cd /ql 82 | echo 83 | TIME g "依赖安装完毕..." 84 | echo 85 | exit 0 86 | -------------------------------------------------------------------------------- /nvjdc.sh: -------------------------------------------------------------------------------- 1 | #/usr/bin/env bash 2 | red='\033[0;31m' 3 | green='\033[0;32m' 4 | yellow='\033[0;33m' 5 | plain='\033[0m' 6 | 7 | # check root 8 | [[ $EUID -ne 0 ]] && echo -e "${red}错误: ${plain} 必须使用root用户运行此脚本!\n" && exit 1 9 | clear 10 | # globals 11 | CWD=$(cd -P -- "$(dirname -- "$0")" && pwd -P) 12 | [ -e "${CWD}/scripts/globals" ] && . ${CWD}/scripts/globals 13 | 14 | 15 | 16 | checkos(){ 17 | ifTermux=$(echo $PWD | grep termux) 18 | ifMacOS=$(uname -a | grep Darwin) 19 | if [ -n "$ifTermux" ];then 20 | os_version=Termux 21 | elif [ -n "$ifMacOS" ];then 22 | os_version=MacOS 23 | else 24 | os_version=$(grep 'VERSION_ID' /etc/os-release | cut -d '"' -f 2 | tr -d '.') 25 | fi 26 | 27 | if [[ "$os_version" == "2004" ]] || [[ "$os_version" == "10" ]] || [[ "$os_version" == "11" ]];then 28 | ssll="-k --ciphers DEFAULT@SECLEVEL=1" 29 | fi 30 | } 31 | checkos 32 | 33 | checkCPU(){ 34 | CPUArch=$(uname -m) 35 | if [[ "$CPUArch" == "aarch64" ]];then 36 | arch=linux_arm64 37 | elif [[ "$CPUArch" == "i686" ]];then 38 | arch=linux_386 39 | elif [[ "$CPUArch" == "arm" ]];then 40 | arch=linux_arm 41 | elif [[ "$CPUArch" == "x86_64" ]] && [ -n "$ifMacOS" ];then 42 | arch=darwin_amd64 43 | elif [[ "$CPUArch" == "x86_64" ]];then 44 | arch=linux_amd64 45 | fi 46 | } 47 | checkCPU 48 | check_dependencies(){ 49 | 50 | os_detail=$(cat /etc/os-release 2> /dev/null) 51 | if_debian=$(echo $os_detail | grep 'ebian') 52 | if_redhat=$(echo $os_detail | grep 'rhel') 53 | if [ -n "$if_debian" ];then 54 | InstallMethod="apt" 55 | elif [ -n "$if_redhat" ] && [[ "$os_version" -lt 8 ]];then 56 | InstallMethod="yum" 57 | elif [[ "$os_version" == "MacOS" ]];then 58 | InstallMethod="brew" 59 | fi 60 | } 61 | check_dependencies 62 | #安装wget、curl、unzip 63 | ${InstallMethod} install unzip wget curl -y > /dev/null 2>&1 64 | get_opsy() { 65 | [ -f /etc/redhat-release ] && awk '{print ($1,$3~/^[0-9]/?$3:$4)}' /etc/redhat-release && return 66 | [ -f /etc/os-release ] && awk -F'[= "]' '/PRETTY_NAME/{print $3,$4,$5}' /etc/os-release && return 67 | [ -f /etc/lsb-release ] && awk -F'[="]+' '/DESCRIPTION/{print $2}' /etc/lsb-release && return 68 | } 69 | virt_check() { 70 | # if hash ifconfig 2>/dev/null; then 71 | # eth=$(ifconfig) 72 | # fi 73 | 74 | virtualx=$(dmesg) 2>/dev/null 75 | 76 | if [[ $(which dmidecode) ]]; then 77 | sys_manu=$(dmidecode -s system-manufacturer) 2>/dev/null 78 | sys_product=$(dmidecode -s system-product-name) 2>/dev/null 79 | sys_ver=$(dmidecode -s system-version) 2>/dev/null 80 | else 81 | sys_manu="" 82 | sys_product="" 83 | sys_ver="" 84 | fi 85 | 86 | if grep docker /proc/1/cgroup -qa; then 87 | virtual="Docker" 88 | elif grep lxc /proc/1/cgroup -qa; then 89 | virtual="Lxc" 90 | elif grep -qa container=lxc /proc/1/environ; then 91 | virtual="Lxc" 92 | elif [[ -f /proc/user_beancounters ]]; then 93 | virtual="OpenVZ" 94 | elif [[ "$virtualx" == *kvm-clock* ]]; then 95 | virtual="KVM" 96 | elif [[ "$cname" == *KVM* ]]; then 97 | virtual="KVM" 98 | elif [[ "$cname" == *QEMU* ]]; then 99 | virtual="KVM" 100 | elif [[ "$virtualx" == *"VMware Virtual Platform"* ]]; then 101 | virtual="VMware" 102 | elif [[ "$virtualx" == *"Parallels Software International"* ]]; then 103 | virtual="Parallels" 104 | elif [[ "$virtualx" == *VirtualBox* ]]; then 105 | virtual="VirtualBox" 106 | elif [[ -e /proc/xen ]]; then 107 | virtual="Xen" 108 | elif [[ "$sys_manu" == *"Microsoft Corporation"* ]]; then 109 | if [[ "$sys_product" == *"Virtual Machine"* ]]; then 110 | if [[ "$sys_ver" == *"7.0"* || "$sys_ver" == *"Hyper-V" ]]; then 111 | virtual="Hyper-V" 112 | else 113 | virtual="Microsoft Virtual Machine" 114 | fi 115 | fi 116 | else 117 | virtual="Dedicated母鸡" 118 | fi 119 | } 120 | get_system_info() { 121 | cname=$(awk -F: '/model name/ {name=$2} END {print name}' /proc/cpuinfo | sed 's/^[ \t]*//;s/[ \t]*$//') 122 | opsy=$(get_opsy) 123 | arch=$(uname -m) 124 | 125 | kern=$(uname -r) 126 | 127 | virt_check 128 | } 129 | copyright(){ 130 | clear 131 | echo -e " 132 | ————————————————————————————————————————————————————————————— 133 | Nvjdc自助面板一键懒人安装脚本 134 | ${green} 135 | ————————————————————————————————————————————————————————————— 136 | " 137 | } 138 | quit(){ 139 | exit 140 | } 141 | 142 | install_nvjdc(){ 143 | echo -e "${red}开始进行安装,请根据命令提示操作${plain}" 144 | echo -e "${green}检测到已有nvjdc面板,正在删除旧的nvjdc文件容器镜像,请稍后...${plain}" 145 | 146 | docker=$(docker ps -a|grep nvjdc) && dockerid=$(awk '{print $(1)}' <<<${docker}) 147 | images=$(docker images|grep nvjdc) && imagesid=$(awk '{print $(3)}' <<<${images}) 148 | docker stop -t=5 "${dockerid}" > /dev/null 2>&1 149 | docker rm "${dockerid}" 150 | docker rmi "${imagesid}" 151 | 152 | if [[ "$(. /etc/os-release && echo "$ID")" == "centos" ]]; then 153 | yum install git -y > /dev/null 154 | elif [[ "$(. /etc/os-release && echo "$ID")" == "ubuntu" ]]; then 155 | apt-get install git -y > /dev/null 156 | elif [[ "$(. /etc/os-release && echo "$ID")" == "debian" ]]; then 157 | apt install git -y > /dev/null 158 | fi 159 | rm -rf /root/nvjdc > /dev/null 160 | git clone https://github.com/Mofan1379/nvjdcdocker.git /root/nvjdc 161 | if [ ! -d "/root/nvjdc/.local-chromium/Linux-884014" ]; then 162 | cd /root/nvjdc 163 | echo -e "${green}正在拉取chromium-browser-snapshots等依赖,体积100多M,请耐心等待下一步命令提示···${plain}" 164 | mkdir -p .local-chromium/Linux-884014 && cd .local-chromium/Linux-884014 165 | wget https://mirrors.huaweicloud.com/chromium-browser-snapshots/Linux_x64/884014/chrome-linux.zip > /dev/null 2>&1 166 | unzip chrome-linux.zip > /dev/null 2>&1 167 | rm -f chrome-linux.zip > /dev/null 2>&1 168 | fi 169 | mkdir /root/nvjdc/Config && cd /root/nvjdc/Config 170 | wget -O Config.json https://ghproxy.com/https://raw.githubusercontent.com/shidahuilang/nvjdc/main/Config.json 171 | read -p "请输入青龙服务器在web页面中显示的名称: " QLName && printf "\n" 172 | read -p "请输入nvjdc面板标题: " title && printf "\n" 173 | read -p "请输入nvjdc面板希望使用的端口号: " portinfo && printf "\n" 174 | read -p "请输入XDD面板地址,格式如http://192.168.2.2:6666/api/login/smslogin 如不启用直接回车: " XDDurl && printf "\n" 175 | read -p "请输入XDD面板Token(如不启用直接回车): " XDDToken && printf "\n" 176 | read -p "请输入PUSHPLUS的TOKEN(如不启用直接回车): " PUSH_PLUS_TOKEN && printf "\n" 177 | read -p "nvjdc是否对接青龙,输入y或者n " jdcqinglong && printf "\n" 178 | if [[ "$jdcqinglong" == "y" ]];then 179 | read -p "请输入青龙OpenApi Client ID: " ClientID && printf "\n" 180 | read -p "请输入青龙OpenApi Client Secret: " ClientSecret && printf "\n" 181 | read -p "请输入青龙服务器的url地址(类似http://192.168.2.2:5700): " QLurl && printf "\n" 182 | cat > /root/nvjdc/Config/Config.json << EOF 183 | { 184 | ///最大支持几个网页 185 | "MaxTab": "20", 186 | //网站标题 187 | "Title": "Nvjdc", 188 | //回收时间分钟 不填默认3分钟 189 | "Closetime": "3", 190 | //网站公告 191 | "Announcement": "本项目脚本收集于互联网。为了您的财产安全,请关闭京东免密支付。", 192 | ///开启打印等待日志卡短信验证登陆 可开启 拿到日志群里回复 默认不要填写 193 | "Debug": "", 194 | ///自动滑块次数5次 5次后手动滑块 可设置为0默认手动滑块 195 | "AutoCaptchaCount": "5", 196 | ///XDD PLUS Url http://IP地址:端口/api/login/smslogin 197 | "XDDurl": "", 198 | ///xddToken 199 | "XDDToken": "", 200 | //## 8. Push Plus官方网站:http: //www.pushplus.plus 201 | //下方填写您的Token,微信扫码登录后一对一推送或一对多推送下面的token,只填" "PUSH_PLUS_TOKEN", 202 | "PUSH_PLUS_TOKEN": "${PUSH_PLUS_TOKEN}", 203 | //下方填写您的一对多推送的 "群组编码" ,(一对多推送下面->您的群组(如无则新建)->群组编码) 204 | "PUSH_PLUS_USER": "", 205 | ///多青龙配置 206 | "Config": [ 207 | { 208 | //序号必须从1开始 209 | "QLkey": 1, 210 | //服务器名称 211 | "QLName": "${QLName}", 212 | //青龙url 213 | "QLurl": "${QLurl}", 214 | //青龙2,9 OpenApi Client ID 215 | "QL_CLIENTID": "${ClientID}", 216 | //青龙2,9 OpenApi Client Secret 217 | "QL_SECRET": "${ClientSecret}", 218 | //青龙面包最大ck容量 219 | "QL_CAPACITY": 200, 220 | //消息推送二维码 221 | "QRurl":"" 222 | } 223 | ] 224 | } 225 | EOF 226 | else 227 | cat > /root/nvjdc/Config/Config.json << EOF 228 | { 229 | ///浏览器最多几个网页 230 | "MaxTab": "8", 231 | //网站标题 232 | "Title": "${title}", 233 | //网站公告 234 | "Announcement": "本项目脚本收集于互联网。为了您的财产安全,请关闭京东免密支付。", 235 | ///XDD PLUS Url http://IP地址:端口/api/login/smslogin 236 | "XDDurl": "${XDDurl}", 237 | ///xddToken 238 | "XDDToken": "${XDDToken}", 239 | "PUSH_PLUS_TOKEN": "${PUSH_PLUS_TOKEN}", 240 | ///青龙配置 注意 如果不要青龙 Config :[] 241 | "Config": [] 242 | } 243 | EOF 244 | fi 245 | read -p "请输入自动滑块次数 直接回车默认5次后手动滑块 输入0为默认手动滑块: " AutoCaptcha && printf "\n" 246 | if [ ! -n "$AutoCaptcha" ];then 247 | sed -i "5a \ \"AutoCaptchaCount\": \"5\"," /root/nvjdc/Config/Config.json 248 | else 249 | sed -i "5a \ \"AutoCaptchaCount\": \"${AutoCaptcha}\"," /root/nvjdc/Config/Config.json 250 | fi 251 | read -p "请输入要安装的nvjdc版本,如安装最新版直接回车: " version && printf "\n" 252 | if [ ! -n "${version}" ];then 253 | version1=latest 254 | else 255 | version1=${version} 256 | fi 257 | 258 | 259 | #判断机器是否安装docker 260 | if test -z "$(which docker)"; then 261 | echo -e "检测到系统未安装docker,开始安装docker" 262 | curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun > /dev/null 2>&1 263 | curl -L "https://github.com/docker/compose/releases/download/1.24.1/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose && chmod +x /usr/local/bin/docker-compose && ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose 264 | fi 265 | 266 | #拉取nvjdc镜像 267 | echo -e "${green}开始拉取nvjdc镜像文件,nvjdc镜像比较大,请耐心等待${plain}" 268 | docker pull shidahuilang/nvjdc:latest 269 | 270 | 271 | #创建并启动nvjdc容器 272 | cd /root/nvjdc 273 | echo -e "${green}开始创建nvjdc容器${plain}" 274 | docker run --name nvjdc -p ${portinfo}:80 -d -v "$(pwd)":/app \ 275 | -v /etc/localtime:/etc/localtime:ro \ 276 | -it --privileged=true shidahuilang/nvjdc:latest 277 | docker update --restart=always nvjdc 278 | 279 | baseip=$(curl -s ipip.ooo) > /dev/null 280 | 281 | echo -e "${green}安装完毕,面板访问地址:http://${baseip}:${portinfo}${plain}" 282 | } 283 | 284 | update_nvjdc(){ 285 | mv /root/nvjdc /root/nvjdc1 286 | git clone https://github.com/Mofan1379/nvjdcdocker.git /root/nvjdc 287 | cd /root/nvjdc && mkdir -p Config && mv /root/nvjdc1/Config.json /root/nvjdc/Config/Config.json 288 | cd /root/nvjdc && mv /root/nvjdc1/.local-chromium /root/nvjdc/.local-chromium 289 | cd /root/nvjdc 290 | portinfo=$(docker port nvjdc | head -1 | sed 's/ //g' | sed 's/80\/tcp->0.0.0.0://g') 291 | condition=$(cat /root/nvjdc/Config/Config.json | grep -o '"XDDurl": .*' | awk -F":" '{print $1}' | sed 's/\"//g') 292 | AutoCaptcha1=$(cat /root/nvjdc/Config/Config.json | grep -o '"AutoCaptchaCount": .*' | awk -F":" '{print $1}' | sed 's/\"//g') 293 | if [ ! -n "$condition" ]; then 294 | read -p "是否要对接XDD,输入y或者n: " XDD && printf "\n" 295 | if [[ "$XDD" == "y" ]];then 296 | read -p "请输入XDD面板地址,格式如http://192.168.2.2:6666/api/login/smslogin : " XDDurl && printf "\n" 297 | read -p "请输入XDD面板Token: " XDDToken && printf "\n" 298 | sed -i "7a \ \"XDDurl\": \"${XDDurl}\"," /root/nvjdc/Config/Config.json 299 | sed -i "7a \ \"XDDToken\": \"${XDDToken}\"," /root/nvjdc/Config/Config.json 300 | fi 301 | fi 302 | 303 | if [ ! -n "$AutoCaptcha1" ];then 304 | read -p "请输入自动滑块次数 直接回车默认5次后手动滑块 输入0为默认手动滑块: " AutoCaptcha && printf "\n" 305 | if [ ! -n "$AutoCaptcha" ];then 306 | sed -i "5a \ \"AutoCaptchaCount\": \"5\"," /root/nvjdc/Config/Config.json 307 | else 308 | sed -i "5a \ \"AutoCaptchaCount\": \"${AutoCaptcha}\"," /root/nvjdc/Config/Config.json 309 | fi 310 | fi 311 | baseip=$(curl -s ipip.ooo) > /dev/null 312 | docker rm -f nvjdc 313 | docker pull shidahuilang/nvjdc:latest 314 | docker run --name nvjdc -p ${portinfo}:80 -d -v "$(pwd)":/app \ 315 | -v /etc/localtime:/etc/localtime:ro \ 316 | -it --privileged=true shidahuilang/nvjdc:2.4 317 | docker update --restart=always nvjdc 318 | echo -e "${green}nvjdc更新完毕,脚本自动退出。${plain}" 319 | exit 0 320 | } 321 | 322 | uninstall_nvjdc(){ 323 | docker=$(docker ps -a|grep nvjdc) && dockerid=$(awk '{print $(1)}' <<<${docker}) 324 | images=$(docker images|grep nvjdc) && imagesid=$(awk '{print $(3)}' <<<${images}) 325 | docker stop -t=5 "${dockerid}" > /dev/null 2>&1 326 | docker rm "${dockerid}" 327 | docker rmi "${imagesid}" 328 | rm -rf nvjdc 329 | echo -e "${green}nvjdc面板已卸载,镜像已删除。${plain}" 330 | exit 0 331 | } 332 | 333 | menu() { 334 | echo -e "\ 335 | ${green}0.${plain} 退出脚本 336 | ${green}1.${plain} 安装nvjdc 337 | ${green}2.${plain} 升级nvjdc 338 | ${green}3.${plain} 卸载nvjdc 339 | " 340 | get_system_info 341 | echo -e "当前系统信息: ${Font_color_suffix}$opsy ${Green_font_prefix}$virtual${Font_color_suffix} $arch ${Green_font_prefix}$kern${Font_color_suffix} 342 | " 343 | 344 | read -p "请输入数字 :" num 345 | case "$num" in 346 | 0) 347 | quit 348 | ;; 349 | 1) 350 | install_nvjdc 351 | ;; 352 | 2) 353 | update_nvjdc 354 | ;; 355 | 3) 356 | uninstall_nvjdc 357 | ;; 358 | *) 359 | clear 360 | echo -e "${Error}:请输入正确数字 [0-3]" 361 | sleep 5s 362 | menu 363 | ;; 364 | esac 365 | } 366 | 367 | copyright 368 | 369 | menu 370 | -------------------------------------------------------------------------------- /pro.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | # 创建映射文件夹 4 | read -p "请输入映射文件夹路径(默认为 /root/pro): " pro_path 5 | pro_path=${pro_path:-"/root/pro"} 6 | mkdir -p $pro_path 7 | cd $pro_path 8 | 9 | # 获取 Prolic 10 | read -p "请输入 Prolic: " prolic 11 | 12 | # 获取管理账号和密码 13 | read -p "请输入自定义管理帐号: " admin_user 14 | read -p "请输入自定义管理密码(八位以上包含大小写字母、数字或特殊字符): " admin_pwd 15 | 16 | # 启动容器 17 | docker run -id \ 18 | --name pro -p 5016:5016 \ 19 | -v "$(pwd)":/app/Data \ 20 | -e Prolic=$prolic \ 21 | -e User=$admin_user \ 22 | -e Pwd=$admin_pwd \ 23 | --privileged=true \ 24 | nolanhzy/pro:latest 25 | 26 | # 检查容器是否启动成功 27 | if [ $(docker ps -f "name=pro" --format "{{.Names}}" | grep -c "pro") -eq 1 ] 28 | then 29 | echo "容器已成功启动!" 30 | else 31 | echo "容器启动失败,请检查!" 32 | exit 1 33 | fi 34 | 35 | # 检查面板是否正常 36 | read -p "请在浏览器中输入 IP:5016 并回车,查看面板是否正常(y/n): " check_panel 37 | if [ $check_panel == "y" ] 38 | then 39 | echo "面板正常!" 40 | else 41 | echo "面板异常,请检查!" 42 | exit 1 43 | fi 44 | 45 | # 进入管理界面 46 | read -p "请在浏览器中输入 IP:5016/#/admin 并回车,进入管理界面(y/n): " enter_admin 47 | if [ $enter_admin == "y" ] 48 | then 49 | echo "已成功进入管理界面!" 50 | else 51 | echo "进入管理界面失败,请检查!" 52 | exit 1 53 | fi 54 | -------------------------------------------------------------------------------- /python3.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | # 3 | echo -e "\033[32;1m 开始安装程序 \033[0m" 4 | echo 5 | cd /ql/scripts/ && apk add --no-cache build-base g++ cairo-dev pango-dev giflib-dev 6 | cd /ql 7 | apk add python3 zlib-dev gcc jpeg-dev python3-dev musl-dev freetype-dev 8 | cd /ql 9 | -------------------------------------------------------------------------------- /rabbit.sh: -------------------------------------------------------------------------------- 1 | #/usr/bin/env bash 2 | red='\033[0;31m' 3 | green='\033[0;32m' 4 | yellow='\033[0;33m' 5 | plain='\033[0m' 6 | 7 | # check root 8 | [[ $EUID -ne 0 ]] && echo -e "${red}错误: ${plain} 必须使用root用户运行此脚本!\n" && exit 1 9 | clear 10 | # globals 11 | CWD=$(cd -P -- "$(dirname -- "$0")" && pwd -P) 12 | [ -e "${CWD}/scripts/globals" ] && . ${CWD}/scripts/globals 13 | 14 | 15 | 16 | checkos(){ 17 | ifTermux=$(echo $PWD | grep termux) 18 | ifMacOS=$(uname -a | grep Darwin) 19 | if [ -n "$ifTermux" ];then 20 | os_version=Termux 21 | elif [ -n "$ifMacOS" ];then 22 | os_version=MacOS 23 | else 24 | os_version=$(grep 'VERSION_ID' /etc/os-release | cut -d '"' -f 2 | tr -d '.') 25 | fi 26 | 27 | if [[ "$os_version" == "2004" ]] || [[ "$os_version" == "10" ]] || [[ "$os_version" == "11" ]];then 28 | ssll="-k --ciphers DEFAULT@SECLEVEL=1" 29 | fi 30 | } 31 | checkos 32 | 33 | checkCPU(){ 34 | CPUArch=$(uname -m) 35 | if [[ "$CPUArch" == "aarch64" ]];then 36 | arch=linux_arm64 37 | elif [[ "$CPUArch" == "i686" ]];then 38 | arch=linux_386 39 | elif [[ "$CPUArch" == "arm" ]];then 40 | arch=linux_arm 41 | elif [[ "$CPUArch" == "x86_64" ]] && [ -n "$ifMacOS" ];then 42 | arch=darwin_amd64 43 | elif [[ "$CPUArch" == "x86_64" ]];then 44 | arch=linux_amd64 45 | fi 46 | } 47 | checkCPU 48 | check_dependencies(){ 49 | 50 | os_detail=$(cat /etc/os-release 2> /dev/null) 51 | if_debian=$(echo $os_detail | grep 'ebian') 52 | if_redhat=$(echo $os_detail | grep 'rhel') 53 | if [ -n "$if_debian" ];then 54 | InstallMethod="apt" 55 | elif [ -n "$if_redhat" ] && [[ "$os_version" -lt 8 ]];then 56 | InstallMethod="yum" 57 | elif [[ "$os_version" == "MacOS" ]];then 58 | InstallMethod="brew" 59 | fi 60 | } 61 | check_dependencies 62 | #安装wget、curl、unzip 63 | ${InstallMethod} install unzip wget curl -y > /dev/null 2>&1 64 | get_opsy() { 65 | [ -f /etc/redhat-release ] && awk '{print ($1,$3~/^[0-9]/?$3:$4)}' /etc/redhat-release && return 66 | [ -f /etc/os-release ] && awk -F'[= "]' '/PRETTY_NAME/{print $3,$4,$5}' /etc/os-release && return 67 | [ -f /etc/lsb-release ] && awk -F'[="]+' '/DESCRIPTION/{print $2}' /etc/lsb-release && return 68 | } 69 | virt_check() { 70 | # if hash ifconfig 2>/dev/null; then 71 | # eth=$(ifconfig) 72 | # fi 73 | 74 | virtualx=$(dmesg) 2>/dev/null 75 | 76 | if [[ $(which dmidecode) ]]; then 77 | sys_manu=$(dmidecode -s system-manufacturer) 2>/dev/null 78 | sys_product=$(dmidecode -s system-product-name) 2>/dev/null 79 | sys_ver=$(dmidecode -s system-version) 2>/dev/null 80 | else 81 | sys_manu="" 82 | sys_product="" 83 | sys_ver="" 84 | fi 85 | 86 | if grep docker /proc/1/cgroup -qa; then 87 | virtual="Docker" 88 | elif grep lxc /proc/1/cgroup -qa; then 89 | virtual="Lxc" 90 | elif grep -qa container=lxc /proc/1/environ; then 91 | virtual="Lxc" 92 | elif [[ -f /proc/user_beancounters ]]; then 93 | virtual="OpenVZ" 94 | elif [[ "$virtualx" == *kvm-clock* ]]; then 95 | virtual="KVM" 96 | elif [[ "$cname" == *KVM* ]]; then 97 | virtual="KVM" 98 | elif [[ "$cname" == *QEMU* ]]; then 99 | virtual="KVM" 100 | elif [[ "$virtualx" == *"VMware Virtual Platform"* ]]; then 101 | virtual="VMware" 102 | elif [[ "$virtualx" == *"Parallels Software International"* ]]; then 103 | virtual="Parallels" 104 | elif [[ "$virtualx" == *VirtualBox* ]]; then 105 | virtual="VirtualBox" 106 | elif [[ -e /proc/xen ]]; then 107 | virtual="Xen" 108 | elif [[ "$sys_manu" == *"Microsoft Corporation"* ]]; then 109 | if [[ "$sys_product" == *"Virtual Machine"* ]]; then 110 | if [[ "$sys_ver" == *"7.0"* || "$sys_ver" == *"Hyper-V" ]]; then 111 | virtual="Hyper-V" 112 | else 113 | virtual="Microsoft Virtual Machine" 114 | fi 115 | fi 116 | else 117 | virtual="Dedicated母鸡" 118 | fi 119 | } 120 | get_system_info() { 121 | cname=$(awk -F: '/model name/ {name=$2} END {print name}' /proc/cpuinfo | sed 's/^[ \t]*//;s/[ \t]*$//') 122 | opsy=$(get_opsy) 123 | arch=$(uname -m) 124 | 125 | kern=$(uname -r) 126 | 127 | virt_check 128 | } 129 | copyright(){ 130 | clear 131 | echo -e " 132 | ————————————————————————————————————————————————————————————— 133 | Rabbit自助面板一键懒人安装脚本 134 | ${green} 135 | ————————————————————————————————————————————————————————————— 136 | " 137 | } 138 | quit(){ 139 | exit 140 | } 141 | 142 | install_rabbit(){ 143 | echo -e "${red}开始进行安装,请根据命令提示操作${plain}" 144 | 145 | docker=$(docker ps -a|grep rabbit) && dockerid=$(awk '{print $(1)}' <<<${docker}) 146 | images=$(docker images|grep rabbit) && imagesid=$(awk '{print $(3)}' <<<${images}) 147 | docker stop -t=5 "${dockerid}" > /dev/null 2>&1 148 | docker rm "${dockerid}" 149 | docker rmi "${imagesid}" 150 | 151 | if [[ "$(. /etc/os-release && echo "$ID")" == "centos" ]]; then 152 | yum install git -y > /dev/null 153 | elif [[ "$(. /etc/os-release && echo "$ID")" == "ubuntu" ]]; then 154 | apt-get install git -y > /dev/null 155 | elif [[ "$(. /etc/os-release && echo "$ID")" == "debian" ]]; then 156 | apt install git -y > /dev/null 157 | fi 158 | rm -rf /root/Rabbit > /dev/null 159 | cd /root && mkdir -p Rabbit && cd Rabbit 160 | cd /root/Rabbit && mkdir -p Config 161 | cd /root/Rabbit 162 | wget -O Config.json https://ghproxy.com/https://raw.githubusercontent.com/shidahuilang/QL-/main/Config.json 163 | read -p "请输入青龙服务器在web页面中显示的名称: " QLName && printf "\n" 164 | read -p "请输入Rabbit面板标题: " Title && printf "\n" 165 | read -p "请输入青龙QL_CLIENTID: " CLIENTID && printf "\n" 166 | read -p "请输入青龙QL_SECRET: " SECRET && printf "\n" 167 | read -p "请输入青龙服务器的url地址(类似http://192.168.2.2:5700): " QLurl && printf "\n" 168 | read -p "请输入阿里云或腾讯云proxy代理地址(格式为http://或者socks://xxx.xxx.xxx.xxx:xxxx): " proxy && printf "\n" 169 | cat > /root/Rabbit/Config/Config.json << EOF 170 | { 171 | "MaxTab": "4", 172 | "Title": "Rabbit", 173 | "Closetime": "5", 174 | "Announcement": "为提高账户的安全性,请关闭免密支付。", 175 | "AutoCaptchaCount": "5", 176 | "proxy": "${proxy}", 177 | "Config": [ 178 | { 179 | "QLkey": 1, 180 | "QLName": "${QLName}", 181 | "QLurl": "${QLurl}", 182 | "QL_CLIENTID": "${CLIENTID}", 183 | "QL_SECRET": "${SECRET}", 184 | "QL_CAPACITY": 40, 185 | "QL_WSCK": 40 186 | }, 187 | { 188 | "QLkey": 2, 189 | "QLName": "阿里云", 190 | "QLurl": "http://xxx.xxx.xxx.xxx:5700", 191 | "QL_CLIENTID": "xxx", 192 | "QL_SECRET": "xxx", 193 | "QL_CAPACITY": 40, 194 | "QL_WSCK": 40 195 | } 196 | ] 197 | } 198 | EOF 199 | 200 | 201 | 202 | #拉取Rabbit镜像 203 | echo -e "${green}开始拉取rabbit镜像文件,rabbit镜像比较大,请耐心等待${plain}" 204 | docker pull ht944/rabbit:latest 205 | 206 | 207 | 208 | #创建并启动rabbit容器 209 | #cd /root/rabbit 210 | echo -e "${green}开始创建rabbit容器${plain}" 211 | cd /root/Rabbit && docker run --name rabbit -d -v "$(pwd)"/Config:/usr/src/Project/Config -p 5701:1234 ht944/rabbit:latest 212 | 213 | baseip=$(curl -s ipip.ooo) > /dev/null 214 | 215 | echo -e "${green}安装完毕,面板访问地址:http://${baseip}:5701" 216 | } 217 | 218 | update_rabbit(){ 219 | docker pull ht944/rabbit:latest && cd /root/Rabbit && docker run --name rabbit -d -v "$(pwd)"/Config:/usr/src/Project/Config -p 5701:1234 ht944/rabbit:latest 220 | baseip=$(curl -s ipip.ooo) > /dev/null 221 | docker rm -f rabbit 222 | docker pull ht944/rabbit:latest 223 | docker run --name rabbit -d -v --restart unless-stopped "$(pwd)"/Config:/usr/src/Project/Config -p 5701:1234 ht944/rabbit:latest 224 | 225 | docker update --restart=always rabbit 226 | echo -e "${green}rabbit更新完毕,脚本自动退出。${plain}" 227 | exit 0 228 | } 229 | 230 | uninstall_rabbit(){ 231 | docker=$(docker ps -a|grep rabbit) && dockerid=$(awk '{print $(1)}' <<<${docker}) 232 | images=$(docker images|grep rabbit) && imagesid=$(awk '{print $(3)}' <<<${images}) 233 | docker stop -t=5 "${dockerid}" > /dev/null 2>&1 234 | docker rm "${dockerid}" 235 | docker rmi "${imagesid}" 236 | rm -rf /root/Rabbit 237 | echo -e "${green}rabbit面板已卸载,镜像已删除。${plain}" 238 | exit 0 239 | } 240 | 241 | menu() { 242 | echo -e "\ 243 | ${green}0.${plain} 退出脚本 244 | ${green}1.${plain} 安装rabbit 245 | ${green}2.${plain} 升级rabbit 246 | ${green}3.${plain} 卸载rabbit 247 | " 248 | get_system_info 249 | echo -e "当前系统信息: ${Font_color_suffix}$opsy ${Green_font_prefix}$virtual${Font_color_suffix} $arch ${Green_font_prefix}$kern${Font_color_suffix} 250 | " 251 | 252 | read -p "请输入数字 :" num 253 | case "$num" in 254 | 0) 255 | quit 256 | ;; 257 | 1) 258 | install_rabbit 259 | ;; 260 | 2) 261 | update_rabbit 262 | ;; 263 | 3) 264 | uninstall_rabbit 265 | ;; 266 | *) 267 | clear 268 | echo -e "${Error}:请输入正确数字 [0-3]" 269 | sleep 5s 270 | menu 271 | ;; 272 | esac 273 | } 274 | 275 | copyright 276 | 277 | menu 278 | -------------------------------------------------------------------------------- /ssh.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | 3 | function system_check() { 4 | if [[ "$(. /etc/os-release && echo "$ID")" == "centos" ]]; then 5 | system_centos 6 | elif [[ "$(. /etc/os-release && echo "$ID")" == "ubuntu" ]]; then 7 | system_ubuntu 8 | elif [[ "$(. /etc/os-release && echo "$ID")" == "debian" ]]; then 9 | system_debian 10 | elif [[ "$(. /etc/os-release && echo "$ID")" == "alpine" ]]; then 11 | system_alpine 12 | elif [[ -f /etc/openwrt_release ]] && [[ -f /rom/etc/openwrt_release ]]; then 13 | echo -e "\033[33m openwrt无需开启root账户SSH \033[0m" 14 | exit 0 15 | else 16 | echo -e "\033[41;33m 不支持您的系统 \033[0m" 17 | exit 1 18 | fi 19 | } 20 | 21 | function system_centos() { 22 | if [[ ! -f /etc/ssh/sshd_config ]]; then 23 | echo -e "\033[33m 安装SSH \033[0m" 24 | yum install -y openssh-server 25 | systemctl enable sshd.service 26 | ssh_PermitRootLogin 27 | service sshd restart 28 | else 29 | ssh_PermitRootLogin 30 | service sshd restart 31 | fi 32 | exit 0 33 | } 34 | 35 | function system_ubuntu() { 36 | if [[ ! -f /etc/ssh/sshd_config ]]; then 37 | echo -e "\033[33m 安装SSH \033[0m" 38 | apt-get -y update 39 | apt-get install -y openssh-server 40 | ssh_PermitRootLogin 41 | service ssh restart 42 | else 43 | ssh_PermitRootLogin 44 | service ssh restart 45 | fi 46 | exit 0 47 | } 48 | 49 | function system_debian() { 50 | if [[ ! -f /etc/ssh/sshd_config ]]; then 51 | echo -e "\033[33m 安装SSH \033[0m" 52 | apt -y update 53 | apt install -y openssh-server 54 | ssh_PermitRootLogin 55 | service ssh restart 56 | else 57 | ssh_PermitRootLogin 58 | service ssh restart 59 | fi 60 | exit 0 61 | } 62 | 63 | function system_alpine() { 64 | if [[ ! -f /etc/ssh/sshd_config ]]; then 65 | echo -e "\033[33m 安装SSH \033[0m" 66 | apk add openssh-server 67 | apk add openssh-client 68 | rc-update add sshd 69 | ssh_PermitRootLogin 70 | service sshd restart 71 | else 72 | ssh_PermitRootLogin 73 | service sshd restart 74 | fi 75 | exit 0 76 | } 77 | 78 | function ssh_PermitRootLogin() { 79 | if [[ `grep -c "ClientAliveInterval 30" /etc/ssh/sshd_config` == '0' ]]; then 80 | sed -i '/ClientAliveInterval/d' /etc/ssh/sshd_config 81 | sed -i '/ClientAliveCountMax/d' /etc/ssh/sshd_config 82 | sed -i '/PermitRootLogin/d' /etc/ssh/sshd_config 83 | sh -c 'echo ClientAliveInterval 30 >> /etc/ssh/sshd_config' 84 | sh -c 'echo ClientAliveCountMax 6 >> /etc/ssh/sshd_config' 85 | sh -c 'echo PermitRootLogin yes >> /etc/ssh/sshd_config' 86 | fi 87 | } 88 | system_check "$@" 89 | -------------------------------------------------------------------------------- /timesync.sh: -------------------------------------------------------------------------------- 1 | #/usr/bin/env bash 2 | #将脚本上传到linux中的/root目录,在root账户下执行bash timesync.sh 3 | # Colors 4 | RED='\033[0;31m' 5 | GREEN='\033[0;32m' 6 | YELLOW='\033[0;33m' 7 | BLUE='\033[0;34m' 8 | PURPLE="\033[0;35m" 9 | CYAN='\033[0;36m' 10 | PLAIN='\033[0m' 11 | 12 | echo -e "${BLUE}开始获取京东服务器时间${PLAIN}" 13 | Time=$(curl -s "https://api.m.jd.com/client.action?functionId=queryMaterialProducts&client=wh5" | grep '{"currentTime":'| sed 's/^.*"currentTime"://g' | sed 's/,"currentTime2":.*//g' | sed 's/\"//g' ) 14 | date -s "$(curl -s "https://api.m.jd.com/client.action?functionId=queryMaterialProducts&client=wh5" | grep '{"currentTime":'| sed 's/^.*"currentTime"://g' | sed 's/,"currentTime2":.*//g' | sed 's/\"//g' )" 15 | echo -e "${BLUE}当前京东服务器时间为${PLAIN}${RED}${Time}${PLAIN}" 16 | echo -e "${BLUE}开始进行时间同步${PLAIN}" 17 | echo -e "${BLUE}与京东服务器时间同步完成,脚本将自动退出。${PLAIN}" 18 | exit 19 | --------------------------------------------------------------------------------