From c8f40a6faaee7100e479450ae4433b7a3d317f5b Mon Sep 17 00:00:00 2001 From: anonymous Date: Wed, 7 Apr 2021 17:36:17 +0800 Subject: [PATCH] dev --- docker/Dockerfile | 23 +- sample/config.sample.sh | 88 ++++++ sample/config.sh.sample | 599 ------------------------------------- sample/crontab.list.sample | 16 - sample/crontab.sample.list | 10 + sample/jdCookie.js | 34 +++ sample/package.json | 29 ++ shell/api.sh | 112 +++---- shell/notify.js | 2 +- shell/rebuild.sh | 18 +- shell/rm_log.sh | 58 ---- shell/rmlog.sh | 1 - shell/share.sh | 73 ++++- shell/task.sh | 252 +++++----------- shell/update.sh | 348 ++++++++------------- 15 files changed, 484 insertions(+), 1179 deletions(-) create mode 100644 sample/config.sample.sh delete mode 100644 sample/config.sh.sample delete mode 100644 sample/crontab.list.sample create mode 100644 sample/crontab.sample.list create mode 100644 sample/jdCookie.js create mode 100644 sample/package.json mode change 100755 => 100644 shell/api.sh mode change 100755 => 100644 shell/rebuild.sh delete mode 100755 shell/rm_log.sh diff --git a/docker/Dockerfile b/docker/Dockerfile index d63ad334..8a8ee020 100644 --- a/docker/Dockerfile +++ b/docker/Dockerfile @@ -1,7 +1,7 @@ FROM node:lts-alpine as build LABEL maintainer="whyour" -ARG QL_BASE_URL=https://github.com.cnpmjs.org/whyour/qinglong -ARG QL_BASE_BRANCH=master +ARG QL_URL=https://github.com.cnpmjs.org/whyour/qinglong +ARG QL_BRANCH=master ENV PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin \ LANG=zh_CN.UTF-8 \ SHELL=/bin/bash \ @@ -16,15 +16,14 @@ RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.aliyun.com/g' /etc/apk/repositories python \ make \ g++ \ - yarn \ - && git clone -b ${QL_BASE_BRANCH} ${QL_BASE_URL} ${QL_DIR} \ + && git clone -b ${QL_BRANCH} ${QL_URL} ${QL_DIR} \ && cd ${QL_DIR} \ && cp -f .env.example .env \ && yarn --network-timeout 100000 FROM node:lts-alpine LABEL maintainer="whyour" -ARG QL_BASE_URL=https://github.com.cnpmjs.org/whyour/qinglong -ARG QL_BASE_BRANCH=master +ARG QL_URL=https://github.com.cnpmjs.org/whyour/qinglong +ARG QL_BRANCH=master ENV PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin \ LANG=zh_CN.UTF-8 \ SHELL=/bin/bash \ @@ -48,20 +47,18 @@ RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.aliyun.com/g' /etc/apk/repositories python \ make \ g++ \ - yarn \ && rm -rf /var/cache/apk/* \ && ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime \ && echo "Asia/Shanghai" > /etc/timezone \ && touch ~/.bashrc \ && mkdir /run/nginx \ - && git clone -b ${QL_BASE_BRANCH} ${QL_BASE_URL} ${QL_DIR} \ + && git clone -b ${QL_BRANCH} ${QL_URL} ${QL_DIR} \ && cd ${QL_DIR} \ && cp -f .env.example .env \ - && ln -sf ${QL_DIR}/shell/js.sh /usr/local/bin/js \ - && ln -sf ${QL_DIR}/shell/git_pull.sh /usr/local/bin/git_pull \ - && ln -sf ${QL_DIR}/shell/rm_log.sh /usr/local/bin/rm_log \ - && ln -sf ${QL_DIR}/shell/export_sharecodes.sh /usr/local/bin/export_sharecodes \ - && ln -sf ${QL_DIR}/shell/git_diy.sh /usr/local/bin/diy \ + && ln -sf ${QL_DIR}/shell/task.sh /usr/local/bin/task \ + && ln -sf ${QL_DIR}/shell/task.sh /usr/local/bin/mytask \ + && ln -sf ${QL_DIR}/shell/update.sh /usr/local/bin/update \ + && ln -sf ${QL_DIR}/shell/rmlog.sh /usr/local/bin/rmlog \ && ln -sf ${QL_DIR}/shell/notify.sh /usr/local/bin/notify \ && ln -sf ${QL_DIR}/shell/rebuild.sh /usr/local/bin/rebuild \ && ln -sf ${QL_DIR}/docker/docker-entrypoint.sh /usr/local/bin/entrypoint \ diff --git a/sample/config.sample.sh b/sample/config.sample.sh new file mode 100644 index 00000000..6465986b --- /dev/null +++ b/sample/config.sample.sh @@ -0,0 +1,88 @@ +## Version: v2.0.0 +## Date: 2021-04-07 +## Update Content: 新一版qinglong。 + +## 上面版本号中,如果第2位数字有变化,那么代表增加了新的参数,如果只有第3位数字有变化,仅代表更新了注释,没有增加新的参数,可更新可不更新 + + +## 临时屏蔽某个Cookie +## 多个Cookie编号以半角的空格分隔,两侧一对半角双引号,使用此功能后,在运行js脚本时账户编号将发生变化 +## 举例1:TempBlockCookie="2" 临时屏蔽掉Cookie2 +## 举例2:TempBlockCookie="2 4" 临时屏蔽掉Cookie2和Cookie4 +TempBlockCookie="" + +## 如果只是想要屏蔽某个账号不跑某一些脚本,可以参考下面 case 这个命令的例子来控制,case的条件中请输入脚本的绝对路径,也就是在crontab.list中的脚本路径是什么,这里就填入什么 +## case $1 in +## /ql/scripts/lxk0301_jd_scripts/jd_fruit.js) +## TempBlockCookie="5" # 账号5不玩lxk0301_jd_scripts下的jd_fruit.js +## ;; +## /ql/scripts/lxk0301_jd_scripts/jd_dreamFactory.js | /ql/scripts/whyour_hundun/quanx/didi.js) +## TempBlockCookie="2" # 账号2不玩lxk0301_jd_scripts下的jd_dreamFactory.js和whyour_hundun下子文件夹quanx中的didi.js +## ;; +## /ql/scripts/lxk0301_jd_scripts/jd_jdzz.js | /ql/scripts/whyour_hundun/quanx/jx_factory.js) +## TempBlockCookie="3 6" # 账号3、账号6不玩lxk0301_jd_scripts下的jd_jdzz.js和whyour_hundun下子文件夹quanx中的jx_factory.js +## ;; +## esac + + +## 在运行 update 命令时,是否自动删除失效的脚本与定时任务 +AutoDelCron="true" + + +## 在运行 update 命令时,是否自动增加新的本地定时任务 +AutoAddCron="true" + + +## 运行 rmlog 命令时删除多久以前的日志,仅能输入正整数 +RmLogDaysAgo="7" + + +## 在运行 task 或 mytask 命令时,随机延迟启动任务的最大延迟时间 +## 如果任务不是必须准点运行的任务,那么给它增加一个随机延迟,由你定义最大延迟时间,单位为秒,如 RandomDelay="300" ,表示任务将在 1-300 秒内随机延迟一个秒数,然后再运行 +## 在crontab.list中,在每小时第0-2分、第30-31分、第59分这几个时间内启动的任务,均算作必须准点运行的任务,在启动这些任务时,即使你定义了RandomDelay,也将准点运行,不启用随机延迟 +## 在crontab.list中,除掉每小时上述时间启动的任务外,其他任务在你定义了 RandomDelay 的情况下,一律启用随机延迟,但如果你给某些任务添加了 "now" 或者 "conc",那么这些任务也将无视随机延迟直接启动 +RandomDelay="300" + + +## 如果你自己会写shell脚本,并且希望在每次运行 update 命令时,额外运行你的 shell 脚本,请赋值为 "true" +## 同时,请务必将你的脚本命名为 extra.sh (只能叫这个文件名),放在 config 目录下 +EnableExtraShell="" + + +## 启用其他开发者的仓库方式一(选填):完整更新整个仓库,针对同一个仓库,方式一和方式二只能选择一种 +## OwnRepoUrl:仓库地址清单,必须从1开始依次编号 +## OwnRepoBranch:你想使用的分支清单,不指定分支(即使用默认分支)时可以用一对不包含内容的空引号"",编号必须和 OwnRepoUrl 对应。 +## OwnRepoPath:要使用的脚本在仓库哪个路径下,请输入仓库下的相对路径,默认空值""代表仓库根目录,编号必须和 OwnRepoUrl 对应,同一个仓库下不同文件夹之间使用空格分开。如果既包括根目录又包括子目录,填写请见示例中OwnRepoPath3。 +## 所有脚本存放在 own 目录下,三个清单必须一一对应,示例如下: +## OwnRepoUrl1="https://gitee.com/abc/jdtsa.git" +## OwnRepoUrl2="https://github.com/nedcd/jxddfsa.git" +## OwnRepoUrl3="git@github.com:eject/poex.git" +## +## OwnRepoBranch1="" # 代表第1个仓库 https://gitee.com/abc/jdtsa.git 使用 "默认" 分支 +## OwnRepoBranch2="main" # 代表第2个仓库 https://github.com/nedcd/jxddfsa.git 使用 "main" 分支 +## OwnRepoBranch3="master" # 代表第3个仓库 git@github.com:eject/poex.git 使用 "master" 分支 +## +## OwnRepoPath1="" # 代表第1个仓库https://gitee.com/abc/jdtsa.git,你想使用的脚本就在仓库根目录下。 +## OwnRepoPath2="scripts/jd normal" # 代表第2个仓库https://github.com/nedcd/jxddfsa.git,你想使用的脚本在仓库的 scripts/jd 和 normal文件夹下,必须输入相对路径 +## OwnRepoPath3="'' cron" # 代表第3个仓库git@github.com:eject/poex.git,你想使用的脚本在仓库的 根目录 和 cron 文件夹下,必须输入相对路径 + +OwnRepoUrl1="" +OwnRepoUrl2="" + +OwnRepoBranch1="" +OwnRepoBranch2="" + +OwnRepoPath1="" +OwnRepoPath2="" + +## 启用其他开发者的仓库方式二(选填):只下载想要的文件,针对同一个仓库,方式一和方式二只能选择一种。 +## 请先确认你能正常下载该raw文件才列在下方,无论是github还是gitee,请只填入 raw 文件链接。 +## 一行一个文件下载链接,首尾一对半角括号,示例: +## OwnRawFile=( +## https://gitee.com/wabdwdd/scipts/raw/master/jd_abc.js +## https://github.com/lonfeg/loon/raw/main/jd_dudi.js +## https://github.com/sunsem/qx/raw/main/z_dida.js +## ) +OwnRawFile=( + +) \ No newline at end of file diff --git a/sample/config.sh.sample b/sample/config.sh.sample deleted file mode 100644 index 9a7d0172..00000000 --- a/sample/config.sh.sample +++ /dev/null @@ -1,599 +0,0 @@ -## Version: v3.30.6 -## Date: 2021-3-8 -## Update Content: 京小兑控制变量,宠汪汪自己内部账户互助变量,环球挑战赛互助变量。 - -## 上面版本号中,如果第2位数字有变化,那么代表增加了新的参数,如果只有第3位数字有变化,仅代表更新了注释,没有增加新的参数,可更新可不更新 - -################################## 说明 ################################## -## 以下配置中,带有 export 申明的,均由LXK9301大佬定义,详见:https://gitee.com/lxk0301/jd_scripts/blob/master/githubAction.md -## 其他互助码,考虑到直接按LXK9301大佬定义的变量去填的话,一是不方便记忆,二是容易搞混,所以最终的变量将由脚本去组合,你只要按注释去填即可 -## 除此之外,还额外增加了是否自动删除失效任务AutoDelCron、是否自动增加新任务AutoAddCron、删除旧日志时间RmLogDaysAgo、随机延迟启动任务RandomDelay、是否添加自定义脚本EnableExtraShell五个人性化的设置供选择 -## 所有赋值等号两边不能有空格,所有的值请一律在两侧添加半角的双引号,如果变量值中含有双引号,则外侧改为一对半角的单引号。 -## 所有的赋值都可以参考 “定义东东萌宠是否静默运行” 部分,在不同时间设置不同的值,以达到你想要的效果,具体判断条件如下: -## $(date "+%d") 当前的日期,如:13 -## $(date "+%w") 当前是星期几,如:3 -## $(date "+%H") 当前的小时数,如:23 -## $(date "+%M") 当前的分钟数,如:49 -## 其他date命令的更多用法,可以在命令行中输入 date --help 查看 -## 判断条件 -eq -ne -gt -ge -lt -le ,具体含义可百度一下 - - -################################## 临时屏蔽某个Cookie(选填) ################################## -## 如果某些Cookie已经失效了,但暂时还没法更新,可以使用此功能在不删除该Cookie和重新修改Cookie编号的前提下,临时屏蔽掉某些编号的Cookie -## 多个Cookie编号以半角的空格分隔,两侧一对半角双引号,使用此功能后,在运行js脚本时账户编号将发生变化 -## 举例1:TempBlockCookie="2" 临时屏蔽掉Cookie2 -## 举例2:TempBlockCookie="2 4" 临时屏蔽掉Cookie2和Cookie4 -## 如果只是想要屏蔽某个账号不玩某些小游戏,可以参考下面 case 这个命令的例子来控制,脚本名称请去掉后缀 “.js” -## case $1 in -## jd_fruit) -## TempBlockCookie="5" # 账号5不玩东东农场 -## ;; -## jd_dreamFactory | jd_jdfactory) -## TempBlockCookie="2" # 账号2不玩京喜工厂和东东工厂 -## ;; -## jd_jdzz | jd_joy) -## TempBlockCookie="3 6" # 账号3、账号6不玩京东赚赚和宠汪汪 -## ;; -## esac -TempBlockCookie="" - - -################################## 定义是否自动删除失效的脚本与定时任务(选填) ################################## -## 有的时候,某些JS脚本只在特定的时间有效,过了时间就失效了,需要自动删除失效的本地定时任务,则设置为 "true" ,否则请设置为 "false" -## 检测文件:LXK9301/jd_scripts 仓库中的 docker/crontab_list.sh,和 shylocks/Loon 仓库中的 docker/crontab_list.sh -## 当设置为 "true" 时,会自动从检测文件中读取比对删除的任务(识别以“jd_”、“jr_”、“jx_”开头的任务) -## 当设置为 "true" 时,脚本只会删除一整行失效的定时任务,不会修改其他现有任务,所以任何时候,你都可以自己调整你的crontab.list -## 当设置为 "true" 时,如果你有添加额外脚本是以“jd_”“jr_”“jx_”开头的,如检测文件中,会被删除,不是以“jd_”“jr_”“jx_”开头的任务则不受影响 -AutoDelCron="true" - - -################################## 定义是否自动增加新的本地定时任务(选填) ################################## -## LXK9301 大佬会在有需要的时候,增加定时任务,如需要本地自动增加新的定时任务,则设置为 "true" ,否则请设置为 "false" -## 检测文件:LXK9301/jd_scripts 仓库中的 docker/crontab_list.sh,和 shylocks/Loon 仓库中的 docker/crontab_list.sh -## 当设置为 "true" 时,如果检测到检测文件中有增加新的定时任务,那么在本地也增加(识别以“jd_”、“jr_”、“jx_”开头的任务) -## 当设置为 "true" 时,会自动从检测文件新增加的任务中读取时间,该时间为北京时间 -## 当设置为 "true" 时,脚本只会增加新的定时任务,不会修改其他现有任务,所以任何时候,你都可以自己调整你的crontab.list -AutoAddCron="true" - - -################################## 定义删除日志的时间(选填) ################################## -## 定义在运行删除旧的日志任务时,要删除多少天以前的日志,请输入正整数,不填则禁用删除日志的功能 -RmLogDaysAgo="7" - - -################################## 定义随机延迟启动任务(选填) ################################## -## 如果任务不是必须准点运行的任务,那么给它增加一个随机延迟,由你定义最大延迟时间,单位为秒,如 RandomDelay="300" ,表示任务将在 1-300 秒内随机延迟一个秒数,然后再运行 -## 在crontab.list中,在每小时第0-2分、第30-31分、第59分这几个时间内启动的任务,均算作必须准点运行的任务,在启动这些任务时,即使你定义了RandomDelay,也将准点运行,不启用随机延迟 -## 在crontab.list中,除掉每小时上述时间启动的任务外,其他任务在你定义了 RandomDelay 的情况下,一律启用随机延迟,但如果你按照Wiki教程给某些任务添加了 "now",那么这些任务也将无视随机延迟直接启动 -RandomDelay="300" - - -################################## 定义User-Agent(选填) ################################## -## 自定义LXK9301大佬仓库里京东系列js脚本的User-Agent,不懂不知不会User-Agent的请不要随意填写内容,随意填写了出错概不负责 -## 如需使用,请自行解除下一行注释 -# export JD_USER_AGENT="" - - -################################## 定义通知TOKEN(选填) ################################## -## 想通过什么渠道收取通知,就填入对应渠道的值 -## 1. ServerChan,教程:http://sc.ftqq.com/3.version -export PUSH_KEY="" - -## 2. BARK,教程(看BARK_PUSH和BARK_SOUND的说明):https://gitee.com/lxk0301/jd_scripts/blob/master/githubAction.md -export BARK_PUSH="" -export BARK_SOUND="" - -## 3. Telegram,如需使用,TG_BOT_TOKEN和TG_USER_ID必须同时赋值,教程:https://gitee.com/lxk0301/jd_scripts/blob/master/backUp/TG_PUSH.md -export TG_BOT_TOKEN="" -export TG_USER_ID="" - -## 4. 钉钉,教程(看DD_BOT_TOKEN和DD_BOT_SECRET部分):https://gitee.com/lxk0301/jd_scripts/blob/master/githubAction.md -export DD_BOT_TOKEN="" -export DD_BOT_SECRET="" - -## 5. iGot聚合推送,支持多方式推送,填写iGot的推送key。教程:https://gitee.com/lxk0301/jd_scripts/blob/master/githubAction.md -export IGOT_PUSH_KEY="" - -## 6. Push Plus,微信扫码登录后一对一推送或一对多推送,参考文档:http://pushplus.hxtrip.com/ -## 其中PUSH_PLUS_USER是一对多推送的“群组编码”(一对多推送下面->您的群组(如无则新建)->群组编码)注:(1、需订阅者扫描二维码 2、如果您是创建群组所属人,也需点击“查看二维码”扫描绑定,否则不能接受群组消息推送),只填PUSH_PLUS_TOKEN默认为一对一推送 -export PUSH_PLUS_TOKEN="" -export PUSH_PLUS_USER="" - -## 7. 企业微信机器人消息推送 webhook 后面的 key,文档:https://work.weixin.qq.com/api/doc/90000/90136/91770 -export QYWX_KEY="" - -## 8. 企业微信应用消息推送的值,教程:https://note.youdao.com/ynoteshare1/index.html?id=351e08a72378206f9dd64d2281e9b83b&type=note -## 依次填上corpid的值,corpsecret的值,touser的值,agentid,media_id的值,注意用,号隔开,例如:"wwcff56746d9adwers,B-791548lnzXBE6_BWfxdf3kSTMJr9vFEPKAbh6WERQ,mingcheng,1000001,2COXgjH2UIfERF2zxrtUOKgQ9XklUqMdGSWLBoW_lSDAdafat" -export QYWX_AM="" - - -################################## 定义每日签到的通知形式(选填) ################################## -## js脚本每日签到提供3种通知方式,分别为: -## 关闭通知,那么请在下方填入0 -## 简洁通知,那么请在下方填入1,其效果见:https://github.com/LXK9301/jd_scripts/blob/master/icon/bean_sign_simple.jpg -## 原始通知,那么请在下方填入2,如果不填也默认为2,内容比较长,这也是默认通知方式 -NotifyBeanSign="" - - -################################## 定义每日签到每个接口间的延迟时间(选填) ################################## -## 默认每个签到接口并发无延迟,如需要依次进行每个接口,请自定义延迟时间,单位为毫秒,延迟作用于每个签到接口, 如填入延迟则切换顺序签到(耗时较长) -export JD_BEAN_STOP="" - - -################################## 定义东东农场互助(选填) ################################## -## 具体填法及要求详见本文件最下方“互助码填法示例” -MyFruit1="" -MyFruit2="" -MyFruit3="" -MyFruit4="" -MyFruit5="" -MyFruit6="" -MyFruitA="" -MyFruitB="" - -ForOtherFruit1="" -ForOtherFruit2="" -ForOtherFruit3="" -ForOtherFruit4="" -ForOtherFruit5="" -ForOtherFruit6="" - - -################################## 定义东东萌宠互助(选填) ################################## -## 具体填法及要求详见本文件最下方“互助码填法示例” -MyPet1="" -MyPet2="" -MyPet3="" -MyPet4="" -MyPet5="" -MyPet6="" -MyPetA="" -MyPetB="" - -ForOtherPet1="" -ForOtherPet2="" -ForOtherPet3="" -ForOtherPet4="" -ForOtherPet5="" -ForOtherPet6="" - - -################################## 定义种豆得豆互助(选填) ################################## -## 具体填法及要求详见本文件最下方“互助码填法示例” -MyBean1="" -MyBean2="" -MyBean3="" -MyBean4="" -MyBean5="" -MyBean6="" -MyBeanA="" -MyBeanB="" - -ForOtherBean1="" -ForOtherBean2="" -ForOtherBean3="" -ForOtherBean4="" -ForOtherBean5="" -ForOtherBean6="" - - -################################## 定义京喜工厂互助(选填) ################################## -## 具体填法及要求详见本文件最下方“互助码填法示例” -MyDreamFactory1="" -MyDreamFactory2="" -MyDreamFactory3="" -MyDreamFactory4="" -MyDreamFactory5="" -MyDreamFactory6="" -MyDreamFactoryA="" -MyDreamFactoryB="" - -ForOtherDreamFactory1="" -ForOtherDreamFactory2="" -ForOtherDreamFactory3="" -ForOtherDreamFactory4="" -ForOtherDreamFactory5="" -ForOtherDreamFactory6="" - - -################################## 定义东东工厂互助(选填) ################################## -## 具体填法及要求详见本文件最下方“互助码填法示例” -MyJdFactory1="" -MyJdFactory2="" -MyJdFactory3="" -MyJdFactory4="" -MyJdFactory5="" -MyJdFactory6="" -MyJdFactoryA="" -MyJdFactoryB="" - -ForOtherJdFactory1="" -ForOtherJdFactory2="" -ForOtherJdFactory3="" -ForOtherJdFactory4="" -ForOtherJdFactory5="" -ForOtherJdFactory6="" - - -################################## 定义京东赚赚互助(选填) ################################## -## 具体填法及要求详见本文件最下方“互助码填法示例” -MyJdzz1="" -MyJdzz2="" -MyJdzz3="" -MyJdzz4="" -MyJdzz5="" -MyJdzz6="" -MyJdzzA="" -MyJdzzB="" - -ForOtherJdzz1="" -ForOtherJdzz2="" -ForOtherJdzz3="" -ForOtherJdzz4="" -ForOtherJdzz5="" -ForOtherJdzz6="" - - -################################## 定义疯狂的JOY互助(选填) ################################## -## 具体填法及要求详见本文件最下方“互助码填法示例” -MyJoy1="" -MyJoy2="" -MyJoy3="" -MyJoy4="" -MyJoy5="" -MyJoy6="" -MyJoyA="" -MyJoyB="" - -ForOtherJoy1="" -ForOtherJoy2="" -ForOtherJoy3="" -ForOtherJoy4="" -ForOtherJoy5="" -ForOtherJoy6="" - - -################################## 定义京喜农场互助(选填) ################################## -## 具体填法及要求详见本文件最下方“互助码填法示例” -## 京喜农场助力码为 JSON 格式因此使用单引号,json 格式如下 -## {"smp":"22bdadsfaadsfadse8a","active":"jdnc_1_btorange210113_2","joinnum":"1"} -## 助力码获取可以通过 js jd_get_share_code now 命令获取 -## 注意:京喜农场 种植种子发生变化的时候,互助码也会变!! -MyJxnc1='' -MyJxnc2='' -MyJxnc3='' -MyJxnc4='' -MyJxnc5='' -MyJxnc6='' -MyJxncA='' -MyJxncB='' - -ForOtherJxnc1="" -ForOtherJxnc2="" -ForOtherJxnc3="" -ForOtherJxnc4="" -ForOtherJxnc5="" -ForOtherJxnc6="" - - -################################## 定义京喜农场TOKEN(选填) ################################## -## 如果某个Cookie的账号种植的是app种子,则必须填入有效的TOKEN;而种植非app种子则不需要TOKEN -## TOKEN的形式:{"farm_jstoken":"749a90f871adsfads8ffda7bf3b1576760","timestamp":"1610165423873","phoneid":"42c7e3dadfadsfdsaac-18f0e4f4a0cf"} -## 因TOKEN中带有双引号,因此,变量值两侧必须由一对单引号引起来 -## TOKEN如何获取请阅读以下文件的注释:https://github.com/LXK9301/jd_scripts/blob/master/jd_jxnc.js -TokenJxnc1='' -TokenJxnc2='' -TokenJxnc3='' -TokenJxnc4='' -TokenJxnc5='' -TokenJxnc6='' - - -################################## 定义口袋书店互助(选填) ################################## -## 具体填法及要求详见本文件最下方“互助码填法示例” -MyBookShop1="" -MyBookShop2="" -MyBookShop3="" -MyBookShop4="" -MyBookShop5="" -MyBookShop6="" -MyBookShopA="" -MyBookShopB="" - -ForOtherBookShop1="" -ForOtherBookShop2="" -ForOtherBookShop3="" -ForOtherBookShop4="" -ForOtherBookShop5="" -ForOtherBookShop6="" - - -################################## 定义签到领现金互助(选填) ################################## -## 具体填法及要求详见本文件最下方“互助码填法示例” -MyCash1="" -MyCash2="" -MyCash3="" -MyCash4="" -MyCash5="" -MyCash6="" -MyCashA="" -MyCashB="" - -ForOtherCash1="" -ForOtherCash2="" -ForOtherCash3="" -ForOtherCash4="" -ForOtherCash5="" -ForOtherCash6="" - - -################################## 定义闪购盲盒互助(选填) ################################## -## 具体填法及要求详见本文件最下方“互助码填法示例” -MySgmh1="" -MySgmh2="" -MySgmh3="" -MySgmh4="" -MySgmh5="" -MySgmh6="" -MySgmhA="" -MySgmhB="" - -ForOtherSgmh1="" -ForOtherSgmh2="" -ForOtherSgmh3="" -ForOtherSgmh4="" -ForOtherSgmh5="" -ForOtherSgmh6="" - - -################################## 定义京东环球挑战赛活动互助(选填) ################################## -## 具体填法及要求详见本文件最下方“互助码填法示例” -## 仅2021年2月22日(含)前有效 -MyGLOBAL1="" -MyGLOBAL2="" -MyGLOBAL3="" -MyGLOBAL4="" -MyGLOBAL5="" -MyGLOBAL6="" -MyGLOBALA="" -MyGLOBALB="" - -ForOtherGLOBAL1="" -ForOtherGLOBAL2="" -ForOtherGLOBAL3="" -ForOtherGLOBAL4="" -ForOtherGLOBAL5="" -ForOtherGLOBAL6="" - -################################## 定义惊喜财富岛互助(选填) ################################## -## 具体填法及要求详见本文件最下方“互助码填法示例” -MyJdcfd1="" -MyJdcfd2="" -MyJdcfd3="" -MyJdcfd4="" -MyJdcfd5="" -MyJdcfd6="" -MyJdcfdA="" -MyJdcfdB="" - - -ForOtherJdcfd1="" -ForOtherJdcfd2="" -ForOtherJdcfd3="" -ForOtherJdcfd4="" -ForOtherJdcfd5="" -ForOtherJdcfd6="" - -################################## 定义东东超市蓝币兑换数量(选填) ################################## -## 东东超市蓝币兑换,可用值包括: -## 一、0:表示不兑换京豆,这也是js脚本的默认值 -## 二、20:表示兑换20个京豆 -## 三、1000:表示兑换1000个京豆 -## 四、可兑换清单的商品名称,输入能跟唯一识别出来的关键词即可,比如:MARKET_COIN_TO_BEANS="抽纸" -## 注意:有些比较贵的实物商品京东只是展示出来忽悠人的,即使你零点用脚本去抢,也会提示没有或提示已下架 -export MARKET_COIN_TO_BEANS="0" - - -################################## 定义东东超市蓝币成功兑换奖品是否静默运行(选填) ################################## -## 默认 "false" 关闭(即:奖品兑换成功后会发出通知提示),如需要静默运行不发出通知,请改为 "true" -export MARKET_REWARD_NOTIFY="" - - -################################## 定义东东超市是否自动升级商品和货架(选填) ################################## -## 升级顺序:解锁升级商品、升级货架,默认 "true" 自动升级,如需关闭自动升级,请改为 "false" -export SUPERMARKET_UPGRADE="" - - -################################## 定义东东超市是否自动更换商圈(选填) ################################## -## 小于对方300热力值自动更换商圈队伍,默认 "true" 自动更换,如不想更换商圈,请改为 "false" -## 目前已无此功能,申明了也无效 -# export BUSINESS_CIRCLE_JUMP="" - - -################################## 定义东东超市是否自动使用金币去抽奖(选填) ################################## -## 是否用金币去抽奖,默认 "false" 关闭,如需开启,请修改为 "true" -export SUPERMARKET_LOTTERY="" - - -################################## 定义东东超市是否自动参加PK队伍(选填) ################################## -## 是否每次PK活动参加脚本作者创建的PK队伍,"true" 表示参加,"false" 表示不参加,默认为 "true" -export JOIN_PK_TEAM="" - - -################################## 定义东东农场是否静默运行(选填) ################################## -## 默认为 "false",不静默,发送推送通知消息,如不想收到通知,请修改为 "true" -## 如果你不想完全关闭或者完全开启通知,只想在特定的时间发送通知,可以参考下面的“定义东东萌宠是否静默运行”部分,设定几个if判断条件 -export FRUIT_NOTIFY_CONTROL="" - - -################################## 定义东东农场是否使用水滴换豆卡(选填) ################################## -## 如果出现限时活动时100g水换20豆,此时比浇水划算,"true" 表示换豆(不浇水),"false" 表示不换豆(继续浇水),默认是"false" -## 如需切换为换豆(不浇水),请修改为 "true" -export FRUIT_BEAN_CARD="" - - -################################## 定义宠汪汪喂食克数(选填) ################################## -## 你期望的宠汪汪每次喂食克数,只能填入10、20、40、80,默认为10 -## 如实际持有食物量小于所设置的克数,脚本会自动降一档,直到降无可降 -## 具体情况请自行在宠汪汪游戏中去查阅攻略 -export JOY_FEED_COUNT="" - - -################################## 定义宠汪汪兑换京豆数量(选填) ################################## -## 目前的可用值包括:0、20、500、1000,其中0表示为不自动兑换京豆,如不设置,将默认为"20" -## 不同等级可兑换不同数量的京豆,详情请见宠汪汪游戏中兑换京豆选项 -## 500、1000的京豆每天有总量限制,设置了并且你也有足够积分时,也并不代表就一定能抢到 -export JD_JOY_REWARD_NAME="" - - -################################## 定义宠汪汪兑换京豆是否静默运行(选填) ################################## -## 默认为 "false",在成功兑换京豆时将发送推送通知消息(失败不发送),如想要静默不发送通知,请修改为 "true" -export JD_JOY_REWARD_NOTIFY="" - - -################################## 定义宠汪汪是否自动给好友的汪汪喂食(选填) ################################## -## 默认 "false" 不会自动给好友的汪汪喂食,如想自动喂食,请改成 "true" -export JOY_HELP_FEED="" - - -################################## 定义宠汪汪是否自动报名宠物赛跑(选填) ################################## -## 默认 "true" 参加宠物赛跑,如需关闭,请改成 "false" -export JOY_RUN_FLAG="" - - -################################## 定义宠汪汪参加比赛类型(选填) ################################## -## 当JOY_RUN_FLAG不设置或设置为 "true" 时生效 -## 可选值:2,10,50,其他值不可以。其中2代表参加双人PK赛,10代表参加10人突围赛,50代表参加50人挑战赛,不填时默认为2 -## 各个账号间请使用 & 分隔,比如:JOY_TEAM_LEVEL="2&2&50&10" -## 如果你有5个账号但只写了四个数字,那么第5个账号将默认参加2人赛,账号如果更多,与此类似 -export JOY_TEAM_LEVEL="" - - -################################## 定义宠汪汪赛跑获胜后是否推送通知(选填) ################################## -## 控制jd_joy.js脚本宠汪汪赛跑获胜后是否推送通知,"false" 为否(不推送通知消息),"true" 为是(即:发送推送通知消息),默认为 "true" -export JOY_RUN_NOTIFY="" - - -################################## 定义摇钱树是否自动将金果卖出变成金币(选填) ################################## -## 金币有时效,默认为 "false",不卖出金果为金币,如想希望自动卖出,请修改为 "true" -export MONEY_TREE_SELL_FRUIT="" - - -################################## 定义东东萌宠是否静默运行(选填) ################################## -## 默认 "false"(不静默,发送推送通知消息),如想静默请修改为 true -## 每次执行脚本通知太频繁了,改成只在周三和周六中午那一次运行时发送通知提醒 -## 除掉上述提及时间之外,均设置为 true,静默不发通知 -## 特别说明:针对北京时间有效。 -if [ $(date "+%w") -eq 6 ] && [ $(date "+%H") -ge 9 ] && [ $(date "+%H") -lt 14 ]; then - export PET_NOTIFY_CONTROL="false" -elif [ $(date "+%w") -eq 3 ] && [ $(date "+%H") -ge 9 ] && [ $(date "+%H") -lt 14 ]; then - export PET_NOTIFY_CONTROL="false" -else - export PET_NOTIFY_CONTROL="true" -fi - - -################################## 定义京喜工厂控制哪个京东账号不运行此脚本(选填) ################################## -## 输入"1"代表第一个京东账号不运行,多个使用 & 连接,例:"1&3" 代表账号1和账号3不运行京喜工厂脚本,注:输入"0",代表全部账号不运行京喜工厂脚本 -## 如果使用了 “临时屏蔽某个Cookie” TempBlockCookie 功能,编号会发生变化 -export DREAMFACTORY_FORBID_ACCOUNT="" - - -################################## 定义东东工厂控制哪个京东账号不运行此脚本(选填) ################################## -## 输入"1"代表第一个京东账号不运行,多个使用 & 连接,例:"1&3" 代表账号1和账号3不运行东东工厂脚本,注:输入"0",代表全部账号不运行东东工厂脚本 -## 如果使用了 “临时屏蔽某个Cookie” TempBlockCookie 功能,编号会发生变化 -export JDFACTORY_FORBID_ACCOUNT="" - - -################################## 定义东东工厂心仪的商品(选填) ################################## -## 只有在满足以下条件时,才自动投入电力:一是存储的电力满足生产商品所需的电力,二是心仪的商品有库存,如果没有输入心仪的商品,那么当前你正在生产的商品视作心仪的商品 -## 如果你看不懂上面的话,请去东东工厂游戏中查阅攻略 -## 心仪的商品请输入商品的全称或能唯一识别出该商品的关键字 -export FACTORAY_WANTPRODUCT_NAME="" - - -################################## 定义京喜农场通知级别(选填) ################################## -## 可用值: 0(不通知); 1(本次获得水滴>0); 2(任务执行); 3(任务执行+未种植种子),默认为"3" -export JXNC_NOTIFY_LEVEL="3" - - -################################## 定义取关参数(选填) ################################## -## jd_unsubscribe这个任务是用来取关每天做任务关注的商品和店铺,默认在每次运行时取关20个商品和20个店铺 -## 如果取关数量不够,可以根据情况增加,还可以设置 jdUnsubscribeStopGoods 和 jdUnsubscribeStopShop -## 商品取关数量 -goodPageSize="" -## 店铺取关数量 -shopPageSize="" -## 遇到此商品不再取关此商品以及它后面的商品,需去商品详情页长按拷贝商品信息 -jdUnsubscribeStopGoods="" -## 遇到此店铺不再取关此店铺以及它后面的店铺,请从头开始输入店铺名称 -jdUnsubscribeStopShop="" - - -################################## 疯狂的JOY(选填) ################################## -## 疯狂的JOY循环助力,"true" 表示循环助力,"false" 表示不循环助力,默认 "false" -export JDJOY_HELPSELF="" - -## 疯狂的JOY京豆兑换,目前最小值为500/1000京豆,默认为 "0" 不开启京豆兑换 -export JDJOY_APPLYJDBEAN="" - -## 疯狂的JOY自动购买什么等级的JOY,如需要使用请自行解除注释 -# export BUY_JOY_LEVEL="" - - -################################## 定义是否自动加购物车(选填) ################################## -## 口袋书店和东东小窝有些任务需要将商品加进购物车才能完成,默认 "false" 不做这些任务,如想做,请设置为 "true" -export PURCHASE_SHOPS="" - -################################## 定义京喜财富岛通知(选填) ################################## -## 输入true为通知,默认 "false",不填则为不通知 -export CFD_NOTIFY_CONTROL="" - - -################################## 定义京小兑是否自动把抽奖卷兑换为兑币,(选填) ################################## -## 输入true为自动兑换,不填则为不兑换 -export JD_JXD_EXCHANGE="" - - -################################## 定义宠汪汪是否开启内部互助,(选填) ################################## -## 输入true为开启内部互助,不填默认关闭 -export JOY_RUN_HELP_MYSELF="" - -################################## Telegram 代理(选填) ################################## -## Telegram 代理的 IP,代理类型为 http,比如你代理是 http://127.0.0.1:1080,则填写 "127.0.0.1" -## 如需使用,请自行解除下一行的注释 -# export TG_PROXY_HOST="" - -## Telegram 代理的端口,代理类型为 http,比如你代理是 http://127.0.0.1:1080,则填写 "1080" -## 如需使用,请自行解除下一行的注释 -# export TG_PROXY_PORT="" - - -################################## 是否添加DIY脚本(选填) ################################## -## 如果你自己会写shell脚本,并且希望在每次git_pull.sh这个脚本运行时,额外运行你的DIY脚本,请赋值为 "true" -## 同时,请务必将你的脚本命名为 extra.sh (只能叫这个文件名),放在 config 目录下 -## 仓库下已经上传extra.sh模板,如果你想使用;可以参考本仓库下 extra.sh 文件;地址:https://raw.githubusercontent.com/dockere/jd-base/master/sample/diy.sh -EnableExtraShell="" - - -################################## 互助码填法示例 ################################## -## **互助码是填在My系列变量中的,ForOther系统变量中只要填入My系列的变量名即可,按注释中的例子拼接,以东东农场为例,如下所示。** -## **实际上东东农场一个账号只能给别人助力3次,我多写的话,只有前几个会被助力。但如果前面的账号获得的助力次数已经达到上限了,那么还是会尝试继续给余下的账号助力,所以多填也是有意义的。** -## **ForOther系列变量必须从1开始编号,依次编下去。** - -# MyFruit1="e6e04602d5e343258873af1651b603ec" # 这是Cookie1这个账号的互助码 -# MyFruit2="52801b06ce2a462f95e1d59d7e856ef4" # 这是Cookie2这个账号的互助码 -# MyFruit3="e2fd1311229146cc9507528d0b054da8" # 这是Cookie3这个账号的互助码 -# MyFruit4="6dc9461f662d490991a31b798f624128" # 这是Cookie4这个账号的互助码 -# MyFruit5="30f29addd75d44e88fb452bbfe9f2110" # 这是Cookie5这个账号的互助码 -# MyFruit6="1d02fc9e0e574b4fa928e84cb1c5e70b" # 这是Cookie6这个账号的互助码 -# MyFruitA="5bc73a365ff74a559bdee785ea97fcc5" # 这是我和别人交换互助,另外一个用户A的互助码 -# MyFruitB="6d402dcfae1043fba7b519e0d6579a6f" # 这是我和别人交换互助,另外一个用户B的互助码 -# MyFruitC="5efc7fdbb8e0436f8694c4c393359576" # 这是我和别人交换互助,另外一个用户C的互助码 - -# ForOtherFruit1="${MyFruit2}@${MyFruitB}@${MyFruit4}" # Cookie1这个账号助力Cookie2的账号的账号、Cookie4的账号以及用户B -# ForOtherFruit2="${MyFruit1}@${MyFruitA}@${MyFruit4}" # Cookie2这个账号助力Cookie1的账号的账号、Cookie4的账号以及用户A -# ForOtherFruit3="${MyFruit1}@${MyFruit2}@${MyFruitC}@${MyFruit4}@${MyFruitA}@${MyFruit6}" # 解释同上,东东农场实际上只能助力3次 -# ForOtherFruit4="${MyFruit1}@${MyFruit2}@${MyFruit3}@${MyFruitC}@${MyFruit6}@${MyFruitA}" # 解释同上,东东农场实际上只能助力3次 -# ForOtherFruit5="${MyFruit1}@${MyFruit2}@${MyFruit3}@${MyFruitB}@${MyFruit4}@${MyFruit6}@${MyFruitC}@${MyFruitA}" -# ForOtherFruit6="${MyFruit1}@${MyFruit2}@${MyFruit3}@${MyFruitA}@${MyFruit4}@${MyFruit5}@${MyFruitC}" diff --git a/sample/crontab.list.sample b/sample/crontab.list.sample deleted file mode 100644 index 4880f84f..00000000 --- a/sample/crontab.list.sample +++ /dev/null @@ -1,16 +0,0 @@ -# 更新shell及面板代码 -55 2,13 * * * CMD_UPDATE >> ${QL_DIR}/log/git_pull.log 2>&1 - -# 重新build面板 -# 30 7 */7 * * rebuild >> ${QL_DIR}/log/rebuild.log 2>&1 - -# 删除 RmLogDaysAgo 指定天数以前的旧日志,本行为不记录日志 -57 13 * * * CMD_RMLOG >/dev/null 2>&1 - -# 重启挂机脚本 -# 33 3 * * * CMD_TASK hangup - -# 运行所有脚本(慎用) -# 33 9 */7 * * CMD_TASK runall - -# 其他定时任务 diff --git a/sample/crontab.sample.list b/sample/crontab.sample.list new file mode 100644 index 00000000..723d327a --- /dev/null +++ b/sample/crontab.sample.list @@ -0,0 +1,10 @@ +# 更新qinglong +55 2,13 * * * CMD_UPDATE + +# 重新build面板 +# 30 7 */7 * * CMD_REBUILD >> ${QL_DIR}/log/rebuild.log 2>&1 + +# 删除 RmLogDaysAgo 指定天数以前的旧日志,不记录日志 +57 13 * * * CMD_RMLOG >/dev/null 2>&1 + +# 其他定时任务 diff --git a/sample/jdCookie.js b/sample/jdCookie.js new file mode 100644 index 00000000..c828d0a2 --- /dev/null +++ b/sample/jdCookie.js @@ -0,0 +1,34 @@ +/* +此文件为Node.js专用。其他用户请忽略 + */ +//此处填写京东账号cookie。 +let CookieJDs = [ + '',//账号一ck,例:pt_key=XXX;pt_pin=XXX; + '',//账号二ck,例:pt_key=XXX;pt_pin=XXX;如有更多,依次类推 +] +// 判断环境变量里面是否有京东ck +if (process.env.JD_COOKIE) { + if (process.env.JD_COOKIE.indexOf('&') > -1) { + CookieJDs = process.env.JD_COOKIE.split('&'); + } else if (process.env.JD_COOKIE.indexOf('\n') > -1) { + CookieJDs = process.env.JD_COOKIE.split('\n'); + } else { + CookieJDs = [process.env.JD_COOKIE]; + } +} +if (JSON.stringify(process.env).indexOf('GITHUB')>-1) { + console.log(`请勿使用github action运行此脚本,无论你是从你自己的私库还是其他哪里拉取的源代码,都会导致我被封号\n`); + !(async () => { + await require('./sendNotify').sendNotify('提醒', `请勿使用github action、滥用github资源会封我仓库以及账号`) + await process.exit(0); + })() +} +CookieJDs = [...new Set(CookieJDs.filter(item => !!item))] +console.log(`\n====================共${CookieJDs.length}个京东账号Cookie=========\n`); +console.log(`==================脚本执行- 北京时间(UTC+8):${new Date(new Date().getTime() + new Date().getTimezoneOffset()*60*1000 + 8*60*60*1000).toLocaleString()}=====================\n`) +if (process.env.JD_DEBUG && process.env.JD_DEBUG === 'false') console.log = () => {}; +for (let i = 0; i < CookieJDs.length; i++) { + if (!CookieJDs[i].match(/pt_pin=(.+?);/) || !CookieJDs[i].match(/pt_key=(.+?);/)) console.log(`\n提示:京东cookie 【${CookieJDs[i]}】填写不规范,可能会影响部分脚本正常使用。正确格式为: pt_key=xxx;pt_pin=xxx;(分号;不可少)\n`); + const index = (i + 1 === 1) ? '' : (i + 1); + exports['CookieJD' + index] = CookieJDs[i].trim(); +} diff --git a/sample/package.json b/sample/package.json new file mode 100644 index 00000000..c3ee19ea --- /dev/null +++ b/sample/package.json @@ -0,0 +1,29 @@ +{ + "name": "lxk0301", + "version": "1.0.0", + "description": "{**When you're done, you can delete the content in this README and update the file with details for others getting started with your repository**}", + "main": "AlipayManor.js", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1" + }, + "repository": { + "type": "git", + "url": "https://github.com/lxk0301/jd_scripts.git" + }, + "keywords": [ + "" + ], + "author": "LXK9301", + "license": "ISC", + "dependencies": { + "crypto-js": "^4.0.0", + "download": "^8.0.0", + "got": "^11.5.1", + "http-server": "^0.12.3", + "qrcode-terminal": "^0.12.0", + "request": "^2.88.2", + "tough-cookie": "^4.0.0", + "tunnel": "0.0.6", + "ws": "^7.4.3" + } +} diff --git a/shell/api.sh b/shell/api.sh old mode 100755 new mode 100644 index 1627468e..4375c13f --- a/shell/api.sh +++ b/shell/api.sh @@ -1,73 +1,73 @@ #!/usr/bin/env bash get_token() { - local authInfo=$(cat $AuthConf) - token=$(get_json_value "$authInfo" "token") + local authInfo=$(cat $AuthConf) + token=$(get_json_value "$authInfo" "token") } get_json_value() { - local json=$1 - local key=$2 + local json=$1 + local key=$2 - if [[ -z "$3" ]]; then - local num=1 - else - local num=$3 - fi + if [[ -z "$3" ]]; then + local num=1 + else + local num=$3 + fi - local value=$(echo "${json}" | awk -F"[,:}]" '{for(i=1;i<=NF;i++){if($i~/'${key}'\042/){print $(i+1)}}}' | tr -d '"' | sed -n ${num}p) + local value=$(echo "${json}" | awk -F"[,:}]" '{for(i=1;i<=NF;i++){if($i~/'${key}'\042/){print $(i+1)}}}' | tr -d '"' | sed -n ${num}p) - echo ${value} + echo ${value} } add_cron_api() { - local currentTimeStamp=$(date +%s) - if [ $# -eq 1 ]; then - local schedule=$(echo "$1" | awk -F ":" '{print $1}') - local command=$(echo "$1" | awk -F ":" '{print $2}') - local name=$(echo "$1" | awk -F ":" '{print $3}') - else - local schedule=$1 - local command=$2 - local name=$3 - fi + local currentTimeStamp=$(date +%s) + if [ $# -eq 1 ]; then + local schedule=$(echo "$1" | awk -F ":" '{print $1}') + local command=$(echo "$1" | awk -F ":" '{print $2}') + local name=$(echo "$1" | awk -F ":" '{print $3}') + else + local schedule=$1 + local command=$2 + local name=$3 + fi - local api=$(curl "http://localhost:5600/api/crons?t=$currentTimeStamp" \ - -H "Accept: application/json" \ - -H "Authorization: Bearer $token" \ - -H "User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 11_2_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.90 Safari/537.36" \ - -H "Content-Type: application/json;charset=UTF-8" \ - -H "Origin: http://localhost:5700" \ - -H "Referer: http://localhost:5700/crontab" \ - -H "Accept-Language: en-US,en;q=0.9,zh-CN;q=0.8,zh;q=0.7" \ - --data-raw "{\"name\":\"$name\",\"command\":\"$command\",\"schedule\":\"$schedule\"}" \ - --compressed) - echo $api - code=$(get_json_value $api "code") - if [[ $code == 200 ]]; then - echo -e "$name 添加成功" - else - echo -e "$name 添加失败" - fi + local api=$(curl "http://localhost:5600/api/crons?t=$currentTimeStamp" \ + -H "Accept: application/json" \ + -H "Authorization: Bearer $token" \ + -H "User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 11_2_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.90 Safari/537.36" \ + -H "Content-Type: application/json;charset=UTF-8" \ + -H "Origin: http://localhost:5700" \ + -H "Referer: http://localhost:5700/crontab" \ + -H "Accept-Language: en-US,en;q=0.9,zh-CN;q=0.8,zh;q=0.7" \ + --data-raw "{\"name\":\"$name\",\"command\":\"$command\",\"schedule\":\"$schedule\"}" \ + --compressed) + echo $api + code=$(get_json_value $api "code") + if [[ $code == 200 ]]; then + echo -e "$name 添加成功" + else + echo -e "$name 添加失败" + fi } del_cron_api() { - local id=$1 - local currentTimeStamp=$(date +%s) - local api=$(curl "http://localhost:5600/api/crons/$id?t=$currentTimeStamp" \ - -X 'DELETE' \ - -H "Accept: application/json" \ - -H "Authorization: Bearer $token" \ - -H "User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 11_2_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.90 Safari/537.36" \ - -H "Content-Type: application/json;charset=UTF-8" \ - -H "Origin: http://localhost:5700" \ - -H "Referer: http://localhost:5700/crontab" \ - -H "Accept-Language: en-US,en;q=0.9,zh-CN;q=0.8,zh;q=0.7") - echo $api - code=$(get_json_value $api "code") - if [[ $code == 200 ]]; then - echo -e "$name 删除成功" - else - echo -e "$name 删除失败" - fi + local id=$1 + local currentTimeStamp=$(date +%s) + local api=$(curl "http://localhost:5600/api/crons/$id?t=$currentTimeStamp" \ + -X 'DELETE' \ + -H "Accept: application/json" \ + -H "Authorization: Bearer $token" \ + -H "User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 11_2_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.90 Safari/537.36" \ + -H "Content-Type: application/json;charset=UTF-8" \ + -H "Origin: http://localhost:5700" \ + -H "Referer: http://localhost:5700/crontab" \ + -H "Accept-Language: en-US,en;q=0.9,zh-CN;q=0.8,zh;q=0.7") + echo $api + code=$(get_json_value $api "code") + if [[ $code == 200 ]]; then + echo -e "$name 删除成功" + else + echo -e "$name 删除失败" + fi } diff --git a/shell/notify.js b/shell/notify.js index c7027b1f..0ade7e9b 100644 --- a/shell/notify.js +++ b/shell/notify.js @@ -1,4 +1,4 @@ -const notify = require('/ql/scripts/sendNotify'); +const notify = require('../scripts/sendNotify.js'); const title = process.argv[2]; const content = process.argv[3]; diff --git a/shell/rebuild.sh b/shell/rebuild.sh old mode 100755 new mode 100644 index 84531eea..ac0b8f8f --- a/shell/rebuild.sh +++ b/shell/rebuild.sh @@ -1,12 +1,13 @@ #!/usr/bin/env bash -ShellDir=${QL_DIR:-$(cd $(dirname $0); pwd)} +dir_shell=$(dirname $(readlink -f "$0")) +dir_root=$(cd $dir_shell; cd ..; pwd) -echo -e "更新shell...\n" -cd ${ShellDir} +echo -e "更新qinglong...\n" +cd $dir_root git fetch --all git pull -echo -e "更新shell完成...\n" +echo -e "更新更新qinglong完成...\n" echo -e "重新build...\n" yarn build @@ -14,14 +15,7 @@ yarn build-back echo -e "重新build完成...\n" echo -e "重启服务...\n" - -PIDS=`ps -ef|grep "app.js"|grep -v grep` -if [ "$PIDS" != "" ]; then - pm2 restart panel -else - pm2 start ${QL_DIR}/build/app.js -n panel -fi - +pm2 restart panel || pm2 start $dir_root/build/app.js -n panel 2>/dev/null nginx -s reload echo -e "重启服务完成...\n" \ No newline at end of file diff --git a/shell/rm_log.sh b/shell/rm_log.sh deleted file mode 100755 index 6cb63d74..00000000 --- a/shell/rm_log.sh +++ /dev/null @@ -1,58 +0,0 @@ -#!/usr/bin/env bash - -## 判断环境 -ShellDir=${QL_DIR:-$(cd $(dirname $0); pwd)} -LogDir=${ShellDir}/log - -## 导入配置文件 -. ${ShellDir}/config/cookie.sh -. ${ShellDir}/config/config.sh - -## 删除运行js脚本的旧日志 -function Rm_JsLog { - LogFileList=$(ls -l ${LogDir}/*/*.log | awk '{print $9}') - for log in ${LogFileList} - do - LogDate=$(echo ${log} | awk -F "/" '{print $NF}' | cut -c1-10) #文件名比文件属性获得的日期要可靠 - if [[ $(uname -s) == Darwin ]] - then - DiffTime=$(($(date +%s) - $(date -j -f "%Y-%m-%d" "${LogDate}" +%s))) - else - DiffTime=$(($(date +%s) - $(date +%s -d "${LogDate}"))) - fi - [ ${DiffTime} -gt $((${RmLogDaysAgo} * 86400)) ] && rm -vf ${log} - done -} - -## 删除git_pull.sh的运行日志 -function Rm_GitPullLog { - if [[ $(uname -s) == Darwin ]] - then - DateDelLog=$(date -v-${RmLogDaysAgo}d "+%Y-%m-%d") - else - Stmp=$(($(date "+%s") - 86400 * ${RmLogDaysAgo})) - DateDelLog=$(date -d "@${Stmp}" "+%Y-%m-%d") - fi - LineEndGitPull=$[$(cat ${LogDir}/git_pull.log | grep -n "${DateDelLog} " | head -1 | awk -F ":" '{print $1}') - 3] - [ ${LineEndGitPull} -gt 0 ] && perl -i -ne "{print unless 1 .. ${LineEndGitPull} }" ${LogDir}/git_pull.log -} - -## 删除空文件夹 -function Rm_EmptyDir { - cd ${LogDir} - for dir in $(ls) - do - if [ -d ${dir} ] && [[ $(ls ${dir}) == "" ]]; then - rm -rf ${dir} - fi - done -} - -## 运行 -if [ -n "${RmLogDaysAgo}" ]; then - echo -e "查找旧日志文件中...\n" - Rm_JsLog - Rm_GitPullLog - Rm_EmptyDir - echo -e "删除旧日志执行完毕\n" -fi diff --git a/shell/rmlog.sh b/shell/rmlog.sh index e1990e73..6d65c1ce 100755 --- a/shell/rmlog.sh +++ b/shell/rmlog.sh @@ -41,7 +41,6 @@ remove_empty_dir () { if [[ ${RmLogDaysAgo} ]]; then echo -e "查找旧日志文件中...\n" remove_js_log - remove_jup_log remove_empty_dir echo -e "删除旧日志执行完毕\n" fi diff --git a/shell/share.sh b/shell/share.sh index 045b8b2d..ab311173 100644 --- a/shell/share.sh +++ b/shell/share.sh @@ -12,7 +12,7 @@ file_sharecode=$dir_config/sharecode.sh file_config_user=$dir_config/config.sh file_auth_sample=$dir_sample/auth.sample.json file_auth_user=$dir_config/auth.json -file_diy_shell=$dir_config/diy.sh +file_extra_shell=$dir_config/extra.sh ## 清单文件 list_crontab_user=$dir_config/crontab.list @@ -22,7 +22,7 @@ list_own_user=$dir_list_tmp/own_user.list list_own_add=$dir_list_tmp/own_add.list list_own_drop=$dir_list_tmp/own_drop.list -## 需组合的环境变量列表,env_name需要和var_name一一对应 +## 需组合的环境变量列表,env_name需要和var_name一一对应,需要从api取信息 env_name=( JD_COOKIE ) @@ -36,12 +36,14 @@ link_name=( mytask rmlog update + rebuild ) original_name=( task.sh task.sh rmlog.sh update.sh + rebuild.sh ) ## 导入配置文件不校验 @@ -65,16 +67,17 @@ notify () { local title=$(echo $1 | perl -pe 's|-|_|g') local msg="$(echo -e $2)" if [ -d $dir_scripts_node_modules ]; then - node $dir_root/notify.js "$title" "$msg" + node $dir_scripts/notify.js "$title" "$msg" fi } ## 统计用户数量 count_user_sum () { - for ((i=1; i<=${SUM:-$((3 * 4))}; i++)); do - local tmp1=Cookie$i - local tmp2=${!tmp1} - [[ $tmp2 ]] && user_sum=$i || break + user_sum=0 + for line in $(cat $file_cookie); do + let user_sum++ + [[ $user_sum -gt $((3 * 5)) ]] && break + eval Cookie${user_sum}="\"$line\"" done } @@ -150,10 +153,56 @@ define_cmd () { fi fi for ((i=0; i<${#link_name[*]}; i++)); do - export cmd_${link_name[i]}="${cmd_prefix}${link_name[i]}${cmd_suffix}" + eval cmd_${link_name[i]}="${cmd_prefix}${link_name[i]}${cmd_suffix}" done } +## 统计 own 仓库数量 +count_own_repo_sum () { + own_repo_sum=0 + for ((i=1; i<=1000; i++)); do + local tmp1=RepoUrl$i + local tmp2=${!tmp1} + [[ $tmp2 ]] && own_repo_sum=$i || break + done +} + +## 形成 own 仓库的文件夹名清单,依赖于import_config_and_check或import_config_no_check +## array_own_repo_path:repo存放的绝对路径组成的数组;array_own_scripts_path:所有要使用的脚本所在的绝对路径组成的数组 +gen_own_dir_and_path () { + local scripts_path_num="-1" + local repo_num tmp1 tmp2 tmp3 tmp4 tmp5 dir + + if [[ $own_repo_sum -ge 1 ]]; then + for ((i=1; i<=$own_repo_sum; i++)); do + repo_num=$((i - 1)) + tmp1=RepoUrl$i + array_own_repo_url[$repo_num]=${!tmp1} + tmp2=RepoBranch$i + array_own_repo_branch[$repo_num]=${!tmp2} + array_own_repo_dir[$repo_num]=$(echo ${array_own_repo_url[$repo_num]} | perl -pe "s|.+com(/\|:)([\w-]+)/([\w-]+)(\.git)?|\2_\3|") + array_own_repo_path[$repo_num]=$dir_scripts/${array_own_repo_dir[$repo_num]} + tmp3=RepoPath$i + if [[ ${!tmp3} ]]; then + for dir in ${!tmp3}; do + let scripts_path_num++ + tmp4="${array_own_repo_dir[repo_num]}/$dir" + tmp5=$(echo $tmp4 | perl -pe "{s|//|/|g; s|/$||}") # 去掉多余的/ + array_own_scripts_path[$scripts_path_num]="$dir_scripts/$tmp5" + done + else + let scripts_path_num++ + array_own_scripts_path[$scripts_path_num]="${array_own_repo_path[$repo_num]}" + fi + done + fi + + if [[ ${#RawUrl[*]} -ge 1 ]]; then + let scripts_path_num++ + array_own_scripts_path[$scripts_path_num]=$dir_raw # 只有own脚本所在绝对路径附加了raw文件夹,其他数组均不附加 + fi +} + ## 修复配置文件 fix_config () { make_dir $dir_config @@ -168,10 +217,10 @@ fix_config () { echo fi perl -i -pe "{ - s|CMD_UPDATE|$cmd_jup|g; - s|ROOT_DIR|$dir_root|g; - s|CMD_RMLOG|$cmd_jlog|g; + s|CMD_UPDATE|$cmd_update|g; + s|CMD_REBUILD|$cmd_rebuild|g; + s|CMD_RMLOG|$cmd_rmlog|g; s|CMD_TASK|$cmd_task|g; - s|CMD_MTASK|$cmd_mtask|g + s|CMD_MYTASK|$cmd_mytask|g }" $list_crontab_user } diff --git a/shell/task.sh b/shell/task.sh index 40476a34..f913ca91 100644 --- a/shell/task.sh +++ b/shell/task.sh @@ -46,40 +46,17 @@ combine_one () { done } -## 转换JD_BEAN_SIGN_STOP_NOTIFY或JD_BEAN_SIGN_NOTIFY_SIMPLE -trans_JD_BEAN_SIGN_NOTIFY () { - case ${NotifyBeanSign} in - 0) - export JD_BEAN_SIGN_STOP_NOTIFY="true" - ;; - 1) - export JD_BEAN_SIGN_NOTIFY_SIMPLE="true" - ;; - 2) - export JD_BEAN_SIGN_NOTIFY_SIMPLE="false" - ;; - esac -} - -## 转换UN_SUBSCRIBES -trans_UN_SUBSCRIBES () { - export UN_SUBSCRIBES="${goodPageSize}\n${shopPageSize}\n${jdUnsubscribeStopGoods}\n${jdUnsubscribeStopShop}" -} - ## 申明全部变量,$1:all/Cookie编号 export_all_env () { - local type=$1 - local latest_log - if [[ $AutoHelpOther == true ]] && [[ $(ls $dir_code) ]]; then - latest_log=$(ls -r $dir_code | head -1) - . $dir_code/$latest_log - fi - [ -f $file_sharecode ] && . $file_sharecode [[ $type == all ]] && combine_all || combine_one $type - trans_JD_BEAN_SIGN_NOTIFY - trans_UN_SUBSCRIBES } +## 选择python3还是node +define_program () { + [[ $p1 == *.js ]] && which_program="node" + [[ $p1 == *.py ]] && which_program="python3" +} + random_delay () { local random_delay_max=$RandomDelay if [[ $random_delay_max ]] && [[ $random_delay_max -gt 0 ]]; then @@ -94,16 +71,19 @@ random_delay () { ## scripts目录下所有可运行脚本数组 gen_array_scripts () { + gen_own_dir_and_path local dir_current=$(pwd) local i=0 - cd $dir_scripts - for file in $(ls); do - if [ -f $file ] && [[ $(grep "new Env" $file) ]] && [[ $file == *.js && $file != sendNotify.js && $file != JD_extra_cookie.js ]]; then - array_scripts[i]=$file - array_scripts_name[i]=$(grep "new Env" $file | awk -F "'|\"" '{print $2}' | head -1) - [[ -z ${array_scripts_name[i]} ]] && array_scripts_name[i]="<未识别出活动名称>" - let i++ - fi + for ((scripts_path_num=0; scripts_path_num<${#array_own_scripts_path[*]}; scripts_path_num++)); do + cd ${array_own_scripts_path[$scripts_path_num]} + for file in $(ls); do + if [ -f $file ] && [[ $(grep "new Env" $file) ]] && [[ $file == *.js && $file != sendNotify.js && $file != JD_extra_cookie.js ]]; then + array_scripts[i]="${array_own_scripts_path[$scripts_path_num]}/$file" + array_scripts_name[i]=$(grep "new Env" $file | awk -F "'|\"" '{print $2}' | head -1) + [[ -z ${array_scripts_name[i]} ]] && array_scripts_name[i]="<未识别出活动名称>" + let i++ + fi + done done cd $dir_current } @@ -111,19 +91,12 @@ gen_array_scripts () { ## 使用说明 usage () { define_cmd - gen_array_scripts - echo -e "jtask命令运行 jd_scripts 脚本,如果已经将非 jd_scripts 脚本复制到 scripts 目录下,也可以使用此命令,用法为:" - echo -e "1.$cmd_jtask # 依次执行,如果设置了随机延迟并且当时时间不在0-2、30-31、59分内,将随机延迟一定秒数" - echo -e "2.$cmd_jtask now # 依次执行,无论是否设置了随机延迟,均立即运行,前台会输出日志,同时记录在日志文件中" - echo -e "3.$cmd_jtask conc # 并发执行,无论是否设置了随机延迟,均立即运行,前台不产生日志,直接记录在日志文件中" - echo -e "4.$cmd_jtask runall # 依次运行所有jd_scripts中的非挂机脚本,非常耗时" - echo -e "5.$cmd_jtask hangup # 重启挂机程序" - echo -e "\notask命令运行 own 脚本,需要输入脚本的绝对路径或相对路径(定时任务中必须是绝对路径),otask会将该脚本复制到 scripts 目录下再运行,用法为:" - echo -e "1.$cmd_otask # 依次执行,如果设置了随机延迟并且当时时间不在0-2、30-31、59分内,将随机延迟一定秒数" - echo -e "2.$cmd_otask now # 依次执行,无论是否设置了随机延迟,均立即运行,前台会输出日志,同时记录在日志文件中" - echo -e "3.$cmd_otask conc # 并发执行,无论是否设置了随机延迟,均立即运行,前台不产生日志,直接记录在日志文件中" - echo -e "\nmtask命令运行你自己添加的脚本,用法同jtask,如果脚本不在scripts目录下,则需要输入完整路径(同otask)。jtask otask mtask均为同一脚本的不同名字,三者仅用来在crontab.list中区分不同类型的任务,以方便自动增删任务,手动运行直接运行jtask即可。" - echo -e "\n当前scripts目录下有以下脚本可以运行:" + echo -e "\ntask命令运行本程序自动添加进crontab的脚本,需要输入脚本的绝对路径或相对路径(定时任务中必须是绝对路径),用法为:" + echo -e "1.$cmd_task # 依次执行,如果设置了随机延迟并且当时时间不在0-2、30-31、59分内,将随机延迟一定秒数" + echo -e "2.$cmd_task now # 依次执行,无论是否设置了随机延迟,均立即运行,前台会输出日志,同时记录在日志文件中" + echo -e "3.$cmd_task conc # 并发执行,无论是否设置了随机延迟,均立即运行,前台不产生日志,直接记录在日志文件中" + echo -e "\nmytask命令运行你自己添加的脚本,用法同task。mytask和task命令均为同一脚本的不同名字,二者仅用来在crontab.list中区分不同类型的任务,以方便自动增删任务,手动直接运行task即可。" + echo -e "\n当前有以下脚本可以运行:" for ((i=0; i<${#array_scripts[*]}; i++)); do echo -e "$(($i + 1)).${array_scripts_name[i]}:${array_scripts[i]}" done @@ -135,101 +108,22 @@ run_nohup () { nohup node $file_name &>$log_path & } -## 查找脚本路径与准确的文件名,$1:脚本传入的参数,输出的file_name不带后缀.js -find_file_and_path () { - local para=$1 - local file_name_tmp1=$(echo $para | perl -pe "s|\.js||") - local file_name_tmp2=$(echo $para | perl -pe "{s|jd_||; s|\.js||; s|^|jd_|}") - local seek_path="$dir_scripts $dir_scripts/backUp" - file_name="" - which_path="" - - for path in $seek_path; do - if [ -f $path/$file_name_tmp1.js ]; then - file_name=$file_name_tmp1 - which_path=$path - break - elif [ -f $path/$file_name_tmp2.js ]; then - file_name=$file_name_tmp2 - which_path=$path - break - fi - done - - if [ -f $para ]; then - local file_name_tmp3=$(echo $para | awk -F "/" '{print $NF}' | perl -pe "s|\.js||") - if [[ $(grep -E "^$file_name_tmp3$" $list_task_jd_scripts) ]]; then - echo -e "\njd_scripts项目存在同名文件$file_name_tmp3.js,不复制$para,直接执行$dir_scripts/$file_name_tmp3.js ...\n" - else - echo -e "\n复制 $para 到 $dir_scripts 下,并执行...\n" - cp -f $para $dir_scripts - fi - file_name=$file_name_tmp3 - which_path=$dir_scripts - fi -} - -## 运行挂机脚本 -run_hungup () { - local hangup_file="jd_crazy_joy_coin" - cd $dir_scripts - for file in $hangup_file; do - import_config_and_check $file - count_user_sum - export_all_env all - if type pm2 >/dev/null 2>&1; then - pm2 stop $file.js 2>/dev/null - pm2 flush - pm2 start -a $file.js --watch "$dir_scripts/$file.js" --name=$file - else - if [[ $(ps -ef | grep "$file" | grep -v "grep") != "" ]]; then - ps -ef | grep "$file" | grep -v "grep" | awk '{print $2}' | xargs kill -9 - fi - make_dir $dir_log/$file - log_time=$(date "+%Y-%m-%d-%H-%M-%S") - log_path="$dir_log/$file/$log_time.log" - run_nohup $file.js >/dev/null 2>&1 - fi - done -} - -## 一次性运行所有jd_scripts脚本 -run_all_jd_scripts () { - define_cmd - if [ ! -f $list_task_jd_scripts ]; then - cat $list_crontab_jd_scripts | grep -E "j[drx]_\w+\.js" | perl -pe "s|.+(j[drx]_\w+)\.js.+|\1|" | sort -u > $list_task_jd_scripts - fi - echo -e "\n==================== 开始运行所有非挂机脚本 ====================\n" - echo -e "请注意:本过程将非常非常耗时,一个账号可能长达几小时,账号越多耗时越长,如果是手动运行,退出终端也将终止运行。\n" - echo -e "倒计时5秒...\n" - for ((sec=5; sec>0; sec--)); do - echo -e "$sec...\n" - sleep 1 - done - for file in $(cat $list_task_jd_scripts); do - echo -e "==================== 运行 $file.js 脚本 ====================\n" - $cmd_jtask $file now - done -} - ## 正常运行单个脚本,$1:传入参数 run_normal () { - local p=$1 - find_file_and_path $p - if [[ $file_name ]] && [[ $which_path ]]; then - import_config_and_check "$file_name" + local p1=$1 + if [ -f $p1 ]; then + import_config_and_check "$p1" update_crontab count_user_sum + define_program export_all_env all [[ $# -eq 1 ]] && random_delay - [[ $user_sum -ge 60 ]] && rm -rf $dir_config/* &>/dev/null log_time=$(date "+%Y-%m-%d-%H-%M-%S") - log_path="$dir_log/$file_name/$log_time.log" - make_dir "$dir_log/$file_name" - cd $which_path - node $file_name.js 2>&1 | tee $log_path + log_path="$dir_log/$p1/$log_time.log" + make_dir "$dir_log/$p1" + $which_program $p1 2>&1 | tee $log_path else - echo -e "\n $p 脚本不存在,请确认...\n" + echo -e "\n $p1 脚本不存在,请确认...\n" usage fi } @@ -237,14 +131,13 @@ run_normal () { ## 并发执行,因为是并发,所以日志只能直接记录在日志文件中(日志文件以Cookie编号结尾),前台执行并发跑时不会输出日志 ## 并发执行时,设定的 RandomDelay 不会生效,即所有任务立即执行 run_concurrent () { - local p=$1 - find_file_and_path $p - if [[ $file_name ]] && [[ $which_path ]]; then - import_config_and_check "$file_name" + local p1=$1 + if [ -f $p1 ]; then + import_config_and_check "$p1" update_crontab count_user_sum - [[ $user_sum -ge 60 ]] && rm -rf $dir_config/* &>/dev/null - make_dir $dir_log/$file_name + define_program + make_dir $dir_log/$p1 log_time=$(date "+%Y-%m-%d-%H-%M-%S.%N") echo -e "\n各账号间已经在后台开始并发执行,前台不输入日志,日志直接写入文件中。\n" for ((user_num=1; user_num<=$user_sum; user_num++)); do @@ -252,9 +145,8 @@ run_concurrent () { [[ $user_num -eq $num ]] && continue 2 done export_all_env $user_num - log_path="$dir_log/$file_name/${log_time}_${user_num}.log" - cd $which_path - node $file_name.js &>$log_path & + log_path="$dir_log/$p1/${log_time}_${user_num}.log" + $which_program $p1 &>$log_path & done else echo -e "\n $p 脚本不存在,请确认...\n" @@ -263,40 +155,34 @@ run_concurrent () { } ## 命令检测 -case $# in - 0) - echo - usage - ;; - 1) - case $1 in - hangup) - run_hungup - ;; - runall) - run_all_jd_scripts - ;; - *) - run_normal $1 - ;; - esac - ;; - 2) - case $2 in - now) - run_normal $1 $2 - ;; - conc) - run_concurrent $1 $2 - ;; - *) - echo -e "\n命令输入错误...\n" - usage - ;; - esac - ;; - *) - echo -e "\n命令过多...\n" - usage - ;; -esac +main () { + case $# in + 0) + echo + usage + ;; + 1) + run_normal $1 + ;; + 2) + case $2 in + now) + run_normal $1 $2 + ;; + conc) + run_concurrent $1 $2 + ;; + *) + echo -e "\n命令输入错误...\n" + usage + ;; + esac + ;; + *) + echo -e "\n命令过多...\n" + usage + ;; + esac +} + +main "$@" \ No newline at end of file diff --git a/shell/update.sh b/shell/update.sh index c6886220..327b7cd5 100644 --- a/shell/update.sh +++ b/shell/update.sh @@ -7,6 +7,7 @@ send_mark=$dir_shell/send_mark ## 导入通用变量与函数 . $dir_shell/share.sh +. $dir_shell/api.sh ## 导入配置文件,检测平台,创建软连接,识别命令,修复配置文件 detect_termux @@ -14,46 +15,7 @@ detect_macos link_shell define_cmd fix_config -import_config_no_check jup - -## 更新crontab,gitee服务器同一时间限制5个链接,因此每个人更新代码必须错开时间,每次执行git_pull随机生成。 -## 每天次数随机,更新时间随机,更新秒数随机,至少4次,至多6次,大部分为5次,符合正态分布。 -random_update_jup_cron () { - if [[ $(date "+%-H") -le 4 ]] && [ -f $list_crontab_user ]; then - local random_min=$(gen_random_num 60) - local random_sleep=$(gen_random_num 56) - local random_hour_array[0]=$(gen_random_num 5) - local random_hour=${random_hour_array[0]} - local i j tmp - - for ((i=1; i<14; i++)); do - j=$(($i - 1)) - tmp=$(($(gen_random_num 3) + ${random_hour_array[j]} + 4)) - [[ $tmp -lt 24 ]] && random_hour_array[i]=$tmp || break - done - - for ((i=1; i<${#random_hour_array[*]}; i++)); do - random_hour="$random_hour,${random_hour_array[i]}" - done - - perl -i -pe "s|.+( $cmd_update)( .*\|$)|$random_min $random_hour \* \* \* sleep $random_sleep && \1|" $list_crontab_user - crontab $list_crontab_user - fi -} - -## 重置仓库remote url,docker专用,$1:要重置的目录,$2:要重置为的网址 -reset_romote_url () { - local dir_current=$(pwd) - local dir_work=$1 - local url=$2 - - if [ -d "$dir/.git" ]; then - cd $dir_work - git remote set-url origin $url - git reset --hard - cd $dir_current - fi -} +import_config_no_check "update" ## 克隆脚本,$1:仓库地址,$2:仓库保存路径,$3:分支(可省略) git_clone_scripts () { @@ -66,69 +28,22 @@ git_clone_scripts () { exit_status=$? } -## 更新脚本,$1:仓库保存路径 +## 更新脚本,$1:仓库保存路径,$2:分支(可省略) git_pull_scripts () { local dir_current=$(pwd) local dir_work=$1 + local cmd_branch + [[ $2 ]] && cmd_branch="origin/$branch" || cmd_branch="" cd $dir_work echo -e "开始更新仓库:$dir_work\n" git fetch --all exit_status=$? - git reset --hard + git reset --hard $cmd_branch git pull cd $dir_current } -## 统计 own 仓库数量 -count_own_repo_sum () { - if [[ -z ${RepoUrl1} ]]; then - own_repo_sum=0 - else - for ((i=1; i<=1000; i++)); do - local tmp1=RepoUrl$i - local tmp2=${!tmp1} - [[ $tmp2 ]] && own_repo_sum=$i || break - done - fi -} - -## 形成 own 仓库的文件夹名清单,依赖于import_config_and_check或import_config_no_check -## array_own_repo_path:repo存放的绝对路径组成的数组;array_own_scripts_path:所有要使用的脚本所在的绝对路径组成的数组 -gen_own_dir_and_path () { - local scripts_path_num="-1" - local repo_num tmp1 tmp2 tmp3 tmp4 tmp5 dir - - if [[ $own_repo_sum -ge 1 ]]; then - for ((i=1; i<=$own_repo_sum; i++)); do - repo_num=$((i - 1)) - tmp1=RepoUrl$i - array_own_repo_url[$repo_num]=${!tmp1} - tmp2=RepoBranch$i - array_own_repo_branch[$repo_num]=${!tmp2} - array_own_repo_dir[$repo_num]=$(echo ${array_own_repo_url[$repo_num]} | perl -pe "s|.+com(/\|:)([\w-]+)/([\w-]+)(\.git)?|\2_\3|") - array_own_repo_path[$repo_num]=$dir_scripts/${array_own_repo_dir[$repo_num]} - tmp3=RepoPath$i - if [[ ${!tmp3} ]]; then - for dir in ${!tmp3}; do - let scripts_path_num++ - tmp4="${array_own_repo_dir[repo_num]}/$dir" - tmp5=$(echo $tmp4 | perl -pe "{s|//|/|g; s|/$||}") # 去掉多余的/ - array_own_scripts_path[$scripts_path_num]="$dir_scripts/$tmp5" - done - else - let scripts_path_num++ - array_own_scripts_path[$scripts_path_num]="${array_own_repo_path[$repo_num]}" - fi - done - fi - - if [[ ${#RawUrl[*]} -ge 1 ]]; then - let scripts_path_num++ - array_own_scripts_path[$scripts_path_num]=$dir_raw # 只有own脚本所在绝对路径附加了raw文件夹,其他数组均不附加 - fi -} - -## 生成脚本的相对路径清单 +## 生成脚本的路径清单文件 gen_list_own () { local dir_current=$(pwd) rm -f $dir_list_tmp/own*.list >/dev/null 2>&1 @@ -238,6 +153,22 @@ npm_install_2 () { cd $dir_current } +## 更新依赖 +update_depend () { + if [ ! -s $dir_scripts/package.json ] || [[ $(diff $dir_sample/package.json $dir_scripts/package.json) ]]; then + cp -f $dir_sample/package.json $dir_scripts/package.json + npm_install_2 $dir_scripts + fi + + if [ ! -s $dir_scripts/sendNotify.js ] || [[ $(diff $dir_sample/sendNotify.js $dir_scripts/sendNotify.js) ]]; then + cp -f $dir_sample/sendNotify.js $dir_scripts/sendNotify.js + fi + + if [ ! -s $dir_scripts/jdCookie.js ] || [[ $(diff $dir_sample/jdCookie.js $dir_scripts/jdCookie.js) ]]; then + cp -f $dir_sample/jdCookie.js $dir_scripts/jdCookie.js + fi +} + ## 输出是否有新的或失效的定时任务,$1:新的或失效的任务清单文件路径,$2:新/失效 output_list_add_drop () { local list=$1 @@ -256,10 +187,10 @@ del_cron () { local detail detail2 if [ -s $list_drop ] && [ -s $list_crontab_user ]; then detail=$(cat $list_drop) - echo -e "开始尝试自动删除$type2的定时任务...\n" + echo -e "开始尝试自动删除失效的定时任务...\n" for cron in $detail; do local tmp=$(echo $cron | perl -pe "s|/|\.|g") - perl -i -ne "{print unless / $type $tmp( |$)/}" $list_crontab_user + perl -i -ne "{print unless / $cmd_task $tmp( |$)/}" $list_crontab_user done crontab $list_crontab_user detail2=$(echo $detail | perl -pe "s| |\\\n|g") @@ -268,16 +199,16 @@ del_cron () { fi } -## 自动增加自己额外的脚本的定时任务,需要:1.AutoAddCron 设置为 true;2.正常更新js脚本,没有报错;3.存在新任务;4.crontab.list存在并且不为空 +## 自动增加定时任务,需要:1.AutoAddCron 设置为 true;2.正常更新js脚本,没有报错;3.存在新任务;4.crontab.list存在并且不为空 ## $1:新任务清单文件路径 -add_cron () { +add_cron_step_1 () { local list_add=$1 local list_crontab_own_tmp=$dir_list_tmp/crontab_own.list [ -f $list_crontab_own_tmp ] && rm -f $list_crontab_own_tmp - if [[ ${AutoAddCron} == true ]] && [ -s $list_add ] && [ -s $list_crontab_user ]; then - echo -e "开始尝试自动添加 own 脚本的定时任务...\n" + if [ -s $list_crontab_user ]; then + echo -e "开始尝试自动添加定时任务...\n" local detail=$(cat $list_add) for file_full_path in $detail; do local file_name=$(echo $file_full_path | awk -F "/" '{print $NF}') @@ -299,13 +230,12 @@ add_cron () { [ -f $list_crontab_own_tmp ] && rm -f $list_crontab_own_tmp } -## 向系统添加定时任务以及通知,$1:写入crontab.list时的exit状态,$2:新增清单文件路径,$3:jd_scripts脚本/own脚本 -add_cron_notify () { +## 向系统添加定时任务以及通知,$1:写入crontab.list时的exit状态,$2:新增清单文件路径 +add_cron_step_2 () { local status_code=$1 local list_add=$2 local tmp=$(echo $(cat $list_add)) local detail=$(echo $tmp | perl -pe "s| |\\\n|g") - local type=$3 if [[ $status_code -eq 0 ]]; then crontab $list_crontab_user echo -e "成功添加新的定时任务...\n" @@ -321,7 +251,8 @@ update_own_repo () { [[ ${#array_own_repo_url[*]} -gt 0 ]] && echo -e "--------------------------------------------------------------\n" for ((i=0; i<${#array_own_repo_url[*]}; i++)); do if [ -d ${array_own_repo_path[i]}/.git ]; then - git_pull_scripts ${array_own_repo_path[i]} + reset_romote_url ${array_own_repo_path[i]} ${array_own_repo_url[i]} &>/dev/null + git_pull_scripts ${array_own_repo_path[i]} ${array_own_repo_branch[i]} else git_clone_scripts ${array_own_repo_url[i]} ${array_own_repo_path[i]} ${array_own_repo_branch[i]} fi @@ -331,7 +262,6 @@ update_own_repo () { ## 更新所有 raw 文件 update_own_raw () { - local rm_mark [[ ${#RawUrl[*]} -gt 0 ]] && echo -e "--------------------------------------------------------------\n" for ((i=0; i<${#RawUrl[*]}; i++)); do raw_file_name[$i]=$(echo ${RawUrl[i]} | awk -F "/" '{print $NF}') @@ -345,147 +275,109 @@ update_own_raw () { [ -f "$dir_raw/${raw_file_name[$i]}.new" ] && rm -f "$dir_raw/${raw_file_name[$i]}.new" fi done - - for file in $(ls $dir_raw); do - rm_mark="yes" - for ((i=0; i<${#raw_file_name[*]}; i++)); do - if [[ $file == ${raw_file_name[$i]} ]]; then - rm_mark="no" - break - fi - done - [[ $rm_mark == yes ]] && rm -f $dir_raw/$file 2>/dev/null - done } -## 调用用户自定义的diy.sh -run_diy_shell () { +## 调用用户自定义的extra.sh +run_extra_shell () { if [[ ${EnableExtraShell} == true ]]; then - if [ -f $file_diy_shell ] + if [ -f $file_extra_shell ] then echo -e "--------------------------------------------------------------\n" - . $file_diy_shell + . $file_extra_shell else - echo -e "$file_diy_shell文件不存在,跳过执行DIY脚本...\n" + echo -e "$file_extra_shell文件不存在,跳过执行...\n" fi fi } -## 在日志中记录时间与路径 -record_time_in_log () { - echo " --------------------------------------------------------------- - -系统时间:$(date "+%Y-%m-%d %H:%M:%S") - -根目录:$dir_root - -scripts目录:$dir_scripts - --------------------------------------------------------------- -" +## 脚本用法 +usage () { + echo -e "本脚本用法:" + echo -e "1. $cmd_update # 更新qinglong、所有你设置的仓库和raw文件,如果启用了EnableExtraShell还将在最后运行你自己编写的extra.sh" + echo -e "2. $cmd_update ql # 只更新qinglong,和输入 $cmd_update qinglong 时功能一样,不会运行extra.sh" + echo -e "3. $cmd_update # 指定scripts脚本目录下某个文件夹名称,只更新这个文件夹中的脚本,当该文件夹为git仓库才可使用此命令,不会运行extra.sh" } -################################################################################################################################# - - - -## 更新jup任务的cron -random_update_jup_cron - -## 重置仓库romote url -if [[ $QL_DIR ]] && [[ $ENABLE_RESET_REPO_URL == true ]]; then - reset_romote_url $dir_shell $url_shell >/dev/null - reset_romote_url $dir_scripts $url_scripts >/dev/null -fi - -## 更新shell -git_pull_scripts $dir_shell -if [[ $exit_status -eq 0 ]]; then - echo -e "\n更新$dir_shell成功...\n" - make_dir $dir_config - cp -f $file_config_sample $dir_config/config.sample.sh - update_docker_entrypoint - update_bot_py - detect_config_version -else - echo -e "\n更新$dir_shell失败,请检查原因...\n" -fi - -## 更新scripts -## 更新前先存储package.json和githubAction.md的内容 -[ -f $dir_scripts/package.json ] && scripts_depend_old=$(cat $dir_scripts/package.json) -[ -f $dir_scripts/githubAction.md ] && cp -f $dir_scripts/githubAction.md $dir_list_tmp/githubAction.md - -## 更新或克隆scripts -if [ -d $dir_scripts/.git ]; then - git_pull_scripts $dir_scripts -else - git_clone_scripts $url_scripts $dir_scripts -fi - -if [[ $exit_status -eq 0 ]]; then - echo -e "\n更新$dir_scripts成功...\n" - - ## npm install - [ ! -d $dir_scripts/node_modules ] && npm_install_1 $dir_scripts - [ -f $dir_scripts/package.json ] && scripts_depend_new=$(cat $dir_scripts/package.json) - [[ "$scripts_depend_old" != "$scripts_depend_new" ]] && npm_install_2 $dir_scripts - - ## diff cron - gen_list_task - diff_cron $list_task_jd_scripts $list_task_user $list_task_add $list_task_drop - - ## 失效任务通知 - if [ -s $list_task_drop ]; then - output_list_add_drop $list_task_drop "失效" - [[ ${AutoDelCron} == true ]] && del_cron $list_task_drop jtask +## 更新qinglong +update_qinglong () { + git_pull_scripts $dir_root + if [[ $exit_status -eq 0 ]]; then + echo -e "\n更新$dir_root成功...\n" + make_dir $dir_config + cp -f $file_config_sample $dir_config/config.sample.sh + update_docker_entrypoint + update_depend + detect_config_version + else + echo -e "\n更新$dir_root失败,请检查原因...\n" fi +} - ## 新增任务通知 - if [ -s $list_task_add ]; then - output_list_add_drop $list_task_add "新" - add_cron_jd_scripts $list_task_add - [[ ${AutoAddCron} == true ]] && add_cron_notify $exit_status $list_task_add "jd_scripts脚本" +## 更新所有脚本 +update_all_scripts () { + count_own_repo_sum + gen_own_dir_and_path + if [[ ${#array_own_scripts_path[*]} -gt 0 ]]; then + make_dir $dir_raw + update_own_repo + update_own_raw + gen_list_own + diff_cron $list_own_scripts $list_own_user $list_own_add $list_own_drop + + if [ -s $list_own_drop ]; then + output_list_add_drop $list_own_drop "失效" + [[ ${AutoDelCron} == true ]] && del_cron $list_own_drop + fi + if [ -s $list_own_add ]; then + output_list_add_drop $list_own_add "新" + if [[ ${AutoAddCron} == true ]]; then + add_cron_step_1 $list_own_add + add_cron_step_2 $exit_status $list_own_add + fi + fi + else + perl -i -ne "{print unless / $cmd_task /}" $list_crontab_user fi +} - ## 环境变量变化通知 - echo -e "检测环境变量清单文件 $dir_scripts/githubAction.md 是否有变化...\n" - diff $dir_list_tmp/githubAction.md $dir_scripts/githubAction.md | tee $dir_list_tmp/env.diff - if [ ! -s $dir_list_tmp/env.diff ]; then - echo -e "$dir_scripts/githubAction.md 没有变化...\n" - elif [ -s $dir_list_tmp/env.diff ] && [[ ${EnvChangeNotify} == true ]]; then - notify_title="检测到环境变量清单文件有变化" - notify_content="减少的内容:\n$(grep -E '^-[^-]' $dir_list_tmp/env.diff)\n\n增加的内容:\n$(grep -E '^\+[^\+]' $dir_list_tmp/env.diff)" - notify "$notify_title" "$notify_content" +## 更新指定仓库 +update_specify_scripts_repo () { + local tmp_dir=$1 + if [ -d $dir_scripts/$tmp_dir ]; then + git_pull_scripts $dir_scripts/$tmp_dir + else + echo -e "$dir_scripts/$tmp_dir 不存在...\n" + usage fi -else - echo -e "\n更新$dir_scripts失败,请检查原因...\n" -fi +} -## 更新own脚本 -count_own_repo_sum -gen_own_dir_and_path -if [[ ${#array_own_scripts_path[*]} -gt 0 ]]; then - make_dir $dir_raw - update_own_repo - update_own_raw - gen_list_own - diff_cron $list_own_scripts $list_own_user $list_own_add $list_own_drop +main () { + log_time=$(date "+%Y-%m-%d-%H-%M-%S") + log_path="$dir_log/update/${log_time}.log" + make_dir "$dir_log/update" + case $# in + 0) + update_qinglong | tee $log_path + update_all_scripts | tee -a $log_path + run_extra_shell | tee -a $log_path + exit 0 + ;; + 1) + case $1 in + ql | qinglong) + update_qinglong | tee $log_path + ;; + *) + update_specify_scripts_repo | tee $log_path + ;; + esac + exit 0 + ;; + *) + usage + exit 0 + ;; + esac +} - if [ -s $list_own_drop ]; then - output_list_add_drop $list_own_drop "失效" - [[ ${AutoDelCron} == true ]] && del_cron $list_own_drop otask - fi - if [ -s $list_own_add ]; then - output_list_add_drop $list_own_add "新" - add_cron $list_own_add - [[ ${AutoAddCron} == true ]] && add_cron_notify $exit_status $list_own_add "own脚本" - fi -else - perl -i -ne "{print unless / $cmd_task /}" $list_crontab_user -fi - - - -exit 0 +main "$@"