From 8c5ac5e28a2aae495b82415459ec4b4cb43aab2e Mon Sep 17 00:00:00 2001 From: Faker Date: Tue, 19 Apr 2022 20:10:14 +0800 Subject: [PATCH] encrypted --- docker/Dockerfile | 37 - docker/Readme.md | 264 ---- docker/auto_help.sh | 155 --- docker/bot/jd.png | Bin 7335 -> 0 bytes docker/bot/jd_bot | 1114 ----------------- docker/bot/requirements.txt | 5 - docker/bot/setup.py | 13 - docker/crontab_list.sh | 229 ---- docker/default_task.sh | 252 ---- docker/docker_entrypoint.sh | 57 - docker/example/custom-append.yml | 62 - docker/example/custom-overwrite.yml | 62 - docker/example/default.yml | 59 - .../docker多账户使用独立容器使用说明.md | 83 -- .../jd_scripts.custom-append.syno.json | 65 - .../jd_scripts.custom-overwrite.syno.json | 69 - docker/example/jd_scripts.syno.json | 83 -- docker/example/multi.yml | 62 - docker/notify_docker_user.js | 20 - docker/proc_file.sh | 27 - jd_jxlhb.js => encrypted/jd_jxlhb.js | 509 +------- 21 files changed, 7 insertions(+), 3220 deletions(-) delete mode 100644 docker/Dockerfile delete mode 100644 docker/Readme.md delete mode 100644 docker/auto_help.sh delete mode 100644 docker/bot/jd.png delete mode 100644 docker/bot/jd_bot delete mode 100644 docker/bot/requirements.txt delete mode 100644 docker/bot/setup.py delete mode 100644 docker/crontab_list.sh delete mode 100644 docker/default_task.sh delete mode 100644 docker/docker_entrypoint.sh delete mode 100644 docker/example/custom-append.yml delete mode 100644 docker/example/custom-overwrite.yml delete mode 100644 docker/example/default.yml delete mode 100644 docker/example/docker多账户使用独立容器使用说明.md delete mode 100644 docker/example/jd_scripts.custom-append.syno.json delete mode 100644 docker/example/jd_scripts.custom-overwrite.syno.json delete mode 100644 docker/example/jd_scripts.syno.json delete mode 100644 docker/example/multi.yml delete mode 100644 docker/notify_docker_user.js delete mode 100644 docker/proc_file.sh rename jd_jxlhb.js => encrypted/jd_jxlhb.js (70%) diff --git a/docker/Dockerfile b/docker/Dockerfile deleted file mode 100644 index b4dfea7..0000000 --- a/docker/Dockerfile +++ /dev/null @@ -1,37 +0,0 @@ -FROM node:lts-alpine3.12 - -LABEL AUTHOR="none" \ - VERSION=0.1.4 - -ARG KEY="-----BEGIN OPENSSH PRIVATE KEY-----\nb3BlbnNzaC1rZXktdjEAAAAABG5vbmUAAAAEbm9uZQAAAAAAAAABAAABFwAAAAdzc2gtcn\nNhAAAAAwEAAQAAAQEAvRQk2oQqLB01iVnJKrnI3tTfJyEHzc2ULVor4vBrKKWOum4dbTeT\ndNWL5aS+CJso7scJT3BRq5fYVZcz5ra0MLMdQyFL1DdwurmzkhPYbwcNrJrB8abEPJ8ltS\nMoa0X9ecmSepaQFedZOZ2YeT/6AAXY+cc6xcwyuRVQ2ZJ3YIMBrRuVkF6nYwLyBLFegzhu\nJJeU5o53kfpbTCirwK0h9ZsYwbNbXYbWuJHmtl5tEBf2Hz+5eCkigXRq8EhRZlSnXfhPr2\n32VCb1A/gav2/YEaMPSibuBCzqVMVruP5D625XkxMdBdLqLBGWt7bCas7/zH2bf+q3zac4\nLcIFhkC6XwAAA9BjE3IGYxNyBgAAAAdzc2gtcnNhAAABAQC9FCTahCosHTWJWckqucje1N\n8nIQfNzZQtWivi8GsopY66bh1tN5N01YvlpL4ImyjuxwlPcFGrl9hVlzPmtrQwsx1DIUvU\nN3C6ubOSE9hvBw2smsHxpsQ8nyW1IyhrRf15yZJ6lpAV51k5nZh5P/oABdj5xzrFzDK5FV\nDZkndggwGtG5WQXqdjAvIEsV6DOG4kl5TmjneR+ltMKKvArSH1mxjBs1tdhta4kea2Xm0Q\nF/YfP7l4KSKBdGrwSFFmVKdd+E+vbfZUJvUD+Bq/b9gRow9KJu4ELOpUxWu4/kPrbleTEx\n0F0uosEZa3tsJqzv/MfZt/6rfNpzgtwgWGQLpfAAAAAwEAAQAAAQEAnMKZt22CBWcGHuUI\nytqTNmPoy2kwLim2I0+yOQm43k88oUZwMT+1ilUOEoveXgY+DpGIH4twusI+wt+EUVDC3e\nlyZlixpLV+SeFyhrbbZ1nCtYrtJutroRMVUTNf7GhvucwsHGS9+tr+96y4YDZxkBlJBfVu\nvdUJbLfGe0xamvE114QaZdbmKmtkHaMQJOUC6EFJI4JmSNLJTxNAXKIi3TUrS7HnsO3Xfv\nhDHElzSEewIC1smwLahS6zi2uwP1ih4fGpJJbU6FF/jMvHf/yByHDtdcuacuTcU798qT0q\nAaYlgMd9zrLC1OHMgSDcoz9/NQTi2AXGAdo4N+mnxPTHcQAAAIB5XCz1vYVwJ8bKqBelf1\nw7OlN0QDM4AUdHdzTB/mVrpMmAnCKV20fyA441NzQZe/52fMASUgNT1dQbIWCtDU2v1cP6\ncG8uyhJOK+AaFeDJ6NIk//d7o73HNxR+gCCGacleuZSEU6075Or2HVGHWweRYF9hbmDzZb\nCLw6NsYaP2uAAAAIEA3t1BpGHHek4rXNjl6d2pI9Pyp/PCYM43344J+f6Ndg3kX+y03Mgu\n06o33etzyNuDTslyZzcYUQqPMBuycsEb+o5CZPtNh+1klAVE3aDeHZE5N5HrJW3fkD4EZw\nmOUWnRj1RT2TsLwixB21EHVm7fh8Kys1d2ULw54LVmtv4+O3cAAACBANkw7XZaZ/xObHC9\n1PlT6vyWg9qHAmnjixDhqmXnS5Iu8TaKXhbXZFg8gvLgduGxH/sGwSEB5D6sImyY+DW/OF\nbmIVC4hwDUbCsTMsmTTTgyESwmuQ++JCh6f2Ams1vDKbi+nOVyqRvCrAHtlpaqSfv8hkjK\npBBqa/rO5yyYmeJZAAAAFHJvb3RAbmFzLmV2aW5lLnByZXNzAQIDBAUG\n-----END OPENSSH PRIVATE KEY-----" - -ENV DEFAULT_LIST_FILE=crontab_list.sh \ - CUSTOM_LIST_MERGE_TYPE=append \ - COOKIES_LIST=/scripts/logs/cookies.list \ - REPO_URL=git@gitee.com:lxk0301/jd_scripts.git \ - REPO_BRANCH=master - -RUN set -ex \ - && apk update \ - && apk upgrade \ - && apk add --no-cache bash tzdata git moreutils curl jq openssh-client \ - && rm -rf /var/cache/apk/* \ - && ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime \ - && echo "Asia/Shanghai" > /etc/timezone \ - && mkdir -p /root/.ssh \ - && echo -e $KEY > /root/.ssh/id_rsa \ - && chmod 600 /root/.ssh/id_rsa \ - && ssh-keyscan gitee.com > /root/.ssh/known_hosts \ - && git clone -b $REPO_BRANCH $REPO_URL /scripts \ - && cd /scripts \ - && mkdir logs \ - && npm config set registry https://registry.npm.taobao.org \ - && npm install \ - && cp /scripts/docker/docker_entrypoint.sh /usr/local/bin \ - && chmod +x /usr/local/bin/docker_entrypoint.sh - -WORKDIR /scripts - -ENTRYPOINT ["docker_entrypoint.sh"] - -CMD [ "crond" ] \ No newline at end of file diff --git a/docker/Readme.md b/docker/Readme.md deleted file mode 100644 index c216307..0000000 --- a/docker/Readme.md +++ /dev/null @@ -1,264 +0,0 @@ -![Docker Pulls](https://img.shields.io/docker/pulls/lxk0301/jd_scripts?style=for-the-badge) -### Usage -```diff -+ 2021-03-21更新 增加bot交互,spnode指令,功能是否开启自动根据你的配置判断,详见 https://gitee.com/lxk0301/jd_docker/pulls/18 - **bot交互启动前置条件为 配置telegram通知,并且未使用自己代理的 TG_API_HOST** - **spnode使用前置条件未启动bot交互** _(后续可能去掉该限制_ - 使用bot交互+spnode后 后续用户的cookie维护更新只需要更新logs/cookies.conf即可 - 使用bot交互+spnode后 后续执行脚本命令请使用spnode否者无法使用logs/cookies.conf的cookies执行脚本,定时任务也将自动替换为spnode命令执行 - 发送/spnode给bot获取可执行脚本的列表,选择对应的按钮执行。(拓展使用:运行指定路径脚本,例:/spnode /scripts/jd_818.js) - spnode功能概述示例 - spnode conc /scripts/jd_bean_change.js 为每个cookie单独执行jd_bean_change脚本(伪并发 - spnode 1 /scripts/jd_bean_change.js 为logs/cookies.conf文件里面第一行cookie账户单独执行jd_bean_change脚本 - spnode jd_XXXX /scripts/jd_bean_change.js 为logs/cookies.conf文件里面pt_pin=jd_XXXX的cookie账户单独执行jd_bean_change脚本 - spnode /scripts/jd_bean_change.js 为logs/cookies.conf所有cookies账户一起执行jd_bean_change脚本 - -**请仔细阅读并理解上面的内容,使用bot交互默认开启spnode指令功能功能。** -+ 2021-03-9更新 新版docker单容器多账号自动互助 -+开启方式:docker-compose.yml 中添加环境变量 - ENABLE_AUTO_HELP=true -+助力原则:不考虑需要被助力次数与提供助力次数 假设有3个账号,则生成: ”助力码1@助力码2@助力码3&助力码1@助力码2@助力码3&助力码1@助力码2@助力码3“ -+原理说明:1、定时调用 /scripts/docker/auto_help.sh collect 收集各个活动的助力码,整理、去重、排序、保存到 /scripts/logs/sharecodeCollection.log; - 2、(由于linux进程限制,父进程无法获取子进程环境变量)在每次脚本运行前,在当前进程先调用 /scripts/docker/auto_help.sh export 把助力码注入到环境变量 - -+ 2021-02-21更新 https://gitee.com/lxk0301/jd_scripts仓库被迫私有,老用户重新更新一下镜像:https://hub.docker.com/r/lxk0301/jd_scripts)(docker-compose.yml的REPO_URL记得修改)后续可同步更新jd_script仓库最新脚本 -+ 2021-02-10更新 docker-compose里面,填写环境变量 SHARE_CODE_FILE=/scripts/logs/sharecode.log, 多账号可实现自己互助(只限sharecode.log日志里面几个活动),注:已停用,请使用2021-03-9更新 -+ 2021-01-22更新 CUSTOM_LIST_FILE 参数支持远程定时任务列表 (⚠️务必确认列表中的任务在仓库里存在) -+ 例1:配置远程crontab_list.sh, 此处借用 shylocks 大佬的定时任务列表, 本仓库不包含列表中的任务代码, 仅作示范 -+ CUSTOM_LIST_FILE=https://raw.githubusercontent.com/shylocks/Loon/main/docker/crontab_list.sh -+ -+ 例2:配置docker挂载本地定时任务列表, 用法不变, 注意volumes挂载 -+ volumes: -+ - ./my_crontab_list.sh:/scripts/docker/my_crontab_list.sh -+ environment: -+ - CUSTOM_LIST_FILE=my_crontab_list.sh - - -+ 2021-01-21更新 增加 DO_NOT_RUN_SCRIPTS 参数配置不执行的脚本 -+ 例:DO_NOT_RUN_SCRIPTS=jd_family.js&jd_dreamFactory.js&jd_jxnc.js -建议填写完整文件名,不完整的文件名可能导致其他脚本被禁用。 -例如:“jd_joy”会匹配到“jd_joy_feedPets”、“jd_joy_reward”、“jd_joy_steal” - -+ 2021-01-03更新 增加 CUSTOM_SHELL_FILE 参数配置执行自定义shell脚本 -+ 例1:配置远程shell脚本, 我自己写了一个shell脚本https://raw.githubusercontent.com/iouAkira/someDockerfile/master/jd_scripts/shell_script_mod.sh 内容很简单下载惊喜农场并添加定时任务 -+ CUSTOM_SHELL_FILE=https://raw.githubusercontent.com/iouAkira/someDockerfile/master/jd_scripts/shell_script_mod.sh -+ -+ 例2:配置docker挂载本地自定义shell脚本,/scripts/docker/shell_script_mod.sh 为你在docker-compose.yml里面挂载到容器里面绝对路径 -+ CUSTOM_SHELL_FILE=/scripts/docker/shell_script_mod.sh -+ -+ tip:如果使用远程自定义,请保证网络畅通或者选择合适的国内仓库,例如有部分人的容器里面就下载不到github的raw文件,那就可以把自己的自定义shell写在gitee上,或者换本地挂载 -+ 如果是 docker 挂载本地,请保证文件挂载进去了,并且配置的是绝对路径。 -+ 自定义 shell 脚本里面如果要加 crontab 任务请使用 echo 追加到 /scripts/docker/merged_list_file.sh 里面否则不生效 -+ 注⚠️ 建议无shell能力的不要轻易使用,当然你可以找别人写好适配了这个docker镜像的脚本直接远程配置 -+ 上面写了这么多如果还看不懂,不建议使用该变量功能。 -_____ -! ⚠️⚠️⚠️2020-12-11更新镜像启动方式,虽然兼容旧版的运行启动方式,但是强烈建议更新镜像和配置后使用 -! 更新后`command:`指令配置不再需要 -! 更新后可以使用自定义任务文件追加在默任务文件之后,比以前的完全覆盖多一个选择 -! - 新的自定两个环境变量为 `CUSTOM_LIST_MERGE_TYPE`:自定文件的生效方式可选值为`append`,`overwrite`默认为`append` ; `CUSTOM_LIST_FILE`: 自定义文件的名字 -! 更新镜像增减镜像更新通知,以后镜像如果更新之后,会通知用户更新 -``` -> 推荐使用`docker-compose`所以这里只介绍`docker-compose`使用方式 - - - -Docker安装 - -- 国内一键安装 `sudo curl -sSL https://get.daocloud.io/docker | sh` -- 国外一键安装 `sudo curl -sSL get.docker.com | sh` -- 北京外国语大学开源软件镜像站 `https://mirrors.bfsu.edu.cn/help/docker-ce/` - - -docker-compose 安装(群晖`nas docker`自带安装了`docker-compose`) - -``` -sudo curl -L "https://github.com/docker/compose/releases/download/1.24.1/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose -sudo chmod +x /usr/local/bin/docker-compose -``` -`Ubuntu`用户快速安装`docker-compose` -``` -sudo apt-get update && sudo apt-get install -y python3-pip curl vim git moreutils -pip3 install --upgrade pip -pip install docker-compose -``` - -### win10用户下载安装[docker desktop](https://www.docker.com/products/docker-desktop) - -通过`docker-compose version`查看`docker-compose`版本,确认是否安装成功。 - - -### 如果需要使用 docker 多个账户独立并发执行定时任务,[参考这里](./example/docker%E5%A4%9A%E8%B4%A6%E6%88%B7%E4%BD%BF%E7%94%A8%E7%8B%AC%E7%AB%8B%E5%AE%B9%E5%99%A8%E4%BD%BF%E7%94%A8%E8%AF%B4%E6%98%8E.md#%E4%BD%BF%E7%94%A8%E6%AD%A4%E6%96%B9%E5%BC%8F%E8%AF%B7%E5%85%88%E7%90%86%E8%A7%A3%E5%AD%A6%E4%BC%9A%E4%BD%BF%E7%94%A8docker%E5%8A%9E%E6%B3%95%E4%B8%80%E7%9A%84%E4%BD%BF%E7%94%A8%E6%96%B9%E5%BC%8F) - -> 注⚠️:前提先理解学会使用这下面的教程 -### 创建一个目录`jd_scripts`用于存放备份配置等数据,迁移重装的时候只需要备份整个jd_scripts目录即可 -需要新建的目录文件结构参考如下: -``` -jd_scripts -├── logs -│   ├── XXXX.log -│   └── XXXX.log -├── my_crontab_list.sh -└── docker-compose.yml -``` -- `jd_scripts/logs`建一个空文件夹就行 -- `jd_scripts/docker-compose.yml` 参考内容如下(自己动手能力不行搞不定请使用默认配置): -- - [使用默认配置用这个](./example/default.yml) -- - [使用自定义任务追加到默认任务之后用这个](./example/custom-append.yml) -- - [使用自定义任务覆盖默认任务用这个](./example/custom-overwrite.yml) -- - [一次启动多容器并发用这个](./example/multi.yml) -- - [使用群晖默认配置用这个](./example/jd_scripts.syno.json) -- - [使用群晖自定义任务追加到默认任务之后用这个](./example/jd_scripts.custom-append.syno.json) -- - [使用群晖自定义任务覆盖默认任务用这个](./example/jd_scripts.custom-overwrite.syno.json) -- `jd_scripts/docker-compose.yml`里面的环境变量(`environment:`)配置[参考这里](../githubAction.md#互助码类环境变量) 和[本文末尾](../docker/Readme.md#docker专属环境变量) - - -- `jd_scripts/my_crontab_list.sh` 参考内容如下,自己根据需要调整增加删除,不熟悉用户推荐使用[默认配置](./crontab_list.sh)里面的内容: - -```shell -# 每3天的23:50分清理一次日志(互助码不清理,proc_file.sh对该文件进行了去重) -50 23 */3 * * find /scripts/logs -name '*.log' | grep -v 'sharecode' | xargs rm -rf - -##############短期活动############## -# 小鸽有礼2(活动时间:2021年1月28日~2021年2月28日) -34 9 * * * node /scripts/jd_xgyl.js >> /scripts/logs/jd_jd_xgyl.log 2>&1 - -#女装盲盒 活动时间:2021-2-19至2021-2-25 -5 7,23 19-25 2 * node /scripts/jd_nzmh.js >> /scripts/logs/jd_nzmh.log 2>&1 - -#京东极速版天天领红包 活动时间:2021-1-18至2021-3-3 -5 0,23 * * * node /scripts/jd_speed_redpocke.js >> /scripts/logs/jd_speed_redpocke.log 2>&1 -##############长期活动############## -# 签到 -3 0,18 * * * cd /scripts && node jd_bean_sign.js >> /scripts/logs/jd_bean_sign.log 2>&1 -# 东东超市兑换奖品 -0,30 0 * * * node /scripts/jd_blueCoin.js >> /scripts/logs/jd_blueCoin.log 2>&1 -# 摇京豆 -0 0 * * * node /scripts/jd_club_lottery.js >> /scripts/logs/jd_club_lottery.log 2>&1 -# 东东农场 -5 6-18/6 * * * node /scripts/jd_fruit.js >> /scripts/logs/jd_fruit.log 2>&1 -# 宠汪汪 -15 */2 * * * node /scripts/jd_joy.js >> /scripts/logs/jd_joy.log 2>&1 -# 宠汪汪喂食 -15 */1 * * * node /scripts/jd_joy_feedPets.js >> /scripts/logs/jd_joy_feedPets.log 2>&1 -# 宠汪汪偷好友积分与狗粮 -13 0-21/3 * * * node /scripts/jd_joy_steal.js >> /scripts/logs/jd_joy_steal.log 2>&1 -# 摇钱树 -0 */2 * * * node /scripts/jd_moneyTree.js >> /scripts/logs/jd_moneyTree.log 2>&1 -# 东东萌宠 -5 6-18/6 * * * node /scripts/jd_pet.js >> /scripts/logs/jd_pet.log 2>&1 -# 京东种豆得豆 -0 7-22/1 * * * node /scripts/jd_plantBean.js >> /scripts/logs/jd_plantBean.log 2>&1 -# 京东全民开红包 -1 1 * * * node /scripts/jd_redPacket.js >> /scripts/logs/jd_redPacket.log 2>&1 -# 进店领豆 -10 0 * * * node /scripts/jd_shop.js >> /scripts/logs/jd_shop.log 2>&1 -# 京东天天加速 -8 */3 * * * node /scripts/jd_speed.js >> /scripts/logs/jd_speed.log 2>&1 -# 东东超市 -11 1-23/5 * * * node /scripts/jd_superMarket.js >> /scripts/logs/jd_superMarket.log 2>&1 -# 取关京东店铺商品 -55 23 * * * node /scripts/jd_unsubscribe.js >> /scripts/logs/jd_unsubscribe.log 2>&1 -# 京豆变动通知 -0 10 * * * node /scripts/jd_bean_change.js >> /scripts/logs/jd_bean_change.log 2>&1 -# 京东抽奖机 -11 1 * * * node /scripts/jd_lotteryMachine.js >> /scripts/logs/jd_lotteryMachine.log 2>&1 -# 京东排行榜 -11 9 * * * node /scripts/jd_rankingList.js >> /scripts/logs/jd_rankingList.log 2>&1 -# 天天提鹅 -18 * * * * node /scripts/jd_daily_egg.js >> /scripts/logs/jd_daily_egg.log 2>&1 -# 金融养猪 -12 * * * * node /scripts/jd_pigPet.js >> /scripts/logs/jd_pigPet.log 2>&1 -# 点点券 -20 0,20 * * * node /scripts/jd_necklace.js >> /scripts/logs/jd_necklace.log 2>&1 -# 京喜工厂 -20 * * * * node /scripts/jd_dreamFactory.js >> /scripts/logs/jd_dreamFactory.log 2>&1 -# 东东小窝 -16 6,23 * * * node /scripts/jd_small_home.js >> /scripts/logs/jd_small_home.log 2>&1 -# 东东工厂 -36 * * * * node /scripts/jd_jdfactory.js >> /scripts/logs/jd_jdfactory.log 2>&1 -# 十元街 -36 8,18 * * * node /scripts/jd_syj.js >> /scripts/logs/jd_syj.log 2>&1 -# 京东快递签到 -23 1 * * * node /scripts/jd_kd.js >> /scripts/logs/jd_kd.log 2>&1 -# 京东汽车(签到满500赛点可兑换500京豆) -0 0 * * * node /scripts/jd_car.js >> /scripts/logs/jd_car.log 2>&1 -# 领京豆额外奖励(每日可获得3京豆) -33 4 * * * node /scripts/jd_bean_home.js >> /scripts/logs/jd_bean_home.log 2>&1 -# 微信小程序京东赚赚 -10 11 * * * node /scripts/jd_jdzz.js >> /scripts/logs/jd_jdzz.log 2>&1 -# 宠汪汪邀请助力 -10 9-20/2 * * * node /scripts/jd_joy_run.js >> /scripts/logs/jd_joy_run.log 2>&1 -# crazyJoy自动每日任务 -10 7 * * * node /scripts/jd_crazy_joy.js >> /scripts/logs/jd_crazy_joy.log 2>&1 -# 京东汽车旅程赛点兑换金豆 -0 0 * * * node /scripts/jd_car_exchange.js >> /scripts/logs/jd_car_exchange.log 2>&1 -# 导到所有互助码 -47 7 * * * node /scripts/jd_get_share_code.js >> /scripts/logs/jd_get_share_code.log 2>&1 -# 口袋书店 -7 8,12,18 * * * node /scripts/jd_bookshop.js >> /scripts/logs/jd_bookshop.log 2>&1 -# 京喜农场 -0 9,12,18 * * * node /scripts/jd_jxnc.js >> /scripts/logs/jd_jxnc.log 2>&1 -# 签到领现金 -27 */4 * * * node /scripts/jd_cash.js >> /scripts/logs/jd_cash.log 2>&1 -# 京喜app签到 -39 7 * * * node /scripts/jx_sign.js >> /scripts/logs/jx_sign.log 2>&1 -# 京东家庭号(暂不知最佳cron) -# */20 * * * * node /scripts/jd_family.js >> /scripts/logs/jd_family.log 2>&1 -# 闪购盲盒 -27 8 * * * node /scripts/jd_sgmh.js >> /scripts/logs/jd_sgmh.log 2>&1 -# 京东秒秒币 -10 7 * * * node /scripts/jd_ms.js >> /scripts/logs/jd_ms.log 2>&1 -#美丽研究院 -1 7,12,19 * * * node /scripts/jd_beauty.js >> /scripts/logs/jd_beauty.log 2>&1 -#京东保价 -1 0,23 * * * node /scripts/jd_price.js >> /scripts/logs/jd_price.log 2>&1 -#京东极速版签到+赚现金任务 -1 1,6 * * * node /scripts/jd_speed_sign.js >> /scripts/logs/jd_speed_sign.log 2>&1 -# 删除优惠券(默认注释,如需要自己开启,如有误删,已删除的券可以在回收站中还原,慎用) -#20 9 * * 6 node /scripts/jd_delCoupon.js >> /scripts/logs/jd_delCoupon.log 2>&1 -``` -> 定时任务命之后,也就是 `>>` 符号之前加上 `|ts` 可在日志每一行前面显示时间,如下图: -> ![image](https://user-images.githubusercontent.com/6993269/99031839-09e04b00-25b3-11eb-8e47-0b6515a282bb.png) -- 目录文件配置好之后在 `jd_scripts`目录执行。 - `docker-compose up -d` 启动(修改docker-compose.yml后需要使用此命令使更改生效); - `docker-compose logs` 打印日志; - `docker-compose logs -f` 打印日志,-f表示跟随日志; - `docker logs -f jd_scripts` 和上面两条相比可以显示汉字; - `docker-compose pull` 更新镜像;多容器用户推荐使用`docker pull lxk0301/jd_scripts`; - `docker-compose stop` 停止容器; - `docker-compose restart` 重启容器; - `docker-compose down` 停止并删除容器; - -- 你可能会用到的命令 - - `docker exec -it jd_scripts /bin/sh -c ". /scripts/docker/auto_help.sh export > /scripts/logs/auto_help_export.log && node /scripts/xxxx.js |ts >> /scripts/logs/xxxx.log 2>&1"` 手动运行一脚本(有自动助力) - - `docker exec -it jd_scripts /bin/sh -c "node /scripts/xxxx.js |ts >> /scripts/logs/xxxx.log 2>&1"` 手动运行一脚本(无自动助力) - - `docker exec -it jd_scripts /bin/sh -c 'env'` 查看设置的环境变量 - - `docker exec -it jd_scripts /bin/sh -c 'crontab -l'` 查看已生效的crontab_list定时器任务 - - `docker exec -it jd_scripts sh -c "git pull"` 手动更新jd_scripts仓库最新脚本(默认已有每天拉取两次的定时任务,不推荐使用) - - `docker exec -it jd_scripts /bin/sh` 仅进入容器命令 - - `rm -rf logs/*.log` 删除logs文件夹里面所有的日志文件(linux) - - `docker exec -it jd_scripts /bin/sh -c ' ls jd_*.js | grep -v jd_crazy_joy_coin.js |xargs -i node {}'` 执行所有定时任务 - -- 如果是群晖用户,在docker注册表搜`jd_scripts`,双击下载映像。 -不需要`docker-compose.yml`,只需建个logs/目录,调整`jd_scripts.syno.json`里面对应的配置值,然后导入json配置新建容器。 -若要自定义`my_crontab_list.sh`,再建个`my_crontab_list.sh`文件,配置参考`jd_scripts.my_crontab_list.syno.json`。 -![image](../icon/qh1.png) - -![image](../icon/qh2.png) - -![image](../icon/qh3.png) - -### DOCKER专属环境变量 - -| Name | 归属 | 属性 | 说明 | -| :---------------: | :------------: | :----: | ------------------------------------------------------------ | -| `CRZAY_JOY_COIN_ENABLE` | 是否jd_crazy_joy_coin挂机 | 非必须 | `docker-compose.yml`文件下填写`CRZAY_JOY_COIN_ENABLE=Y`表示挂机,`CRZAY_JOY_COIN_ENABLE=N`表不挂机 | -| `DO_NOT_RUN_SCRIPTS` | 不执行的脚本 | 非必须 | 例:`docker-compose.yml`文件里面填写`DO_NOT_RUN_SCRIPTS=jd_family.js&jd_dreamFactory.js&jd_jxnc.js`, 建议填写完整脚本名,不完整的文件名可能导致其他脚本被禁用 | -| `ENABLE_AUTO_HELP` | 单容器多账号自动互助 | 非必须 | 例:`docker-compose.yml`文件里面填写`ENABLE_AUTO_HELP=true` | diff --git a/docker/auto_help.sh b/docker/auto_help.sh deleted file mode 100644 index 5c29885..0000000 --- a/docker/auto_help.sh +++ /dev/null @@ -1,155 +0,0 @@ -#set -e - -#日志路径 -logDir="/scripts/logs" - -# 处理后的log文件 -logFile=${logDir}/sharecodeCollection.log -if [ -n "$1" ]; then - parameter=${1} -else - echo "没有参数" -fi - -# 收集助力码 -collectSharecode() { - if [ -f ${2} ]; then - echo "${1}:清理 ${preLogFile} 中的旧助力码,收集新助力码" - - #删除预处理旧助力码 - if [ -f "${logFile}" ]; then - sed -i '/'"${1}"'/d' ${logFile} - fi - - #收集日志中的互助码 - codes="$(sed -n '/'${1}'.*/'p ${2} | sed 's/京东账号/京东账号 /g' | sed 's/(/ (/g' | sed 's/】/】 /g' | awk '{print $4,$5,$6,$7}' | sort -gk2 | awk '!a[$2" "$3]++{print}')" - - #获取ck文件夹中的pin值集合 - if [ -f "/usr/local/bin/spnode" ]; then - ptpins="$(awk -F "=" '{print $3}' $COOKIES_LIST | awk -F ";" '{print $1}')" - else - ptpins="$(echo $JD_COOKIE | sed "s/[ &]/\\n/g" | sed "/^$/d" | awk -F "=" '{print $3}' | awk -F ";" '{print $1}')" - fi - - - #遍历pt_pin值 - for item in $ptpins; do - #中文pin解码 - if [ ${#item} > 20 ]; then - item="$(printf $(echo -n "$item" | sed 's/\\/\\\\/g;s/\(%\)\([0-9a-fA-F][0-9a-fA-F]\)/\\x\2/g')"\n")" - fi - #根据pin值匹配第一个code结果输出到文件中 - echo "$codes" | grep -m1 $item >> $logFile - done - else - echo "${1}:${2} 文件不存在,不清理 ${logFile} 中的旧助力码" - fi - -} - -# 导出助力码 -exportSharecode() { - if [ -f ${logFile} ]; then - #账号数 - cookiecount=$(echo ${JD_COOKIE} | grep -o pt_key | grep -c pt_key) - if [ -f /usr/local/bin/spnode ]; then - cookiecount=$(cat "$COOKIES_LIST" | grep -o pt_key | grep -c pt_key) - fi - echo "cookie个数:${cookiecount}" - - # 单个账号助力码 - singleSharecode=$(sed -n '/'${1}'.*/'p ${logFile} | awk '{print $4}' | awk '{T=T"@"$1} END {print T}' | awk '{print substr($1,2)}') - # | awk '{print $2,$4}' | sort -g | uniq - # echo "singleSharecode:${singleSharecode}" - - # 拼接多个账号助力码 - num=1 - while [ ${num} -le ${cookiecount} ]; do - local allSharecode=${allSharecode}"&"${singleSharecode} - num=$(expr $num + 1) - done - - allSharecode=$(echo ${allSharecode} | awk '{print substr($1,2)}') - - # echo "${1}:${allSharecode}" - - #判断合成的助力码长度是否大于账号数,不大于,则可知没有助力码 - if [ ${#allSharecode} -gt ${cookiecount} ]; then - echo "${1}:导出助力码" - echo "${3}=${allSharecode}" - export ${3}=${allSharecode} - else - echo "${1}:没有助力码,不导出" - fi - - else - echo "${1}:${logFile} 不存在,不导出助力码" - fi - -} - -#生成助力码 -autoHelp() { - if [ ${parameter} == "collect" ]; then - - # echo "收集助力码" - collectSharecode ${1} ${2} ${3} - - elif [ ${parameter} == "export" ]; then - - # echo "导出助力码" - exportSharecode ${1} ${2} ${3} - fi -} - -#日志需要为这种格式才能自动提取 -#Mar 07 00:15:10 【京东账号1(xxxxxx)的京喜财富岛好友互助码】3B41B250C4A369EE6DCA6834880C0FE0624BAFD83FC03CA26F8DEC7DB95D658C - -#新增自动助力活动格式 -# autoHelp 关键词 日志路径 变量名 - -############# 短期活动 ############# - - -############# 长期活动 ############# - -#东东农场 -autoHelp "东东农场好友互助码" "${logDir}/jd_fruit.log" "FRUITSHARECODES" - -#东东萌宠 -autoHelp "东东萌宠好友互助码" "${logDir}/jd_pet.log" "PETSHARECODES" - -#种豆得豆 -autoHelp "京东种豆得豆好友互助码" "${logDir}/jd_plantBean.log" "PLANT_BEAN_SHARECODES" - -#京喜工厂 -autoHelp "京喜工厂好友互助码" "${logDir}/jd_dreamFactory.log" "DREAM_FACTORY_SHARE_CODES" - -#东东工厂 -autoHelp "东东工厂好友互助码" "${logDir}/jd_jdfactory.log" "DDFACTORY_SHARECODES" - -#crazyJoy -autoHelp "crazyJoy任务好友互助码" "${logDir}/jd_crazy_joy.log" "JDJOY_SHARECODES" - -#京喜财富岛 -autoHelp "京喜财富岛好友互助码" "${logDir}/jd_cfd.log" "JDCFD_SHARECODES" - -#京喜农场 -autoHelp "京喜农场好友互助码" "${logDir}/jd_jxnc.log" "JXNC_SHARECODES" - -#京东赚赚 -autoHelp "京东赚赚好友互助码" "${logDir}/jd_jdzz.log" "JDZZ_SHARECODES" - -######### 日志打印格式需调整 ######### - -#口袋书店 -autoHelp "口袋书店好友互助码" "${logDir}/jd_bookshop.log" "BOOKSHOP_SHARECODES" - -#领现金 -autoHelp "签到领现金好友互助码" "${logDir}/jd_cash.log" "JD_CASH_SHARECODES" - -#闪购盲盒 -autoHelp "闪购盲盒好友互助码" "${logDir}/jd_sgmh.log" "JDSGMH_SHARECODES" - -#东东健康社区 -autoHelp "东东健康社区好友互助码" "${logDir}/jd_health.log" "JDHEALTH_SHARECODES" diff --git a/docker/bot/jd.png b/docker/bot/jd.png deleted file mode 100644 index c948dadaf6c083aced3892b33b992f835d578e9d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7335 zcmV;Y99ZLtP)W2^eCSB`8AxQ3!|u zJ0vZjXxl9hrR~>>qP|w75kUqqiXg}!O%NFyhX#4bBtr}sB@+oD37M+uPUoI`roG-D z=iFO$lL|>CRjI<4FZosKo_p>-Ykzm`wbxpE?Hvj})Q0yqh?)21<3Q0*0mDLb8;_r= z?ZwCceSpCL7)rsdP|p_V<~|a47X+|^=c3T{cR=Fa9Lw83Tv655poUY1K>^Y55y=eS z*O-Ru`F}4^>hEAU4?B1tiGzTBBn|@hkvIs@hSx*bd)RjVq(StJG}@~%)9`@-5K~_^ z1qR8#)83mDGC2CHh?%3`W6dHW0tprZM4%dNg!&C}3q*hfhkGu~d%;g+P~ao*IS8Nv z20;p?nZhuYl~jf$bOTa@kOXF>IPlnYWz~l3kmpjUNJ=tHHVh^ruG6R>BuIk__E5l) zJF$@OvFmUcKu@aXws7=*7`;EnbaF?hXd4qYx5-R1k{M-M&`oF>NC1EeIPlqZ$tmeo zTkF}3x0hq(Qmp(7-d=@rDbRE_j3^a@Foe_~bqWLC0~0yYNM!O{b}C9}s$(1 zjYDRL@dwJ*4j5Y9rfEQ=QnEI(5&Zy30h8bZE8pI@)<$tuf^$=~$;Wkct)H;&Z(~<1 z#@nj`-Gpv{7%G6&S&6TUFZk0e%2x%J0T&`nO`?34A&(-X{= zhZ0F<1_7D@5(vD3@)#!U5s4aa=Rxfi5QRS5K`ND;GGPKAeNy;u*Wro_WvCz}00cfX9a2N+54bb# z(R+D$fGF@(xukL}>iE<6%mrfREU9axz(GKbPBAkZrVap%s_WL@iZzhxN{YH(N-4K& z*>cm3H$L^$A2x2>=(?_M=n2b8r_&vyJKlHj!DpU1=cuEO@+!7SX6Rd&XpjDaGfnZ= zK!DT$hT2uXCmzmwk3=Gb0ZN6SrGrmD59eG+Qx6dUynvK~AP`aGxX?81x#yl;wQALe zjz50Fg#F#B8wnnnNsj(Rej)(Gzni9M7=}}=ZrQxKR4NgXX_{6dknM@D_725{0 zNayIuhqSMJiV{f@0sx4K01|!7?9TcW4d+4S>0MFEhlUlN`#D;0shBvG8C0zT0Ex&Y zCV)6z!T`fC_51F-?<@cMWe`o7JmuD(-PSq2)APJY4_Vc8uZH?_9LK3vt3=e^-rmvC z!OR>g#VS-PUns<*UP!RQxQU!fQ5Z545rK)p1hsvT`0f~b5{clsT(Q05X5({L$mvHz zfh!dNBm@v?A2Wet)rvmGAUyl*AB)9OXJ_Z~<;zyAST`frkqk!x;Xt76S^j|laHZr=JeXTMO@_d9GLMXFsS3 zMCfBH`(QJ5^;GeZD)6TNntB+CazuwkQ|+ZvZ$y6vX5h4YQGAb1Lf=p2^Ma5mMa|DK6w$s_{A+0Uds_T1h zeJ0t4$6ifjMk9%JF(bvVU5URqTE7~u1Iwy?n&UOEIL6*p?AdS*eAPON{`p&;mdLMN zn{6FqUG{&%Gd`t$@;&X5yMxXN)obsiaTBShJ0v1d%werxpoW3d+h-MzKmvKL>$+~u zuilovUUlP!*tb_PYY!kI5~9yb0Ki{fX{1ok)JG>Lm^wL>1W<2G)Ne~Fc(LZ2jibpjuG1ZbPbs9)91I(=JdMcT6 zs_|^g9L+y5l}f3YLDf5G>y)9FK@tK)Okj$V6bwimWgCm1gO%vpqdI{DQpP5c+2&4We0JV9f_gk)wYXGXR*rsVNUAlDP z!iAS#e)*(HlZwS6>XC9IgJ_Ioh#DFvV&dp~>~oK0;ZIM~nm1rJkk~M}#FO66q4Dm{ zETqCP(-a zqD70Az45o(e||^j`0@FC9$*zQs5qvsul$jAM_ym=6PW-o#YQ<2L4yDAFjXD4lH2&z z%&6%gHHy1q5_gY50PH&IeKUE&fpDvKxvZ25RcKf2l$CH4t9-%t{A4;sL=cfP-FJvJ zyzISLn-~C;%jFMz;IM1Hf6bRK`_cvT=KbiFTMl~P!ChTlkq-8{lMOa4HoY}ESSb}< zs^z;GM8Ytss|!#6H>^~Dkx8#=6Nsa5@LjQ+Br-s*t7gs;>7?J?mCxsySxOB+HBkG% z@LTWwGb_dzBMgKT6w)?BthdWGed)cSHgf`8ESKh8a6u3RU;W?ze%{Iwq4iVRw{~CRpKx_R>O!&08(n2 z*3{CxZfloz*G(;kp>{k0*JR|_X=Ea?LmoBStwk0p+x`cS=l35D$Ij<_!Z47UMj%Z} z&CoG^N^6G)*&FM|HmbY{%7?y>;z> zxl^X;Zbd{1yKNr4%du5t+7gL`l=6Rm|GR}hUiha!y*O^{xDU;mb zbXqqIK_cp;AQD1KDG3OIpin5RS+n|u7hZVekw;%&x$?2``iCv$>|~4rk=2SwBq9;b zR}H~ToC>QPF<=s@T=b4O!M}cyM7Vk5rnlCti5MgzDK)dTee4@AkNN6?(lIA*xbnvo z_>wugVMmV0PI}TCz)?DruGp1l{_xa84?pzc3oqpJg={u6ZomEZ-+$ux@#Dvg8Ix;j zvMdvfYPH(a)3b5oJ8M?2UbSlFx^?RX;qVh@e{n+VoacV!N__w$Fpd)1YQ5|&)uK?iYVn}%^Ehy)}M*o z5s5(LA}S$eDv=Ds@U1m#UVr`dC4c_&^5x4nytARFr^j)eP=%2nFGv`Mp2=i8Iy$CI znL1;}j3Yn%;pr1PQ=k8Mb;Vzml^B>6i!wZs*V%{1T0U`rZX%US-ic?0GiQlPu~;lQ zj-zQ>WcGv*LJCbczHAecfQ~#x}d$=RSIiE0$Qmy-S zc21f+`K&o}s#T|4D(Cb0La}Juw(t9zl*weWxw*Nut*xb{C6mn>2@8f1T)x0r@-kXl z2ND^_&yM}rSda$)QQO57ZUkaxP4my3$6(*{3WXj(2_Y3LkdQ)1DRg3M$%_z@NswW- z-STY$3Ue+D%Xty1#za6LA$P2a(c559t?GkF0PK0L=T!j+A=8;mb4!b+X;Mld1d$*D zGb?6R%C^gHDr4OG1LL8)Dc8bkcjAjU_YT$o6Lz`8+1EjM2&3*Cha{#W3;(yhjR*G?9p8bG{Fp06Q+ z$gILJWM<#@BX>%ODEBIa5JV8|qqX1vTHf#t&ZJokq`%wB0R{_*ZIp3fej@wT;Lsz2 zM9SN`sZzF?6$ufARDuLD*;Jvc?I+(M-{*uLcTm%iOy%zUfwq2i;S1mNa;+%#Fm^tE z8{Vy@b%^SVqkX#88{x$->lXND69H zXVv%Is^fWXEGHA`8nU_c+7>xObs$(~>etV;fPK__?u@KPOroa4u&9BVY%C<`O8{`cX1O^1f>pTJkXag~^L?n65 zii+#|p2w_&&{)@zOj(t3)8qHFExJ`NbgN{x-*P?9wis(yw*K1!>)eaW=YQUBZV!vy z6b7|4MD4al1!M*|jQq7Yo{ebYx-SfYUg7{I5=2CrCYsx{Cm%Au`323fIguKiBEo1T zCX9U1SXe607{HQgl<8Y{$rU{(oIxB4-#5EAWnTGX(~}P;R=&<=QW?g(ecMD71XM11 zQ>T?LxU_oQsiBanl;-H)DM zJ@Ugrt|f46uG$nQwxir(s8m=_5u&Ds6nQa3bw8g>L(8>kRa<}jzsx(X*WOvr*<8F5 zKNP4jxqBoIDwxT!5r)CU1FN%6s~$Vsn=myrOyxT8svHCeL*}qHuKa+Ma`Jj5CjeABe0Q=q zLj+PGRUHmOl}ra?$9oeG^d=n?j+;AwsZnoJz?~Wl|qWbsIt{Gr^*tY};PI zUN2}G5QJdUf|+2u;2(YB*wg2`%a;WkH=$xPLrW!-hfN=K$U$_)g{o)ka4}fNNF@;f zK!G1xnexS7YB~H!;hm&Fnh=Jj84U4meyVei67(!|DkEOM&egvs{Yi>YEqm!*iaxHaEpqb zS1r%`r?73bEcGBRquFkuXs`J)?}`zzL6TU7nOrb_lCk(jSSA2bDmq8Za!)y1*u|(2 ziHLeDSnG;NXe??R9%#ca0>GhCB&sK$t-t!bC>4lAD5Z1pze4IzmA-07@se__#BsaQ z(7i1=fRVC6QVO}{9UeWl^sSo{zql!^*x}g=)U*#$u}4T5CoMq)C>4eT*{G4j*o8=r zkzo^wh*jd&Yf3lW@11sz+OpBiwFLQYr&4ZeY5|~B2xc!-`BD*{H+uBwWFj?^CYBMQ zir_@rc7wHl!qEKd5>0t(${`^I)k>-Tx+}AXz#JrhBHD{N+!Zp8c&b&HaA6 zXvLAo`>InTVjB2H6{`QMyF4owdKIF2!5Nc5`Vm~s9^Un*4nwQ)^cAIJT6!1hy(;x?BGMQor}N3x8Krs%hfOwN@!3aYX-)QQ+8Qj`e$V% zB2iiD<~!>U_+fLijIs~I*aZegh$b=#p89@y`;E=le_QIBit7{zLerjoGFdDdTQ;$7 zL^p?;ZWIf-NAIWhb_)D=t6<$*pq^7Ly3_Tu`t8XVdSD04R58={V5u8GPT{U!-kPT;(Ht;$=QBSVz(+~_hEbN8_t7( zeIyP7c7KE9KGZQ>nn+NgD&!dqkjP{yI`LpvKTYsFRW5N2!Z$3emM$mP#s> z3dbK16>oE)V1D`w*^B=LfZMgj{{3TGa|`#k`E8rFKoDCt38ykxJjTn8UGEzjO)Qsj z)N$GSezSu;h4C2+QCFg)!FJTGp36Ung$rr!Cv&&nN43u~STcwx1bD}v-3AKi`Rw`f zzaK<4H?Z#P0JQ_xhA0IhG?dH1%g>V^^lR)G%s~(z@FFB?N4+%4$j}UQZDrFyKJUN! z60u^}6Jy636DBb@a9w}ND^a2QF33bo0{J`(eb5p=QSt89gNG~u5r&G0lBqptg4lJ) z_l0h#FksgsaF8#iZu@0s&RhWY6OWWHI7_5byM7*!Fbrq|+eh|p^3f2N)^WLHT=1Ff zSN{V5Nm)DhW2e#+2&h&$2msi3{>1t272MQJLXc&m>S%`^nmqMmQA5>-@7HtL;R#L-h}5Zd9`rPNupLS{4O9y zP|Rn4e781dE&znRM;TJ6kZU&2nj4YoKJf@`dIv3S2m+<+*&p4hkL?7I|Jr5Y?Kg|2 zy>~+C5JoJ~MxN+*Qh_Mi(r|cZz6AlY5K`dR8>#O~<#JJ+e1_y!@{)cHq_TE{1Yq zVO1B`oP419<2$##VHc`tC{a87$8p4AGm>YV6E`?|oO#pj{XLYM=3Rt&7xmj(=_fZ< zzji6L4RWpj5RxboiD1bq#h>1QAndydk^uw(a?OeJ7wDSKK=D`iV%=J*F;4MK3{Cf6 z{39ijh&CoB686t-hUZ0_Wb2MMlwzr+&YQ30ngvn$$tToni|c36^*&i@{xknWss7@k zJp*kyXvkt`BCb~1slfJ?2LQqVQW}`ygqVCl+jC2WX)&q&mbc~0*kpwIqtPqB5B$}W5i?RO!0JeVd;&9>5s9AypDz(;hP(~vw z(W}~n)5R!a8M-n8226`QU(WlK_2H9Ku) zYvQV7{^RG(X&-5@zJWYU=ZQUA7EgwYzCzDn6R{Y*`20E*XsN4@a0Z0%=?sGrD4=}h?OgQdG} z%g(#dXl>O_m>oWFH#PNpKG+^%h)E0sW6oRw__pm_^(|@W^&!k*@0lRvdA&nBldIl% zt$W5f=D7W=v(NMHx*gF0Q%Z3T<>7S{+9Uue&ZztK0-u|jB!k=Y!8%I}{D7r!j6WW6=n)a>1LoAZfJ zrKW$-IAf0c-LH#eqJN2Z7qt1n(SzG!j4%vA%}>5$c8=fj*?-`N?x*H9fVoi6Pd}^q zXZJARm&^7q?{KfWQVQBOUr;WoL#MYt{tSnH_fgZZ;cY%(a@#XYSgEZi9wAmPLn;k` z9fzhK-1@uc1>gsP^Vmbq*Dn{P0<6Zlt5D!$j&FP5iLg}cI(C|@*n>5_)N65u#>HWX zme$hazbR_%T)&P}+3s6!R!bJsiseXWqp5~;1BHD4+V5cFJHcy<)za6bZoo=x+gh%PUwWbI z-!H=flSQrtWqWXYO`E0;jV2O7DV5I?k;vs(2-FT_Vc+9o2~rBnV$|X1)-Ug%`j@m4G~cgs$w2QWLdB*km$FyXb^A^id+*kIcQ1Q=;u(8`2Pn+ zQfb|L9Q#Nd1neVm5U`KLLBKu|2Lb!4!Uh5RG;t8HkHkU1J`x83{}1bvfh~0^M!^68 N002ovPDHLkV1iZA13CZz diff --git a/docker/bot/jd_bot b/docker/bot/jd_bot deleted file mode 100644 index 9b818f1..0000000 --- a/docker/bot/jd_bot +++ /dev/null @@ -1,1114 +0,0 @@ -# -*- coding: utf-8 -*- -# @Author : iouAkira(lof) -# @mail : e.akimoto.akira@gmail.com -# @CreateTime: 2020-11-02 -# @UpdateTime: 2021-03-23 - -import math -import os -import subprocess -from subprocess import TimeoutExpired -from MyQR import myqr -import requests -import time -import logging -import re -from urllib.parse import quote, unquote - -import telegram.utils.helpers as helpers -from telegram import InlineKeyboardButton, InlineKeyboardMarkup, ParseMode -from telegram.ext import Updater, CommandHandler, MessageHandler, Filters, CallbackQueryHandler - -# 启用日志 -logging.basicConfig(format='%(asctime)s-%(name)s-%(levelname)s=> [%(funcName)s] %(message)s ', level=logging.INFO) -logger = logging.getLogger(__name__) - -_base_dir = '/scripts/' -_logs_dir = '%slogs/' % _base_dir -_docker_dir = '%sdocker/' % _base_dir -_bot_dir = '%sbot/' % _docker_dir -_share_code_conf = '%scode_gen_conf.list' % _logs_dir - -if 'GEN_CODE_CONF' in os.environ: - share_code_conf = os.getenv("GEN_CODE_CONF") - if share_code_conf.startswith("/"): - _share_code_conf = share_code_conf - - -def start(update, context): - from_user_id = update.message.from_user.id - if admin_id == str(from_user_id): - spnode_readme = "" - if "DISABLE_SPNODE" not in os.environ: - spnode_readme = "/spnode 获取可执行脚本的列表,选择对应的按钮执行。(拓展使用:运行指定路径脚本,例:/spnode /scripts/jd_818.js)\n\n" \ - "使用bot交互+spnode后 后续用户的cookie维护更新只需要更新logs/cookies.list即可\n" \ - "使用bot交互+spnode后 后续执行脚本命令请使用spnode否者无法使用logs/cookies.list的cookies执行脚本,定时任务也将自动替换为spnode命令执行\n" \ - "spnode功能概述示例\n\n" \ - "spnode conc /scripts/jd_bean_change.js 为每个cookie单独执行jd_bean_change脚本(伪并发\n" \ - "spnode 1 /scripts/jd_bean_change.js 为logs/cookies.list文件里面第一行cookie账户单独执行jd_bean_change脚本\n" \ - "spnode jd_XXXX /scripts/jd_bean_change.js 为logs/cookies.list文件里面pt_pin=jd_XXXX的cookie账户单独执行jd_bean_change脚本\n" \ - "spnode /scripts/jd_bean_change.js 为logs/cookies.list所有cookies账户一起执行jd_bean_change脚本\n" \ - "请仔细阅读并理解上面的内容,使用bot交互默认开启spnode指令功能功能。\n" \ - "如需____停用___请配置环境变量 -DISABLE_SPNODE=True" - context.bot.send_message(chat_id=update.effective_chat.id, - text="限制自己使用的JD Scripts拓展机器人\n" \ - "\n" \ - "/start 开始并获取指令说明\n" \ - "/node 获取可执行脚本的列表,选择对应的按钮执行。(拓展使用:运行指定路径脚本,例:/node /scripts/jd_818.js) \n" \ - "/git 获取可执行git指令列表,选择对应的按钮执行。(拓展使用:运行指定路径脚本,例:/git -C /scripts/ pull)\n" \ - "/logs 获取logs下的日志文件列表,选择对应名字可以下载日志文件\n" \ - "/env 获取系统环境变量列表。(拓展使用:设置系统环境变量,例:/env export JD_DEBUG=true,环境变量只针对当前bot进程生效) \n" \ - "/cmd 执行执行命令。参考:/cmd ls -l 涉及目录文件操作请使用绝对路径,部分shell命令开放使用\n" \ - "/gen_long_code 长期活动互助码提交消息生成\n" \ - "/gen_temp_code 短期临时活动互助码提交消息生成\n" \ - "/gen_daily_code 每天变化互助码活动提交消息生成\n\n%s" % spnode_readme) - else: - update.message.reply_text(text='此为私人使用bot,不能执行您的指令!') - - -def node(update, context): - """关于定时任务中nodejs脚本的相关操作 - """ - if is_admin(update.message.from_user.id): - commands = update.message.text.split() - commands.remove('/node') - if len(commands) > 0: - cmd = 'node %s' % (' '.join(commands)) - try: - - out_bytes = subprocess.check_output( - cmd, shell=True, timeout=3600, stderr=subprocess.STDOUT) - - out_text = out_bytes.decode('utf-8') - - if len(out_text.split()) > 50: - - msg = context.bot.sendMessage(text='```{}```'.format( - helpers.escape_markdown(' ↓↓↓ %s 执行结果超长,请查看log ↓↓↓' % cmd)), chat_id=update.effective_chat.id, - parse_mode=ParseMode.MARKDOWN_V2) - - log_name = '%sbot_%s_%s.log' % ( - _logs_dir, 'node', os.path.splitext(commands[-1])[0]) - - with open(log_name, 'a+') as wf: - wf.write(out_text) - - msg.reply_document( - reply_to_message_id=msg.message_id, quote=True, document=open(log_name, 'rb')) - else: - - context.bot.sendMessage(text='```{}```'.format( - helpers.escape_markdown(' ↓↓↓ %s 执行结果 ↓↓↓ \n\n%s ' % (cmd, out_text))), - chat_id=update.effective_chat.id, parse_mode=ParseMode.MARKDOWN_V2) - - except TimeoutExpired: - - context.bot.sendMessage(text='```{}```'.format(helpers.escape_markdown(' →→→ %s 执行超时 ←←← ' % ( - cmd))), chat_id=update.effective_chat.id, parse_mode=ParseMode.MARKDOWN_V2) - - except: - - context.bot.sendMessage( - text='```{}```'.format(helpers.escape_markdown(' →→→ %s 执行出错,请检查确认命令是否正确 ←←← ' % ( - cmd))), chat_id=update.effective_chat.id, parse_mode=ParseMode.MARKDOWN_V2) - raise - else: - reply_markup = get_reply_markup_btn('node') - update.message.reply_text(text='```{}```'.format(helpers.escape_markdown(' ↓↓↓ 请选择想要执行的nodejs脚本 ↓↓↓ ')), - reply_markup=reply_markup, parse_mode=ParseMode.MARKDOWN_V2) - else: - update.message.reply_text(text='此为私人使用bot,不能执行您的指令!') - - -def spnode(update, context): - """关于定时任务中nodejs脚本的相关操作 - """ - if is_admin(update.message.from_user.id): - commands = update.message.text.split() - commands.remove('/spnode') - if len(commands) > 0: - cmd = 'spnode %s' % (' '.join(commands)) - try: - - out_bytes = subprocess.check_output( - cmd, shell=True, timeout=600, stderr=subprocess.STDOUT) - - out_text = out_bytes.decode('utf-8') - - if len(out_text.split()) > 50: - - msg = context.bot.sendMessage(text='```{}```'.format( - helpers.escape_markdown(' ↓↓↓ %s 执行结果超长,请查看log ↓↓↓' % cmd)), chat_id=update.effective_chat.id, - parse_mode=ParseMode.MARKDOWN_V2) - file_name = re.split(r"\W+", cmd) - if 'js' in file_name: - file_name.remove('js') - log_name = '%sbot_%s_%s.log' % (_logs_dir, 'spnode', file_name[-1]) - - with open(log_name, 'a+') as wf: - wf.write(out_text) - - msg.reply_document( - reply_to_message_id=msg.message_id, quote=True, document=open(log_name, 'rb')) - else: - - context.bot.sendMessage(text='```{}```'.format( - helpers.escape_markdown(' ↓↓↓ %s 执行结果 ↓↓↓ \n\n%s ' % (cmd, out_text))), - chat_id=update.effective_chat.id, parse_mode=ParseMode.MARKDOWN_V2) - - except TimeoutExpired: - - context.bot.sendMessage(text='```{}```'.format(helpers.escape_markdown(' →→→ %s 执行超时 ←←← ' % ( - cmd))), chat_id=update.effective_chat.id, parse_mode=ParseMode.MARKDOWN_V2) - - except: - - context.bot.sendMessage( - text='```{}```'.format(helpers.escape_markdown(' →→→ %s 执行出错,请检查确认命令是否正确 ←←← ' % ( - cmd))), chat_id=update.effective_chat.id, parse_mode=ParseMode.MARKDOWN_V2) - raise - else: - reply_markup = get_reply_markup_btn('spnode') - update.message.reply_text(text='```{}```'.format(helpers.escape_markdown(' ↓↓↓ 请选择想要执行的nodejs脚本 ↓↓↓ ')), - reply_markup=reply_markup, parse_mode=ParseMode.MARKDOWN_V2) - else: - update.message.reply_text(text='此为私人使用bot,不能执行您的指令!') - - -def git(update, context): - """关于/scripts仓库的git相关操作 - """ - if is_admin(update.message.from_user.id): - commands = update.message.text.split() - commands.remove('/git') - if len(commands) > 0: - cmd = 'git %s' % (' '.join(commands)) - try: - - out_bytes = subprocess.check_output( - cmd, shell=True, timeout=600, stderr=subprocess.STDOUT) - - out_text = out_bytes.decode('utf-8') - - if len(out_text.split()) > 50: - - msg = context.bot.sendMessage(text='```{}```'.format( - helpers.escape_markdown(' ↓↓↓ %s 执行结果超长,请查看log ↓↓↓' % cmd)), chat_id=update.effective_chat.id, - parse_mode=ParseMode.MARKDOWN_V2) - - log_name = '%sbot_%s_%s.log' % ( - _logs_dir, 'git', os.path.splitext(commands[-1])[0]) - - with open(log_name, 'a+') as wf: - wf.write(out_text) - - msg.reply_document( - reply_to_message_id=msg.message_id, quote=True, document=open(log_name, 'rb')) - else: - - context.bot.sendMessage(text='```{}```'.format( - helpers.escape_markdown(' ↓↓↓ %s 执行结果 ↓↓↓ \n\n%s ' % (cmd, out_text))), - chat_id=update.effective_chat.id, parse_mode=ParseMode.MARKDOWN_V2) - - except TimeoutExpired: - - context.bot.sendMessage(text='```{}```'.format(helpers.escape_markdown(' →→→ %s 执行超时 ←←← ' % ( - cmd))), chat_id=update.effective_chat.id, parse_mode=ParseMode.MARKDOWN_V2) - - except: - - context.bot.sendMessage( - text='```{}```'.format(helpers.escape_markdown(' →→→ %s 执行出错,请检查确认命令是否正确 ←←← ' % ( - cmd))), chat_id=update.effective_chat.id, parse_mode=ParseMode.MARKDOWN_V2) - raise - - else: - reply_markup = get_reply_markup_btn('git') - - update.message.reply_text(text='```{}```'.format(helpers.escape_markdown(' ↓↓↓ 请选择想要执行的git指令 ↓↓↓ ')), - reply_markup=reply_markup, parse_mode=ParseMode.MARKDOWN_V2) - else: - update.message.reply_text(text='此为私人使用bot,不能执行您的指令!') - - -def env(update, context): - """env 环境变量相关操作 - """ - if is_admin(update.message.from_user.id): - commands = update.message.text.split() - commands.remove('/env') - if len(commands) == 2 and (commands[0]) == 'export': - - try: - envs = commands[1].split('=') - os.putenv(envs[0], envs[1]) - - context.bot.sendMessage(text='```{}```'.format( - helpers.escape_markdown(' ↓↓↓ 环境变量设置成功 ↓↓↓ \n\n%s ' % ('='.join(envs)))), - chat_id=update.effective_chat.id, parse_mode=ParseMode.MARKDOWN_V2) - except: - context.bot.sendMessage( - text='```{}```'.format(helpers.escape_markdown(' →→→ %s 执行出错,请检查确认命令是否正确 ←←← ' % ( - ' '.join(commands)))), chat_id=update.effective_chat.id, parse_mode=ParseMode.MARKDOWN_V2) - raise - - elif len(commands) == 0: - out_bytes = subprocess.check_output( - 'env', shell=True, timeout=600, stderr=subprocess.STDOUT) - - out_text = out_bytes.decode('utf-8') - - if len(out_text.split()) > 50: - - msg = context.bot.sendMessage(text='```{}```'.format( - helpers.escape_markdown(' ↓↓↓ %s 执行结果超长,请查看log ↓↓↓' % 'env')), chat_id=update.effective_chat.id, - parse_mode=ParseMode.MARKDOWN_V2) - - log_name = '%sbot_%s.log' % (_logs_dir, 'env') - - with open(log_name, 'a+') as wf: - wf.write(out_text + '\n\n') - - msg.reply_document( - reply_to_message_id=msg.message_id, quote=True, document=open(log_name, 'rb')) - else: - - context.bot.sendMessage(text='```{}```'.format( - helpers.escape_markdown(' ↓↓↓ env 执行结果 ↓↓↓ \n\n%s ' % out_text)), - chat_id=update.effective_chat.id, parse_mode=ParseMode.MARKDOWN_V2) - else: - context.bot.sendMessage(text='```{}```'.format( - helpers.escape_markdown(' →→→ env 指令不正确,请参考说明输入 ←←← ')), chat_id=update.effective_chat.id, - parse_mode=ParseMode.MARKDOWN_V2) - - else: - update.message.reply_text(text='此为私人使用bot,不能执行您的指令!') - - -def crontab(update, context): - """关于crontab 定时任务相关操作 - """ - reply_markup = get_reply_markup_btn('crontab_l') - - if is_admin(update.message.from_user.id): - try: - update.message.reply_text(text='```{}```'.format(helpers.escape_markdown(' ↓↓↓ 下面为定时任务列表,请选择需要的操作 ↓↓↓ ')), - reply_markup=reply_markup, parse_mode=ParseMode.MARKDOWN_V2) - except: - raise - else: - update.message.reply_text(text='此为私人使用bot,不能执行您的指令!') - - -def logs(update, context): - """关于_logs_dir目录日志文件的相关操作 - """ - reply_markup = get_reply_markup_btn('logs') - - if is_admin(update.message.from_user.id): - update.message.reply_text(text='```{}```'.format(helpers.escape_markdown(' ↓↓↓ 请选择想想要下载的日志文件或者清除所有日志 ↓↓↓ ')), - reply_markup=reply_markup, parse_mode=ParseMode.MARKDOWN_V2) - else: - update.message.reply_text(text='此为私人使用bot,不能执行您的指令!') - - -def callback_run(update, context): - """执行按钮响应回调方法处理按钮点击事件 - """ - query = update.callback_query - select_btn_type = query.data.split()[0] - chat = query.message.chat - logger.info("callback query.message.chat ==> %s " % chat) - logger.info("callback query.data ==> %s " % query.data) - if select_btn_type == 'node' or select_btn_type == 'spnode' or select_btn_type == 'git': - try: - context.bot.edit_message_text(text='```{}```'.format(' ↓↓↓ 任务正在执行 ↓↓↓ \n\n%s' % query.data), - chat_id=query.message.chat_id, - message_id=query.message.message_id, parse_mode=ParseMode.MARKDOWN_V2) - out_bytes = subprocess.check_output( - query.data, shell=True, timeout=600, stderr=subprocess.STDOUT) - out_text = out_bytes.decode('utf-8') - if len(out_text.split()) > 50: - context.bot.edit_message_text(text='```{}```'.format(' ↓↓↓ %s 执行结果超长,请查看log ↓↓↓' % query.data), - chat_id=query.message.chat_id, - message_id=query.message.message_id, parse_mode=ParseMode.MARKDOWN_V2) - log_name = '%sbot_%s_%s.log' % ( - _logs_dir, select_btn_type, os.path.splitext(query.data.split('/')[-1])[0]) - logger.info('log_name==>' + log_name) - - with open(log_name, 'a+') as wf: - wf.write(out_text) - - query.message.reply_document( - reply_to_message_id=query.message.message_id, quote=True, document=open(log_name, 'rb')) - - else: - context.bot.edit_message_text(text='```{}```'.format( - helpers.escape_markdown(' ↓↓↓ %s 执行结果 ↓↓↓ \n\n%s ' % (query.data, out_text))), - chat_id=update.effective_chat.id, message_id=query.message.message_id, - parse_mode=ParseMode.MARKDOWN_V2) - except TimeoutExpired: - logger.error(' →→→ %s 执行超时 ←←← ' % query.data) - context.bot.edit_message_text(text='```{}```'.format(' →→→ %s 执行超时 ←←← ' % query.data), - chat_id=query.message.chat_id, - message_id=query.message.message_id, parse_mode=ParseMode.MARKDOWN_V2) - except: - context.bot.edit_message_text(text='```{}```'.format(' →→→ %s 执行出错 ←←← ' % query.data), - chat_id=query.message.chat_id, - message_id=query.message.message_id, parse_mode=ParseMode.MARKDOWN_V2) - raise - elif select_btn_type.startswith('cl'): - if select_btn_type == 'cl': - logger.info(f'crontab_l ==> {query.data.split()[1:]}') - reply_markup = InlineKeyboardMarkup([ - [InlineKeyboardButton( - ' '.join(query.data.split()[1:]), callback_data='pass')], - [InlineKeyboardButton('⚡️执行', callback_data='cle %s' % ' '.join(query.data.split()[1:])), - InlineKeyboardButton('❌删除', callback_data='cld %s' % ' '.join(query.data.split()[1:]))] - ]) - context.bot.edit_message_text(text='```{}```'.format(' ↓↓↓ 请选择对该定时任务的操作 ↓↓↓ '), - chat_id=query.message.chat_id, - reply_markup=reply_markup, message_id=query.message.message_id, - parse_mode=ParseMode.MARKDOWN_V2) - elif select_btn_type == 'cle': - cmd = ' '.join(query.data.split()[6:]) - try: - context.bot.edit_message_text(text='```{}```'.format(' ↓↓↓ 任务正在执行 ↓↓↓ \n\n%s' % cmd), - chat_id=query.message.chat_id, - message_id=query.message.message_id, parse_mode=ParseMode.MARKDOWN_V2) - out_bytes = subprocess.check_output(cmd, shell=True, timeout=600, - stderr=subprocess.STDOUT) - out_text = out_bytes.decode('utf-8') - if len(out_text.split()) > 50: - - context.bot.edit_message_text(text='```{}```'.format( - helpers.escape_markdown(' ↓↓↓ %s 执行结果超长,请查看log ↓↓↓' % cmd)), - chat_id=update.effective_chat.id, message_id=query.message.message_id, - parse_mode=ParseMode.MARKDOWN_V2) - - log_name = '%sbot_%s_%s.log' % ( - _logs_dir, select_btn_type, os.path.splitext(cmd.split('/')[-1])[0]) - - with open(log_name, 'a+') as wf: - wf.write(out_text) - - query.message.reply_document( - reply_to_message_id=query.message.message_id, quote=True, document=open(log_name, 'rb')) - - else: - context.bot.edit_message_text(text='```{}```'.format( - helpers.escape_markdown(' ↓↓↓ %s 执行结果 ↓↓↓ \n\n%s ' % (cmd, out_text))), - chat_id=update.effective_chat.id, message_id=query.message.message_id, - parse_mode=ParseMode.MARKDOWN_V2) - except TimeoutExpired: - logger.error(' →→→ %s 执行超时 ←←← ' % ' '.join(cmd[6:])) - context.bot.edit_message_text(text='```{}```'.format(' →→→ %s 执行超时 ←←← ' % cmd), - chat_id=query.message.chat_id, - message_id=query.message.message_id, parse_mode=ParseMode.MARKDOWN_V2) - except: - context.bot.edit_message_text(text='```{}```'.format(' →→→ %s 执行出错 ←←← ' % cmd), - chat_id=query.message.chat_id, - message_id=query.message.message_id, parse_mode=ParseMode.MARKDOWN_V2) - raise - elif select_btn_type == 'cld': - query.answer(text='删除任务功能暂未实现', show_alert=True) - - elif select_btn_type == 'logs': - log_file = query.data.split()[-1] - if log_file == 'clear': - cmd = 'rm -rf %s*.log' % _logs_dir - try: - subprocess.check_output( - cmd, shell=True, timeout=600, stderr=subprocess.STDOUT) - - context.bot.edit_message_text(text='```{}```'.format(' →→→ 日志文件已清除 ←←← '), - chat_id=query.message.chat_id, - message_id=query.message.message_id, parse_mode=ParseMode.MARKDOWN_V2) - except: - context.bot.sendMessage(text='```{}```'.format(helpers.escape_markdown( - ' →→→ 清除日志执行出错 ←←← ')), chat_id=update.effective_chat.id, parse_mode=ParseMode.MARKDOWN_V2) - raise - else: - context.bot.edit_message_text(text='```{}```'.format(' ↓↓↓ 下面为下载的%s文件 ↓↓↓ ' % select_btn_type), - chat_id=query.message.chat_id, - message_id=query.message.message_id, parse_mode=ParseMode.MARKDOWN_V2) - - query.message.reply_document(reply_to_message_id=query.message.message_id, quote=True, - document=open(log_file, 'rb')) - - else: - context.bot.edit_message_text(text='```{}```'.format(' →→→ 操作已取消 ←←← '), chat_id=query.message.chat_id, - message_id=query.message.message_id, parse_mode=ParseMode.MARKDOWN_V2) - - -def get_reply_markup_btn(cmd_type): - """因为编辑后也可能会需要到重新读取按钮,所以抽出来作为一个方法返回按钮list - - Returns - ------- - 返回一个对应命令类型按钮列表,方便读取 - """ - if cmd_type == 'logs': - keyboard_line = [] - logs_list = get_dir_file_list(_logs_dir, 'log') - if (len(logs_list)) > 0: - file_list = list(set(get_dir_file_list(_logs_dir, 'log'))) - file_list.sort() - for i in range(math.ceil(len(file_list) / 2)): - ret = file_list[0:2] - keyboard_column = [] - for ii in ret: - keyboard_column.append(InlineKeyboardButton( - ii.split('/')[-1], callback_data='logs %s' % ii)) - file_list.remove(ii) - keyboard_line.append(keyboard_column) - - keyboard_line.append([InlineKeyboardButton('清除日志', callback_data='logs clear'), - InlineKeyboardButton('取消操作', callback_data='cancel')]) - else: - keyboard_line.append([InlineKeyboardButton( - '未找到相关日志文件', callback_data='cancel')]) - reply_markup = InlineKeyboardMarkup(keyboard_line) - elif cmd_type == 'crontab_l': - button_list = list(set(get_crontab_list(cmd_type))) - keyboard_line = [] - if len(button_list) > 0: - for i in button_list: - keyboard_column = [InlineKeyboardButton( - i, callback_data='cl %s' % i)] - - button_list.remove(i) - keyboard_line.append(keyboard_column) - keyboard_line.append( - [InlineKeyboardButton('取消操作', callback_data='cancel')]) - else: - keyboard_line.append([InlineKeyboardButton( - '未从%s获取到任务列表' % crontab_list_file, callback_data='cancel')]) - reply_markup = InlineKeyboardMarkup(keyboard_line) - elif cmd_type == 'node' or cmd_type == 'spnode': - button_list = list(set(get_crontab_list(cmd_type))) - button_list.sort() - keyboard_line = [] - for i in range(math.ceil(len(button_list) / 2)): - ret = button_list[0:2] - keyboard_column = [] - for ii in ret: - keyboard_column.append(InlineKeyboardButton( - ii.split('/')[-1], callback_data=ii)) - button_list.remove(ii) - keyboard_line.append(keyboard_column) - - keyboard_line.append( - [InlineKeyboardButton('取消操作', callback_data='cancel')]) - - reply_markup = InlineKeyboardMarkup(keyboard_line) - elif cmd_type == 'git': - # button_list = list(set(get_crontab_list(cmd_type))) - # button_list.sort() - keyboard_line = [[InlineKeyboardButton('git pull', callback_data='git -C %s pull' % _base_dir), - InlineKeyboardButton('git reset --hard', callback_data='git -C %s reset --hard' % _base_dir)], - [InlineKeyboardButton('取消操作', callback_data='cancel')]] - # for i in range(math.ceil(len(button_list) / 2)): - # ret = button_list[0:2] - # keyboard_column = [] - # for ii in ret: - # keyboard_column.append(InlineKeyboardButton( - # ii.split('/')[-1], callback_data=ii)) - # button_list.remove(ii) - # keyboard_line.append(keyboard_column) - # if len(keyboard_line) < 1: - # keyboard_line.append( - # [InlineKeyboardButton('git pull', callback_data='git -C %s pull' % _base_dir), - # InlineKeyboardButton('git reset --hard', callback_data='git -C %s reset --hard' % _base_dir)]) - reply_markup = InlineKeyboardMarkup(keyboard_line) - else: - reply_markup = InlineKeyboardMarkup( - [[InlineKeyboardButton('没找到对的命令操作按钮', callback_data='cancel')]]) - - return reply_markup - - -def get_crontab_list(cmd_type): - """获取任务列表里面的node相关的定时任务 - - Parameters - ---------- - cmd_type: 是任务的命令类型 - # item_idx: 确定取的需要取之是定任务里面第几个空格后的值作为后面执行指令参数 - - Returns - ------- - 返回一个指定命令类型定时任务列表 - """ - button_list = [] - try: - with open(_docker_dir + crontab_list_file) as lines: - array = lines.readlines() - for i in array: - i = i.replace('|ts', '').strip('\n') - if i.startswith('#') or len(i) < 5: - pass - else: - items = i.split('>>') - item_sub = items[0].split()[5:] - # logger.info(item_sub[0]) - if cmd_type.find(item_sub[0]) > -1: - if cmd_type == 'spnode': - # logger.info(str(' '.join(item_sub)).replace('node','spnode')) - button_list.append(str(' '.join(item_sub)).replace('node', 'spnode')) - else: - button_list.append(' '.join(item_sub)) - elif cmd_type == 'crontab_l': - button_list.append(items[0]) - except: - logger.warning(f'读取定时任务配置文件 {crontab_list_file} 出错') - finally: - return button_list - - -def get_dir_file_list(dir_path, file_type): - """获取传入的路径下的文件列表 - - Parameters - ---------- - dir_path: 完整的目录路径,不需要最后一个 - file_type: 或者文件的后缀名字 - - Returns - ------- - 返回一个完整绝对路径的文件列表,方便读取 - """ - cmd = 'ls %s*.%s' % (dir_path, file_type) - file_list = [] - try: - out_bytes = subprocess.check_output( - cmd, shell=True, timeout=5, stderr=subprocess.STDOUT) - out_text = out_bytes.decode('utf-8') - file_list = out_text.split() - except: - logger.warning(f'{dir_path}目录下,不存在{file_type}对应的文件') - finally: - return file_list - - -def is_admin(from_user_id): - if str(admin_id) == str(from_user_id): - return True - else: - return False - - -class CodeConf(object): - def __init__(self, bot_id, submit_code, log_name, activity_code, find_split_char): - self.bot_id = bot_id - self.submit_code = submit_code - self.log_name = log_name - self.activity_code = activity_code - self.find_split_char = find_split_char - - def get_submit_msg(self): - code_list = [] - ac = self.activity_code if self.activity_code != "@N" else "" - try: - with open("%s%s" % (_logs_dir, self.log_name), 'r') as lines: - array = lines.readlines() - for i in array: - # print(self.find_split_char) - if i.find(self.find_split_char) > -1: - code_list.append(i.split(self.find_split_char)[ - 1].replace('\n', '')) - if self.activity_code == "@N": - return '%s %s' % (self.submit_code, - "&".join(list(set(code_list)))) - else: - return '%s %s %s' % (self.submit_code, ac, - "&".join(list(set(code_list)))) - except: - return "%s %s活动获取系统日志文件异常,请检查日志文件是否存在" % (self.submit_code, ac) - - -def gen_long_code(update, context): - """ - 长期活动互助码提交消息生成 - """ - long_code_conf = [] - bot_list = [] - try: - with open(_share_code_conf, 'r') as lines: - array = lines.readlines() - for i in array: - if i.startswith("long"): - bot_list.append(i.split('-')[1]) - code_conf = CodeConf( - i.split('-')[1], i.split('-')[2], i.split('-')[3], i.split('-')[4], - i.split('-')[5].replace('\n', '')) - long_code_conf.append(code_conf) - - for bot in list(set(bot_list)): - for cf in long_code_conf: - if cf.bot_id == bot: - print() - context.bot.send_message(chat_id=update.effective_chat.id, text=cf.get_submit_msg()) - context.bot.send_message(chat_id=update.effective_chat.id, text="以上为 %s 可以提交的活动互助码" % bot) - except: - context.bot.send_message(chat_id=update.effective_chat.id, - text="获取互助码消息生成配置文件失败,请检查%s文件是否存在" % _share_code_conf) - - -def gen_temp_code(update, context): - """ - 短期临时活动互助码提交消息生成 - """ - temp_code_conf = [] - bot_list = [] - try: - with open(_share_code_conf, 'r') as lines: - array = lines.readlines() - for i in array: - if i.startswith("temp"): - bot_list.append(i.split('-')[1]) - code_conf = CodeConf( - i.split('-')[1], i.split('-')[2], i.split('-')[3], i.split('-')[4], - i.split('-')[5].replace('\n', '')) - temp_code_conf.append(code_conf) - - for bot in list(set(bot_list)): - for cf in temp_code_conf: - if cf.bot_id == bot: - print() - context.bot.send_message(chat_id=update.effective_chat.id, text=cf.get_submit_msg()) - context.bot.send_message(chat_id=update.effective_chat.id, text="以上为 %s 可以提交的短期临时活动互助码" % bot) - except: - context.bot.send_message(chat_id=update.effective_chat.id, - text="获取互助码消息生成配置文件失败,请检查%s文件是否存在" % _share_code_conf) - - -def gen_daily_code(update, context): - """ - 每天变化互助码活动提交消息生成 - """ - daily_code_conf = [] - bot_list = [] - try: - with open(_share_code_conf, 'r') as lines: - array = lines.readlines() - for i in array: - if i.startswith("daily"): - bot_list.append(i.split('-')[1]) - code_conf = CodeConf( - i.split('-')[1], i.split('-')[2], i.split('-')[3], i.split('-')[4], - i.split('-')[5].replace('\n', '')) - daily_code_conf.append(code_conf) - - for bot in list(set(bot_list)): - for cf in daily_code_conf: - if cf.bot_id == bot: - print() - context.bot.send_message(chat_id=update.effective_chat.id, text=cf.get_submit_msg()) - context.bot.send_message(chat_id=update.effective_chat.id, text="以上为 %s 可以提交的每天变化活动互助码" % bot) - except: - context.bot.send_message(chat_id=update.effective_chat.id, - text="获取互助码消息生成配置文件失败,请检查%s文件是否存在" % _share_code_conf) - - -def shcmd(update, context): - """ - 执行终端命令,超时时间为60,执行耗时或者不退出的指令会报超时异常 - """ - if is_admin(update.message.from_user.id): - commands = update.message.text.split() - commands.remove('/cmd') - if len(commands) > 0: - support_cmd = ["echo", "ls", "pwd", "cp", "mv", "ps", "wget", "cat", "sed", "git", "apk", "sh", - "docker_entrypoint.sh"] - if commands[0] in support_cmd: - sp_cmd = ["sh", "docker_entrypoint.sh"] - cmd = ' '.join(commands) - try: - # 测试发现 subprocess.check_output 执行shell 脚本文件的时候无法正常执行获取返回结果 - # 所以 ["sh", "docker_entrypoint.sh"] 指令换为 subprocess.Popen 方法执行 - out_text = "" - if commands[0] in sp_cmd: - p = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT) - while p.poll() is None: - line = p.stdout.readline() - # logger.info(line.decode('utf-8')) - out_text = out_text + line.decode('utf-8') - else: - out_bytes = subprocess.check_output( - cmd, shell=True, timeout=60, stderr=subprocess.STDOUT) - out_text = out_bytes.decode('utf-8') - - if len(out_text.split('\n')) > 50: - msg = context.bot.sendMessage(text='```{}```'.format( - helpers.escape_markdown(' ↓↓↓ %s 执行结果超长,请查看log ↓↓↓' % cmd)), - chat_id=update.effective_chat.id, - parse_mode=ParseMode.MARKDOWN_V2) - log_name = '%sbot_%s_%s.log' % (_logs_dir, 'cmd', commands[0]) - with open(log_name, 'w') as wf: - wf.write(out_text) - msg.reply_document( - reply_to_message_id=msg.message_id, quote=True, document=open(log_name, 'rb')) - else: - context.bot.sendMessage(text='```{}```'.format( - helpers.escape_markdown(' ↓↓↓ %s 执行结果 ↓↓↓ \n\n%s ' % (cmd, out_text))), - chat_id=update.effective_chat.id, parse_mode=ParseMode.MARKDOWN_V2) - - except TimeoutExpired: - context.bot.sendMessage(text='```{}```'.format(helpers.escape_markdown(' →→→ %s 执行超时 ←←← ' % ( - cmd))), chat_id=update.effective_chat.id, parse_mode=ParseMode.MARKDOWN_V2) - except Exception as e: - context.bot.sendMessage( - text='```{}```'.format(helpers.escape_markdown(' →→→ %s 执行出错,请检查确认命令是否正确 ←←← ' % ( - cmd))), chat_id=update.effective_chat.id, parse_mode=ParseMode.MARKDOWN_V2) - logger.error(e) - else: - update.message.reply_text( - text='```{}```'.format( - helpers.escape_markdown( - f' →→→ {commands[0]}指令不在支持命令范围,请输入其他支持的指令{"|".join(support_cmd)} ←←← ')), - parse_mode=ParseMode.MARKDOWN_V2) - else: - update.message.reply_text( - text='```{}```'.format(helpers.escape_markdown(' →→→ 请在/cmd 后写自己需要执行的指的命令 ←←← ')), - parse_mode=ParseMode.MARKDOWN_V2) - else: - update.message.reply_text(text='此为私人使用bot,不能执行您的指令!') - - -# getSToken请求获取,s_token用于发送post请求是的必须参数 -s_token = "" -# getSToken请求获取,guid,lsid,lstoken用于组装cookies -guid, lsid, lstoken = "", "", "" -# 由上面参数组装生成,getOKLToken函数发送请求需要使用 -cookies = "" -# getOKLToken请求获取,token用户生成二维码使用、okl_token用户检查扫码登录结果使用 -token, okl_token = "", "" -# 最终获取到的可用的cookie -jd_cookie = "" - - -def get_jd_cookie(update, context): - getSToken() - getOKLToken() - - qr_code_path = genQRCode() - photo_file = open(qr_code_path, 'rb') - photo_message = context.bot.send_photo(chat_id=update.effective_chat.id, photo=photo_file, - caption="请使用京东APP扫描二维码获取Cookie(二维码有效期:3分钟)") - photo_file.close() - - return_msg = chekLogin() - if return_msg == 0: - context.bot.delete_message(chat_id=update.effective_chat.id, message_id=photo_message.message_id) - context.bot.send_message(chat_id=update.effective_chat.id, text="获取Cookie成功\n`%s`" % jd_cookie, - parse_mode=ParseMode.MARKDOWN_V2) - - elif return_msg == 21: - context.bot.delete_message(chat_id=update.effective_chat.id, message_id=photo_message.message_id) - context.bot.edit_message_text(chat_id=update.effective_chat.id, message_id=photo_message.message_id, - text="二维码已经失效,请重新获取") - else: - context.bot.delete_message(chat_id=update.effective_chat.id, message_id=photo_message.message_id) - context.bot.edit_message_text(chat_id=update.effective_chat.id, message_id=photo_message.message_id, - text=return_msg) - - -def getSToken(): - time_stamp = int(time.time() * 1000) - get_url = 'https://plogin.m.jd.com/cgi-bin/mm/new_login_entrance?lang=chs&appid=300&returnurl=https://wq.jd.com/passport/LoginRedirect?state=%s&returnurl=https://home.m.jd.com/myJd/newhome.action?sceneval=2&ufc=&/myJd/home.action&source=wq_passport' % time_stamp - get_header = { - 'Connection': 'Keep-Alive', - 'Content-Type': 'application/x-www-form-urlencoded', - 'Accept': 'application/json, text/plain, */*', - 'Accept-Language': 'zh-cn', - 'Referer': 'https://plogin.m.jd.com/login/login?appid=300&returnurl=https://wq.jd.com/passport/LoginRedirect?state=%s&returnurl=https://home.m.jd.com/myJd/newhome.action?sceneval=2&ufc=&/myJd/home.action&source=wq_passport' % time_stamp, - 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.111 Safari/537.36', - 'Host': 'plogin.m.jd.com' - } - try: - resp = requests.get(url=get_url, headers=get_header) - parseGetRespCookie(resp.headers, resp.json()) - logger.info(resp.headers) - logger.info(resp.json()) - except Exception as error: - logger.exception("Get网络请求异常", error) - - -def parseGetRespCookie(headers, get_resp): - global s_token - global cookies - s_token = get_resp.get('s_token') - set_cookies = headers.get('set-cookie') - logger.info(set_cookies) - - guid = re.findall(r"guid=(.+?);", set_cookies)[0] - lsid = re.findall(r"lsid=(.+?);", set_cookies)[0] - lstoken = re.findall(r"lstoken=(.+?);", set_cookies)[0] - - cookies = f"guid={guid}; lang=chs; lsid={lsid}; lstoken={lstoken}; " - logger.info(cookies) - - -def getOKLToken(): - post_time_stamp = int(time.time() * 1000) - post_url = 'https://plogin.m.jd.com/cgi-bin/m/tmauthreflogurl?s_token=%s&v=%s&remember=true' % ( - s_token, post_time_stamp) - post_data = { - 'lang': 'chs', - 'appid': 300, - 'returnurl': 'https://wqlogin2.jd.com/passport/LoginRedirect?state=%s&returnurl=//home.m.jd.com/myJd/newhome.action?sceneval=2&ufc=&/myJd/home.action' % post_time_stamp, - 'source': 'wq_passport' - } - post_header = { - 'Connection': 'Keep-Alive', - 'Content-Type': 'application/x-www-form-urlencoded; Charset=UTF-8', - 'Accept': 'application/json, text/plain, */*', - 'Cookie': cookies, - 'Referer': 'https://plogin.m.jd.com/login/login?appid=300&returnurl=https://wqlogin2.jd.com/passport/LoginRedirect?state=%s&returnurl=//home.m.jd.com/myJd/newhome.action?sceneval=2&ufc=&/myJd/home.action&source=wq_passport' % post_time_stamp, - 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.111 Safari/537.36', - 'Host': 'plogin.m.jd.com', - } - try: - global okl_token - resp = requests.post(url=post_url, headers=post_header, data=post_data, timeout=20) - parsePostRespCookie(resp.headers, resp.json()) - logger.info(resp.headers) - except Exception as error: - logger.exception("Post网络请求错误", error) - - -def parsePostRespCookie(headers, data): - global token - global okl_token - - token = data.get('token') - print(headers.get('set-cookie')) - okl_token = re.findall(r"okl_token=(.+?);", headers.get('set-cookie'))[0] - - logger.info("token:" + token) - logger.info("okl_token:" + okl_token) - - -def genQRCode(): - global qr_code_path - cookie_url = f'https://plogin.m.jd.com/cgi-bin/m/tmauth?appid=300&client_type=m&token=%s' % token - version, level, qr_name = myqr.run( - words=cookie_url, - # 扫描二维码后,显示的内容,或是跳转的链接 - version=5, # 设置容错率 - level='H', # 控制纠错水平,范围是L、M、Q、H,从左到右依次升高 - picture='/scripts/docker/bot/jd.png', # 图片所在目录,可以是动图 - colorized=True, # 黑白(False)还是彩色(True) - contrast=1.0, # 用以调节图片的对比度,1.0 表示原始图片。默认为1.0。 - brightness=1.0, # 用来调节图片的亮度,用法同上。 - save_name='/scripts/docker/genQRCode.png', # 控制输出文件名,格式可以是 .jpg, .png ,.bmp ,.gif - ) - return qr_name - - -def chekLogin(): - expired_time = time.time() + 60 * 3 - while True: - check_time_stamp = int(time.time() * 1000) - check_url = 'https://plogin.m.jd.com/cgi-bin/m/tmauthchecktoken?&token=%s&ou_state=0&okl_token=%s' % ( - token, okl_token) - check_data = { - 'lang': 'chs', - 'appid': 300, - 'returnurl': 'https://wqlogin2.jd.com/passport/LoginRedirect?state=%s&returnurl=//home.m.jd.com/myJd/newhome.action?sceneval=2&ufc=&/myJd/home.action' % check_time_stamp, - 'source': 'wq_passport' - - } - check_header = { - 'Referer': f'https://plogin.m.jd.com/login/login?appid=300&returnurl=https://wqlogin2.jd.com/passport/LoginRedirect?state=%s&returnurl=//home.m.jd.com/myJd/newhome.action?sceneval=2&ufc=&/myJd/home.action&source=wq_passport' % check_time_stamp, - 'Cookie': cookies, - 'Connection': 'Keep-Alive', - 'Content-Type': 'application/x-www-form-urlencoded; Charset=UTF-8', - 'Accept': 'application/json, text/plain, */*', - 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.111 Safari/537.36', - - } - resp = requests.post(url=check_url, headers=check_header, data=check_data, timeout=30) - data = resp.json() - if data.get("errcode") == 0: - parseJDCookies(resp.headers) - return data.get("errcode") - if data.get("errcode") == 21: - return data.get("errcode") - if time.time() > expired_time: - return "超过3分钟未扫码,二维码已过期。" - - -def parseJDCookies(headers): - global jd_cookie - logger.info("扫码登录成功,下面为获取到的用户Cookie。") - set_cookie = headers.get('Set-Cookie') - pt_key = re.findall(r"pt_key=(.+?);", set_cookie)[0] - pt_pin = re.findall(r"pt_pin=(.+?);", set_cookie)[0] - logger.info(pt_key) - logger.info(pt_pin) - jd_cookie = f'pt_key={pt_key};pt_pin={pt_pin};' - - -def saveFile(update, context): - from_user_id = update.message.from_user.id - if admin_id == str(from_user_id): - js_file_name = update.message.document.file_name - if str(js_file_name).endswith(".js"): - save_path = f"{_base_dir}{js_file_name}" - try: - # logger.info(update.message) - file = context.bot.getFile(update.message.document.file_id) - file.download(save_path) - keyboard_line = [[InlineKeyboardButton('node 执行', callback_data='node %s ' % save_path), - InlineKeyboardButton('spnode 执行', - callback_data='spnode %s' % save_path)], - [InlineKeyboardButton('取消操作', callback_data='cancel')]] - - reply_markup = InlineKeyboardMarkup(keyboard_line) - - update.message.reply_text( - text='```{}```'.format( - helpers.escape_markdown(' ↓↓↓ %s 上传至/scripts完成,请请选择需要的操作 ↓↓↓ ' % js_file_name)), - reply_markup=reply_markup, parse_mode=ParseMode.MARKDOWN_V2) - - except Exception as e: - update.message.reply_text(text='```{}```'.format( - helpers.escape_markdown(" →→→ %s js上传至/scripts过程中出错,请重新尝试。 ←←← " % js_file_name)), - parse_mode=ParseMode.MARKDOWN_V2) - else: - update.message.reply_text(text='```{}```'.format( - helpers.escape_markdown(" →→→ 抱歉,暂时只开放上传js文件至/scripts目录 ←←← ")), - parse_mode=ParseMode.MARKDOWN_V2) - - -def unknown(update, context): - """回复用户输入不存在的指令 - """ - from_user_id = update.message.from_user.id - if admin_id == str(from_user_id): - spnode_readme = "" - if "DISABLE_SPNODE" not in os.environ: - spnode_readme = "/spnode 获取可执行脚本的列表,选择对应的按钮执行。(拓展使用:运行指定路径脚本,例:/spnode /scripts/jd_818.js)\n\n" \ - "使用bot交互+spnode后 后续用户的cookie维护更新只需要更新logs/cookies.list即可\n" \ - "使用bot交互+spnode后 后续执行脚本命令请使用spnode否者无法使用logs/cookies.list的cookies执行脚本,定时任务也将自动替换为spnode命令执行\n" \ - "spnode功能概述示例\n\n" \ - "spnode conc /scripts/jd_bean_change.js 为每个cookie单独执行jd_bean_change脚本(伪并发\n" \ - "spnode 1 /scripts/jd_bean_change.js 为logs/cookies.list文件里面第一行cookie账户单独执行jd_bean_change脚本\n" \ - "spnode jd_XXXX /scripts/jd_bean_change.js 为logs/cookies.list文件里面pt_pin=jd_XXXX的cookie账户单独执行jd_bean_change脚本\n" \ - "spnode /scripts/jd_bean_change.js 为logs/cookies.list所有cookies账户一起执行jd_bean_change脚本\n" \ - "请仔细阅读并理解上面的内容,使用bot交互默认开启spnode指令功能功能。\n" \ - "如需____停用___请配置环境变量 -DISABLE_SPNODE=True" - update.message.reply_text(text="⚠️ 您输入了一个错误的指令,请参考说明使用\n" \ - "\n" \ - "/start 开始并获取指令说明\n" \ - "/node 获取可执行脚本的列表,选择对应的按钮执行。(拓展使用:运行指定路径脚本,例:/node /scripts/jd_818.js) \n" \ - "/git 获取可执行git指令列表,选择对应的按钮执行。(拓展使用:运行指定路径脚本,例:/git -C /scripts/ pull)\n" \ - "/logs 获取logs下的日志文件列表,选择对应名字可以下载日志文件\n" \ - "/env 获取系统环境变量列表。(拓展使用:设置系统环境变量,例:/env export JD_DEBUG=true,环境变量只针对当前bot进程生效) \n" \ - "/cmd 执行执行命令。参考:/cmd ls -l 涉及目录文件操作请使用绝对路径,部分shell命令开放使用\n" \ - "/gen_long_code 长期活动互助码提交消息生成\n" \ - "/gen_temp_code 短期临时活动互助码提交消息生成\n" \ - "/gen_daily_code 每天变化互助码活动提交消息生成\n\n%s" % spnode_readme, - parse_mode=ParseMode.HTML) - else: - update.message.reply_text(text='此为私人使用bot,不能执行您的指令!') - - -def error(update, context): - """Log Errors caused by Updates.""" - logger.warning('Update "%s" caused error "%s"', update, context.error) - context.bot.send_message( - 'Update "%s" caused error "%s"', update, context.error) - - -def main(): - global admin_id, bot_token, crontab_list_file - - if 'TG_BOT_TOKEN' in os.environ: - bot_token = os.getenv('TG_BOT_TOKEN') - - if 'TG_USER_ID' in os.environ: - admin_id = os.getenv('TG_USER_ID') - - if 'CRONTAB_LIST_FILE' in os.environ: - crontab_list_file = os.getenv('CRONTAB_LIST_FILE') - else: - crontab_list_file = 'crontab_list.sh' - - logger.info('CRONTAB_LIST_FILE=' + crontab_list_file) - - # 创建更新程序并参数为你Bot的TOKEN。 - updater = Updater(bot_token, use_context=True) - - # 获取调度程序来注册处理程序 - dp = updater.dispatcher - - # 通过 start 函数 响应 '/start' 命令 - dp.add_handler(CommandHandler('start', start)) - - # 通过 start 函数 响应 '/help' 命令 - dp.add_handler(CommandHandler('help', start)) - - # 通过 node 函数 响应 '/node' 命令 - dp.add_handler(CommandHandler('node', node)) - - # 通过 node 函数 响应 '/spnode' 命令 - dp.add_handler(CommandHandler('spnode', spnode)) - - # 通过 git 函数 响应 '/git' 命令 - dp.add_handler(CommandHandler('git', git)) - - # 通过 crontab 函数 响应 '/crontab' 命令 - dp.add_handler(CommandHandler('crontab', crontab)) - - # 通过 logs 函数 响应 '/logs' 命令 - dp.add_handler(CommandHandler('logs', logs)) - - # 通过 cmd 函数 响应 '/cmd' 命令 - dp.add_handler(CommandHandler('cmd', shcmd)) - - # 通过 callback_run 函数 响应相关按钮命令 - dp.add_handler(CallbackQueryHandler(callback_run)) - - # 通过 env 函数 响应 '/env' 命令 - dp.add_handler(CommandHandler('env', env)) - - # 通过 gen_long_code 函数 响应 '/gen_long_code' 命令 - dp.add_handler(CommandHandler('gen_long_code', gen_long_code)) - - # 通过 gen_temp_code 函数 响应 '/gen_temp_code' 命令 - dp.add_handler(CommandHandler('gen_temp_code', gen_temp_code)) - - # 通过 gen_daily_code 函数 响应 '/gen_daily_code' 命令 - dp.add_handler(CommandHandler('gen_daily_code', gen_daily_code)) - - # 通过 get_jd_cookie 函数 响应 '/eikooc_dj_teg' 命令 #别问为啥这么写,有意为之的 - dp.add_handler(CommandHandler('eikooc_dj_teg', get_jd_cookie)) - - # 文件监听 - dp.add_handler(MessageHandler(Filters.document, saveFile)) - - # 没找到对应指令 - dp.add_handler(MessageHandler(Filters.command, unknown)) - - # 响应普通文本消息 - # dp.add_handler(MessageHandler(Filters.text, resp_text)) - - dp.add_error_handler(error) - - updater.start_polling() - updater.idle() - - -# 生成依赖安装列表 -# pip3 freeze > requirements.txt -# 或者使用pipreqs -# pip3 install pipreqs -# 在当前目录生成 -# pipreqs . --encoding=utf8 --force -# 使用requirements.txt安装依赖 -# pip3 install -r requirements.txt -if __name__ == '__main__': - main() diff --git a/docker/bot/requirements.txt b/docker/bot/requirements.txt deleted file mode 100644 index 4b29cbe..0000000 --- a/docker/bot/requirements.txt +++ /dev/null @@ -1,5 +0,0 @@ -python_telegram_bot==13.0 -requests==2.23.0 -MyQR==2.3.1 -telegram==0.0.1 -tzlocal<3.0 diff --git a/docker/bot/setup.py b/docker/bot/setup.py deleted file mode 100644 index a1be8e0..0000000 --- a/docker/bot/setup.py +++ /dev/null @@ -1,13 +0,0 @@ -# -*- coding: utf-8 -*- -# @Author : iouAkira(lof) -# @mail : e.akimoto.akira@gmail.com -# @CreateTime: 2020-11-02 -# @UpdateTime: 2021-03-21 - -from setuptools import setup - -setup( - name='jd-scripts-bot', - version='0.2', - scripts=['jd_bot', ], -) diff --git a/docker/crontab_list.sh b/docker/crontab_list.sh deleted file mode 100644 index b7b723f..0000000 --- a/docker/crontab_list.sh +++ /dev/null @@ -1,229 +0,0 @@ -# 每3天的23:50分清理一次日志(互助码不清理,proc_file.sh对该文件进行了去重) -50 23 */3 * * find /scripts/logs -name '*.log' | grep -v 'sharecodeCollection' | xargs rm -rf -#收集助力码 -30 * * * * sh +x /scripts/docker/auto_help.sh collect >> /scripts/logs/auto_help_collect.log 2>&1 - -##############活动############## - -#宠汪汪 -35 0-23/2 * * * node /scripts/jd_joy.js >> /scripts/logs/jd_joy.log 2>&1 -#宠汪汪兑换 -59 7,15,23 * * * node /scripts/jd_joy_reward.js >> /scripts/logs/jd_joy_reward.log 2>&1 -#点点券 -#10 6,20 * * * node /scripts/jd_necklace.js >> /scripts/logs/jd_necklace.log 2>&1 -#惊喜签到 -0 3,8 * * * node /scripts/jd_jxsign.js >> /scripts/logs/jd_jxsign.log 2>&1 -#东东超市兑换奖品 -59 23 * * * node /scripts/jd_blueCoin.js >> /scripts/logs/jd_blueCoin.log 2>&1 -#财富岛 -35 * * * * node /scripts/jd_cfd.js >> /scripts/logs/jd_cfd.log 2>&1 -#京东汽车 -10 4,20 * * * node /scripts/jd_car.js >> /scripts/logs/jd_car.log 2>&1 -#金榜创造营 -13 5,19 * * * node /scripts/jd_gold_creator.js >> /scripts/logs/jd_gold_creator.log 2>&1 -#京东多合一签到 -0 4,14 * * * node /scripts/jd_bean_sign.js >> /scripts/logs/jd_bean_sign.log 2>&1 -#半点京豆雨 -30 0-23/1 * * * node /scripts/jd_half_redrain.js >> /scripts/logs/jd_half_redrain.log 2>&1 -#东东超市 -39 * * * * node /scripts/jd_superMarket.js >> /scripts/logs/jd_superMarket.log 2>&1 -#京东极速版红包 -20 2,12 * * * node /scripts/jd_speed_redpocke.js >> /scripts/logs/jd_speed_redpocke.log 2>&1 -#领京豆额外奖励 -10 3,9 * * * node /scripts/jd_bean_home.js >> /scripts/logs/jd_bean_home.log 2>&1 -#京东资产变动通知 -0 12 * * * node /scripts/jd_bean_change.js >> /scripts/logs/jd_bean_change.log 2>&1 -#京东极速版 -0 1,7 * * * node /scripts/jd_speed_sign.js >> /scripts/logs/jd_speed_sign.log 2>&1 -#我是大老板 -35 0-23/1 * * * node /scripts/jd_wsdlb.js >> /scripts/logs/jd_wsdlb.log 2>&1 -# -5 3,19 * * * node /scripts/jd_unsubscribe.js >> /scripts/logs/jd_unsubscribe.log 2>&1 -#东东萌宠 -45 6-18/6 * * * node /scripts/jd_pet.js >> /scripts/logs/jd_pet.log 2>&1 -#挑一挑 -1 3,9,18 * * * node /scripts/jd_jump.js >> /scripts/logs/jd_jump.log 2>&1 -# -36 0,1-23/3 * * * node /scripts/jd_mohe.js >> /scripts/logs/jd_mohe.log 2>&1 -#种豆得豆 -44 0-23/6 * * * node /scripts/jd_plantBean.js >> /scripts/logs/jd_plantBean.log 2>&1 -#东东农场 -35 6-18/6 * * * node /scripts/jd_fruit.js >> /scripts/logs/jd_fruit.log 2>&1 -#删除优惠券 -0 3,20 * * * node /scripts/jd_delCoupon.js >> /scripts/logs/jd_delCoupon.log 2>&1 -# -5 2,19 * * * node /scripts/jd_club_lottery.js >> /scripts/logs/jd_club_lottery.log 2>&1 -# -40 * * * * node /scripts/jd_jdfactory.js >> /scripts/logs/jd_jdfactory.log 2>&1 -# -0 0-23/1 * * * node /scripts/jd_super_redrain.js >> /scripts/logs/jd_super_redrain.log 2>&1 -#领金贴 -10 1 * * * node /scripts/jd_jin_tie.js >> /scripts/logs/jd_jin_tie.log 2>&1 -#健康社区 -13 2,5,20 * * * node /scripts/jd_health.js >> /scripts/logs/jd_health.log 2>&1 -#秒秒币 -10 2 * * * node /scripts/jd_ms.js >> /scripts/logs/jd_ms.log 2>&1 -# -1 2,15,19 * * * node /scripts/jd_daily_lottery.js >> /scripts/logs/jd_daily_lottery.log 2>&1 -# -9 0-23/3 * * * node /scripts/jd_ddnc_farmpark.js >> /scripts/logs/jd_ddnc_farmpark.log 2>&1 -#京喜工厂 -39 * * * * node /scripts/jd_dreamFactory.js >> /scripts/logs/jd_dreamFactory.log 2>&1 -#闪购盲盒 -20 4,16,19 * * * node /scripts/jd_sgmh.js >> /scripts/logs/jd_sgmh.log 2>&1 -# -0 0 * * * node /scripts/jd_bean_change1.js >> /scripts/logs/jd_bean_change1.log 2>&1 -# -1 0 * * * node /scripts/jd_shop.js >> /scripts/logs/jd_shop.log 2>&1 -#摇钱树 -23 0-23/2 * * * node /scripts/jd_moneyTree.js >> /scripts/logs/jd_moneyTree.log 2>&1 -#排行榜 -37 2 * * * node /scripts/jd_rankingList.js >> /scripts/logs/jd_rankingList.log 2>&1 -# -32 0-23/6 * * * node /scripts/jd_pigPet.js >> /scripts/logs/jd_pigPet.log 2>&1 -# -10-20/5 12 * * * node /scripts/jd_live.js >> /scripts/logs/jd_live.log 2>&1 -#京东快递 -40 0 * * * node /scripts/jd_kd.js >> /scripts/logs/jd_kd.log 2>&1 -#美丽研究院 -16 9,15,17 * * * node /scripts/jd_beauty.js >> /scripts/logs/jd_beauty.log 2>&1 -#京喜牧场 -48 0-23/3 * * * node /scripts/jd_jxmc.js >> /scripts/logs/jd_jxmc.log 2>&1 -#京东试用 -30 10 * * * node /scripts/jd_try.js >> /scripts/logs/jd_try.log 2>&1 -#领现金 -42 0-23/6 * * * node /scripts/jd_cash.js >> /scripts/logs/jd_cash.log 2>&1 -#赚金币 -0 8 * * * node /scripts/jd_zjb.js >> /scripts/logs/jd_zjb.log 2>&1 -# -# 0 6 * * * node /scripts/getJDCookie.js >> /scripts/logs/getJDCookie.log 2>&1 -#京东赚赚 -10 0 * * * node /scripts/jd_jdzz.js >> /scripts/logs/jd_jdzz.log 2>&1 -#获取互助码 -20 13 * * 6 node /scripts/jd_get_share_code.js >> /scripts/logs/jd_get_share_code.log 2>&1 -# -15-55/20 * * * * node /scripts/jd_health_collect.js >> /scripts/logs/jd_health_collect.log 2>&1 -#京东到家果园 -10 0,8,11,17 * * * node /scripts/jd_jddj_fruit.js >> /scripts/logs/jd_jddj_fruit.log 2>&1 -#京东到家 -5 0,6,12 * * * node /scripts/jd_jddj_bean.js >> /scripts/logs/jd_jddj_bean.log 2>&1 -#京东到家收水滴 -10 * * * * node /scripts/jd_jddj_collectWater.js >> /scripts/logs/jd_jddj_collectWater.log 2>&1 -#京东到家 -5-40/5 * * * * node /scripts/jd_jddj_getPoints.js >> /scripts/logs/jd_jddj_getPoints.log 2>&1 -#京东到家 -20 */4 * * * node /scripts/jd_jddj_plantBeans.js >> /scripts/logs/jd_jddj_plantBeans.log 2>&1 -# -13 3 * * * node /scripts/jd_drawEntrance.js >> /scripts/logs/jd_drawEntrance.log 2>&1 -#特务 -1,10 0 * * * node /scripts/jd_superBrand.js >> /scripts/logs/jd_superBrand.log 2>&1 -#送豆得豆 -5 0,12 * * * node /scripts/jd_SendBean.js >> /scripts/logs/jd_SendBean.log 2>&1 -# -20 0,2 * * * node /scripts/jd_wish.js >> /scripts/logs/jd_wish.log 2>&1 -#财富岛气球 -5 * * * * node /scripts/jd_cfd_loop.js >> /scripts/logs/jd_cfd_loop.log 2>&1 -#宠汪汪偷狗粮 -40 0-21/3 * * * node /scripts/jd_joy_steal.js >> /scripts/logs/jd_joy_steal.log 2>&1 -#京小鸽 -18 4,11 * * * node /scripts/jd_jxg.js >> /scripts/logs/jd_jxg.log 2>&1 -# -20 6,7 * * * node /scripts/jd_morningSc.js >> /scripts/logs/jd_morningSc.log 2>&1 -#领现金兑换 -0 0 * * * node /scripts/jd_cash_exchange.js >> /scripts/logs/jd_cash_exchange.log 2>&1 -#快手水果 -33 1,8,12,19 * * * node /scripts/jd_ks_fruit.js >> /scripts/logs/jd_ks_fruit.log 2>&1 -#宠汪汪喂食 -15 0-23/1 * * * node /scripts/jd_joy_feedPets.js >> /scripts/logs/jd_joy_feedPets.log 2>&1 -#宠汪汪赛跑 -15 10,12 * * * node /scripts/jd_joy_run.js >> /scripts/logs/jd_joy_run.log 2>&1 -#领京豆 -38 8,13 * * * node /scripts/jd_mdou.js >> /scripts/logs/jd_mdou.log 2>&1 -# -0 1 * * * node /scripts/jd_cleancart.js >> /scripts/logs/jd_cleancart.log 2>&1 -#店铺签到 -2 2 * * * node /scripts/jd_dpqd.js >> /scripts/logs/jd_dpqd.log 2>&1 -#推一推 -2 12 * * * node /scripts/jd_tyt.js >> /scripts/logs/jd_tyt.log 2>&1 -# -55 6 * * * node /scripts/jd_unsubscriLive.js >> /scripts/logs/jd_unsubscriLive.log 2>&1 -#女装盲盒 -45 2,20 * * * node /scripts/jd_nzmh.js >> /scripts/logs/jd_nzmh.log 2>&1 -#开卡74 -47 3 25-30,1 11,12 * node /scripts/jd_opencard74.js >> /scripts/logs/jd_opencard74.log 2>&1 -#开卡75 -47 2 1-15 12 * node /scripts/jd_opencard75.js >> /scripts/logs/jd_opencard75.log 2>&1 -#开卡76 -47 3 3-12 12 * node /scripts/jd_opencard76.js >> /scripts/logs/jd_opencard76.log 2>&1 -#积分换话费 -43 5,17 * * * node /scripts/jd_dwapp.js >> /scripts/logs/jd_dwapp.log 2>&1 -# 领券中心签到 -5 0 * * * node /scripts/jd_ccSign.js >> /scripts/logs/jd_ccSign.log 2>&1 -#邀请有礼 -20 9 * * * node /scripts/jd_yqyl.js >> /scripts/logs/jd_yqyl.log 2>&1 -# -20 3,6,9 * * * node /scripts/jd_dreamfactory_tuan.js >> /scripts/logs/jd_dreamfactory_tuan.log 2>&1 -#京喜领红包 -23 0,6,12,21 * * * node /scripts/jd_jxlhb.js >> /scripts/logs/jd_jxlhb.log 2>&1 -#超级直播间盲盒抽京豆 -1 18,20 * * * node /scripts/jd_super_mh.js >> /scripts/logs/jd_super_mh.log 2>&1 -# 内容鉴赏官 -5 2,5,16 * * * node /scripts/jd_connoisseur.js >> /scripts/logs/jd_connoisseur.log 2>&1 -# 京喜财富岛月饼 -5 * * * * node /scripts/jd_cfd_mooncake.js >> /scripts/logs/jd_cfd_mooncake.log 2>&1 -# 东东世界 -15 3,16 * * * node /scripts/jd_ddworld.js >> /scripts/logs/jd_ddworld.log 2>&1 -# 小魔方 -31 2,8 * * * node /scripts/jd_mf.js >> /scripts/logs/jd_mf.log 2>&1 -# 魔方 -11 7,19 * * * node /scripts/jd_mofang.js >> /scripts/logs/jd_mofang.log 2>&1 -# 芥么签到 -11 0,9 * * * node /scripts/jd_jmsign.js >> /scripts/logs/jd_jmsign.log 2>&1 -# 芥么赚豪礼 -37 0,11 * * * node /scripts/jd_jmzhl.js >> /scripts/logs/jd_jmzhl.log 2>&1 -# 幸运扭蛋 -24 9 * 10-11 * node /scripts/jd_lucky_egg.js >> /scripts/logs/jd_lucky_egg.log 2>&1 -# 东东世界兑换 -0 0 * * * node /scripts/jd_ddworld_exchange.js >> /scripts/logs/jd_ddworld_exchange.log 2>&1 -# 天天提鹅 -20 * * * * node /scripts/jd_daily_egg.js >> /scripts/logs/jd_daily_egg.log 2>&1 -# 发财大赢家 -1 2,10 * * * node /scripts/jd_fcdyj.js >> /scripts/logs/jd_fcdyj.log 2>&1 -# 翻翻乐 -20 * * * * node /scripts/jd_big_winner.js >> /scripts/logs/jd_big_winner.log 2>&1 -# 京东极速版签到免单 -18 8,12,20 * * * node /scripts/jd_speed_signfree.js >> /scripts/logs/jd_speed_signfree.log 2>&1 -# 牛牛福利 -1 9,19 * * * node /scripts/jd_nnfl.js >> /scripts/logs/jd_nnfl.log 2>&1 -#赚京豆 -10,40 0,1 * * * node /scripts/jd_syj.js >> /scripts/logs/jd_syj.log 2>&1 -#搞基大神-饭粒 -46 1,19 * * * node /scripts/jd_fanli.js >> /scripts/logs/jd_fanli.log 2>&1 -#农场集勋章 -16 7,16 * * * node /scripts/jd_medal.js >> /scripts/logs/jd_medal.log 2>&1 -#京东签到翻牌 -10 8,18 * * * node /scripts/jd_sign_graphics.js >> /scripts/logs/jd_sign_graphics.log 2>&1 -#京喜财富岛合成生鲜 -45 * * * * node /scripts/jd_cfd_fresh.js >> /scripts/logs/jd_cfd_fresh.log 2>&1 -#财富岛珍珠兑换 -59 0-23/1 * * * node /scripts/jd_cfd_pearl_ex.js >> /scripts/logs/jd_cfd_pearl_ex.log 2>&1 -#美丽研究院--兑换 -1 7,12,19 * * * node /scripts/jd_beauty_ex.js >> /scripts/logs/jd_beauty_ex.log 2>&1 -#锦鲤 -5 0 * * * node /scripts/jd_angryKoi.js >> /scripts/logs/jd_angryKoi.log 2>&1 -#京东赚京豆一分钱抽奖 -10 0 * * * node /scripts/jd_lottery_drew.js >> /scripts/logs/jd_lottery_drew.log 2>&1 -#京东保价 -41 23 * * * node /scripts/jd_price.js >> /scripts/logs/jd_price.log 2>&1 -#金榜年终奖 -10 0,2 * * * node /scripts/jd_split.js >> /scripts/logs/jd_split.log 2>&1 -#京东小魔方--收集兑换 -10 7 * * * node /scripts/jd_mofang_ex.js >> /scripts/logs/jd_mofang_ex.log 2>&1 -#骁龙 -10 9,17 * * * node /scripts/jd_xiaolong.js >> /scripts/logs/jd_xiaolong.log 2>&1 -#京东我的理想家 -10 7 * * * node /scripts/jd_lxLottery.js >> /scripts/logs/jd_lxLottery.log 2>&1 -#京豆兑换为喜豆 -33 9 * * * node /scripts/jd_exchangejxbeans.js >> /scripts/logs/jd_exchangejxbeans.log 2>&1 -#早起签到 -1 6,7 * * * python3 /jd/scripts/jd_zqfl.py >> /jd/log/jd_zqfl.log 2>&1 diff --git a/docker/default_task.sh b/docker/default_task.sh deleted file mode 100644 index 7cc7e18..0000000 --- a/docker/default_task.sh +++ /dev/null @@ -1,252 +0,0 @@ -#!/bin/sh -set -e - -# 放在这个初始化python3环境,目的减小镜像体积,一些不需要使用bot交互的用户可以不用拉体积比较大的镜像 -# 在这个任务里面还有初始化还有目的就是为了方便bot更新了新功能的话只需要重启容器就完成更新 -function initPythonEnv() { - echo "开始安装运行jd_bot需要的python环境及依赖..." - apk add --update python3-dev py3-pip py3-cryptography py3-numpy py-pillow - echo "开始安装jd_bot依赖..." - #测试 - #cd /jd_docker/docker/bot - #合并 - cd /scripts/docker/bot - pip3 install --upgrade pip - pip3 install -r requirements.txt - python3 setup.py install -} - -#启动tg bot交互前置条件成立,开始安装配置环境 -if [ "$1" == "True" ]; then - initPythonEnv - if [ -z "$DISABLE_SPNODE" ]; then - echo "增加命令组合spnode ,使用该命令spnode jd_xxxx.js 执行js脚本会读取cookies.conf里面的jd cokie账号来执行脚本" - ( - cat </usr/local/bin/spnode - chmod +x /usr/local/bin/spnode - fi - - echo "spnode需要使用的到,cookie写入文件,该文件同时也为jd_bot扫码获自动取cookies服务" - if [ -z "$JD_COOKIE" ]; then - if [ ! -f "$COOKIES_LIST" ]; then - echo "" >"$COOKIES_LIST" - echo "未配置JD_COOKIE环境变量,$COOKIES_LIST文件已生成,请将cookies写入$COOKIES_LIST文件,格式每个Cookie一行" - fi - else - if [ -f "$COOKIES_LIST" ]; then - echo "cookies.conf文件已经存在跳过,如果需要更新cookie请修改$COOKIES_LIST文件内容" - else - echo "环境变量 cookies写入$COOKIES_LIST文件,如果需要更新cookie请修改cookies.conf文件内容" - echo $JD_COOKIE | sed "s/[ &]/\\n/g" | sed "/^$/d" >$COOKIES_LIST - fi - fi - - CODE_GEN_CONF=/scripts/logs/code_gen_conf.list - echo "生成互助消息需要使用的到的 logs/code_gen_conf.list 文件,后续需要自己根据说明维护更新删除..." - if [ ! -f "$CODE_GEN_CONF" ]; then - ( - cat <$CODE_GEN_CONF - else - echo "logs/code_gen_conf.list 文件已经存在跳过初始化操作" - fi - - echo "容器jd_bot交互所需环境已配置安装已完成..." - curl -sX POST "https://api.telegram.org/bot$TG_BOT_TOKEN/sendMessage" -d "chat_id=$TG_USER_ID&text=恭喜🎉你获得feature容器jd_bot交互所需环境已配置安装已完成,并启用。请发送 /help 查看使用帮助。如需禁用请在docker-compose.yml配置 DISABLE_BOT_COMMAND=True" >>/dev/null - -fi - -#echo "暂停更新配置,不要尝试删掉这个文件,你的容器可能会起不来" -#echo '' >/scripts/logs/pull.lock - -echo "定义定时任务合并处理用到的文件路径..." -defaultListFile="/scripts/docker/$DEFAULT_LIST_FILE" -echo "默认文件定时任务文件路径为 ${defaultListFile}" -mergedListFile="/scripts/docker/merged_list_file.sh" -echo "合并后定时任务文件路径为 ${mergedListFile}" - -echo "第1步将默认定时任务列表添加到并后定时任务文件..." -cat $defaultListFile >$mergedListFile - -echo "第2步判断是否存在自定义任务任务列表并追加..." -if [ $CUSTOM_LIST_FILE ]; then - echo "您配置了自定义任务文件:$CUSTOM_LIST_FILE,自定义任务类型为:$CUSTOM_LIST_MERGE_TYPE..." - # 无论远程还是本地挂载, 均复制到 $customListFile - customListFile="/scripts/docker/custom_list_file.sh" - echo "自定义定时任务文件临时工作路径为 ${customListFile}" - if expr "$CUSTOM_LIST_FILE" : 'http.*' &>/dev/null; then - echo "自定义任务文件为远程脚本,开始下载自定义远程任务。" - wget -O $customListFile $CUSTOM_LIST_FILE - echo "下载完成..." - elif [ -f /scripts/docker/$CUSTOM_LIST_FILE ]; then - echo "自定义任务文件为本地挂载。" - cp /scripts/docker/$CUSTOM_LIST_FILE $customListFile - fi - - if [ -f "$customListFile" ]; then - if [ $CUSTOM_LIST_MERGE_TYPE == "append" ]; then - echo "合并默认定时任务文件:$DEFAULT_LIST_FILE 和 自定义定时任务文件:$CUSTOM_LIST_FILE" - echo -e "" >>$mergedListFile - cat $customListFile >>$mergedListFile - elif [ $CUSTOM_LIST_MERGE_TYPE == "overwrite" ]; then - echo "配置了自定义任务文件:$CUSTOM_LIST_FILE,自定义任务类型为:$CUSTOM_LIST_MERGE_TYPE..." - cat $customListFile >$mergedListFile - else - echo "配置配置了错误的自定义定时任务类型:$CUSTOM_LIST_MERGE_TYPE,自定义任务类型为只能为append或者overwrite..." - fi - else - echo "配置的自定义任务文件:$CUSTOM_LIST_FILE未找到,使用默认配置$DEFAULT_LIST_FILE..." - fi -else - echo "当前只使用了默认定时任务文件 $DEFAULT_LIST_FILE ..." -fi - -echo "第3步判断是否配置了随机延迟参数..." -if [ $RANDOM_DELAY_MAX ]; then - if [ $RANDOM_DELAY_MAX -ge 1 ]; then - echo "已设置随机延迟为 $RANDOM_DELAY_MAX , 设置延迟任务中..." - sed -i "/\(jd_bean_sign.js\|jd_blueCoin.js\|jd_joy_reward.js\|jd_joy_steal.js\|jd_joy_feedPets.js\|jd_car_exchange.js\)/!s/node/sleep \$((RANDOM % \$RANDOM_DELAY_MAX)); node/g" $mergedListFile - fi -else - echo "未配置随机延迟对应的环境变量,故不设置延迟任务..." -fi - -echo "第4步判断是否配置自定义shell执行脚本..." -if [ 0"$CUSTOM_SHELL_FILE" = "0" ]; then - echo "未配置自定shell脚本文件,跳过执行。" -else - if expr "$CUSTOM_SHELL_FILE" : 'http.*' &>/dev/null; then - echo "自定义shell脚本为远程脚本,开始下载自定义远程脚本。" - wget -O /scripts/docker/shell_script_mod.sh $CUSTOM_SHELL_FILE - echo "下载完成,开始执行..." - echo "#远程自定义shell脚本追加定时任务" >>$mergedListFile - sh -x /scripts/docker/shell_script_mod.sh - echo "自定义远程shell脚本下载并执行结束。" - else - if [ ! -f $CUSTOM_SHELL_FILE ]; then - echo "自定义shell脚本为docker挂载脚本文件,但是指定挂载文件不存在,跳过执行。" - else - echo "docker挂载的自定shell脚本,开始执行..." - echo "#docker挂载自定义shell脚本追加定时任务" >>$mergedListFile - sh -x $CUSTOM_SHELL_FILE - echo "docker挂载的自定shell脚本,执行结束。" - fi - fi -fi - -echo "第5步删除不运行的脚本任务..." -if [ $DO_NOT_RUN_SCRIPTS ]; then - echo "您配置了不运行的脚本:$DO_NOT_RUN_SCRIPTS" - arr=${DO_NOT_RUN_SCRIPTS//&/ } - for item in $arr; do - sed -ie '/'"${item}"'/d' ${mergedListFile} - done - -fi - -echo "第6步设定下次运行docker_entrypoint.sh时间..." -echo "删除原有docker_entrypoint.sh任务" -sed -ie '/'docker_entrypoint.sh'/d' ${mergedListFile} - -# 12:00前生成12:00后的cron,12:00后生成第二天12:00前的cron,一天只更新两次代码 -if [ $(date +%-H) -lt 12 ]; then - random_h=$(($RANDOM % 12 + 12)) -else - random_h=$(($RANDOM % 12)) -fi -random_m=$(($RANDOM % 60)) - -echo "设定 docker_entrypoint.sh cron为:" -echo -e "\n# 必须要的默认定时任务请勿删除" >>$mergedListFile -echo -e "${random_m} ${random_h} * * * docker_entrypoint.sh >> /scripts/logs/default_task.log 2>&1" | tee -a $mergedListFile - -echo "第7步 自动助力" -if [ -n "$ENABLE_AUTO_HELP" ]; then - #直接判断变量,如果未配置,会导致sh抛出一个错误,所以加了上面一层 - if [ "$ENABLE_AUTO_HELP" = "true" ]; then - echo "开启自动助力" - #在所有脚本执行前,先执行助力码导出 - sed -i 's/node/ . \/scripts\/docker\/auto_help.sh export > \/scripts\/logs\/auto_help_export.log \&\& node /g' ${mergedListFile} - else - echo "未开启自动助力" - fi -fi - -echo "第8步增加 |ts 任务日志输出时间戳..." -sed -i "/\( ts\| |ts\|| ts\)/!s/>>/\|ts >>/g" $mergedListFile - -echo "第9步执行proc_file.sh脚本任务..." -sh /scripts/docker/proc_file.sh - -echo "第10步加载最新的定时任务文件..." -if [[ -f /usr/bin/jd_bot && -z "$DISABLE_SPNODE" ]]; then - echo "bot交互与spnode 前置条件成立,替换任务列表的node指令为spnode" - sed -i "s/ node / spnode /g" $mergedListFile - #conc每个cookies独立并行执行脚本示例,cookies数量多使用该功能可能导致内存爆掉,默认不开启 有需求,请在自定义shell里面实现 - #sed -i "/\(jd_xtg.js\|jd_car_exchange.js\)/s/spnode/spnode conc/g" $mergedListFile -fi -crontab $mergedListFile - -echo "第11步将仓库的docker_entrypoint.sh脚本更新至系统/usr/local/bin/docker_entrypoint.sh内..." -cat /scripts/docker/docker_entrypoint.sh >/usr/local/bin/docker_entrypoint.sh - -echo "发送通知" -export NOTIFY_CONTENT="" -cd /scripts/docker -node notify_docker_user.js diff --git a/docker/docker_entrypoint.sh b/docker/docker_entrypoint.sh deleted file mode 100644 index 6c9852c..0000000 --- a/docker/docker_entrypoint.sh +++ /dev/null @@ -1,57 +0,0 @@ -#!/bin/sh -set -e - -#获取配置的自定义参数 -if [ -n "$1" ]; then - run_cmd=$1 -fi - -( -if [ -f "/scripts/logs/pull.lock" ]; then - echo "存在更新锁定文件,跳过git pull操作..." -else - echo "设定远程仓库地址..." - cd /scripts - git remote set-url origin "$REPO_URL" - git reset --hard - echo "git pull拉取最新代码..." - git -C /scripts pull --rebase - echo "npm install 安装最新依赖" - npm install --prefix /scripts -fi -) || exit 0 - -# 默认启动telegram交互机器人的条件 -# 确认容器启动时调用的docker_entrypoint.sh -# 必须配置TG_BOT_TOKEN、TG_USER_ID, -# 且未配置DISABLE_BOT_COMMAND禁用交互, -# 且未配置自定义TG_API_HOST,因为配置了该变量,说明该容器环境可能并能科学的连到telegram服务器 -if [[ -n "$run_cmd" && -n "$TG_BOT_TOKEN" && -n "$TG_USER_ID" && -z "$DISABLE_BOT_COMMAND" && -z "$TG_API_HOST" ]]; then - ENABLE_BOT_COMMAND=True -else - ENABLE_BOT_COMMAND=False -fi - -echo "------------------------------------------------执行定时任务任务shell脚本------------------------------------------------" -#测试 -# sh /jd_docker/docker/default_task.sh "$ENABLE_BOT_COMMAND" "$run_cmd" -#合并 -sh /scripts/docker/default_task.sh "$ENABLE_BOT_COMMAND" "$run_cmd" -echo "--------------------------------------------------默认定时任务执行完成---------------------------------------------------" - -if [ -n "$run_cmd" ]; then - # 增加一层jd_bot指令已经正确安装成功校验 - # 以上条件都满足后会启动jd_bot交互,否还是按照以前的模式启动,最大程度避免现有用户改动调整 - if [[ "$ENABLE_BOT_COMMAND" == "True" && -f /usr/bin/jd_bot ]]; then - echo "启动crontab定时任务主进程..." - crond - echo "启动telegram bot指令交主进程..." - jd_bot - else - echo "启动crontab定时任务主进程..." - crond -f - fi - -else - echo "默认定时任务执行结束。" -fi diff --git a/docker/example/custom-append.yml b/docker/example/custom-append.yml deleted file mode 100644 index eeaa8ed..0000000 --- a/docker/example/custom-append.yml +++ /dev/null @@ -1,62 +0,0 @@ -jd_scripts: - image: lxk0301/jd_scripts - # 配置服务器资源约束。此例子中服务被限制为使用内存不超过200M以及cpu不超过0.2(单核的20%) - # 经过实际测试,建议不低于200M - # deploy: - # resources: - # limits: - # cpus: '0.2' - # memory: 200M - container_name: jd_scripts - restart: always - volumes: - - ./my_crontab_list.sh:/scripts/docker/my_crontab_list.sh - - ./logs:/scripts/logs - tty: true - # 因为更换仓库地址可能git pull的dns解析不到,可以在配置追加hosts - extra_hosts: - - "gitee.com:180.97.125.228" - - "github.com:13.229.188.59" - - "raw.githubusercontent.com:151.101.228.133" - environment: - #脚本更新仓库地址,配置了会切换到对应的地址 - - REPO_URL=git@gitee.com:lxk0301/jd_scripts.git - # 注意环境变量填写值的时候一律不需要引号(""或者'')下面这些只是示例,根据自己的需求增加删除 - #jd cookies - # 例: JD_COOKIE=pt_key=XXX;pt_pin=XXX; - # 例(多账号): JD_COOKIE=pt_key=XXX;pt_pin=XXX;&pt_key=XXX;pt_pin=XXX;&pt_key=XXX;pt_pin=XXX; - - JD_COOKIE= - #微信server酱通知 - - PUSH_KEY= - #Bark App通知 - - BARK_PUSH= - #telegram机器人通知 - - TG_BOT_TOKEN= - - TG_USER_ID= - #钉钉机器人通知 - - DD_BOT_TOKEN= - - DD_BOT_SECRET= - #企业微信机器人通知 - - QYWX_KEY= - #京东种豆得豆 - - PLANT_BEAN_SHARECODES= - #京东农场 - # 例: FRUITSHARECODES=京东农场的互助码 - - FRUITSHARECODES= - #京东萌宠 - # 例: PETSHARECODES=东东萌宠的互助码 - - PETSHARECODES= - # 宠汪汪的喂食数量 - - JOY_FEED_COUNT= - #东东超市 - # - SUPERMARKET_SHARECODES= - #兑换多少数量的京豆(20,或者1000京豆,或者其他奖品的文字) - # 例: MARKET_COIN_TO_BEANS=1000 - - MARKET_COIN_TO_BEANS= - #如果设置了 RANDOM_DELAY_MAX ,则会启用随机延迟功能,延迟随机 0 到 RANDOM_DELAY_MAX-1 秒。如果不设置此项,则不使用延迟。 - #并不是所有的脚本都会被启用延迟,因为有一些脚本需要整点触发。延迟的目的有两个,1是降低抢占cpu资源几率,2是降低检查风险(主要是1) - #填写数字,单位为秒,比如写为 RANDOM_DELAY_MAX=30 就是随机产生0到29之间的一个秒数,执行延迟的意思。 - - RANDOM_DELAY_MAX=120 - #使用自定义定任务追加默认任务之后,上面volumes挂载之后这里配置对应的文件名 - - CUSTOM_LIST_FILE=my_crontab_list.sh - diff --git a/docker/example/custom-overwrite.yml b/docker/example/custom-overwrite.yml deleted file mode 100644 index dd0a6a5..0000000 --- a/docker/example/custom-overwrite.yml +++ /dev/null @@ -1,62 +0,0 @@ -jd_scripts: - image: lxk0301/jd_scripts - # 配置服务器资源约束。此例子中服务被限制为使用内存不超过200M以及cpu不超过0.2(单核的20%) - # 经过实际测试,建议不低于200M - # deploy: - # resources: - # limits: - # cpus: '0.2' - # memory: 200M - container_name: jd_scripts - restart: always - volumes: - - ./my_crontab_list.sh:/scripts/docker/my_crontab_list.sh - - ./logs:/scripts/logs - tty: true - # 因为更换仓库地址可能git pull的dns解析不到,可以在配置追加hosts - extra_hosts: - - "gitee.com:180.97.125.228" - - "github.com:13.229.188.59" - - "raw.githubusercontent.com:151.101.228.133" - environment: - #脚本更新仓库地址,配置了会切换到对应的地址 - - REPO_URL=git@gitee.com:lxk0301/jd_scripts.git - # 注意环境变量填写值的时候一律不需要引号(""或者'')下面这些只是示例,根据自己的需求增加删除 - #jd cookies - # 例: JD_COOKIE=pt_key=XXX;pt_pin=XXX; - #例(多账号): JD_COOKIE=pt_key=XXX;pt_pin=XXX;&pt_key=XXX;pt_pin=XXX;&pt_key=XXX;pt_pin=XXX; - - JD_COOKIE= - #微信server酱通知 - - PUSH_KEY= - #Bark App通知 - - BARK_PUSH= - #telegram机器人通知 - - TG_BOT_TOKEN= - - TG_USER_ID= - #钉钉机器人通知 - - DD_BOT_TOKEN= - - DD_BOT_SECRET= - #企业微信机器人通知 - - QYWX_KEY= - #京东种豆得豆 - - PLANT_BEAN_SHARECODES= - #京东农场 - # 例: FRUITSHARECODES=京东农场的互助码 - - FRUITSHARECODES= - #京东萌宠 - # 例: PETSHARECODES=东东萌宠的互助码 - - PETSHARECODES= - # 宠汪汪的喂食数量 - - JOY_FEED_COUNT= - #东东超市 - # - SUPERMARKET_SHARECODES= - #兑换多少数量的京豆(20,或者1000京豆,或者其他奖品的文字) - # 例: MARKET_COIN_TO_BEANS=1000 - - MARKET_COIN_TO_BEANS= - #如果设置了 RANDOM_DELAY_MAX ,则会启用随机延迟功能,延迟随机 0 到 RANDOM_DELAY_MAX-1 秒。如果不设置此项,则不使用延迟。 - #并不是所有的脚本都会被启用延迟,因为有一些脚本需要整点触发。延迟的目的有两个,1是降低抢占cpu资源几率,2是降低检查风险(主要是1) - #填写数字,单位为秒,比如写为 RANDOM_DELAY_MAX=30 就是随机产生0到29之间的一个秒数,执行延迟的意思。 - - RANDOM_DELAY_MAX=120 - #使用自定义定任务覆盖默认任务,上面volumes挂载之后这里配置对应的文件名,和自定义文件使用方式为overwrite - - CUSTOM_LIST_FILE=my_crontab_list.sh - - CUSTOM_LIST_MERGE_TYPE=overwrite diff --git a/docker/example/default.yml b/docker/example/default.yml deleted file mode 100644 index 3ff4995..0000000 --- a/docker/example/default.yml +++ /dev/null @@ -1,59 +0,0 @@ -jd_scripts: - image: lxk0301/jd_scripts - # 配置服务器资源约束。此例子中服务被限制为使用内存不超过200M以及cpu不超过0.2(单核的20%) - # 经过实际测试,建议不低于200M - # deploy: - # resources: - # limits: - # cpus: '0.2' - # memory: 200M - container_name: jd_scripts - restart: always - volumes: - - ./logs:/scripts/logs - tty: true - # 因为更换仓库地址可能git pull的dns解析不到,可以在配置追加hosts - extra_hosts: - - "gitee.com:180.97.125.228" - - "github.com:13.229.188.59" - - "raw.githubusercontent.com:151.101.228.133" - environment: - #脚本更新仓库地址,配置了会切换到对应的地址 - - REPO_URL=git@gitee.com:lxk0301/jd_scripts.git - # 注意环境变量填写值的时候一律不需要引号(""或者'')下面这些只是示例,根据自己的需求增加删除 - #jd cookies - # 例: JD_COOKIE=pt_key=XXX;pt_pin=XXX; - # 例(多账号): JD_COOKIE=pt_key=XXX;pt_pin=XXX;&pt_key=XXX;pt_pin=XXX;&pt_key=XXX;pt_pin=XXX; - - JD_COOKIE= - #微信server酱通知 - - PUSH_KEY= - #Bark App通知 - - BARK_PUSH= - #telegram机器人通知 - - TG_BOT_TOKEN= - - TG_USER_ID= - #钉钉机器人通知 - - DD_BOT_TOKEN= - - DD_BOT_SECRET= - #企业微信机器人通知 - - QYWX_KEY= - #京东种豆得豆 - - PLANT_BEAN_SHARECODES= - #京东农场 - # 例: FRUITSHARECODES=京东农场的互助码 - - FRUITSHARECODES= - #京东萌宠 - # 例: PETSHARECODES=东东萌宠的互助码 - - PETSHARECODES= - # 宠汪汪的喂食数量 - - JOY_FEED_COUNT= - #东东超市 - # - SUPERMARKET_SHARECODES= - #兑换多少数量的京豆(20,或者1000京豆,或者其他奖品的文字) - # 例: MARKET_COIN_TO_BEANS=1000 - - MARKET_COIN_TO_BEANS= - - #如果设置了 RANDOM_DELAY_MAX ,则会启用随机延迟功能,延迟随机 0 到 RANDOM_DELAY_MAX-1 秒。如果不设置此项,则不使用延迟。 - #并不是所有的脚本都会被启用延迟,因为有一些脚本需要整点触发。延迟的目的有两个,1是降低抢占cpu资源几率,2是降低检查风险(主要是1) - #填写数字,单位为秒,比如写为 RANDOM_DELAY_MAX=30 就是随机产生0到29之间的一个秒数,执行延迟的意思。 - - RANDOM_DELAY_MAX=120 diff --git a/docker/example/docker多账户使用独立容器使用说明.md b/docker/example/docker多账户使用独立容器使用说明.md deleted file mode 100644 index 4fd879d..0000000 --- a/docker/example/docker多账户使用独立容器使用说明.md +++ /dev/null @@ -1,83 +0,0 @@ -### 使用此方式,请先理解学会使用[docker办法一](https://github.com/LXK9301/jd_scripts/tree/master/docker#%E5%88%9B%E5%BB%BA%E4%B8%80%E4%B8%AA%E7%9B%AE%E5%BD%95jd_scripts%E7%94%A8%E4%BA%8E%E5%AD%98%E6%94%BE%E5%A4%87%E4%BB%BD%E9%85%8D%E7%BD%AE%E7%AD%89%E6%95%B0%E6%8D%AE%E8%BF%81%E7%A7%BB%E9%87%8D%E8%A3%85%E7%9A%84%E6%97%B6%E5%80%99%E5%8F%AA%E9%9C%80%E8%A6%81%E5%A4%87%E4%BB%BD%E6%95%B4%E4%B8%AAjd_scripts%E7%9B%AE%E5%BD%95%E5%8D%B3%E5%8F%AF)的使用方式 -> 发现有人好像希望不同账户任务并发执行,不想一个账户执行完了才能再执行另一个,这里写一个`docker办法一`的基础上实现方式,其实就是不同账户创建不同的容器,他们互不干扰单独定时执行自己的任务。 -配置使用起来还是比较简单的,具体往下看 -### 文件夹目录参考 -![image](https://user-images.githubusercontent.com/6993269/97781779-885ae700-1bc8-11eb-93a4-b274cbd6062c.png) -### 具体使用说明直接在图片标注了,文件参考[图片下方](https://github.com/LXK9301/jd_scripts/new/master/docker#docker-composeyml%E6%96%87%E4%BB%B6%E5%8F%82%E8%80%83),配置完成后的[执行命令]() -![image](https://user-images.githubusercontent.com/6993269/97781610-a1af6380-1bc7-11eb-9397-903b47f5ad6b.png) -#### `docker-compose.yml`文件参考 -```yaml -version: "3" -services: - jd_scripts1: #默认 - image: lxk0301/jd_scripts - # 配置服务器资源约束。此例子中服务被限制为使用内存不超过200M以及cpu不超过 0.2(单核的20%) - # 经过实际测试,建议不低于200M - # deploy: - # resources: - # limits: - # cpus: '0.2' - # memory: 200M - restart: always - container_name: jd_scripts1 - tty: true - volumes: - - ./logs1:/scripts/logs - environment: - - JD_COOKIE=pt_key=AAJfjaNrADAS8ygfgIsOxxxxxxxKpfDaZ2pSBOYTxtPqLK8U1Q;pt_pin=lxxxxxx5; - - TG_BOT_TOKEN=130xxxx280:AAExxxxxxWP10zNf91WQ - - TG_USER_ID=12xxxx206 - # 互助助码等参数可自行增加,如下。 - # 京东种豆得豆 - # - PLANT_BEAN_SHARECODES= - - jd_scripts2: #默认 - image: lxk0301/jd_scripts - restart: always - container_name: jd_scripts2 - tty: true - volumes: - - ./logs2:/scripts/logs - environment: - - JD_COOKIE=pt_key=AAJfjaNrADAS8ygfgIsOxxxxxxxKpfDaZ2pSBOYTxtPqLK8U1Q;pt_pin=lxxxxxx5; - - TG_BOT_TOKEN=130xxxx280:AAExxxxxxWP10zNf91WQ - - TG_USER_ID=12xxxx206 - jd_scripts4: #自定义追加默认之后 - image: lxk0301/jd_scripts - restart: always - container_name: jd_scripts4 - tty: true - volumes: - - ./logs4:/scripts/logs - - ./my_crontab_list4.sh:/scripts/docker/my_crontab_list.sh - environment: - - JD_COOKIE=pt_key=AAJfjaNrADAS8ygfgIsOxxxxxxxKpfDaZ2pSBOYTxtPqLK8U1Q;pt_pin=lxxxxxx5; - - TG_BOT_TOKEN=130xxxx280:AAExxxxxxWP10zNf91WQ - - TG_USER_ID=12xxxx206 - - CUSTOM_LIST_FILE=my_crontab_list.sh - jd_scripts5: #自定义覆盖默认 - image: lxk0301/jd_scripts - restart: always - container_name: jd_scripts5 - tty: true - volumes: - - ./logs5:/scripts/logs - - ./my_crontab_list5.sh:/scripts/docker/my_crontab_list.sh - environment: - - JD_COOKIE=pt_key=AAJfjaNrADAS8ygfgIsOxxxxxxxKpfDaZ2pSBOYTxtPqLK8U1Q;pt_pin=lxxxxxx5; - - TG_BOT_TOKEN=130xxxx280:AAExxxxxxWP10zNf91WQ - - TG_USER_ID=12xxxx206 - - CUSTOM_LIST_FILE=my_crontab_list.sh - - CUSTOM_LIST_MERGE_TYPE=overwrite - -``` -#### 目录文件配置好之后在 `jd_scripts_multi`目录执行 - `docker-compose up -d` 启动; - `docker-compose logs` 打印日志; - `docker-compose pull` 更新镜像; - `docker-compose stop` 停止容器; - `docker-compose restart` 重启容器; - `docker-compose down` 停止并删除容器; - ![image](https://user-images.githubusercontent.com/6993269/97781935-8fcec000-1bc9-11eb-9d1a-d219e7a1caa9.png) - - diff --git a/docker/example/jd_scripts.custom-append.syno.json b/docker/example/jd_scripts.custom-append.syno.json deleted file mode 100644 index a2da16f..0000000 --- a/docker/example/jd_scripts.custom-append.syno.json +++ /dev/null @@ -1,65 +0,0 @@ -{ - "cap_add" : [], - "cap_drop" : [], - "cmd" : "", - "cpu_priority" : 50, - "devices" : null, - "enable_publish_all_ports" : false, - "enable_restart_policy" : true, - "enabled" : true, - "env_variables" : [ - { - "key" : "PATH", - "value" : "/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin" - }, - { - "key" : "CDN_JD_DAILYBONUS", - "value" : "true" - }, - { - "key" : "JD_COOKIE", - "value" : "pt_key=xxx;pt_pin=xxx;" - }, - { - "key" : "PUSH_KEY", - "value" : "" - }, - { - "key" : "CUSTOM_LIST_FILE", - "value" : "my_crontab_list.sh" - } - ], - "exporting" : false, - "id" : "3a2f6f27c23f93bc104585c22569c760cc9ce82df09cdb41d53b491fe1d0341c", - "image" : "lxk0301/jd_scripts", - "is_ddsm" : false, - "is_package" : false, - "links" : [], - "memory_limit" : 0, - "name" : "jd_scripts", - "network" : [ - { - "driver" : "bridge", - "name" : "bridge" - } - ], - "network_mode" : "default", - "port_bindings" : [], - "privileged" : false, - "shortcut" : { - "enable_shortcut" : false - }, - "use_host_network" : false, - "volume_bindings" : [ - { - "host_volume_file" : "/docker/jd_scripts/my_crontab_list.sh", - "mount_point" : "/scripts/docker/my_crontab_list.sh", - "type" : "rw" - }, - { - "host_volume_file" : "/docker/jd_scripts/logs", - "mount_point" : "/scripts/logs", - "type" : "rw" - } - ] -} diff --git a/docker/example/jd_scripts.custom-overwrite.syno.json b/docker/example/jd_scripts.custom-overwrite.syno.json deleted file mode 100644 index e4e05fb..0000000 --- a/docker/example/jd_scripts.custom-overwrite.syno.json +++ /dev/null @@ -1,69 +0,0 @@ -{ - "cap_add" : [], - "cap_drop" : [], - "cmd" : "", - "cpu_priority" : 50, - "devices" : null, - "enable_publish_all_ports" : false, - "enable_restart_policy" : true, - "enabled" : true, - "env_variables" : [ - { - "key" : "PATH", - "value" : "/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin" - }, - { - "key" : "CDN_JD_DAILYBONUS", - "value" : "true" - }, - { - "key" : "JD_COOKIE", - "value" : "pt_key=xxx;pt_pin=xxx;" - }, - { - "key" : "PUSH_KEY", - "value" : "" - }, - { - "key" : "CUSTOM_LIST_FILE", - "value" : "my_crontab_list.sh" - }, - { - "key" : "CUSTOM_LIST_MERGE_TYPE", - "value" : "overwrite" - } - ], - "exporting" : false, - "id" : "3a2f6f27c23f93bc104585c22569c760cc9ce82df09cdb41d53b491fe1d0341c", - "image" : "lxk0301/jd_scripts", - "is_ddsm" : false, - "is_package" : false, - "links" : [], - "memory_limit" : 0, - "name" : "jd_scripts", - "network" : [ - { - "driver" : "bridge", - "name" : "bridge" - } - ], - "network_mode" : "default", - "port_bindings" : [], - "privileged" : false, - "shortcut" : { - "enable_shortcut" : false - }, - "use_host_network" : false, - "volume_bindings" : [ - { - "host_volume_file" : "/docker/jd_scripts/my_crontab_list.sh", - "mount_point" : "/scripts/docker/my_crontab_list.sh", - "type" : "rw" - }, - { - "host_volume_file" : "/docker/jd_scripts/logs", - "mount_point" : "/scripts/logs", - "type" : "rw" - } - ] -} diff --git a/docker/example/jd_scripts.syno.json b/docker/example/jd_scripts.syno.json deleted file mode 100644 index 189b047..0000000 --- a/docker/example/jd_scripts.syno.json +++ /dev/null @@ -1,83 +0,0 @@ -{ - "cap_add" : null, - "cap_drop" : null, - "cmd" : "", - "cpu_priority" : 0, - "devices" : null, - "enable_publish_all_ports" : false, - "enable_restart_policy" : true, - "enabled" : false, - "env_variables" : [ - { - "key" : "PATH", - "value" : "/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin" - }, - { - "key" : "CDN_JD_DAILYBONUS", - "value" : "true" - }, - { - "key" : "JD_COOKIE", - "value" : "pt_key=AAJfjaNrADASxxxxxxxKpfDaZ2pSBOYTxtPqLK8U1Q;pt_pin=lxxxxx5;" - }, - { - "key" : "TG_BOT_TOKEN", - "value" : "13xxxxxx80:AAEkNxxxxxxzNf91WQ" - }, - { - "key" : "TG_USER_ID", - "value" : "12xxxx206" - }, - { - "key" : "PLANT_BEAN_SHARECODES", - "value" : "" - }, - { - "key" : "FRUITSHARECODES", - "value" : "" - }, - { - "key" : "PETSHARECODES", - "value" : "" - }, - { - "key" : "SUPERMARKET_SHARECODES", - "value" : "" - }, - { - "key" : "CRONTAB_LIST_FILE", - "value" : "crontab_list.sh" - } - ], - "exporting" : false, - "id" : "18af38bc0ac37a40e4b9608a86fef56c464577cc160bbdddec90155284fcf4e5", - "image" : "lxk0301/jd_scripts", - "is_ddsm" : false, - "is_package" : false, - "links" : [], - "memory_limit" : 0, - "name" : "jd_scripts", - "network" : [ - { - "driver" : "bridge", - "name" : "bridge" - } - ], - "network_mode" : "default", - "port_bindings" : [], - "privileged" : false, - "shortcut" : { - "enable_shortcut" : false, - "enable_status_page" : false, - "enable_web_page" : false, - "web_page_url" : "" - }, - "use_host_network" : false, - "volume_bindings" : [ - { - "host_volume_file" : "/docker/jd_scripts/logs", - "mount_point" : "/scripts/logs", - "type" : "rw" - } - ] -} diff --git a/docker/example/multi.yml b/docker/example/multi.yml deleted file mode 100644 index a02de0d..0000000 --- a/docker/example/multi.yml +++ /dev/null @@ -1,62 +0,0 @@ -version: "3" -services: - jd_scripts1: #默认 - image: lxk0301/jd_scripts - # 配置服务器资源约束。此例子中服务被限制为使用内存不超过200M以及cpu不超过 0.2(单核的20%) - # 经过实际测试,建议不低于200M - # deploy: - # resources: - # limits: - # cpus: '0.2' - # memory: 200M - restart: always - container_name: jd_scripts1 - tty: true - volumes: - - ./logs1:/scripts/logs - environment: - - JD_COOKIE=pt_key=AAJfjaNrADAS8ygfgIsOxxxxxxxKpfDaZ2pSBOYTxtPqLK8U1Q;pt_pin=lxxxxxx5; - - TG_BOT_TOKEN=130xxxx280:AAExxxxxxWP10zNf91WQ - - TG_USER_ID=12xxxx206 - # 互助助码等参数可自行增加,如下。 - # 京东种豆得豆 - # - PLANT_BEAN_SHARECODES= - - jd_scripts2: #默认 - image: lxk0301/jd_scripts - restart: always - container_name: jd_scripts2 - tty: true - volumes: - - ./logs2:/scripts/logs - environment: - - JD_COOKIE=pt_key=AAJfjaNrADAS8ygfgIsOxxxxxxxKpfDaZ2pSBOYTxtPqLK8U1Q;pt_pin=lxxxxxx5; - - TG_BOT_TOKEN=130xxxx280:AAExxxxxxWP10zNf91WQ - - TG_USER_ID=12xxxx206 - jd_scripts4: #自定义追加默认之后 - image: lxk0301/jd_scripts - restart: always - container_name: jd_scripts4 - tty: true - volumes: - - ./logs4:/scripts/logs - - ./my_crontab_list4.sh:/scripts/docker/my_crontab_list.sh - environment: - - JD_COOKIE=pt_key=AAJfjaNrADAS8ygfgIsOxxxxxxxKpfDaZ2pSBOYTxtPqLK8U1Q;pt_pin=lxxxxxx5; - - TG_BOT_TOKEN=130xxxx280:AAExxxxxxWP10zNf91WQ - - TG_USER_ID=12xxxx206 - - CUSTOM_LIST_FILE=my_crontab_list.sh - jd_scripts5: #自定义覆盖默认 - image: lxk0301/jd_scripts - restart: always - container_name: jd_scripts5 - tty: true - volumes: - - ./logs5:/scripts/logs - - ./my_crontab_list5.sh:/scripts/docker/my_crontab_list.sh - environment: - - JD_COOKIE=pt_key=AAJfjaNrADAS8ygfgIsOxxxxxxxKpfDaZ2pSBOYTxtPqLK8U1Q;pt_pin=lxxxxxx5; - - TG_BOT_TOKEN=130xxxx280:AAExxxxxxWP10zNf91WQ - - TG_USER_ID=12xxxx206 - - CUSTOM_LIST_FILE=my_crontab_list.sh - - CUSTOM_LIST_MERGE_TYPE=overwrite diff --git a/docker/notify_docker_user.js b/docker/notify_docker_user.js deleted file mode 100644 index 7ca2b0e..0000000 --- a/docker/notify_docker_user.js +++ /dev/null @@ -1,20 +0,0 @@ -const notify = require('../sendNotify'); -const fs = require('fs'); -const notifyPath = '/scripts/logs/notify.txt'; -async function image_update_notify() { - if (fs.existsSync(notifyPath)) { - const content = await fs.readFileSync(`${notifyPath}`, 'utf8');//读取notify.txt内容 - if (process.env.NOTIFY_CONTENT && !content.includes(process.env.NOTIFY_CONTENT)) { - await notify.sendNotify("⚠️Docker镜像版本更新通知⚠️", process.env.NOTIFY_CONTENT); - await fs.writeFileSync(`${notifyPath}`, process.env.NOTIFY_CONTENT); - } - } else { - if (process.env.NOTIFY_CONTENT) { - notify.sendNotify("⚠️Docker镜像版本更新通知⚠️", process.env.NOTIFY_CONTENT) - await fs.writeFileSync(`${notifyPath}`, process.env.NOTIFY_CONTENT); - } - } -} -!(async() => { - await image_update_notify(); -})().catch((e) => console.log(e)) \ No newline at end of file diff --git a/docker/proc_file.sh b/docker/proc_file.sh deleted file mode 100644 index 89f4627..0000000 --- a/docker/proc_file.sh +++ /dev/null @@ -1,27 +0,0 @@ -#!/bin/sh - -if [[ -f /usr/bin/jd_bot && -z "$DISABLE_SPNODE" ]]; then - CMD="spnode" -else - CMD="node" -fi - -echo "处理jd_crazy_joy_coin任务。。。" -if [ ! $CRZAY_JOY_COIN_ENABLE ]; then - echo "默认启用jd_crazy_joy_coin杀掉jd_crazy_joy_coin任务,并重启" - eval $(ps -ef | grep "jd_crazy_joy_coin" | grep -v "grep" | awk '{print "kill "$1}') - echo '' >/scripts/logs/jd_crazy_joy_coin.log - $CMD /scripts/jd_crazy_joy_coin.js | ts >>/scripts/logs/jd_crazy_joy_coin.log 2>&1 & - echo "默认jd_crazy_joy_coin重启完成" -else - if [ $CRZAY_JOY_COIN_ENABLE = "Y" ]; then - echo "配置启用jd_crazy_joy_coin,杀掉jd_crazy_joy_coin任务,并重启" - eval $(ps -ef | grep "jd_crazy_joy_coin" | grep -v "grep" | awk '{print "kill "$1}') - echo '' >/scripts/logs/jd_crazy_joy_coin.log - $CMD /scripts/jd_crazy_joy_coin.js | ts >>/scripts/logs/jd_crazy_joy_coin.log 2>&1 & - echo "配置jd_crazy_joy_coin重启完成" - else - eval $(ps -ef | grep "jd_crazy_joy_coin" | grep -v "grep" | awk '{print "kill "$1}') - echo "已配置不启用jd_crazy_joy_coin任务,仅杀掉" - fi -fi diff --git a/jd_jxlhb.js b/encrypted/jd_jxlhb.js similarity index 70% rename from jd_jxlhb.js rename to encrypted/jd_jxlhb.js index 0fa5c67..0f066ff 100644 --- a/jd_jxlhb.js +++ b/encrypted/jd_jxlhb.js @@ -1,23 +1,23 @@ /* 京喜领88元红包 -活动入口:京喜app-》我的-》京喜领88元红包 -助力逻辑:先自己京东账号相互助力,如有剩余助力机会,则助力作者 +活动入口:京喜APP-我的-签到领红包-天天领红包 +助力逻辑:自己京东账号相互助力 温馨提示:如提示助力火爆,可尝试寻找京东客服 脚本兼容: Quantumult X, Surge, Loon, JSBox, Node.js ==============Quantumult X============== [task_local] #京喜领88元红包 -4 2,10 * * * https://raw.githubusercontent.com/Aaron-lv/sync/jd_scripts/jd_jxlhb.js, tag=京喜领88元红包, img-url=https://raw.githubusercontent.com/Orz-3/mini/master/Color/jd.png, enabled=true +11 0,7 * * * https://raw.githubusercontent.com/KingRan/KR/main/jd_jxlhb.js, tag=京喜领88元红包, img-url=https://raw.githubusercontent.com/Orz-3/mini/master/Color/jd.png, enabled=true ==============Loon============== [Script] -cron "4 2,10 * * *" script-path=https://raw.githubusercontent.com/Aaron-lv/sync/jd_scripts/jd_jxlhb.js,tag=京喜领88元红包 +cron "11 0,7 * * *" script-path=https://raw.githubusercontent.com/KingRan/KR/main/jd_jxlhb.js,tag=京喜领88元红包 ================Surge=============== -京喜领88元红包 = type=cron,cronexp="4 2,10 * * *",wake-system=1,timeout=3600,script-path=https://raw.githubusercontent.com/Aaron-lv/sync/jd_scripts/jd_jxlhb.js +京喜领88元红包 = type=cron,cronexp="11 0,7 * * *",wake-system=1,timeout=3600,script-path=https://raw.githubusercontent.com/KingRan/KR/main/jd_jxlhb.js ===============小火箭========== -京喜领88元红包 = type=cron,script-path=https://raw.githubusercontent.com/Aaron-lv/sync/jd_scripts/jd_jxlhb.js, cronexpr="4 2,10 * * *", timeout=3600, enable=true +京喜领88元红包 = type=cron,script-path=https://raw.githubusercontent.com/KingRan/KR/main/jd_jxlhb.js, cronexpr="11 0,7 * * *", timeout=3600, enable=true */ !function (t, r) { "object" == typeof exports ? module.exports = exports = r() : "function" == typeof define && define.amd ? define([], r) : t.CryptoJS = r() }(this, function () { var t = t || function (t, r) { var e = Object.create || function () { function t() { } return function (r) { var e; return t.prototype = r, e = new t, t.prototype = null, e } }(), i = {}, n = i.lib = {}, o = n.Base = function () { return { extend: function (t) { var r = e(this); return t && r.mixIn(t), r.hasOwnProperty("init") && this.init !== r.init || (r.init = function () { r.$super.init.apply(this, arguments) }), r.init.prototype = r, r.$super = this, r }, create: function () { var t = this.extend(); return t.init.apply(t, arguments), t }, init: function () { }, mixIn: function (t) { for (var r in t) t.hasOwnProperty(r) && (this[r] = t[r]); t.hasOwnProperty("toString") && (this.toString = t.toString) }, clone: function () { return this.init.prototype.extend(this) } } }(), s = n.WordArray = o.extend({ init: function (t, e) { t = this.words = t || [], e != r ? this.sigBytes = e : this.sigBytes = 4 * t.length }, toString: function (t) { return (t || c).stringify(this) }, concat: function (t) { var r = this.words, e = t.words, i = this.sigBytes, n = t.sigBytes; if (this.clamp(), i % 4) for (var o = 0; o < n; o++) { var s = e[o >>> 2] >>> 24 - o % 4 * 8 & 255; r[i + o >>> 2] |= s << 24 - (i + o) % 4 * 8 } else for (var o = 0; o < n; o += 4)r[i + o >>> 2] = e[o >>> 2]; return this.sigBytes += n, this }, clamp: function () { var r = this.words, e = this.sigBytes; r[e >>> 2] &= 4294967295 << 32 - e % 4 * 8, r.length = t.ceil(e / 4) }, clone: function () { var t = o.clone.call(this); return t.words = this.words.slice(0), t }, random: function (r) { for (var e, i = [], n = function (r) { var r = r, e = 987654321, i = 4294967295; return function () { e = 36969 * (65535 & e) + (e >> 16) & i, r = 18e3 * (65535 & r) + (r >> 16) & i; var n = (e << 16) + r & i; return n /= 4294967296, n += .5, n * (t.random() > .5 ? 1 : -1) } }, o = 0; o < r; o += 4) { var a = n(4294967296 * (e || t.random())); e = 987654071 * a(), i.push(4294967296 * a() | 0) } return new s.init(i, r) } }), a = i.enc = {}, c = a.Hex = { stringify: function (t) { for (var r = t.words, e = t.sigBytes, i = [], n = 0; n < e; n++) { var o = r[n >>> 2] >>> 24 - n % 4 * 8 & 255; i.push((o >>> 4).toString(16)), i.push((15 & o).toString(16)) } return i.join("") }, parse: function (t) { for (var r = t.length, e = [], i = 0; i < r; i += 2)e[i >>> 3] |= parseInt(t.substr(i, 2), 16) << 24 - i % 8 * 4; return new s.init(e, r / 2) } }, h = a.Latin1 = { stringify: function (t) { for (var r = t.words, e = t.sigBytes, i = [], n = 0; n < e; n++) { var o = r[n >>> 2] >>> 24 - n % 4 * 8 & 255; i.push(String.fromCharCode(o)) } return i.join("") }, parse: function (t) { for (var r = t.length, e = [], i = 0; i < r; i++)e[i >>> 2] |= (255 & t.charCodeAt(i)) << 24 - i % 4 * 8; return new s.init(e, r) } }, l = a.Utf8 = { stringify: function (t) { try { return decodeURIComponent(escape(h.stringify(t))) } catch (t) { throw new Error("Malformed UTF-8 data") } }, parse: function (t) { return h.parse(unescape(encodeURIComponent(t))) } }, f = n.BufferedBlockAlgorithm = o.extend({ reset: function () { this._data = new s.init, this._nDataBytes = 0 }, _append: function (t) { "string" == typeof t && (t = l.parse(t)), this._data.concat(t), this._nDataBytes += t.sigBytes }, _process: function (r) { var e = this._data, i = e.words, n = e.sigBytes, o = this.blockSize, a = 4 * o, c = n / a; c = r ? t.ceil(c) : t.max((0 | c) - this._minBufferSize, 0); var h = c * o, l = t.min(4 * h, n); if (h) { for (var f = 0; f < h; f += o)this._doProcessBlock(i, f); var u = i.splice(0, h); e.sigBytes -= l } return new s.init(u, l) }, clone: function () { var t = o.clone.call(this); return t._data = this._data.clone(), t }, _minBufferSize: 0 }), u = (n.Hasher = f.extend({ cfg: o.extend(), init: function (t) { this.cfg = this.cfg.extend(t), this.reset() }, reset: function () { f.reset.call(this), this._doReset() }, update: function (t) { return this._append(t), this._process(), this }, finalize: function (t) { t && this._append(t); var r = this._doFinalize(); return r }, blockSize: 16, _createHelper: function (t) { return function (r, e) { return new t.init(e).finalize(r) } }, _createHmacHelper: function (t) { return function (r, e) { return new u.HMAC.init(t, e).finalize(r) } } }), i.algo = {}); return i }(Math); return function () { function r(t, r, e) { for (var i = [], o = 0, s = 0; s < r; s++)if (s % 4) { var a = e[t.charCodeAt(s - 1)] << s % 4 * 2, c = e[t.charCodeAt(s)] >>> 6 - s % 4 * 2; i[o >>> 2] |= (a | c) << 24 - o % 4 * 8, o++ } return n.create(i, o) } var e = t, i = e.lib, n = i.WordArray, o = e.enc; o.Base64 = { stringify: function (t) { var r = t.words, e = t.sigBytes, i = this._map; t.clamp(); for (var n = [], o = 0; o < e; o += 3)for (var s = r[o >>> 2] >>> 24 - o % 4 * 8 & 255, a = r[o + 1 >>> 2] >>> 24 - (o + 1) % 4 * 8 & 255, c = r[o + 2 >>> 2] >>> 24 - (o + 2) % 4 * 8 & 255, h = s << 16 | a << 8 | c, l = 0; l < 4 && o + .75 * l < e; l++)n.push(i.charAt(h >>> 6 * (3 - l) & 63)); var f = i.charAt(64); if (f) for (; n.length % 4;)n.push(f); return n.join("") }, parse: function (t) { var e = t.length, i = this._map, n = this._reverseMap; if (!n) { n = this._reverseMap = []; for (var o = 0; o < i.length; o++)n[i.charCodeAt(o)] = o } var s = i.charAt(64); if (s) { var a = t.indexOf(s); a !== -1 && (e = a) } return r(t, e, n) }, _map: "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=" } }(), function (r) { function e(t, r, e, i, n, o, s) { var a = t + (r & e | ~r & i) + n + s; return (a << o | a >>> 32 - o) + r } function i(t, r, e, i, n, o, s) { var a = t + (r & i | e & ~i) + n + s; return (a << o | a >>> 32 - o) + r } function n(t, r, e, i, n, o, s) { var a = t + (r ^ e ^ i) + n + s; return (a << o | a >>> 32 - o) + r } function o(t, r, e, i, n, o, s) { var a = t + (e ^ (r | ~i)) + n + s; return (a << o | a >>> 32 - o) + r } var s = t, a = s.lib, c = a.WordArray, h = a.Hasher, l = s.algo, f = []; !function () { for (var t = 0; t < 64; t++)f[t] = 4294967296 * r.abs(r.sin(t + 1)) | 0 }(); var u = l.MD5 = h.extend({ _doReset: function () { this._hash = new c.init([1732584193, 4023233417, 2562383102, 271733878]) }, _doProcessBlock: function (t, r) { for (var s = 0; s < 16; s++) { var a = r + s, c = t[a]; t[a] = 16711935 & (c << 8 | c >>> 24) | 4278255360 & (c << 24 | c >>> 8) } var h = this._hash.words, l = t[r + 0], u = t[r + 1], d = t[r + 2], v = t[r + 3], p = t[r + 4], _ = t[r + 5], y = t[r + 6], g = t[r + 7], B = t[r + 8], w = t[r + 9], k = t[r + 10], S = t[r + 11], m = t[r + 12], x = t[r + 13], b = t[r + 14], H = t[r + 15], z = h[0], A = h[1], C = h[2], D = h[3]; z = e(z, A, C, D, l, 7, f[0]), D = e(D, z, A, C, u, 12, f[1]), C = e(C, D, z, A, d, 17, f[2]), A = e(A, C, D, z, v, 22, f[3]), z = e(z, A, C, D, p, 7, f[4]), D = e(D, z, A, C, _, 12, f[5]), C = e(C, D, z, A, y, 17, f[6]), A = e(A, C, D, z, g, 22, f[7]), z = e(z, A, C, D, B, 7, f[8]), D = e(D, z, A, C, w, 12, f[9]), C = e(C, D, z, A, k, 17, f[10]), A = e(A, C, D, z, S, 22, f[11]), z = e(z, A, C, D, m, 7, f[12]), D = e(D, z, A, C, x, 12, f[13]), C = e(C, D, z, A, b, 17, f[14]), A = e(A, C, D, z, H, 22, f[15]), z = i(z, A, C, D, u, 5, f[16]), D = i(D, z, A, C, y, 9, f[17]), C = i(C, D, z, A, S, 14, f[18]), A = i(A, C, D, z, l, 20, f[19]), z = i(z, A, C, D, _, 5, f[20]), D = i(D, z, A, C, k, 9, f[21]), C = i(C, D, z, A, H, 14, f[22]), A = i(A, C, D, z, p, 20, f[23]), z = i(z, A, C, D, w, 5, f[24]), D = i(D, z, A, C, b, 9, f[25]), C = i(C, D, z, A, v, 14, f[26]), A = i(A, C, D, z, B, 20, f[27]), z = i(z, A, C, D, x, 5, f[28]), D = i(D, z, A, C, d, 9, f[29]), C = i(C, D, z, A, g, 14, f[30]), A = i(A, C, D, z, m, 20, f[31]), z = n(z, A, C, D, _, 4, f[32]), D = n(D, z, A, C, B, 11, f[33]), C = n(C, D, z, A, S, 16, f[34]), A = n(A, C, D, z, b, 23, f[35]), z = n(z, A, C, D, u, 4, f[36]), D = n(D, z, A, C, p, 11, f[37]), C = n(C, D, z, A, g, 16, f[38]), A = n(A, C, D, z, k, 23, f[39]), z = n(z, A, C, D, x, 4, f[40]), D = n(D, z, A, C, l, 11, f[41]), C = n(C, D, z, A, v, 16, f[42]), A = n(A, C, D, z, y, 23, f[43]), z = n(z, A, C, D, w, 4, f[44]), D = n(D, z, A, C, m, 11, f[45]), C = n(C, D, z, A, H, 16, f[46]), A = n(A, C, D, z, d, 23, f[47]), z = o(z, A, C, D, l, 6, f[48]), D = o(D, z, A, C, g, 10, f[49]), C = o(C, D, z, A, b, 15, f[50]), A = o(A, C, D, z, _, 21, f[51]), z = o(z, A, C, D, m, 6, f[52]), D = o(D, z, A, C, v, 10, f[53]), C = o(C, D, z, A, k, 15, f[54]), A = o(A, C, D, z, u, 21, f[55]), z = o(z, A, C, D, B, 6, f[56]), D = o(D, z, A, C, H, 10, f[57]), C = o(C, D, z, A, y, 15, f[58]), A = o(A, C, D, z, x, 21, f[59]), z = o(z, A, C, D, p, 6, f[60]), D = o(D, z, A, C, S, 10, f[61]), C = o(C, D, z, A, d, 15, f[62]), A = o(A, C, D, z, w, 21, f[63]), h[0] = h[0] + z | 0, h[1] = h[1] + A | 0, h[2] = h[2] + C | 0, h[3] = h[3] + D | 0 }, _doFinalize: function () { var t = this._data, e = t.words, i = 8 * this._nDataBytes, n = 8 * t.sigBytes; e[n >>> 5] |= 128 << 24 - n % 32; var o = r.floor(i / 4294967296), s = i; e[(n + 64 >>> 9 << 4) + 15] = 16711935 & (o << 8 | o >>> 24) | 4278255360 & (o << 24 | o >>> 8), e[(n + 64 >>> 9 << 4) + 14] = 16711935 & (s << 8 | s >>> 24) | 4278255360 & (s << 24 | s >>> 8), t.sigBytes = 4 * (e.length + 1), this._process(); for (var a = this._hash, c = a.words, h = 0; h < 4; h++) { var l = c[h]; c[h] = 16711935 & (l << 8 | l >>> 24) | 4278255360 & (l << 24 | l >>> 8) } return a }, clone: function () { var t = h.clone.call(this); return t._hash = this._hash.clone(), t } }); s.MD5 = h._createHelper(u), s.HmacMD5 = h._createHmacHelper(u) }(Math), function () { var r = t, e = r.lib, i = e.WordArray, n = e.Hasher, o = r.algo, s = [], a = o.SHA1 = n.extend({ _doReset: function () { this._hash = new i.init([1732584193, 4023233417, 2562383102, 271733878, 3285377520]) }, _doProcessBlock: function (t, r) { for (var e = this._hash.words, i = e[0], n = e[1], o = e[2], a = e[3], c = e[4], h = 0; h < 80; h++) { if (h < 16) s[h] = 0 | t[r + h]; else { var l = s[h - 3] ^ s[h - 8] ^ s[h - 14] ^ s[h - 16]; s[h] = l << 1 | l >>> 31 } var f = (i << 5 | i >>> 27) + c + s[h]; f += h < 20 ? (n & o | ~n & a) + 1518500249 : h < 40 ? (n ^ o ^ a) + 1859775393 : h < 60 ? (n & o | n & a | o & a) - 1894007588 : (n ^ o ^ a) - 899497514, c = a, a = o, o = n << 30 | n >>> 2, n = i, i = f } e[0] = e[0] + i | 0, e[1] = e[1] + n | 0, e[2] = e[2] + o | 0, e[3] = e[3] + a | 0, e[4] = e[4] + c | 0 }, _doFinalize: function () { var t = this._data, r = t.words, e = 8 * this._nDataBytes, i = 8 * t.sigBytes; return r[i >>> 5] |= 128 << 24 - i % 32, r[(i + 64 >>> 9 << 4) + 14] = Math.floor(e / 4294967296), r[(i + 64 >>> 9 << 4) + 15] = e, t.sigBytes = 4 * r.length, this._process(), this._hash }, clone: function () { var t = n.clone.call(this); return t._hash = this._hash.clone(), t } }); r.SHA1 = n._createHelper(a), r.HmacSHA1 = n._createHmacHelper(a) }(), function (r) { var e = t, i = e.lib, n = i.WordArray, o = i.Hasher, s = e.algo, a = [], c = []; !function () { function t(t) { for (var e = r.sqrt(t), i = 2; i <= e; i++)if (!(t % i)) return !1; return !0 } function e(t) { return 4294967296 * (t - (0 | t)) | 0 } for (var i = 2, n = 0; n < 64;)t(i) && (n < 8 && (a[n] = e(r.pow(i, .5))), c[n] = e(r.pow(i, 1 / 3)), n++), i++ }(); var h = [], l = s.SHA256 = o.extend({ _doReset: function () { this._hash = new n.init(a.slice(0)) }, _doProcessBlock: function (t, r) { for (var e = this._hash.words, i = e[0], n = e[1], o = e[2], s = e[3], a = e[4], l = e[5], f = e[6], u = e[7], d = 0; d < 64; d++) { if (d < 16) h[d] = 0 | t[r + d]; else { var v = h[d - 15], p = (v << 25 | v >>> 7) ^ (v << 14 | v >>> 18) ^ v >>> 3, _ = h[d - 2], y = (_ << 15 | _ >>> 17) ^ (_ << 13 | _ >>> 19) ^ _ >>> 10; h[d] = p + h[d - 7] + y + h[d - 16] } var g = a & l ^ ~a & f, B = i & n ^ i & o ^ n & o, w = (i << 30 | i >>> 2) ^ (i << 19 | i >>> 13) ^ (i << 10 | i >>> 22), k = (a << 26 | a >>> 6) ^ (a << 21 | a >>> 11) ^ (a << 7 | a >>> 25), S = u + k + g + c[d] + h[d], m = w + B; u = f, f = l, l = a, a = s + S | 0, s = o, o = n, n = i, i = S + m | 0 } e[0] = e[0] + i | 0, e[1] = e[1] + n | 0, e[2] = e[2] + o | 0, e[3] = e[3] + s | 0, e[4] = e[4] + a | 0, e[5] = e[5] + l | 0, e[6] = e[6] + f | 0, e[7] = e[7] + u | 0 }, _doFinalize: function () { var t = this._data, e = t.words, i = 8 * this._nDataBytes, n = 8 * t.sigBytes; return e[n >>> 5] |= 128 << 24 - n % 32, e[(n + 64 >>> 9 << 4) + 14] = r.floor(i / 4294967296), e[(n + 64 >>> 9 << 4) + 15] = i, t.sigBytes = 4 * e.length, this._process(), this._hash }, clone: function () { var t = o.clone.call(this); return t._hash = this._hash.clone(), t } }); e.SHA256 = o._createHelper(l), e.HmacSHA256 = o._createHmacHelper(l) }(Math), function () { function r(t) { return t << 8 & 4278255360 | t >>> 8 & 16711935 } var e = t, i = e.lib, n = i.WordArray, o = e.enc; o.Utf16 = o.Utf16BE = { stringify: function (t) { for (var r = t.words, e = t.sigBytes, i = [], n = 0; n < e; n += 2) { var o = r[n >>> 2] >>> 16 - n % 4 * 8 & 65535; i.push(String.fromCharCode(o)) } return i.join("") }, parse: function (t) { for (var r = t.length, e = [], i = 0; i < r; i++)e[i >>> 1] |= t.charCodeAt(i) << 16 - i % 2 * 16; return n.create(e, 2 * r) } }; o.Utf16LE = { stringify: function (t) { for (var e = t.words, i = t.sigBytes, n = [], o = 0; o < i; o += 2) { var s = r(e[o >>> 2] >>> 16 - o % 4 * 8 & 65535); n.push(String.fromCharCode(s)) } return n.join("") }, parse: function (t) { for (var e = t.length, i = [], o = 0; o < e; o++)i[o >>> 1] |= r(t.charCodeAt(o) << 16 - o % 2 * 16); return n.create(i, 2 * e) } } }(), function () { if ("function" == typeof ArrayBuffer) { var r = t, e = r.lib, i = e.WordArray, n = i.init, o = i.init = function (t) { if (t instanceof ArrayBuffer && (t = new Uint8Array(t)), (t instanceof Int8Array || "undefined" != typeof Uint8ClampedArray && t instanceof Uint8ClampedArray || t instanceof Int16Array || t instanceof Uint16Array || t instanceof Int32Array || t instanceof Uint32Array || t instanceof Float32Array || t instanceof Float64Array) && (t = new Uint8Array(t.buffer, t.byteOffset, t.byteLength)), t instanceof Uint8Array) { for (var r = t.byteLength, e = [], i = 0; i < r; i++)e[i >>> 2] |= t[i] << 24 - i % 4 * 8; n.call(this, e, r) } else n.apply(this, arguments) }; o.prototype = i } }(), function (r) { function e(t, r, e) { return t ^ r ^ e } function i(t, r, e) { return t & r | ~t & e } function n(t, r, e) { return (t | ~r) ^ e } function o(t, r, e) { return t & e | r & ~e } function s(t, r, e) { return t ^ (r | ~e) } function a(t, r) { return t << r | t >>> 32 - r } var c = t, h = c.lib, l = h.WordArray, f = h.Hasher, u = c.algo, d = l.create([0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 7, 4, 13, 1, 10, 6, 15, 3, 12, 0, 9, 5, 2, 14, 11, 8, 3, 10, 14, 4, 9, 15, 8, 1, 2, 7, 0, 6, 13, 11, 5, 12, 1, 9, 11, 10, 0, 8, 12, 4, 13, 3, 7, 15, 14, 5, 6, 2, 4, 0, 5, 9, 7, 12, 2, 10, 14, 1, 3, 8, 11, 6, 15, 13]), v = l.create([5, 14, 7, 0, 9, 2, 11, 4, 13, 6, 15, 8, 1, 10, 3, 12, 6, 11, 3, 7, 0, 13, 5, 10, 14, 15, 8, 12, 4, 9, 1, 2, 15, 5, 1, 3, 7, 14, 6, 9, 11, 8, 12, 2, 10, 0, 4, 13, 8, 6, 4, 1, 3, 11, 15, 0, 5, 12, 2, 13, 9, 7, 10, 14, 12, 15, 10, 4, 1, 5, 8, 7, 6, 2, 13, 14, 0, 3, 9, 11]), p = l.create([11, 14, 15, 12, 5, 8, 7, 9, 11, 13, 14, 15, 6, 7, 9, 8, 7, 6, 8, 13, 11, 9, 7, 15, 7, 12, 15, 9, 11, 7, 13, 12, 11, 13, 6, 7, 14, 9, 13, 15, 14, 8, 13, 6, 5, 12, 7, 5, 11, 12, 14, 15, 14, 15, 9, 8, 9, 14, 5, 6, 8, 6, 5, 12, 9, 15, 5, 11, 6, 8, 13, 12, 5, 12, 13, 14, 11, 8, 5, 6]), _ = l.create([8, 9, 9, 11, 13, 15, 15, 5, 7, 7, 8, 11, 14, 14, 12, 6, 9, 13, 15, 7, 12, 8, 9, 11, 7, 7, 12, 7, 6, 15, 13, 11, 9, 7, 15, 11, 8, 6, 6, 14, 12, 13, 5, 14, 13, 13, 7, 5, 15, 5, 8, 11, 14, 14, 6, 14, 6, 9, 12, 9, 12, 5, 15, 8, 8, 5, 12, 9, 12, 5, 14, 6, 8, 13, 6, 5, 15, 13, 11, 11]), y = l.create([0, 1518500249, 1859775393, 2400959708, 2840853838]), g = l.create([1352829926, 1548603684, 1836072691, 2053994217, 0]), B = u.RIPEMD160 = f.extend({ _doReset: function () { this._hash = l.create([1732584193, 4023233417, 2562383102, 271733878, 3285377520]) }, _doProcessBlock: function (t, r) { for (var c = 0; c < 16; c++) { var h = r + c, l = t[h]; t[h] = 16711935 & (l << 8 | l >>> 24) | 4278255360 & (l << 24 | l >>> 8) } var f, u, B, w, k, S, m, x, b, H, z = this._hash.words, A = y.words, C = g.words, D = d.words, R = v.words, E = p.words, M = _.words; S = f = z[0], m = u = z[1], x = B = z[2], b = w = z[3], H = k = z[4]; for (var F, c = 0; c < 80; c += 1)F = f + t[r + D[c]] | 0, F += c < 16 ? e(u, B, w) + A[0] : c < 32 ? i(u, B, w) + A[1] : c < 48 ? n(u, B, w) + A[2] : c < 64 ? o(u, B, w) + A[3] : s(u, B, w) + A[4], F |= 0, F = a(F, E[c]), F = F + k | 0, f = k, k = w, w = a(B, 10), B = u, u = F, F = S + t[r + R[c]] | 0, F += c < 16 ? s(m, x, b) + C[0] : c < 32 ? o(m, x, b) + C[1] : c < 48 ? n(m, x, b) + C[2] : c < 64 ? i(m, x, b) + C[3] : e(m, x, b) + C[4], F |= 0, F = a(F, M[c]), F = F + H | 0, S = H, H = b, b = a(x, 10), x = m, m = F; F = z[1] + B + b | 0, z[1] = z[2] + w + H | 0, z[2] = z[3] + k + S | 0, z[3] = z[4] + f + m | 0, z[4] = z[0] + u + x | 0, z[0] = F }, _doFinalize: function () { var t = this._data, r = t.words, e = 8 * this._nDataBytes, i = 8 * t.sigBytes; r[i >>> 5] |= 128 << 24 - i % 32, r[(i + 64 >>> 9 << 4) + 14] = 16711935 & (e << 8 | e >>> 24) | 4278255360 & (e << 24 | e >>> 8), t.sigBytes = 4 * (r.length + 1), this._process(); for (var n = this._hash, o = n.words, s = 0; s < 5; s++) { var a = o[s]; o[s] = 16711935 & (a << 8 | a >>> 24) | 4278255360 & (a << 24 | a >>> 8) } return n }, clone: function () { var t = f.clone.call(this); return t._hash = this._hash.clone(), t } }); c.RIPEMD160 = f._createHelper(B), c.HmacRIPEMD160 = f._createHmacHelper(B) }(Math), function () { var r = t, e = r.lib, i = e.Base, n = r.enc, o = n.Utf8, s = r.algo; s.HMAC = i.extend({ init: function (t, r) { t = this._hasher = new t.init, "string" == typeof r && (r = o.parse(r)); var e = t.blockSize, i = 4 * e; r.sigBytes > i && (r = t.finalize(r)), r.clamp(); for (var n = this._oKey = r.clone(), s = this._iKey = r.clone(), a = n.words, c = s.words, h = 0; h < e; h++)a[h] ^= 1549556828, c[h] ^= 909522486; n.sigBytes = s.sigBytes = i, this.reset() }, reset: function () { var t = this._hasher; t.reset(), t.update(this._iKey) }, update: function (t) { return this._hasher.update(t), this }, finalize: function (t) { var r = this._hasher, e = r.finalize(t); r.reset(); var i = r.finalize(this._oKey.clone().concat(e)); return i } }) }(), function () { var r = t, e = r.lib, i = e.Base, n = e.WordArray, o = r.algo, s = o.SHA1, a = o.HMAC, c = o.PBKDF2 = i.extend({ cfg: i.extend({ keySize: 4, hasher: s, iterations: 1 }), init: function (t) { this.cfg = this.cfg.extend(t) }, compute: function (t, r) { for (var e = this.cfg, i = a.create(e.hasher, t), o = n.create(), s = n.create([1]), c = o.words, h = s.words, l = e.keySize, f = e.iterations; c.length < l;) { var u = i.update(r).finalize(s); i.reset(); for (var d = u.words, v = d.length, p = u, _ = 1; _ < f; _++) { p = i.finalize(p), i.reset(); for (var y = p.words, g = 0; g < v; g++)d[g] ^= y[g] } o.concat(u), h[0]++ } return o.sigBytes = 4 * l, o } }); r.PBKDF2 = function (t, r, e) { return c.create(e).compute(t, r) } }(), function () { var r = t, e = r.lib, i = e.Base, n = e.WordArray, o = r.algo, s = o.MD5, a = o.EvpKDF = i.extend({ cfg: i.extend({ keySize: 4, hasher: s, iterations: 1 }), init: function (t) { this.cfg = this.cfg.extend(t) }, compute: function (t, r) { for (var e = this.cfg, i = e.hasher.create(), o = n.create(), s = o.words, a = e.keySize, c = e.iterations; s.length < a;) { h && i.update(h); var h = i.update(t).finalize(r); i.reset(); for (var l = 1; l < c; l++)h = i.finalize(h), i.reset(); o.concat(h) } return o.sigBytes = 4 * a, o } }); r.EvpKDF = function (t, r, e) { return a.create(e).compute(t, r) } }(), function () { var r = t, e = r.lib, i = e.WordArray, n = r.algo, o = n.SHA256, s = n.SHA224 = o.extend({ _doReset: function () { this._hash = new i.init([3238371032, 914150663, 812702999, 4144912697, 4290775857, 1750603025, 1694076839, 3204075428]) }, _doFinalize: function () { var t = o._doFinalize.call(this); return t.sigBytes -= 4, t } }); r.SHA224 = o._createHelper(s), r.HmacSHA224 = o._createHmacHelper(s) }(), function (r) { var e = t, i = e.lib, n = i.Base, o = i.WordArray, s = e.x64 = {}; s.Word = n.extend({ init: function (t, r) { this.high = t, this.low = r } }), s.WordArray = n.extend({ init: function (t, e) { t = this.words = t || [], e != r ? this.sigBytes = e : this.sigBytes = 8 * t.length }, toX32: function () { for (var t = this.words, r = t.length, e = [], i = 0; i < r; i++) { var n = t[i]; e.push(n.high), e.push(n.low) } return o.create(e, this.sigBytes) }, clone: function () { for (var t = n.clone.call(this), r = t.words = this.words.slice(0), e = r.length, i = 0; i < e; i++)r[i] = r[i].clone(); return t } }) }(), function (r) { var e = t, i = e.lib, n = i.WordArray, o = i.Hasher, s = e.x64, a = s.Word, c = e.algo, h = [], l = [], f = []; !function () { for (var t = 1, r = 0, e = 0; e < 24; e++) { h[t + 5 * r] = (e + 1) * (e + 2) / 2 % 64; var i = r % 5, n = (2 * t + 3 * r) % 5; t = i, r = n } for (var t = 0; t < 5; t++)for (var r = 0; r < 5; r++)l[t + 5 * r] = r + (2 * t + 3 * r) % 5 * 5; for (var o = 1, s = 0; s < 24; s++) { for (var c = 0, u = 0, d = 0; d < 7; d++) { if (1 & o) { var v = (1 << d) - 1; v < 32 ? u ^= 1 << v : c ^= 1 << v - 32 } 128 & o ? o = o << 1 ^ 113 : o <<= 1 } f[s] = a.create(c, u) } }(); var u = []; !function () { for (var t = 0; t < 25; t++)u[t] = a.create() }(); var d = c.SHA3 = o.extend({ cfg: o.cfg.extend({ outputLength: 512 }), _doReset: function () { for (var t = this._state = [], r = 0; r < 25; r++)t[r] = new a.init; this.blockSize = (1600 - 2 * this.cfg.outputLength) / 32 }, _doProcessBlock: function (t, r) { for (var e = this._state, i = this.blockSize / 2, n = 0; n < i; n++) { var o = t[r + 2 * n], s = t[r + 2 * n + 1]; o = 16711935 & (o << 8 | o >>> 24) | 4278255360 & (o << 24 | o >>> 8), s = 16711935 & (s << 8 | s >>> 24) | 4278255360 & (s << 24 | s >>> 8); var a = e[n]; a.high ^= s, a.low ^= o } for (var c = 0; c < 24; c++) { for (var d = 0; d < 5; d++) { for (var v = 0, p = 0, _ = 0; _ < 5; _++) { var a = e[d + 5 * _]; v ^= a.high, p ^= a.low } var y = u[d]; y.high = v, y.low = p } for (var d = 0; d < 5; d++)for (var g = u[(d + 4) % 5], B = u[(d + 1) % 5], w = B.high, k = B.low, v = g.high ^ (w << 1 | k >>> 31), p = g.low ^ (k << 1 | w >>> 31), _ = 0; _ < 5; _++) { var a = e[d + 5 * _]; a.high ^= v, a.low ^= p } for (var S = 1; S < 25; S++) { var a = e[S], m = a.high, x = a.low, b = h[S]; if (b < 32) var v = m << b | x >>> 32 - b, p = x << b | m >>> 32 - b; else var v = x << b - 32 | m >>> 64 - b, p = m << b - 32 | x >>> 64 - b; var H = u[l[S]]; H.high = v, H.low = p } var z = u[0], A = e[0]; z.high = A.high, z.low = A.low; for (var d = 0; d < 5; d++)for (var _ = 0; _ < 5; _++) { var S = d + 5 * _, a = e[S], C = u[S], D = u[(d + 1) % 5 + 5 * _], R = u[(d + 2) % 5 + 5 * _]; a.high = C.high ^ ~D.high & R.high, a.low = C.low ^ ~D.low & R.low } var a = e[0], E = f[c]; a.high ^= E.high, a.low ^= E.low } }, _doFinalize: function () { var t = this._data, e = t.words, i = (8 * this._nDataBytes, 8 * t.sigBytes), o = 32 * this.blockSize; e[i >>> 5] |= 1 << 24 - i % 32, e[(r.ceil((i + 1) / o) * o >>> 5) - 1] |= 128, t.sigBytes = 4 * e.length, this._process(); for (var s = this._state, a = this.cfg.outputLength / 8, c = a / 8, h = [], l = 0; l < c; l++) { var f = s[l], u = f.high, d = f.low; u = 16711935 & (u << 8 | u >>> 24) | 4278255360 & (u << 24 | u >>> 8), d = 16711935 & (d << 8 | d >>> 24) | 4278255360 & (d << 24 | d >>> 8), h.push(d), h.push(u) } return new n.init(h, a) }, clone: function () { for (var t = o.clone.call(this), r = t._state = this._state.slice(0), e = 0; e < 25; e++)r[e] = r[e].clone(); return t } }); e.SHA3 = o._createHelper(d), e.HmacSHA3 = o._createHmacHelper(d) }(Math), function () { function r() { return s.create.apply(s, arguments) } var e = t, i = e.lib, n = i.Hasher, o = e.x64, s = o.Word, a = o.WordArray, c = e.algo, h = [r(1116352408, 3609767458), r(1899447441, 602891725), r(3049323471, 3964484399), r(3921009573, 2173295548), r(961987163, 4081628472), r(1508970993, 3053834265), r(2453635748, 2937671579), r(2870763221, 3664609560), r(3624381080, 2734883394), r(310598401, 1164996542), r(607225278, 1323610764), r(1426881987, 3590304994), r(1925078388, 4068182383), r(2162078206, 991336113), r(2614888103, 633803317), r(3248222580, 3479774868), r(3835390401, 2666613458), r(4022224774, 944711139), r(264347078, 2341262773), r(604807628, 2007800933), r(770255983, 1495990901), r(1249150122, 1856431235), r(1555081692, 3175218132), r(1996064986, 2198950837), r(2554220882, 3999719339), r(2821834349, 766784016), r(2952996808, 2566594879), r(3210313671, 3203337956), r(3336571891, 1034457026), r(3584528711, 2466948901), r(113926993, 3758326383), r(338241895, 168717936), r(666307205, 1188179964), r(773529912, 1546045734), r(1294757372, 1522805485), r(1396182291, 2643833823), r(1695183700, 2343527390), r(1986661051, 1014477480), r(2177026350, 1206759142), r(2456956037, 344077627), r(2730485921, 1290863460), r(2820302411, 3158454273), r(3259730800, 3505952657), r(3345764771, 106217008), r(3516065817, 3606008344), r(3600352804, 1432725776), r(4094571909, 1467031594), r(275423344, 851169720), r(430227734, 3100823752), r(506948616, 1363258195), r(659060556, 3750685593), r(883997877, 3785050280), r(958139571, 3318307427), r(1322822218, 3812723403), r(1537002063, 2003034995), r(1747873779, 3602036899), r(1955562222, 1575990012), r(2024104815, 1125592928), r(2227730452, 2716904306), r(2361852424, 442776044), r(2428436474, 593698344), r(2756734187, 3733110249), r(3204031479, 2999351573), r(3329325298, 3815920427), r(3391569614, 3928383900), r(3515267271, 566280711), r(3940187606, 3454069534), r(4118630271, 4000239992), r(116418474, 1914138554), r(174292421, 2731055270), r(289380356, 3203993006), r(460393269, 320620315), r(685471733, 587496836), r(852142971, 1086792851), r(1017036298, 365543100), r(1126000580, 2618297676), r(1288033470, 3409855158), r(1501505948, 4234509866), r(1607167915, 987167468), r(1816402316, 1246189591)], l = []; !function () { for (var t = 0; t < 80; t++)l[t] = r() }(); var f = c.SHA512 = n.extend({ _doReset: function () { this._hash = new a.init([new s.init(1779033703, 4089235720), new s.init(3144134277, 2227873595), new s.init(1013904242, 4271175723), new s.init(2773480762, 1595750129), new s.init(1359893119, 2917565137), new s.init(2600822924, 725511199), new s.init(528734635, 4215389547), new s.init(1541459225, 327033209)]) }, _doProcessBlock: function (t, r) { for (var e = this._hash.words, i = e[0], n = e[1], o = e[2], s = e[3], a = e[4], c = e[5], f = e[6], u = e[7], d = i.high, v = i.low, p = n.high, _ = n.low, y = o.high, g = o.low, B = s.high, w = s.low, k = a.high, S = a.low, m = c.high, x = c.low, b = f.high, H = f.low, z = u.high, A = u.low, C = d, D = v, R = p, E = _, M = y, F = g, P = B, W = w, O = k, U = S, I = m, K = x, X = b, L = H, j = z, N = A, T = 0; T < 80; T++) { var Z = l[T]; if (T < 16) var q = Z.high = 0 | t[r + 2 * T], G = Z.low = 0 | t[r + 2 * T + 1]; else { var J = l[T - 15], $ = J.high, Q = J.low, V = ($ >>> 1 | Q << 31) ^ ($ >>> 8 | Q << 24) ^ $ >>> 7, Y = (Q >>> 1 | $ << 31) ^ (Q >>> 8 | $ << 24) ^ (Q >>> 7 | $ << 25), tt = l[T - 2], rt = tt.high, et = tt.low, it = (rt >>> 19 | et << 13) ^ (rt << 3 | et >>> 29) ^ rt >>> 6, nt = (et >>> 19 | rt << 13) ^ (et << 3 | rt >>> 29) ^ (et >>> 6 | rt << 26), ot = l[T - 7], st = ot.high, at = ot.low, ct = l[T - 16], ht = ct.high, lt = ct.low, G = Y + at, q = V + st + (G >>> 0 < Y >>> 0 ? 1 : 0), G = G + nt, q = q + it + (G >>> 0 < nt >>> 0 ? 1 : 0), G = G + lt, q = q + ht + (G >>> 0 < lt >>> 0 ? 1 : 0); Z.high = q, Z.low = G } var ft = O & I ^ ~O & X, ut = U & K ^ ~U & L, dt = C & R ^ C & M ^ R & M, vt = D & E ^ D & F ^ E & F, pt = (C >>> 28 | D << 4) ^ (C << 30 | D >>> 2) ^ (C << 25 | D >>> 7), _t = (D >>> 28 | C << 4) ^ (D << 30 | C >>> 2) ^ (D << 25 | C >>> 7), yt = (O >>> 14 | U << 18) ^ (O >>> 18 | U << 14) ^ (O << 23 | U >>> 9), gt = (U >>> 14 | O << 18) ^ (U >>> 18 | O << 14) ^ (U << 23 | O >>> 9), Bt = h[T], wt = Bt.high, kt = Bt.low, St = N + gt, mt = j + yt + (St >>> 0 < N >>> 0 ? 1 : 0), St = St + ut, mt = mt + ft + (St >>> 0 < ut >>> 0 ? 1 : 0), St = St + kt, mt = mt + wt + (St >>> 0 < kt >>> 0 ? 1 : 0), St = St + G, mt = mt + q + (St >>> 0 < G >>> 0 ? 1 : 0), xt = _t + vt, bt = pt + dt + (xt >>> 0 < _t >>> 0 ? 1 : 0); j = X, N = L, X = I, L = K, I = O, K = U, U = W + St | 0, O = P + mt + (U >>> 0 < W >>> 0 ? 1 : 0) | 0, P = M, W = F, M = R, F = E, R = C, E = D, D = St + xt | 0, C = mt + bt + (D >>> 0 < St >>> 0 ? 1 : 0) | 0 } v = i.low = v + D, i.high = d + C + (v >>> 0 < D >>> 0 ? 1 : 0), _ = n.low = _ + E, n.high = p + R + (_ >>> 0 < E >>> 0 ? 1 : 0), g = o.low = g + F, o.high = y + M + (g >>> 0 < F >>> 0 ? 1 : 0), w = s.low = w + W, s.high = B + P + (w >>> 0 < W >>> 0 ? 1 : 0), S = a.low = S + U, a.high = k + O + (S >>> 0 < U >>> 0 ? 1 : 0), x = c.low = x + K, c.high = m + I + (x >>> 0 < K >>> 0 ? 1 : 0), H = f.low = H + L, f.high = b + X + (H >>> 0 < L >>> 0 ? 1 : 0), A = u.low = A + N, u.high = z + j + (A >>> 0 < N >>> 0 ? 1 : 0) }, _doFinalize: function () { var t = this._data, r = t.words, e = 8 * this._nDataBytes, i = 8 * t.sigBytes; r[i >>> 5] |= 128 << 24 - i % 32, r[(i + 128 >>> 10 << 5) + 30] = Math.floor(e / 4294967296), r[(i + 128 >>> 10 << 5) + 31] = e, t.sigBytes = 4 * r.length, this._process(); var n = this._hash.toX32(); return n }, clone: function () { var t = n.clone.call(this); return t._hash = this._hash.clone(), t }, blockSize: 32 }); e.SHA512 = n._createHelper(f), e.HmacSHA512 = n._createHmacHelper(f) }(), function () { var r = t, e = r.x64, i = e.Word, n = e.WordArray, o = r.algo, s = o.SHA512, a = o.SHA384 = s.extend({ _doReset: function () { this._hash = new n.init([new i.init(3418070365, 3238371032), new i.init(1654270250, 914150663), new i.init(2438529370, 812702999), new i.init(355462360, 4144912697), new i.init(1731405415, 4290775857), new i.init(2394180231, 1750603025), new i.init(3675008525, 1694076839), new i.init(1203062813, 3204075428)]) }, _doFinalize: function () { var t = s._doFinalize.call(this); return t.sigBytes -= 16, t } }); r.SHA384 = s._createHelper(a), r.HmacSHA384 = s._createHmacHelper(a) }(), t.lib.Cipher || function (r) { var e = t, i = e.lib, n = i.Base, o = i.WordArray, s = i.BufferedBlockAlgorithm, a = e.enc, c = (a.Utf8, a.Base64), h = e.algo, l = h.EvpKDF, f = i.Cipher = s.extend({ cfg: n.extend(), createEncryptor: function (t, r) { return this.create(this._ENC_XFORM_MODE, t, r) }, createDecryptor: function (t, r) { return this.create(this._DEC_XFORM_MODE, t, r) }, init: function (t, r, e) { this.cfg = this.cfg.extend(e), this._xformMode = t, this._key = r, this.reset() }, reset: function () { s.reset.call(this), this._doReset() }, process: function (t) { return this._append(t), this._process() }, finalize: function (t) { t && this._append(t); var r = this._doFinalize(); return r }, keySize: 4, ivSize: 4, _ENC_XFORM_MODE: 1, _DEC_XFORM_MODE: 2, _createHelper: function () { function t(t) { return "string" == typeof t ? m : w } return function (r) { return { encrypt: function (e, i, n) { return t(i).encrypt(r, e, i, n) }, decrypt: function (e, i, n) { return t(i).decrypt(r, e, i, n) } } } }() }), u = (i.StreamCipher = f.extend({ _doFinalize: function () { var t = this._process(!0); return t }, blockSize: 1 }), e.mode = {}), d = i.BlockCipherMode = n.extend({ createEncryptor: function (t, r) { return this.Encryptor.create(t, r) }, createDecryptor: function (t, r) { return this.Decryptor.create(t, r) }, init: function (t, r) { this._cipher = t, this._iv = r } }), v = u.CBC = function () { function t(t, e, i) { var n = this._iv; if (n) { var o = n; this._iv = r } else var o = this._prevBlock; for (var s = 0; s < i; s++)t[e + s] ^= o[s] } var e = d.extend(); return e.Encryptor = e.extend({ processBlock: function (r, e) { var i = this._cipher, n = i.blockSize; t.call(this, r, e, n), i.encryptBlock(r, e), this._prevBlock = r.slice(e, e + n) } }), e.Decryptor = e.extend({ processBlock: function (r, e) { var i = this._cipher, n = i.blockSize, o = r.slice(e, e + n); i.decryptBlock(r, e), t.call(this, r, e, n), this._prevBlock = o } }), e }(), p = e.pad = {}, _ = p.Pkcs7 = { pad: function (t, r) { for (var e = 4 * r, i = e - t.sigBytes % e, n = i << 24 | i << 16 | i << 8 | i, s = [], a = 0; a < i; a += 4)s.push(n); var c = o.create(s, i); t.concat(c) }, unpad: function (t) { var r = 255 & t.words[t.sigBytes - 1 >>> 2]; t.sigBytes -= r } }, y = (i.BlockCipher = f.extend({ cfg: f.cfg.extend({ mode: v, padding: _ }), reset: function () { f.reset.call(this); var t = this.cfg, r = t.iv, e = t.mode; if (this._xformMode == this._ENC_XFORM_MODE) var i = e.createEncryptor; else { var i = e.createDecryptor; this._minBufferSize = 1 } this._mode && this._mode.__creator == i ? this._mode.init(this, r && r.words) : (this._mode = i.call(e, this, r && r.words), this._mode.__creator = i) }, _doProcessBlock: function (t, r) { this._mode.processBlock(t, r) }, _doFinalize: function () { var t = this.cfg.padding; if (this._xformMode == this._ENC_XFORM_MODE) { t.pad(this._data, this.blockSize); var r = this._process(!0) } else { var r = this._process(!0); t.unpad(r) } return r }, blockSize: 4 }), i.CipherParams = n.extend({ init: function (t) { this.mixIn(t) }, toString: function (t) { return (t || this.formatter).stringify(this) } })), g = e.format = {}, B = g.OpenSSL = { stringify: function (t) { var r = t.ciphertext, e = t.salt; if (e) var i = o.create([1398893684, 1701076831]).concat(e).concat(r); else var i = r; return i.toString(c) }, parse: function (t) { var r = c.parse(t), e = r.words; if (1398893684 == e[0] && 1701076831 == e[1]) { var i = o.create(e.slice(2, 4)); e.splice(0, 4), r.sigBytes -= 16 } return y.create({ ciphertext: r, salt: i }) } }, w = i.SerializableCipher = n.extend({ cfg: n.extend({ format: B }), encrypt: function (t, r, e, i) { i = this.cfg.extend(i); var n = t.createEncryptor(e, i), o = n.finalize(r), s = n.cfg; return y.create({ ciphertext: o, key: e, iv: s.iv, algorithm: t, mode: s.mode, padding: s.padding, blockSize: t.blockSize, formatter: i.format }) }, decrypt: function (t, r, e, i) { i = this.cfg.extend(i), r = this._parse(r, i.format); var n = t.createDecryptor(e, i).finalize(r.ciphertext); return n }, _parse: function (t, r) { return "string" == typeof t ? r.parse(t, this) : t } }), k = e.kdf = {}, S = k.OpenSSL = { execute: function (t, r, e, i) { i || (i = o.random(8)); var n = l.create({ keySize: r + e }).compute(t, i), s = o.create(n.words.slice(r), 4 * e); return n.sigBytes = 4 * r, y.create({ key: n, iv: s, salt: i }) } }, m = i.PasswordBasedCipher = w.extend({ cfg: w.cfg.extend({ kdf: S }), encrypt: function (t, r, e, i) { i = this.cfg.extend(i); var n = i.kdf.execute(e, t.keySize, t.ivSize); i.iv = n.iv; var o = w.encrypt.call(this, t, r, n.key, i); return o.mixIn(n), o }, decrypt: function (t, r, e, i) { i = this.cfg.extend(i), r = this._parse(r, i.format); var n = i.kdf.execute(e, t.keySize, t.ivSize, r.salt); i.iv = n.iv; var o = w.decrypt.call(this, t, r, n.key, i); return o } }) }(), t.mode.CFB = function () { function r(t, r, e, i) { var n = this._iv; if (n) { var o = n.slice(0); this._iv = void 0 } else var o = this._prevBlock; i.encryptBlock(o, 0); for (var s = 0; s < e; s++)t[r + s] ^= o[s] } var e = t.lib.BlockCipherMode.extend(); return e.Encryptor = e.extend({ processBlock: function (t, e) { var i = this._cipher, n = i.blockSize; r.call(this, t, e, n, i), this._prevBlock = t.slice(e, e + n) } }), e.Decryptor = e.extend({ processBlock: function (t, e) { var i = this._cipher, n = i.blockSize, o = t.slice(e, e + n); r.call(this, t, e, n, i), this._prevBlock = o } }), e }(), t.mode.ECB = function () { var r = t.lib.BlockCipherMode.extend(); return r.Encryptor = r.extend({ processBlock: function (t, r) { this._cipher.encryptBlock(t, r) } }), r.Decryptor = r.extend({ processBlock: function (t, r) { this._cipher.decryptBlock(t, r) } }), r }(), t.pad.AnsiX923 = { pad: function (t, r) { var e = t.sigBytes, i = 4 * r, n = i - e % i, o = e + n - 1; t.clamp(), t.words[o >>> 2] |= n << 24 - o % 4 * 8, t.sigBytes += n }, unpad: function (t) { var r = 255 & t.words[t.sigBytes - 1 >>> 2]; t.sigBytes -= r } }, t.pad.Iso10126 = { pad: function (r, e) { var i = 4 * e, n = i - r.sigBytes % i; r.concat(t.lib.WordArray.random(n - 1)).concat(t.lib.WordArray.create([n << 24], 1)) }, unpad: function (t) { var r = 255 & t.words[t.sigBytes - 1 >>> 2]; t.sigBytes -= r } }, t.pad.Iso97971 = { pad: function (r, e) { r.concat(t.lib.WordArray.create([2147483648], 1)), t.pad.ZeroPadding.pad(r, e) }, unpad: function (r) { t.pad.ZeroPadding.unpad(r), r.sigBytes-- } }, t.mode.OFB = function () { var r = t.lib.BlockCipherMode.extend(), e = r.Encryptor = r.extend({ processBlock: function (t, r) { var e = this._cipher, i = e.blockSize, n = this._iv, o = this._keystream; n && (o = this._keystream = n.slice(0), this._iv = void 0), e.encryptBlock(o, 0); for (var s = 0; s < i; s++)t[r + s] ^= o[s] } }); return r.Decryptor = e, r }(), t.pad.NoPadding = { pad: function () { }, unpad: function () { } }, function (r) { var e = t, i = e.lib, n = i.CipherParams, o = e.enc, s = o.Hex, a = e.format; a.Hex = { stringify: function (t) { return t.ciphertext.toString(s) }, parse: function (t) { var r = s.parse(t); return n.create({ ciphertext: r }) } } }(), function () { var r = t, e = r.lib, i = e.BlockCipher, n = r.algo, o = [], s = [], a = [], c = [], h = [], l = [], f = [], u = [], d = [], v = []; !function () { for (var t = [], r = 0; r < 256; r++)r < 128 ? t[r] = r << 1 : t[r] = r << 1 ^ 283; for (var e = 0, i = 0, r = 0; r < 256; r++) { var n = i ^ i << 1 ^ i << 2 ^ i << 3 ^ i << 4; n = n >>> 8 ^ 255 & n ^ 99, o[e] = n, s[n] = e; var p = t[e], _ = t[p], y = t[_], g = 257 * t[n] ^ 16843008 * n; a[e] = g << 24 | g >>> 8, c[e] = g << 16 | g >>> 16, h[e] = g << 8 | g >>> 24, l[e] = g; var g = 16843009 * y ^ 65537 * _ ^ 257 * p ^ 16843008 * e; f[n] = g << 24 | g >>> 8, u[n] = g << 16 | g >>> 16, d[n] = g << 8 | g >>> 24, v[n] = g, e ? (e = p ^ t[t[t[y ^ p]]], i ^= t[t[i]]) : e = i = 1 } }(); var p = [0, 1, 2, 4, 8, 16, 32, 64, 128, 27, 54], _ = n.AES = i.extend({ _doReset: function () { if (!this._nRounds || this._keyPriorReset !== this._key) { for (var t = this._keyPriorReset = this._key, r = t.words, e = t.sigBytes / 4, i = this._nRounds = e + 6, n = 4 * (i + 1), s = this._keySchedule = [], a = 0; a < n; a++)if (a < e) s[a] = r[a]; else { var c = s[a - 1]; a % e ? e > 6 && a % e == 4 && (c = o[c >>> 24] << 24 | o[c >>> 16 & 255] << 16 | o[c >>> 8 & 255] << 8 | o[255 & c]) : (c = c << 8 | c >>> 24, c = o[c >>> 24] << 24 | o[c >>> 16 & 255] << 16 | o[c >>> 8 & 255] << 8 | o[255 & c], c ^= p[a / e | 0] << 24), s[a] = s[a - e] ^ c } for (var h = this._invKeySchedule = [], l = 0; l < n; l++) { var a = n - l; if (l % 4) var c = s[a]; else var c = s[a - 4]; l < 4 || a <= 4 ? h[l] = c : h[l] = f[o[c >>> 24]] ^ u[o[c >>> 16 & 255]] ^ d[o[c >>> 8 & 255]] ^ v[o[255 & c]] } } }, encryptBlock: function (t, r) { this._doCryptBlock(t, r, this._keySchedule, a, c, h, l, o) }, decryptBlock: function (t, r) { var e = t[r + 1]; t[r + 1] = t[r + 3], t[r + 3] = e, this._doCryptBlock(t, r, this._invKeySchedule, f, u, d, v, s); var e = t[r + 1]; t[r + 1] = t[r + 3], t[r + 3] = e }, _doCryptBlock: function (t, r, e, i, n, o, s, a) { for (var c = this._nRounds, h = t[r] ^ e[0], l = t[r + 1] ^ e[1], f = t[r + 2] ^ e[2], u = t[r + 3] ^ e[3], d = 4, v = 1; v < c; v++) { var p = i[h >>> 24] ^ n[l >>> 16 & 255] ^ o[f >>> 8 & 255] ^ s[255 & u] ^ e[d++], _ = i[l >>> 24] ^ n[f >>> 16 & 255] ^ o[u >>> 8 & 255] ^ s[255 & h] ^ e[d++], y = i[f >>> 24] ^ n[u >>> 16 & 255] ^ o[h >>> 8 & 255] ^ s[255 & l] ^ e[d++], g = i[u >>> 24] ^ n[h >>> 16 & 255] ^ o[l >>> 8 & 255] ^ s[255 & f] ^ e[d++]; h = p, l = _, f = y, u = g } var p = (a[h >>> 24] << 24 | a[l >>> 16 & 255] << 16 | a[f >>> 8 & 255] << 8 | a[255 & u]) ^ e[d++], _ = (a[l >>> 24] << 24 | a[f >>> 16 & 255] << 16 | a[u >>> 8 & 255] << 8 | a[255 & h]) ^ e[d++], y = (a[f >>> 24] << 24 | a[u >>> 16 & 255] << 16 | a[h >>> 8 & 255] << 8 | a[255 & l]) ^ e[d++], g = (a[u >>> 24] << 24 | a[h >>> 16 & 255] << 16 | a[l >>> 8 & 255] << 8 | a[255 & f]) ^ e[d++]; t[r] = p, t[r + 1] = _, t[r + 2] = y, t[r + 3] = g }, keySize: 8 }); r.AES = i._createHelper(_) }(), function () { @@ -27,502 +27,7 @@ cron "4 2,10 * * *" script-path=https://raw.githubusercontent.com/Aaron-lv/sync/ }(), function () { function r() { for (var t = this._S, r = this._i, e = this._j, i = 0, n = 0; n < 4; n++) { r = (r + 1) % 256, e = (e + t[r]) % 256; var o = t[r]; t[r] = t[e], t[e] = o, i |= t[(t[r] + t[e]) % 256] << 24 - 8 * n } return this._i = r, this._j = e, i } var e = t, i = e.lib, n = i.StreamCipher, o = e.algo, s = o.RC4 = n.extend({ _doReset: function () { for (var t = this._key, r = t.words, e = t.sigBytes, i = this._S = [], n = 0; n < 256; n++)i[n] = n; for (var n = 0, o = 0; n < 256; n++) { var s = n % e, a = r[s >>> 2] >>> 24 - s % 4 * 8 & 255; o = (o + i[n] + a) % 256; var c = i[n]; i[n] = i[o], i[o] = c } this._i = this._j = 0 }, _doProcessBlock: function (t, e) { t[e] ^= r.call(this) }, keySize: 8, ivSize: 0 }); e.RC4 = n._createHelper(s); var a = o.RC4Drop = s.extend({ cfg: s.cfg.extend({ drop: 192 }), _doReset: function () { s._doReset.call(this); for (var t = this.cfg.drop; t > 0; t--)r.call(this) } }); e.RC4Drop = n._createHelper(a) }(), t.mode.CTRGladman = function () { function r(t) { if (255 === (t >> 24 & 255)) { var r = t >> 16 & 255, e = t >> 8 & 255, i = 255 & t; 255 === r ? (r = 0, 255 === e ? (e = 0, 255 === i ? i = 0 : ++i) : ++e) : ++r, t = 0, t += r << 16, t += e << 8, t += i } else t += 1 << 24; return t } function e(t) { return 0 === (t[0] = r(t[0])) && (t[1] = r(t[1])), t } var i = t.lib.BlockCipherMode.extend(), n = i.Encryptor = i.extend({ processBlock: function (t, r) { var i = this._cipher, n = i.blockSize, o = this._iv, s = this._counter; o && (s = this._counter = o.slice(0), this._iv = void 0), e(s); var a = s.slice(0); i.encryptBlock(a, 0); for (var c = 0; c < n; c++)t[r + c] ^= a[c] } }); return i.Decryptor = n, i }(), function () { function r() { for (var t = this._X, r = this._C, e = 0; e < 8; e++)a[e] = r[e]; r[0] = r[0] + 1295307597 + this._b | 0, r[1] = r[1] + 3545052371 + (r[0] >>> 0 < a[0] >>> 0 ? 1 : 0) | 0, r[2] = r[2] + 886263092 + (r[1] >>> 0 < a[1] >>> 0 ? 1 : 0) | 0, r[3] = r[3] + 1295307597 + (r[2] >>> 0 < a[2] >>> 0 ? 1 : 0) | 0, r[4] = r[4] + 3545052371 + (r[3] >>> 0 < a[3] >>> 0 ? 1 : 0) | 0, r[5] = r[5] + 886263092 + (r[4] >>> 0 < a[4] >>> 0 ? 1 : 0) | 0, r[6] = r[6] + 1295307597 + (r[5] >>> 0 < a[5] >>> 0 ? 1 : 0) | 0, r[7] = r[7] + 3545052371 + (r[6] >>> 0 < a[6] >>> 0 ? 1 : 0) | 0, this._b = r[7] >>> 0 < a[7] >>> 0 ? 1 : 0; for (var e = 0; e < 8; e++) { var i = t[e] + r[e], n = 65535 & i, o = i >>> 16, s = ((n * n >>> 17) + n * o >>> 15) + o * o, h = ((4294901760 & i) * i | 0) + ((65535 & i) * i | 0); c[e] = s ^ h } t[0] = c[0] + (c[7] << 16 | c[7] >>> 16) + (c[6] << 16 | c[6] >>> 16) | 0, t[1] = c[1] + (c[0] << 8 | c[0] >>> 24) + c[7] | 0, t[2] = c[2] + (c[1] << 16 | c[1] >>> 16) + (c[0] << 16 | c[0] >>> 16) | 0, t[3] = c[3] + (c[2] << 8 | c[2] >>> 24) + c[1] | 0, t[4] = c[4] + (c[3] << 16 | c[3] >>> 16) + (c[2] << 16 | c[2] >>> 16) | 0, t[5] = c[5] + (c[4] << 8 | c[4] >>> 24) + c[3] | 0, t[6] = c[6] + (c[5] << 16 | c[5] >>> 16) + (c[4] << 16 | c[4] >>> 16) | 0, t[7] = c[7] + (c[6] << 8 | c[6] >>> 24) + c[5] | 0 } var e = t, i = e.lib, n = i.StreamCipher, o = e.algo, s = [], a = [], c = [], h = o.Rabbit = n.extend({ _doReset: function () { for (var t = this._key.words, e = this.cfg.iv, i = 0; i < 4; i++)t[i] = 16711935 & (t[i] << 8 | t[i] >>> 24) | 4278255360 & (t[i] << 24 | t[i] >>> 8); var n = this._X = [t[0], t[3] << 16 | t[2] >>> 16, t[1], t[0] << 16 | t[3] >>> 16, t[2], t[1] << 16 | t[0] >>> 16, t[3], t[2] << 16 | t[1] >>> 16], o = this._C = [t[2] << 16 | t[2] >>> 16, 4294901760 & t[0] | 65535 & t[1], t[3] << 16 | t[3] >>> 16, 4294901760 & t[1] | 65535 & t[2], t[0] << 16 | t[0] >>> 16, 4294901760 & t[2] | 65535 & t[3], t[1] << 16 | t[1] >>> 16, 4294901760 & t[3] | 65535 & t[0]]; this._b = 0; for (var i = 0; i < 4; i++)r.call(this); for (var i = 0; i < 8; i++)o[i] ^= n[i + 4 & 7]; if (e) { var s = e.words, a = s[0], c = s[1], h = 16711935 & (a << 8 | a >>> 24) | 4278255360 & (a << 24 | a >>> 8), l = 16711935 & (c << 8 | c >>> 24) | 4278255360 & (c << 24 | c >>> 8), f = h >>> 16 | 4294901760 & l, u = l << 16 | 65535 & h; o[0] ^= h, o[1] ^= f, o[2] ^= l, o[3] ^= u, o[4] ^= h, o[5] ^= f, o[6] ^= l, o[7] ^= u; for (var i = 0; i < 4; i++)r.call(this) } }, _doProcessBlock: function (t, e) { var i = this._X; r.call(this), s[0] = i[0] ^ i[5] >>> 16 ^ i[3] << 16, s[1] = i[2] ^ i[7] >>> 16 ^ i[5] << 16, s[2] = i[4] ^ i[1] >>> 16 ^ i[7] << 16, s[3] = i[6] ^ i[3] >>> 16 ^ i[1] << 16; for (var n = 0; n < 4; n++)s[n] = 16711935 & (s[n] << 8 | s[n] >>> 24) | 4278255360 & (s[n] << 24 | s[n] >>> 8), t[e + n] ^= s[n] }, blockSize: 4, ivSize: 2 }); e.Rabbit = n._createHelper(h) }(), t.mode.CTR = function () { var r = t.lib.BlockCipherMode.extend(), e = r.Encryptor = r.extend({ processBlock: function (t, r) { var e = this._cipher, i = e.blockSize, n = this._iv, o = this._counter; n && (o = this._counter = n.slice(0), this._iv = void 0); var s = o.slice(0); e.encryptBlock(s, 0), o[i - 1] = o[i - 1] + 1 | 0; for (var a = 0; a < i; a++)t[r + a] ^= s[a] } }); return r.Decryptor = e, r }(), function () { function r() { for (var t = this._X, r = this._C, e = 0; e < 8; e++)a[e] = r[e]; r[0] = r[0] + 1295307597 + this._b | 0, r[1] = r[1] + 3545052371 + (r[0] >>> 0 < a[0] >>> 0 ? 1 : 0) | 0, r[2] = r[2] + 886263092 + (r[1] >>> 0 < a[1] >>> 0 ? 1 : 0) | 0, r[3] = r[3] + 1295307597 + (r[2] >>> 0 < a[2] >>> 0 ? 1 : 0) | 0, r[4] = r[4] + 3545052371 + (r[3] >>> 0 < a[3] >>> 0 ? 1 : 0) | 0, r[5] = r[5] + 886263092 + (r[4] >>> 0 < a[4] >>> 0 ? 1 : 0) | 0, r[6] = r[6] + 1295307597 + (r[5] >>> 0 < a[5] >>> 0 ? 1 : 0) | 0, r[7] = r[7] + 3545052371 + (r[6] >>> 0 < a[6] >>> 0 ? 1 : 0) | 0, this._b = r[7] >>> 0 < a[7] >>> 0 ? 1 : 0; for (var e = 0; e < 8; e++) { var i = t[e] + r[e], n = 65535 & i, o = i >>> 16, s = ((n * n >>> 17) + n * o >>> 15) + o * o, h = ((4294901760 & i) * i | 0) + ((65535 & i) * i | 0); c[e] = s ^ h } t[0] = c[0] + (c[7] << 16 | c[7] >>> 16) + (c[6] << 16 | c[6] >>> 16) | 0, t[1] = c[1] + (c[0] << 8 | c[0] >>> 24) + c[7] | 0, t[2] = c[2] + (c[1] << 16 | c[1] >>> 16) + (c[0] << 16 | c[0] >>> 16) | 0, t[3] = c[3] + (c[2] << 8 | c[2] >>> 24) + c[1] | 0, t[4] = c[4] + (c[3] << 16 | c[3] >>> 16) + (c[2] << 16 | c[2] >>> 16) | 0, t[5] = c[5] + (c[4] << 8 | c[4] >>> 24) + c[3] | 0, t[6] = c[6] + (c[5] << 16 | c[5] >>> 16) + (c[4] << 16 | c[4] >>> 16) | 0, t[7] = c[7] + (c[6] << 8 | c[6] >>> 24) + c[5] | 0 } var e = t, i = e.lib, n = i.StreamCipher, o = e.algo, s = [], a = [], c = [], h = o.RabbitLegacy = n.extend({ _doReset: function () { var t = this._key.words, e = this.cfg.iv, i = this._X = [t[0], t[3] << 16 | t[2] >>> 16, t[1], t[0] << 16 | t[3] >>> 16, t[2], t[1] << 16 | t[0] >>> 16, t[3], t[2] << 16 | t[1] >>> 16], n = this._C = [t[2] << 16 | t[2] >>> 16, 4294901760 & t[0] | 65535 & t[1], t[3] << 16 | t[3] >>> 16, 4294901760 & t[1] | 65535 & t[2], t[0] << 16 | t[0] >>> 16, 4294901760 & t[2] | 65535 & t[3], t[1] << 16 | t[1] >>> 16, 4294901760 & t[3] | 65535 & t[0]]; this._b = 0; for (var o = 0; o < 4; o++)r.call(this); for (var o = 0; o < 8; o++)n[o] ^= i[o + 4 & 7]; if (e) { var s = e.words, a = s[0], c = s[1], h = 16711935 & (a << 8 | a >>> 24) | 4278255360 & (a << 24 | a >>> 8), l = 16711935 & (c << 8 | c >>> 24) | 4278255360 & (c << 24 | c >>> 8), f = h >>> 16 | 4294901760 & l, u = l << 16 | 65535 & h; n[0] ^= h, n[1] ^= f, n[2] ^= l, n[3] ^= u, n[4] ^= h, n[5] ^= f, n[6] ^= l, n[7] ^= u; for (var o = 0; o < 4; o++)r.call(this) } }, _doProcessBlock: function (t, e) { var i = this._X; r.call(this), s[0] = i[0] ^ i[5] >>> 16 ^ i[3] << 16, s[1] = i[2] ^ i[7] >>> 16 ^ i[5] << 16, s[2] = i[4] ^ i[1] >>> 16 ^ i[7] << 16, s[3] = i[6] ^ i[3] >>> 16 ^ i[1] << 16; for (var n = 0; n < 4; n++)s[n] = 16711935 & (s[n] << 8 | s[n] >>> 24) | 4278255360 & (s[n] << 24 | s[n] >>> 8), t[e + n] ^= s[n] }, blockSize: 4, ivSize: 2 }); e.RabbitLegacy = n._createHelper(h) }(), t.pad.ZeroPadding = { pad: function (t, r) { var e = 4 * r; t.clamp(), t.sigBytes += e - (t.sigBytes % e || e) }, unpad: function (t) { for (var r = t.words, e = t.sigBytes - 1; !(r[e >>> 2] >>> 24 - e % 4 * 8 & 255);)e--; t.sigBytes = e + 1 } }, t }); const $ = new Env('京喜领88元红包'); -const notify = $.isNode() ? require('./sendNotify') : {}; -const jdCookieNode = $.isNode() ? require('./jdCookie.js') : {}; -let cookiesArr = [], cookie = ''; -let UA, UAInfo = {}, codeInfo = {}, token; -if ($.isNode()) { - Object.keys(jdCookieNode).forEach((item) => { - cookiesArr.push(jdCookieNode[item]) - }); - if (process.env.JD_DEBUG && process.env.JD_DEBUG === 'false') console.log = () => {}; -} else { - cookiesArr = [$.getdata("CookieJD"), $.getdata("CookieJD2"), ...$.toObj($.getdata("CookiesJD") || "[]").map((item) => item.cookie)].filter((item) => !!item); -} -$.packetIdArr = []; -$.activeId = '529439'; -const BASE_URL = 'https://m.jingxi.com/cubeactive/steprewardv3' -$.appId = "e395f" -!(async () => { - if (!cookiesArr[0]) { - $.msg($.name, '【提示】请先获取京东账号一cookie\n直接使用NobyDa的京东签到获取', 'https://bean.m.jd.com/bean/signIndex.action', {"open-url": "https://bean.m.jd.com/bean/signIndex.action"}); - return; - } - let res = await getAuthorShareCode('https://raw.githubusercontent.com/Aaron-lv/updateTeam/master/shareCodes/jxhb.json') - if (!res) { - $.http.get({url: 'https://purge.jsdelivr.net/gh/Aaron-lv/updateTeam@master/shareCodes/jxhb.json'}).then((resp) => {}).catch((e) => $.log('刷新CDN异常', e)); - await $.wait(1000) - res = await getAuthorShareCode('https://cdn.jsdelivr.net/gh/Aaron-lv/updateTeam@master/shareCodes/jxhb.json') - } - if (res && res.activeId) $.activeId = res.activeId; - $.authorMyShareIds = [...((res && res.codes) || [])]; - $.CryptoJS = $.isNode() ? require('crypto-js') : CryptoJS; - await requestAlgo() - await $.wait(1000) - //开启红包,获取互助码 - for (let i = 0; i < cookiesArr.length; i++) { - cookie = cookiesArr[i]; - $.UserName = decodeURIComponent(cookie.match(/pt_pin=([^; ]+)(?=;?)/) && cookie.match(/pt_pin=([^; ]+)(?=;?)/)[1]) - $.index = i + 1; - $.isLogin = true - $.nickName = '' - UA = `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` - UAInfo[$.UserName] = UA - await TotalBean(); - console.log(`\n*****开始【京东账号${$.index}】${$.nickName || $.UserName}*****\n`); - if (!$.isLogin) { - $.msg($.name, `【提示】cookie已失效`, `京东账号${$.index} ${$.nickName || $.UserName}\n请重新登录获取\nhttps://bean.m.jd.com/bean/signIndex.action`, {"open-url": "https://bean.m.jd.com/bean/signIndex.action"}); - - if ($.isNode()) { - await notify.sendNotify(`${$.name}cookie已失效 - ${$.UserName}`, `京东账号${$.index} ${$.UserName}\n请重新登录获取cookie`); - } - continue - } - token = await getJxToken() - await main(); - } - //互助 - console.log(`\n自己京东账号助力码:\n${JSON.stringify($.packetIdArr)}\n`); - console.log(`\n开始助力:助力逻辑 先自己京东相互助力,如有剩余助力机会,则助力作者\n`) - for (let i = 0; i < cookiesArr.length; i++) { - cookie = cookiesArr[i]; - $.UserName = decodeURIComponent(cookie.match(/pt_pin=([^; ]+)(?=;?)/) && cookie.match(/pt_pin=([^; ]+)(?=;?)/)[1]); - $.canHelp = true; - UA = UAInfo[$.UserName] - token = await getJxToken() - for (let j = 0; j < $.packetIdArr.length && $.canHelp; j++) { - console.log(`【${$.UserName}】去助力【${$.packetIdArr[j].userName}】邀请码:${$.packetIdArr[j].strUserPin}`); - if ($.UserName === $.packetIdArr[j].userName) { - console.log(`助力失败:不能助力自己`) - continue - } - $.max = false; - await enrollFriend($.packetIdArr[j].strUserPin); - await $.wait(5000); - if ($.max) { - $.packetIdArr.splice(j, 1) - j-- - continue - } - } - if ($.canHelp && ($.authorMyShareIds && $.authorMyShareIds.length)) { - console.log(`\n【${$.UserName}】有剩余助力机会,开始助力作者\n`) - for (let j = 0; j < $.authorMyShareIds.length && $.canHelp; j++) { - console.log(`【${$.UserName}】去助力作者的邀请码:${$.authorMyShareIds[j]}`); - $.max = false; - await enrollFriend($.authorMyShareIds[j]); - await $.wait(5000); - if ($.max) { - $.authorMyShareIds.splice(j, 1) - j-- - continue - } - } - } - } - //拆红包 - for (let i = 0; i < cookiesArr.length; i++) { - cookie = cookiesArr[i]; - $.canOpenGrade = true; - $.UserName = decodeURIComponent(cookie.match(/pt_pin=([^; ]+)(?=;?)/) && cookie.match(/pt_pin=([^; ]+)(?=;?)/)[1]) - UA = UAInfo[$.UserName] - token = await getJxToken() - for (let grade of $.grades) { - if (!codeInfo[$.UserName]) continue; - console.log(`\n【${$.UserName}】去拆第${grade}个红包`); - await openRedPack(codeInfo[$.UserName], grade); - if (!$.canOpenGrade) break - await $.wait(15000); - } - } -})() - .catch((e) => { - $.log('', `❌ ${$.name}, 失败! 原因: ${e}!`, '') - }) - .finally(() => { - $.done(); - }) -async function main() { - await joinActive(); - await $.wait(2000); - await getUserInfo(); -} -//参与活动 -function joinActive() { - return new Promise(resolve => { - $.get(taskurl('JoinActive', `stepreward_jstoken=${token['farm_jstoken']}×tamp=${token['timestamp']}&phoneid=${token['phoneid']}&strPin=`), (err, resp, data) => { - try { - if (err) { - console.log(`\n${$.name}: API查询请求失败 ‼️‼️`) - $.logErr(err); - } else { - data = JSON.parse(data.replace(/\n/g, "").match(new RegExp(/jsonpCBK.?\((.*);*\)/))[1]); - if (data.iRet === 0) { - console.log(`活动开启成功\n`); - } else { - console.log(`活动开启失败:${data.sErrMsg}\n`); - } - } - } catch (e) { - $.logErr(e, resp); - } finally { - resolve(); - } - }) - }) -} -//获取助力码 -function getUserInfo() { - return new Promise(resolve => { - $.get(taskurl('GetUserInfo'), (err, resp, data) => { - try { - if (err) { - console.log(`\n${$.name}: API查询请求失败 ‼️‼️`) - $.logErr(err); - } else { - data = JSON.parse(data.replace(/\n/g, "").match(new RegExp(/jsonpCBK.?\((.*);*\)/))[1]); - if (data.iRet === 0) { - $.grades = [] - $.helpNum = '' - let grades = data.Data.gradeConfig - for(let key of Object.keys(grades)){ - let vo = grades[key] - $.grades.push(vo.dwGrade) - $.helpNum = vo.dwHelpTimes - } - if (data.Data.dwHelpedTimes === $.helpNum) { - console.log(`${$.grades[$.grades.length - 1]}个阶梯红包已全部拆完\n`) - } else { - console.log(`获取助力码成功:${data.Data.strUserPin}\n`); - if (data.Data.strUserPin) { - $.packetIdArr.push({ - strUserPin: data.Data.strUserPin, - userName: $.UserName - }) - } - } - if (data.Data.strUserPin) { - codeInfo[$.UserName] = data.Data.strUserPin - } - } else { - console.log(`获取助力码失败:${data.sErrMsg}\n`); - } - } - } catch (e) { - $.logErr(e, resp); - } finally { - resolve(data); - } - }) - }) -} -//助力好友 -function enrollFriend(strPin) { - return new Promise(resolve => { - $.get(taskurl('EnrollFriend', `stepreward_jstoken=${token['farm_jstoken']}×tamp=${token['timestamp']}&phoneid=${token['phoneid']}&strPin=${strPin}`), (err, resp, data) => { - try { - if (err) { - console.log(`\n${$.name}: API查询请求失败 ‼️‼️`) - $.log(JSON.stringify(err)); - } else { - data = JSON.parse(data.replace(/\n/g, "").match(new RegExp(/jsonpCBK.?\((.*);*\)/))[1]); - if (data.iRet === 0) { - console.log(`助力成功🎉:${data.sErrMsg}\n`); - } else { - if (data.iRet === 2000) $.canHelp = false;//未登录 - if (data.iRet === 2015) $.canHelp = false;//助力已达上限 - if (data.iRet === 2016) { - $.canHelp = false;//助力火爆 - console.log(`温馨提示:如提示助力火爆,可尝试寻找京东客服`); - } - if (data.iRet === 2013 || data.iRet === 2011) $.max = true; - console.log(`助力失败:${data.sErrMsg}\n`); - } - } - } catch (e) { - $.logErr(e, resp); - } finally { - resolve(); - } - }) - }) -} -function openRedPack(strPin, grade) { - return new Promise(resolve => { - $.get(taskurl('DoGradeDraw', `grade=${grade}`), (err, resp, data) => { - try { - if (err) { - console.log(`\n${$.name}: API查询请求失败 ‼️‼️`) - $.logErr(err); - } else { - data = JSON.parse(data.replace(/\n/g, "").match(new RegExp(/jsonpCBK.?\((.*);*\)/))[1]); - if (data.iRet === 0) { - console.log(`拆红包成功:${data.sErrMsg}\n`); - } else { - if (data.iRet === 2017) $.canOpenGrade = false; - console.log(`拆红包失败:${data.sErrMsg}\n`); - } - } - } catch (e) { - $.logErr(e, resp); - } finally { - resolve(); - } - }) - }) -} - -function getAuthorShareCode(url) { - return new Promise(async resolve => { - const options = { - url: `${url}?${new Date()}`, "timeout": 10000, headers: { - "User-Agent": "Mozilla/5.0 (iPhone; CPU iPhone OS 13_2_3 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/13.0.3 Mobile/15E148 Safari/604.1 Edg/87.0.4280.88" - } - }; - if ($.isNode() && process.env.TG_PROXY_HOST && process.env.TG_PROXY_PORT) { - const tunnel = require("tunnel"); - const agent = { - https: tunnel.httpsOverHttp({ - proxy: { - host: process.env.TG_PROXY_HOST, - port: process.env.TG_PROXY_PORT * 1 - } - }) - } - Object.assign(options, { agent }) - } - $.get(options, async (err, resp, data) => { - try { - resolve(JSON.parse(data)) - } catch (e) { - // $.logErr(e, resp) - } finally { - resolve(); - } - }) - await $.wait(10000) - resolve(); - }) -} - -function taskurl(function_path, body = '') { - let url = `${BASE_URL}/${function_path}?activeId=${$.activeId}${body ? `&${body}` : ''}`; - url += `&_stk=${getStk(url)}`; - url += `&_ste=1&h5st=${decrypt(Date.now(), '', '', url)}&userDraw=0&publishFlag=1&channel=7&_t=${Date.now()}&_=${Date.now()}&sceneval=2&g_login_type=1&callback=jsonpCBK${String.fromCharCode(Math.floor(Math.random() * 26) + "A".charCodeAt(0))}&g_ty=ls`; - return { - url, - headers: { - "Host": "m.jingxi.com", - "Accept": "*/*", - "Accept-Encoding": "gzip, deflate, br", - "User-Agent": UA, - "Accept-Language": "zh-CN,zh-Hans;q=0.9", - "Referer": "https://st.jingxi.com/", - "Cookie": cookie - } - } -} -function getStk(url) { - let arr = url.split('&').map(x => x.replace(/.*\?/, "").replace(/=.*/, "")) - return encodeURIComponent(arr.filter(x => x).sort().join(',')) -} -function randomString(e) { - e = e || 32; - let t = "abcdef0123456789", a = t.length, n = ""; - for (let i = 0; i < e; i++) - n += t.charAt(Math.floor(Math.random() * a)); - return n -} - -function TotalBean() { - return new Promise(resolve => { - const options = { - url: "https://me-api.jd.com/user_new/info/GetJDUserInfoUnion", - headers: { - "Host": "me-api.jd.com", - "Accept": "*/*", - "User-Agent": "ScriptableWidgetExtension/185 CFNetwork/1312 Darwin/21.0.0", - "Accept-Language": "zh-CN,zh-Hans;q=0.9", - "Accept-Encoding": "gzip, deflate, br", - "Cookie": cookie - } - } - $.get(options, (err, resp, data) => { - try { - if (err) { - $.logErr(err) - } else { - if (data) { - data = JSON.parse(data); - if (data['retcode'] === "1001") { - $.isLogin = false; //cookie过期 - return; - } - if (data['retcode'] === "0" && data.data && data.data.hasOwnProperty("userInfo")) { - $.nickName = data.data.userInfo.baseInfo.nickname; - } - } else { - console.log('京东服务器返回空数据'); - } - } - } catch (e) { - $.logErr(e, resp) - } finally { - resolve() - } - }) - }) -} -/* -修改时间戳转换函数,京喜工厂原版修改 - */ -Date.prototype.Format = function (fmt) { - var e, - n = this, d = fmt, l = { - "M+": n.getMonth() + 1, - "d+": n.getDate(), - "D+": n.getDate(), - "h+": n.getHours(), - "H+": n.getHours(), - "m+": n.getMinutes(), - "s+": n.getSeconds(), - "w+": n.getDay(), - "q+": Math.floor((n.getMonth() + 3) / 3), - "S+": n.getMilliseconds() - }; - /(y+)/i.test(d) && (d = d.replace(RegExp.$1, "".concat(n.getFullYear()).substr(4 - RegExp.$1.length))); - for (var k in l) { - if (new RegExp("(".concat(k, ")")).test(d)) { - var t, a = "S+" === k ? "000" : "00"; - d = d.replace(RegExp.$1, 1 == RegExp.$1.length ? l[k] : ("".concat(a) + l[k]).substr("".concat(l[k]).length)) - } - } - return d; -} - -async function requestAlgo() { - $.fingerprint = await generateFp(); - const options = { - "url": `https://cactus.jd.com/request_algo?g_ty=ajax`, - "headers": { - 'Authority': 'cactus.jd.com', - 'Pragma': 'no-cache', - 'Cache-Control': 'no-cache', - 'Accept': 'application/json', - 'User-Agent': 'Mozilla/5.0 (iPhone; CPU iPhone OS 13_2_3 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/13.0.3 Mobile/15E148 Safari/604.1', - 'Content-Type': 'application/json', - 'Origin': 'https://st.jingxi.com', - 'Sec-Fetch-Site': 'cross-site', - 'Sec-Fetch-Mode': 'cors', - 'Sec-Fetch-Dest': 'empty', - 'Referer': 'https://st.jingxi.com/', - 'Accept-Language': 'zh-CN,zh;q=0.9,zh-TW;q=0.8,en;q=0.7' - }, - 'body': JSON.stringify({ - "version": "3.0", - "fp": $.fingerprint, - "appId": $.appId.toString(), - "timestamp": Date.now(), - "platform": "web", - "expandParams": "" - }) - } - return new Promise(async resolve => { - $.post(options, (err, resp, data) => { - try { - if (err) { - console.log(`${JSON.stringify(err)}`) - console.log(`request_algo 签名参数API请求失败,请检查网路重试`) - } else { - if (data) { - // console.log(data); - data = JSON.parse(data); - if (data['status'] === 200) { - $.token = data.data.result.tk; - let enCryptMethodJDString = data.data.result.algo; - if (enCryptMethodJDString) $.enCryptMethodJD = new Function(`return ${enCryptMethodJDString}`)(); - // console.log(`获取签名参数成功!`) - // console.log(`fp: ${$.fingerprint}`) - // console.log(`token: ${$.token}`) - // console.log(`enCryptMethodJD: ${enCryptMethodJDString}`) - } else { - console.log('request_algo 签名参数API请求失败:') - } - } else { - console.log(`京东服务器返回空数据`) - } - } - } catch (e) { - $.logErr(e, resp) - } finally { - resolve(); - } - }) - }) -} -function decrypt(time, stk, type, url) { - stk = stk || (url ? getUrlData(url, '_stk') : '') - if (stk) { - const timestamp = new Date(time).Format("yyyyMMddhhmmssSSS"); - let hash1 = ''; - if ($.fingerprint && $.token && $.enCryptMethodJD) { - hash1 = $.enCryptMethodJD($.token, $.fingerprint.toString(), timestamp.toString(), $.appId.toString(), $.CryptoJS).toString($.CryptoJS.enc.Hex); - } else { - const random = '5gkjB6SpmC9s'; - $.token = `tk01wcdf61cb3a8nYUtHcmhSUFFCfddDPRvKvYaMjHkxo6Aj7dhzO+GXGFa9nPXfcgT+mULoF1b1YIS1ghvSlbwhE0Xc`; - $.fingerprint = 5287160221454703; - const str = `${$.token}${$.fingerprint}${timestamp}${$.appId}${random}`; - hash1 = $.CryptoJS.SHA512(str, $.token).toString($.CryptoJS.enc.Hex); - } - let st = ''; - stk.split(',').map((item, index) => { - st += `${item}:${getUrlData(url, item)}${index === stk.split(',').length -1 ? '' : '&'}`; - }) - const hash2 = $.CryptoJS.HmacSHA256(st, hash1.toString()).toString($.CryptoJS.enc.Hex); - // console.log(`\nst:${st}`) - // console.log(`h5st:${["".concat(timestamp.toString()), "".concat(fingerprint.toString()), "".concat($.appId.toString()), "".concat(token), "".concat(hash2)].join(";")}\n`) - return encodeURIComponent(["".concat(timestamp.toString()), "".concat($.fingerprint.toString()), "".concat($.appId.toString()), "".concat($.token), "".concat(hash2), "".concat("3.0"), "".concat(Date.now() + 2)].join(";")) - } else { - return '20210318144213808;8277529360925161;10001;tk01w952a1b73a8nU0luMGtBanZTHCgj0KFVwDa4n5pJ95T/5bxO/m54p4MtgVEwKNev1u/BUjrpWAUMZPW0Kz2RWP8v;86054c036fe3bf0991bd9a9da1a8d44dd130c6508602215e50bb1e385326779d' - } -} - -/** - * 获取url参数值 - * @param url - * @param name - * @returns {string} - */ -function getUrlData(url, name) { - if (typeof URL !== "undefined") { - let urls = new URL(url); - let data = urls.searchParams.get(name); - return data ? data : ''; - } else { - const query = url.match(/\?.*/)[0].substring(1) - const vars = query.split('&') - for (let i = 0; i < vars.length; i++) { - const pair = vars[i].split('=') - if (pair[0] === name) { - // return pair[1]; - return vars[i].substr(vars[i].indexOf('=') + 1); - } - } - return '' - } -} -/** - * 模拟生成 fingerprint - * @returns {string} - */ -function generateFp() { - let e = "0123456789"; - let a = 13; - let i = ''; - for (; a--; ) - i += e[Math.random() * e.length | 0]; - return (i + Date.now()).slice(0,16) -} +var _0xod2='jsjiami.com.v6',_0xod2_=['_0xod2'],_0x43fd=[_0xod2,'\x69\x73\x4e\x6f\x64\x65','\x2e\x2f\x73\x65\x6e\x64\x4e\x6f\x74\x69\x66\x79','\x2e\x2f\x6a\x64\x43\x6f\x6f\x6b\x69\x65\x2e\x6a\x73','\x6b\x65\x79\x73','\x66\x6f\x72\x45\x61\x63\x68','\x70\x75\x73\x68','\x65\x6e\x76','\x4a\x44\x5f\x44\x45\x42\x55\x47','\x66\x61\x6c\x73\x65','\x6c\x6f\x67','\x67\x65\x74\x64\x61\x74\x61','\x43\x6f\x6f\x6b\x69\x65\x4a\x44','\x43\x6f\x6f\x6b\x69\x65\x4a\x44\x32','\x74\x6f\x4f\x62\x6a','\x43\x6f\x6f\x6b\x69\x65\x73\x4a\x44','\x6d\x61\x70','\x63\x6f\x6f\x6b\x69\x65','\x66\x69\x6c\x74\x65\x72','\x70\x61\x63\x6b\x65\x74\x49\x64\x41\x72\x72','\x61\x63\x74\x69\x76\x65\x49\x64','\x35\x32\x39\x34\x33\x39','\x68\x74\x74\x70\x73\x3a\x2f\x2f\x6d\x2e\x6a\x69\x6e\x67\x78\x69\x2e\x63\x6f\x6d\x2f\x63\x75\x62\x65\x61\x63\x74\x69\x76\x65\x2f\x73\x74\x65\x70\x72\x65\x77\x61\x72\x64\x76\x33','\x61\x70\x70\x49\x64','\x65\x33\x39\x35\x66','\x6d\x73\x67','\x6e\x61\x6d\x65','\u3010\u63d0\u793a\u3011\u8bf7\u5148\u83b7\u53d6\u4eac\u4e1c\u8d26\u53f7\u4e00\x63\x6f\x6f\x6b\x69\x65\x0a\u76f4\u63a5\u4f7f\u7528\x4e\x6f\x62\x79\x44\x61\u7684\u4eac\u4e1c\u7b7e\u5230\u83b7\u53d6','\x68\x74\x74\x70\x73\x3a\x2f\x2f\x62\x65\x61\x6e\x2e\x6d\x2e\x6a\x64\x2e\x63\x6f\x6d\x2f\x62\x65\x61\x6e\x2f\x73\x69\x67\x6e\x49\x6e\x64\x65\x78\x2e\x61\x63\x74\x69\x6f\x6e','\x68\x74\x74\x70\x73\x3a\x2f\x2f\x67\x69\x74\x65\x65\x2e\x63\x6f\x6d\x2f\x4b\x69\x6e\x67\x52\x61\x6e\x35\x32\x31\x2f\x4a\x44\x2d\x53\x63\x72\x69\x70\x74\x73\x2f\x72\x61\x77\x2f\x6d\x61\x73\x74\x65\x72\x2f\x73\x68\x61\x72\x65\x43\x6f\x64\x65\x73\x2f\x6a\x78\x6c\x68\x62\x2e\x6a\x73\x6f\x6e','\x61\x75\x74\x68\x6f\x72\x4d\x79\x53\x68\x61\x72\x65\x49\x64\x73','\x63\x6f\x64\x65\x73','\x43\x72\x79\x70\x74\x6f\x4a\x53','\x63\x72\x79\x70\x74\x6f\x2d\x6a\x73','\x77\x61\x69\x74','\x6c\x65\x6e\x67\x74\x68','\x55\x73\x65\x72\x4e\x61\x6d\x65','\x6d\x61\x74\x63\x68','\x69\x6e\x64\x65\x78','\x69\x73\x4c\x6f\x67\x69\x6e','\x6e\x69\x63\x6b\x4e\x61\x6d\x65','\x6a\x64\x70\x69\x6e\x67\x6f\x75\x3b\x69\x50\x68\x6f\x6e\x65\x3b\x34\x2e\x31\x33\x2e\x30\x3b\x31\x34\x2e\x34\x2e\x32\x3b','\x3b\x6e\x65\x74\x77\x6f\x72\x6b\x2f\x77\x69\x66\x69\x3b\x6d\x6f\x64\x65\x6c\x2f\x69\x50\x68\x6f\x6e\x65\x31\x30\x2c\x32\x3b\x61\x70\x70\x42\x75\x69\x6c\x64\x2f\x31\x30\x30\x36\x30\x39\x3b\x73\x75\x70\x70\x6f\x72\x74\x41\x70\x70\x6c\x65\x50\x61\x79\x2f\x31\x3b\x68\x61\x73\x55\x50\x50\x61\x79\x2f\x30\x3b\x70\x75\x73\x68\x4e\x6f\x74\x69\x63\x65\x49\x73\x4f\x70\x65\x6e\x2f\x31\x3b\x68\x61\x73\x4f\x43\x50\x61\x79\x2f\x30\x3b\x73\x75\x70\x70\x6f\x72\x74\x42\x65\x73\x74\x50\x61\x79\x2f\x30\x3b\x73\x65\x73\x73\x69\x6f\x6e\x2f','\x72\x61\x6e\x64\x6f\x6d','\x3b\x70\x61\x70\x2f\x4a\x41\x32\x30\x31\x39\x5f\x33\x31\x31\x31\x37\x38\x39\x3b\x62\x72\x61\x6e\x64\x2f\x61\x70\x70\x6c\x65\x3b\x73\x75\x70\x70\x6f\x72\x74\x4a\x44\x53\x48\x57\x4b\x2f\x31\x3b\x4d\x6f\x7a\x69\x6c\x6c\x61\x2f\x35\x2e\x30\x20\x28\x69\x50\x68\x6f\x6e\x65\x3b\x20\x43\x50\x55\x20\x69\x50\x68\x6f\x6e\x65\x20\x4f\x53\x20\x31\x34\x5f\x36\x20\x6c\x69\x6b\x65\x20\x4d\x61\x63\x20\x4f\x53\x20\x58\x29\x20\x41\x70\x70\x6c\x65\x57\x65\x62\x4b\x69\x74\x2f\x36\x30\x35\x2e\x31\x2e\x31\x35\x20\x28\x4b\x48\x54\x4d\x4c\x2c\x20\x6c\x69\x6b\x65\x20\x47\x65\x63\x6b\x6f\x29\x20\x4d\x6f\x62\x69\x6c\x65\x2f\x31\x35\x45\x31\x34\x38','\x0a\x2a\x2a\x2a\x2a\x2a\u5f00\u59cb\u3010\u4eac\u4e1c\u8d26\u53f7','\x2a\x2a\x2a\x2a\x2a\x0a','\u3010\u63d0\u793a\u3011\x63\x6f\x6f\x6b\x69\x65\u5df2\u5931\u6548','\u4eac\u4e1c\u8d26\u53f7','\x0a\u8bf7\u91cd\u65b0\u767b\u5f55\u83b7\u53d6\x0a\x68\x74\x74\x70\x73\x3a\x2f\x2f\x62\x65\x61\x6e\x2e\x6d\x2e\x6a\x64\x2e\x63\x6f\x6d\x2f\x62\x65\x61\x6e\x2f\x73\x69\x67\x6e\x49\x6e\x64\x65\x78\x2e\x61\x63\x74\x69\x6f\x6e','\x73\x65\x6e\x64\x4e\x6f\x74\x69\x66\x79','\x63\x6f\x6f\x6b\x69\x65\u5df2\u5931\u6548\x20\x2d\x20','\x0a\u8bf7\u91cd\u65b0\u767b\u5f55\u83b7\u53d6\x63\x6f\x6f\x6b\x69\x65','\x0a\u81ea\u5df1\u4eac\u4e1c\u8d26\u53f7\u52a9\u529b\u7801\uff1a\x0a','\x73\x74\x72\x69\x6e\x67\x69\x66\x79','\x0a\u5f00\u59cb\u52a9\u529b\uff1a\u52a9\u529b\u903b\u8f91\x20\u5148\u81ea\u5df1\u4eac\u4e1c\u76f8\u4e92\u52a9\u529b\uff0c\u5982\u6709\u5269\u4f59\u52a9\u529b\u673a\u4f1a\uff0c\u5219\u52a9\u529b\u4f5c\u8005\x0a','\x63\x61\x6e\x48\x65\x6c\x70','\u3011\u53bb\u52a9\u529b\u3010','\x75\x73\x65\x72\x4e\x61\x6d\x65','\u3011\u9080\u8bf7\u7801\uff1a','\x73\x74\x72\x55\x73\x65\x72\x50\x69\x6e','\u52a9\u529b\u5931\u8d25\uff1a\u4e0d\u80fd\u52a9\u529b\u81ea\u5df1','\x6d\x61\x78','\x73\x70\x6c\x69\x63\x65','\u3011\u6709\u5269\u4f59\u52a9\u529b\u673a\u4f1a\uff0c\u5f00\u59cb\u52a9\u529b\u4f5c\u8005\x0a','\u3011\u53bb\u52a9\u529b\u4f5c\u8005\u7684\u9080\u8bf7\u7801\uff1a','\x63\x61\x6e\x4f\x70\x65\x6e\x47\x72\x61\x64\x65','\x67\x72\x61\x64\x65\x73','\u3011\u53bb\u62c6\u7b2c','\u4e2a\u7ea2\u5305','\x63\x61\x74\x63\x68','\x2c\x20\u5931\u8d25\x21\x20\u539f\u56e0\x3a\x20','\x66\x69\x6e\x61\x6c\x6c\x79','\x64\x6f\x6e\x65','\x6f\x70\x65\x6e\x46\x61\x69\x6c','\x67\x65\x74','\x4a\x6f\x69\x6e\x41\x63\x74\x69\x76\x65','\x73\x74\x65\x70\x72\x65\x77\x61\x72\x64\x5f\x6a\x73\x74\x6f\x6b\x65\x6e\x3d','\x66\x61\x72\x6d\x5f\x6a\x73\x74\x6f\x6b\x65\x6e','\x26\x74\x69\x6d\x65\x73\x74\x61\x6d\x70\x3d','\x74\x69\x6d\x65\x73\x74\x61\x6d\x70','\x26\x70\x68\x6f\x6e\x65\x69\x64\x3d','\x70\x68\x6f\x6e\x65\x69\x64','\x26\x73\x74\x72\x50\x69\x6e\x3d','\x3a\x20\x20\x41\x50\x49\u67e5\u8be2\u8bf7\u6c42\u5931\u8d25\x20\u203c\ufe0f\u203c\ufe0f','\x6c\x6f\x67\x45\x72\x72','\x70\x61\x72\x73\x65','\x72\x65\x70\x6c\x61\x63\x65','\x69\x52\x65\x74','\u6d3b\u52a8\u5f00\u542f\u6210\u529f\x0a','\u6d3b\u52a8\u5f00\u542f\u5931\u8d25\uff1a','\x73\x45\x72\x72\x4d\x73\x67','\x47\x65\x74\x55\x73\x65\x72\x49\x6e\x66\x6f','\x68\x65\x6c\x70\x4e\x75\x6d','\x44\x61\x74\x61','\x67\x72\x61\x64\x65\x43\x6f\x6e\x66\x69\x67','\x64\x77\x47\x72\x61\x64\x65','\x64\x77\x48\x65\x6c\x70\x54\x69\x6d\x65\x73','\x64\x77\x48\x65\x6c\x70\x65\x64\x54\x69\x6d\x65\x73','\u4e2a\u9636\u68af\u7ea2\u5305\u5df2\u5168\u90e8\u62c6\u5b8c\x0a','\u83b7\u53d6\u52a9\u529b\u7801\u6210\u529f\uff1a','\u83b7\u53d6\u52a9\u529b\u7801\u5931\u8d25\uff1a','\x45\x6e\x72\x6f\x6c\x6c\x46\x72\x69\x65\x6e\x64','\u52a9\u529b\u6210\u529f\ud83c\udf89\x3a','\u6e29\u99a8\u63d0\u793a\uff1a\u5982\u63d0\u793a\u52a9\u529b\u706b\u7206\uff0c\u53ef\u5c1d\u8bd5\u5bfb\u627e\u4eac\u4e1c\u5ba2\u670d','\u52a9\u529b\u5931\u8d25\uff1a','\x44\x6f\x47\x72\x61\x64\x65\x44\x72\x61\x77','\x67\x72\x61\x64\x65\x3d','\u62c6\u7ea2\u5305\u6210\u529f\x3a','\u62c6\u7ea2\u5305\u5931\u8d25\x3a','\x4d\x6f\x7a\x69\x6c\x6c\x61\x2f\x35\x2e\x30\x20\x28\x69\x50\x68\x6f\x6e\x65\x3b\x20\x43\x50\x55\x20\x69\x50\x68\x6f\x6e\x65\x20\x4f\x53\x20\x31\x33\x5f\x32\x5f\x33\x20\x6c\x69\x6b\x65\x20\x4d\x61\x63\x20\x4f\x53\x20\x58\x29\x20\x41\x70\x70\x6c\x65\x57\x65\x62\x4b\x69\x74\x2f\x36\x30\x35\x2e\x31\x2e\x31\x35\x20\x28\x4b\x48\x54\x4d\x4c\x2c\x20\x6c\x69\x6b\x65\x20\x47\x65\x63\x6b\x6f\x29\x20\x56\x65\x72\x73\x69\x6f\x6e\x2f\x31\x33\x2e\x30\x2e\x33\x20\x4d\x6f\x62\x69\x6c\x65\x2f\x31\x35\x45\x31\x34\x38\x20\x53\x61\x66\x61\x72\x69\x2f\x36\x30\x34\x2e\x31\x20\x45\x64\x67\x2f\x38\x37\x2e\x30\x2e\x34\x32\x38\x30\x2e\x38\x38','\x54\x47\x5f\x50\x52\x4f\x58\x59\x5f\x48\x4f\x53\x54','\x54\x47\x5f\x50\x52\x4f\x58\x59\x5f\x50\x4f\x52\x54','\x74\x75\x6e\x6e\x65\x6c','\x68\x74\x74\x70\x73\x4f\x76\x65\x72\x48\x74\x74\x70','\x61\x73\x73\x69\x67\x6e','\x32\x30\x32\x32\x30\x34\x31\x32\x31\x36\x34\x36\x34\x31\x31\x35\x37\x25\x33\x42\x31\x39\x37\x65\x65\x36\x39\x37\x64\x35\x30\x63\x61\x33\x31\x36\x66\x33\x35\x38\x32\x34\x38\x38\x63\x37\x66\x61\x39\x64\x33\x34\x25\x33\x42\x31\x36\x39\x66\x31\x25\x33\x42\x74\x6b\x30\x32\x77\x64\x39\x34\x35\x31\x64\x65\x62\x31\x38\x6e\x31\x50\x33\x31\x4a\x75\x6e\x53\x47\x54\x66\x5a\x68\x6d\x65\x62\x75\x69\x76\x77\x73\x45\x77\x59\x57\x55\x51\x46\x31\x5a\x6b\x70\x64\x74\x75\x53\x6d\x4b\x4f\x45\x53\x35\x44\x6e\x49\x4d\x46\x64\x79\x4f\x76\x4b\x69\x6b\x64\x67\x75\x65\x6c\x49\x69\x42\x55\x6e\x4a\x62\x65\x43\x67\x6f\x4e\x6c\x63\x45\x76\x76\x25\x33\x42\x36\x65\x30\x39\x30\x63\x62\x64\x65\x33\x33\x37\x35\x39\x30\x62\x35\x31\x61\x35\x31\x34\x37\x31\x38\x66\x65\x65\x33\x39\x31\x64\x34\x36\x66\x65\x63\x65\x36\x62\x39\x35\x33\x65\x64\x31\x30\x38\x34\x61\x30\x35\x32\x66\x36\x64\x37\x36\x66\x66\x62\x64\x39\x32\x25\x33\x42\x33\x2e\x30\x25\x33\x42\x31\x36\x34\x39\x37\x35\x33\x32\x30\x31\x31\x35\x37','\x3f\x61\x63\x74\x69\x76\x65\x49\x64\x3d','\x26\x5f\x73\x74\x6b\x3d','\x26\x5f\x73\x74\x65\x3d\x31\x26\x68\x35\x73\x74\x3d','\x26\x75\x73\x65\x72\x44\x72\x61\x77\x3d\x30\x26\x70\x75\x62\x6c\x69\x73\x68\x46\x6c\x61\x67\x3d\x31\x26\x63\x68\x61\x6e\x6e\x65\x6c\x3d\x37\x26\x5f\x74\x3d','\x6e\x6f\x77','\x26\x5f\x3d','\x26\x73\x63\x65\x6e\x65\x76\x61\x6c\x3d\x32\x26\x67\x5f\x6c\x6f\x67\x69\x6e\x5f\x74\x79\x70\x65\x3d\x31\x26\x63\x61\x6c\x6c\x62\x61\x63\x6b\x3d\x6a\x73\x6f\x6e\x70\x43\x42\x4b','\x66\x72\x6f\x6d\x43\x68\x61\x72\x43\x6f\x64\x65','\x66\x6c\x6f\x6f\x72','\x63\x68\x61\x72\x43\x6f\x64\x65\x41\x74','\x26\x67\x5f\x74\x79\x3d\x6c\x73','\x6d\x2e\x6a\x69\x6e\x67\x78\x69\x2e\x63\x6f\x6d','\x2a\x2f\x2a','\x67\x7a\x69\x70\x2c\x20\x64\x65\x66\x6c\x61\x74\x65\x2c\x20\x62\x72','\x7a\x68\x2d\x43\x4e\x2c\x7a\x68\x2d\x48\x61\x6e\x73\x3b\x71\x3d\x30\x2e\x39','\x68\x74\x74\x70\x73\x3a\x2f\x2f\x73\x74\x2e\x6a\x69\x6e\x67\x78\x69\x2e\x63\x6f\x6d\x2f','\x73\x70\x6c\x69\x74','\x73\x6f\x72\x74','\x6a\x6f\x69\x6e','\x61\x62\x63\x64\x65\x66\x30\x31\x32\x33\x34\x35\x36\x37\x38\x39','\x63\x68\x61\x72\x41\x74','\x68\x74\x74\x70\x73\x3a\x2f\x2f\x6d\x65\x2d\x61\x70\x69\x2e\x6a\x64\x2e\x63\x6f\x6d\x2f\x75\x73\x65\x72\x5f\x6e\x65\x77\x2f\x69\x6e\x66\x6f\x2f\x47\x65\x74\x4a\x44\x55\x73\x65\x72\x49\x6e\x66\x6f\x55\x6e\x69\x6f\x6e','\x6d\x65\x2d\x61\x70\x69\x2e\x6a\x64\x2e\x63\x6f\x6d','\x53\x63\x72\x69\x70\x74\x61\x62\x6c\x65\x57\x69\x64\x67\x65\x74\x45\x78\x74\x65\x6e\x73\x69\x6f\x6e\x2f\x31\x38\x35\x20\x43\x46\x4e\x65\x74\x77\x6f\x72\x6b\x2f\x31\x33\x31\x32\x20\x44\x61\x72\x77\x69\x6e\x2f\x32\x31\x2e\x30\x2e\x30','\x72\x65\x74\x63\x6f\x64\x65','\x31\x30\x30\x31','\x64\x61\x74\x61','\x68\x61\x73\x4f\x77\x6e\x50\x72\x6f\x70\x65\x72\x74\x79','\x75\x73\x65\x72\x49\x6e\x66\x6f','\x62\x61\x73\x65\x49\x6e\x66\x6f','\x6e\x69\x63\x6b\x6e\x61\x6d\x65','\u4eac\u4e1c\u670d\u52a1\u5668\u8fd4\u56de\u7a7a\u6570\u636e','\x70\x72\x6f\x74\x6f\x74\x79\x70\x65','\x46\x6f\x72\x6d\x61\x74','\x67\x65\x74\x4d\x6f\x6e\x74\x68','\x67\x65\x74\x44\x61\x74\x65','\x67\x65\x74\x48\x6f\x75\x72\x73','\x67\x65\x74\x4d\x69\x6e\x75\x74\x65\x73','\x67\x65\x74\x53\x65\x63\x6f\x6e\x64\x73','\x67\x65\x74\x44\x61\x79','\x67\x65\x74\x4d\x69\x6c\x6c\x69\x73\x65\x63\x6f\x6e\x64\x73','\x74\x65\x73\x74','\x63\x6f\x6e\x63\x61\x74','\x67\x65\x74\x46\x75\x6c\x6c\x59\x65\x61\x72','\x73\x75\x62\x73\x74\x72','\x30\x30\x30','\x66\x69\x6e\x67\x65\x72\x70\x72\x69\x6e\x74','\x68\x74\x74\x70\x73\x3a\x2f\x2f\x63\x61\x63\x74\x75\x73\x2e\x6a\x64\x2e\x63\x6f\x6d\x2f\x72\x65\x71\x75\x65\x73\x74\x5f\x61\x6c\x67\x6f\x3f\x67\x5f\x74\x79\x3d\x61\x6a\x61\x78','\x63\x61\x63\x74\x75\x73\x2e\x6a\x64\x2e\x63\x6f\x6d','\x6e\x6f\x2d\x63\x61\x63\x68\x65','\x61\x70\x70\x6c\x69\x63\x61\x74\x69\x6f\x6e\x2f\x6a\x73\x6f\x6e','\x4d\x6f\x7a\x69\x6c\x6c\x61\x2f\x35\x2e\x30\x20\x28\x69\x50\x68\x6f\x6e\x65\x3b\x20\x43\x50\x55\x20\x69\x50\x68\x6f\x6e\x65\x20\x4f\x53\x20\x31\x33\x5f\x32\x5f\x33\x20\x6c\x69\x6b\x65\x20\x4d\x61\x63\x20\x4f\x53\x20\x58\x29\x20\x41\x70\x70\x6c\x65\x57\x65\x62\x4b\x69\x74\x2f\x36\x30\x35\x2e\x31\x2e\x31\x35\x20\x28\x4b\x48\x54\x4d\x4c\x2c\x20\x6c\x69\x6b\x65\x20\x47\x65\x63\x6b\x6f\x29\x20\x56\x65\x72\x73\x69\x6f\x6e\x2f\x31\x33\x2e\x30\x2e\x33\x20\x4d\x6f\x62\x69\x6c\x65\x2f\x31\x35\x45\x31\x34\x38\x20\x53\x61\x66\x61\x72\x69\x2f\x36\x30\x34\x2e\x31','\x68\x74\x74\x70\x73\x3a\x2f\x2f\x73\x74\x2e\x6a\x69\x6e\x67\x78\x69\x2e\x63\x6f\x6d','\x63\x72\x6f\x73\x73\x2d\x73\x69\x74\x65','\x63\x6f\x72\x73','\x65\x6d\x70\x74\x79','\x7a\x68\x2d\x43\x4e\x2c\x7a\x68\x3b\x71\x3d\x30\x2e\x39\x2c\x7a\x68\x2d\x54\x57\x3b\x71\x3d\x30\x2e\x38\x2c\x65\x6e\x3b\x71\x3d\x30\x2e\x37','\x33\x2e\x30','\x74\x6f\x53\x74\x72\x69\x6e\x67','\x77\x65\x62','\x70\x6f\x73\x74','\x72\x65\x71\x75\x65\x73\x74\x5f\x61\x6c\x67\x6f\x20\u7b7e\u540d\u53c2\u6570\x41\x50\x49\u8bf7\u6c42\u5931\u8d25\uff0c\u8bf7\u68c0\u67e5\u7f51\u8def\u91cd\u8bd5','\x73\x74\x61\x74\x75\x73','\x74\x6f\x6b\x65\x6e','\x72\x65\x73\x75\x6c\x74','\x61\x6c\x67\x6f','\x65\x6e\x43\x72\x79\x70\x74\x4d\x65\x74\x68\x6f\x64\x4a\x44','\x72\x65\x74\x75\x72\x6e\x20','\x72\x65\x71\x75\x65\x73\x74\x5f\x61\x6c\x67\x6f\x20\u7b7e\u540d\u53c2\u6570\x41\x50\x49\u8bf7\u6c42\u5931\u8d25\x3a','\x5f\x73\x74\x6b','\x79\x79\x79\x79\x4d\x4d\x64\x64\x68\x68\x6d\x6d\x73\x73\x53\x53\x53','\x65\x6e\x63','\x48\x65\x78','\x35\x67\x6b\x6a\x42\x36\x53\x70\x6d\x43\x39\x73','\x74\x6b\x30\x31\x77\x63\x64\x66\x36\x31\x63\x62\x33\x61\x38\x6e\x59\x55\x74\x48\x63\x6d\x68\x53\x55\x46\x46\x43\x66\x64\x64\x44\x50\x52\x76\x4b\x76\x59\x61\x4d\x6a\x48\x6b\x78\x6f\x36\x41\x6a\x37\x64\x68\x7a\x4f\x2b\x47\x58\x47\x46\x61\x39\x6e\x50\x58\x66\x63\x67\x54\x2b\x6d\x55\x4c\x6f\x46\x31\x62\x31\x59\x49\x53\x31\x67\x68\x76\x53\x6c\x62\x77\x68\x45\x30\x58\x63','\x53\x48\x41\x35\x31\x32','\x48\x6d\x61\x63\x53\x48\x41\x32\x35\x36','\x32\x30\x32\x31\x30\x33\x31\x38\x31\x34\x34\x32\x31\x33\x38\x30\x38\x3b\x38\x32\x37\x37\x35\x32\x39\x33\x36\x30\x39\x32\x35\x31\x36\x31\x3b\x31\x30\x30\x30\x31\x3b\x74\x6b\x30\x31\x77\x39\x35\x32\x61\x31\x62\x37\x33\x61\x38\x6e\x55\x30\x6c\x75\x4d\x47\x74\x42\x61\x6e\x5a\x54\x48\x43\x67\x6a\x30\x4b\x46\x56\x77\x44\x61\x34\x6e\x35\x70\x4a\x39\x35\x54\x2f\x35\x62\x78\x4f\x2f\x6d\x35\x34\x70\x34\x4d\x74\x67\x56\x45\x77\x4b\x4e\x65\x76\x31\x75\x2f\x42\x55\x6a\x72\x70\x57\x41\x55\x4d\x5a\x50\x57\x30\x4b\x7a\x32\x52\x57\x50\x38\x76\x3b\x38\x36\x30\x35\x34\x63\x30\x33\x36\x66\x65\x33\x62\x66\x30\x39\x39\x31\x62\x64\x39\x61\x39\x64\x61\x31\x61\x38\x64\x34\x34\x64\x64\x31\x33\x30\x63\x36\x35\x30\x38\x36\x30\x32\x32\x31\x35\x65\x35\x30\x62\x62\x31\x65\x33\x38\x35\x33\x32\x36\x37\x37\x39\x64','\x75\x6e\x64\x65\x66\x69\x6e\x65\x64','\x73\x65\x61\x72\x63\x68\x50\x61\x72\x61\x6d\x73','\x73\x75\x62\x73\x74\x72\x69\x6e\x67','\x69\x6e\x64\x65\x78\x4f\x66','\x30\x31\x32\x33\x34\x35\x36\x37\x38\x39','\x73\x6c\x69\x63\x65','\x45\x71\x6a\x52\x78\x73\x71\x6a\x66\x47\x69\x61\x6d\x77\x69\x2e\x67\x63\x66\x6f\x75\x6d\x2e\x44\x76\x36\x64\x3d\x3d'];function _0x3625(_0x50f146,_0x11f3b9){_0x50f146=~~'0x'['concat'](_0x50f146['slice'](0x0));var _0x50f7cb=_0x43fd[_0x50f146];return _0x50f7cb;};(function(_0x565586,_0x78f4e2){var _0x489111=0x0;for(_0x78f4e2=_0x565586['shift'](_0x489111>>0x2);_0x78f4e2&&_0x78f4e2!==(_0x565586['pop'](_0x489111>>0x3)+'')['replace'](/[EqRxqfGwgfuDd=]/g,'');_0x489111++){_0x489111=_0x489111^0xdf1b5;}}(_0x43fd,_0x3625));const notify=$[_0x3625('0')]()?require(_0x3625('1')):{};const jdCookieNode=$[_0x3625('0')]()?require(_0x3625('2')):{};let cookiesArr=[],cookie='';let UA,UAInfo={},codeInfo={},token;if($[_0x3625('0')]()){Object[_0x3625('3')](jdCookieNode)[_0x3625('4')](_0x1503d7=>{cookiesArr[_0x3625('5')](jdCookieNode[_0x1503d7]);});if(process[_0x3625('6')][_0x3625('7')]&&process[_0x3625('6')][_0x3625('7')]===_0x3625('8'))console[_0x3625('9')]=()=>{};}else{cookiesArr=[$[_0x3625('a')](_0x3625('b')),$[_0x3625('a')](_0x3625('c')),...$[_0x3625('d')]($[_0x3625('a')](_0x3625('e'))||'\x5b\x5d')[_0x3625('f')](_0x35f952=>_0x35f952[_0x3625('10')])][_0x3625('11')](_0x271dff=>!!_0x271dff);}$[_0x3625('12')]=[];$[_0x3625('13')]=_0x3625('14');const BASE_URL=_0x3625('15');$[_0x3625('16')]=_0x3625('17');!(async()=>{if(!cookiesArr[0x0]){$[_0x3625('18')]($[_0x3625('19')],_0x3625('1a'),_0x3625('1b'),{'open-url':_0x3625('1b')});return;}let _0x31a966=await getAuthorShareCode(_0x3625('1c'));if(_0x31a966&&_0x31a966[_0x3625('13')])$[_0x3625('13')]=_0x31a966[_0x3625('13')];$[_0x3625('1d')]=[..._0x31a966&&_0x31a966[_0x3625('1e')]||[]];$[_0x3625('1f')]=$[_0x3625('0')]()?require(_0x3625('20')):CryptoJS;await requestAlgo();await $[_0x3625('21')](0x3e8);for(let _0x161eea=0x0;_0x161eea{$[_0x3625('9')]('','\u274c\x20'+$[_0x3625('19')]+_0x3625('46')+_0xbfc31b+'\x21','');})[_0x3625('47')](()=>{$[_0x3625('48')]();});async function main(){$[_0x3625('49')]=![];await joinActive();await $[_0x3625('21')](0x7d0);if(!$[_0x3625('49')]){await getUserInfo();}}function joinActive(){return new Promise(_0x8007ea=>{$[_0x3625('4a')](taskurl(_0x3625('4b'),_0x3625('4c')+token[_0x3625('4d')]+_0x3625('4e')+token[_0x3625('4f')]+_0x3625('50')+token[_0x3625('51')]+_0x3625('52')),(_0x320c24,_0x340df5,_0x590388)=>{try{if(_0x320c24){console[_0x3625('9')]('\x0a'+$[_0x3625('19')]+_0x3625('53'));$[_0x3625('54')](_0x320c24);}else{_0x590388=JSON[_0x3625('55')](_0x590388[_0x3625('56')](/\n/g,'')[_0x3625('24')](new RegExp(/jsonpCBK.?\((.*);*\)/))[0x1]);if(_0x590388[_0x3625('57')]===0x0){console[_0x3625('9')](_0x3625('58'));}else{if(_0x590388[_0x3625('57')]===0x7e0){$[_0x3625('49')]=!![];}console[_0x3625('9')](_0x3625('59')+_0x590388[_0x3625('5a')]+'\x0a');}}}catch(_0x14c1aa){$[_0x3625('54')](_0x14c1aa,_0x340df5);}finally{_0x8007ea();}});});}function getUserInfo(){return new Promise(_0x14e405=>{$[_0x3625('4a')](taskurl(_0x3625('5b')),(_0x2d1722,_0x5ccd6d,_0x185cc7)=>{try{if(_0x2d1722){console[_0x3625('9')]('\x0a'+$[_0x3625('19')]+_0x3625('53'));$[_0x3625('54')](_0x2d1722);}else{_0x185cc7=JSON[_0x3625('55')](_0x185cc7[_0x3625('56')](/\n/g,'')[_0x3625('24')](new RegExp(/jsonpCBK.?\((.*);*\)/))[0x1]);if(_0x185cc7[_0x3625('57')]===0x0){$[_0x3625('42')]=[];$[_0x3625('5c')]='';let _0x3620d4=_0x185cc7[_0x3625('5d')][_0x3625('5e')];for(let _0x545af7 of Object[_0x3625('3')](_0x3620d4)){let _0x4273e7=_0x3620d4[_0x545af7];$[_0x3625('42')][_0x3625('5')](_0x4273e7[_0x3625('5f')]);$[_0x3625('5c')]=_0x4273e7[_0x3625('60')];}if(_0x185cc7[_0x3625('5d')][_0x3625('61')]===$[_0x3625('5c')]){console[_0x3625('9')]($[_0x3625('42')][$[_0x3625('42')][_0x3625('22')]-0x1]+_0x3625('62'));}else{console[_0x3625('9')](_0x3625('63')+_0x185cc7[_0x3625('5d')][_0x3625('3b')]+'\x0a');if(_0x185cc7[_0x3625('5d')][_0x3625('3b')]){$[_0x3625('12')][_0x3625('5')]({'\x73\x74\x72\x55\x73\x65\x72\x50\x69\x6e':_0x185cc7[_0x3625('5d')][_0x3625('3b')],'\x75\x73\x65\x72\x4e\x61\x6d\x65':$[_0x3625('23')]});}}if(_0x185cc7[_0x3625('5d')][_0x3625('3b')]){codeInfo[$[_0x3625('23')]]=_0x185cc7[_0x3625('5d')][_0x3625('3b')];}}else{console[_0x3625('9')](_0x3625('64')+_0x185cc7[_0x3625('5a')]+'\x0a');}}}catch(_0x31d0ce){$[_0x3625('54')](_0x31d0ce,_0x5ccd6d);}finally{_0x14e405(_0x185cc7);}});});}function enrollFriend(_0x141a9d){return new Promise(_0x59fafd=>{$[_0x3625('4a')](taskurl(_0x3625('65'),_0x3625('4c')+token[_0x3625('4d')]+_0x3625('4e')+token[_0x3625('4f')]+_0x3625('50')+token[_0x3625('51')]+_0x3625('52')+_0x141a9d),(_0x50806f,_0x49610d,_0x1221b5)=>{try{if(_0x50806f){console[_0x3625('9')]('\x0a'+$[_0x3625('19')]+_0x3625('53'));$[_0x3625('9')](JSON[_0x3625('35')](_0x50806f));}else{_0x1221b5=JSON[_0x3625('55')](_0x1221b5[_0x3625('56')](/\n/g,'')[_0x3625('24')](new RegExp(/jsonpCBK.?\((.*);*\)/))[0x1]);if(_0x1221b5[_0x3625('57')]===0x0){console[_0x3625('9')](_0x3625('66')+_0x1221b5[_0x3625('5a')]+'\x0a');}else{if(_0x1221b5[_0x3625('57')]===0x7d0)$[_0x3625('37')]=![];if(_0x1221b5[_0x3625('57')]===0x7df)$[_0x3625('37')]=![];if(_0x1221b5[_0x3625('57')]===0x7e0){$[_0x3625('37')]=![];console[_0x3625('9')](_0x3625('67'));}if(_0x1221b5[_0x3625('57')]===0x7dd||_0x1221b5[_0x3625('57')]===0x7db)$[_0x3625('3d')]=!![];console[_0x3625('9')](_0x3625('68')+_0x1221b5[_0x3625('5a')]+'\x0a');}}}catch(_0x459182){$[_0x3625('54')](_0x459182,_0x49610d);}finally{_0x59fafd();}});});}function openRedPack(_0x3b4840,_0x254b14){return new Promise(_0x17698d=>{$[_0x3625('4a')](taskurl(_0x3625('69'),_0x3625('6a')+_0x254b14),(_0x3f3335,_0x287fb2,_0x271718)=>{try{if(_0x3f3335){console[_0x3625('9')]('\x0a'+$[_0x3625('19')]+_0x3625('53'));$[_0x3625('54')](_0x3f3335);}else{_0x271718=JSON[_0x3625('55')](_0x271718[_0x3625('56')](/\n/g,'')[_0x3625('24')](new RegExp(/jsonpCBK.?\((.*);*\)/))[0x1]);if(_0x271718[_0x3625('57')]===0x0){console[_0x3625('9')](_0x3625('6b')+_0x271718[_0x3625('5a')]+'\x0a');}else{if(_0x271718[_0x3625('57')]===0x7e1)$[_0x3625('41')]=![];console[_0x3625('9')](_0x3625('6c')+_0x271718[_0x3625('5a')]+'\x0a');}}}catch(_0x333928){$[_0x3625('54')](_0x333928,_0x287fb2);}finally{_0x17698d();}});});}function getAuthorShareCode(_0x4cc0bf){return new Promise(async _0x585bbc=>{const _0xa1db6d={'\x75\x72\x6c':_0x4cc0bf+'\x3f'+new Date(),'timeout':0x2710,'\x68\x65\x61\x64\x65\x72\x73':{'User-Agent':_0x3625('6d')}};if($[_0x3625('0')]()&&process[_0x3625('6')][_0x3625('6e')]&&process[_0x3625('6')][_0x3625('6f')]){const _0x286866=require(_0x3625('70'));const _0x3a22ff={'\x68\x74\x74\x70\x73':_0x286866[_0x3625('71')]({'\x70\x72\x6f\x78\x79':{'\x68\x6f\x73\x74':process[_0x3625('6')][_0x3625('6e')],'\x70\x6f\x72\x74':process[_0x3625('6')][_0x3625('6f')]*0x1}})};Object[_0x3625('72')](_0xa1db6d,{'\x61\x67\x65\x6e\x74':_0x3a22ff});}$[_0x3625('4a')](_0xa1db6d,async(_0x5eeb43,_0x4a7bb4,_0x574329)=>{try{_0x585bbc(JSON[_0x3625('55')](_0x574329));}catch(_0x4935c1){}finally{_0x585bbc();}});await $[_0x3625('21')](0x2710);_0x585bbc();});}function taskurl(_0xc676ab,_0x4eb197=''){let _0x1e9f96=_0x3625('73');let _0x1a2b90=BASE_URL+'\x2f'+_0xc676ab+_0x3625('74')+$[_0x3625('13')]+(_0x4eb197?'\x26'+_0x4eb197:'');_0x1a2b90+=_0x3625('75')+getStk(_0x1a2b90);_0x1a2b90+=_0x3625('76')+_0x1e9f96+_0x3625('77')+Date[_0x3625('78')]()+_0x3625('79')+Date[_0x3625('78')]()+_0x3625('7a')+String[_0x3625('7b')](Math[_0x3625('7c')](Math[_0x3625('2a')]()*0x1a)+'\x41'[_0x3625('7d')](0x0))+_0x3625('7e');return{'\x75\x72\x6c':_0x1a2b90,'\x68\x65\x61\x64\x65\x72\x73':{'Host':_0x3625('7f'),'Accept':_0x3625('80'),'Accept-Encoding':_0x3625('81'),'User-Agent':UA,'Accept-Language':_0x3625('82'),'Referer':_0x3625('83'),'Cookie':cookie}};}function getStk(_0x244cee){let _0x8e36b7=_0x244cee[_0x3625('84')]('\x26')[_0x3625('f')](_0x4d6179=>_0x4d6179[_0x3625('56')](/.*\?/,'')[_0x3625('56')](/=.*/,''));return encodeURIComponent(_0x8e36b7[_0x3625('11')](_0x5c1537=>_0x5c1537)[_0x3625('85')]()[_0x3625('86')]('\x2c'));}function randomString(_0x432350){_0x432350=_0x432350||0x20;let _0x333d39=_0x3625('87'),_0x180eb7=_0x333d39[_0x3625('22')],_0x84cd14='';for(let _0x2f4f26=0x0;_0x2f4f26<_0x432350;_0x2f4f26++)_0x84cd14+=_0x333d39[_0x3625('88')](Math[_0x3625('7c')](Math[_0x3625('2a')]()*_0x180eb7));return _0x84cd14;}function TotalBean(){return new Promise(_0x4b8f08=>{const _0x18ac19={'\x75\x72\x6c':_0x3625('89'),'\x68\x65\x61\x64\x65\x72\x73':{'Host':_0x3625('8a'),'Accept':_0x3625('80'),'User-Agent':_0x3625('8b'),'Accept-Language':_0x3625('82'),'Accept-Encoding':_0x3625('81'),'Cookie':cookie}};$[_0x3625('4a')](_0x18ac19,(_0x53736c,_0x2fe93a,_0x56158f)=>{try{if(_0x53736c){$[_0x3625('54')](_0x53736c);}else{if(_0x56158f){_0x56158f=JSON[_0x3625('55')](_0x56158f);if(_0x56158f[_0x3625('8c')]===_0x3625('8d')){$[_0x3625('26')]=![];return;}if(_0x56158f[_0x3625('8c')]==='\x30'&&_0x56158f[_0x3625('8e')]&&_0x56158f[_0x3625('8e')][_0x3625('8f')](_0x3625('90'))){$[_0x3625('27')]=_0x56158f[_0x3625('8e')][_0x3625('90')][_0x3625('91')][_0x3625('92')];}}else{console[_0x3625('9')](_0x3625('93'));}}}catch(_0xc0e37d){$[_0x3625('54')](_0xc0e37d,_0x2fe93a);}finally{_0x4b8f08();}});});}Date[_0x3625('94')][_0x3625('95')]=function(_0x456a01){var _0x39a937,_0xa48103=this,_0x58d3bd=_0x456a01,_0x4677ed={'M+':_0xa48103[_0x3625('96')]()+0x1,'d+':_0xa48103[_0x3625('97')](),'D+':_0xa48103[_0x3625('97')](),'h+':_0xa48103[_0x3625('98')](),'H+':_0xa48103[_0x3625('98')](),'m+':_0xa48103[_0x3625('99')](),'s+':_0xa48103[_0x3625('9a')](),'w+':_0xa48103[_0x3625('9b')](),'q+':Math[_0x3625('7c')]((_0xa48103[_0x3625('96')]()+0x3)/0x3),'S+':_0xa48103[_0x3625('9c')]()};/(y+)/i[_0x3625('9d')](_0x58d3bd)&&(_0x58d3bd=_0x58d3bd[_0x3625('56')](RegExp['\x24\x31'],''[_0x3625('9e')](_0xa48103[_0x3625('9f')]())[_0x3625('a0')](0x4-RegExp['\x24\x31'][_0x3625('22')])));for(var _0x456d65 in _0x4677ed){if(new RegExp('\x28'[_0x3625('9e')](_0x456d65,'\x29'))[_0x3625('9d')](_0x58d3bd)){var _0x577d0c,_0x4b1bf7='\x53\x2b'===_0x456d65?_0x3625('a1'):'\x30\x30';_0x58d3bd=_0x58d3bd[_0x3625('56')](RegExp['\x24\x31'],0x1==RegExp['\x24\x31'][_0x3625('22')]?_0x4677ed[_0x456d65]:(''[_0x3625('9e')](_0x4b1bf7)+_0x4677ed[_0x456d65])[_0x3625('a0')](''[_0x3625('9e')](_0x4677ed[_0x456d65])[_0x3625('22')]));}}return _0x58d3bd;};async function requestAlgo(){$[_0x3625('a2')]=await generateFp();const _0x8a925b={'url':_0x3625('a3'),'headers':{'Authority':_0x3625('a4'),'Pragma':_0x3625('a5'),'Cache-Control':_0x3625('a5'),'Accept':_0x3625('a6'),'User-Agent':_0x3625('a7'),'Content-Type':_0x3625('a6'),'Origin':_0x3625('a8'),'Sec-Fetch-Site':_0x3625('a9'),'Sec-Fetch-Mode':_0x3625('aa'),'Sec-Fetch-Dest':_0x3625('ab'),'Referer':_0x3625('83'),'Accept-Language':_0x3625('ac')},'body':JSON[_0x3625('35')]({'version':_0x3625('ad'),'fp':$[_0x3625('a2')],'appId':$[_0x3625('16')][_0x3625('ae')](),'timestamp':Date[_0x3625('78')](),'platform':_0x3625('af'),'expandParams':''})};return new Promise(async _0x4430ff=>{$[_0x3625('b0')](_0x8a925b,(_0x45ab31,_0x513a48,_0x11b7b5)=>{try{if(_0x45ab31){console[_0x3625('9')](''+JSON[_0x3625('35')](_0x45ab31));console[_0x3625('9')](_0x3625('b1'));}else{if(_0x11b7b5){_0x11b7b5=JSON[_0x3625('55')](_0x11b7b5);if(_0x11b7b5[_0x3625('b2')]===0xc8){$[_0x3625('b3')]=_0x11b7b5[_0x3625('8e')][_0x3625('b4')]['\x74\x6b'];let _0x26d99b=_0x11b7b5[_0x3625('8e')][_0x3625('b4')][_0x3625('b5')];if(_0x26d99b)$[_0x3625('b6')]=new Function(_0x3625('b7')+_0x26d99b)();}else{console[_0x3625('9')](_0x3625('b8'));}}else{console[_0x3625('9')](_0x3625('93'));}}}catch(_0x577c65){$[_0x3625('54')](_0x577c65,_0x513a48);}finally{_0x4430ff();}});});}function decrypt(_0xd1c068,_0x2981f4,_0x2548fc,_0x5ab987){_0x2981f4=_0x2981f4||(_0x5ab987?getUrlData(_0x5ab987,_0x3625('b9')):'');if(_0x2981f4){const _0xd01f7b=new Date(_0xd1c068)[_0x3625('95')](_0x3625('ba'));let _0x49f89c='';if($[_0x3625('a2')]&&$[_0x3625('b3')]&&$[_0x3625('b6')]){_0x49f89c=$[_0x3625('b6')]($[_0x3625('b3')],$[_0x3625('a2')][_0x3625('ae')](),_0xd01f7b[_0x3625('ae')](),$[_0x3625('16')][_0x3625('ae')](),$[_0x3625('1f')])[_0x3625('ae')]($[_0x3625('1f')][_0x3625('bb')][_0x3625('bc')]);}else{const _0x49b1b4=_0x3625('bd');$[_0x3625('b3')]=_0x3625('be');$[_0x3625('a2')]=0x12c8a4eaded16f;const _0x2cfc0d=''+$[_0x3625('b3')]+$[_0x3625('a2')]+_0xd01f7b+$[_0x3625('16')]+_0x49b1b4;_0x49f89c=$[_0x3625('1f')][_0x3625('bf')](_0x2cfc0d,$[_0x3625('b3')])[_0x3625('ae')]($[_0x3625('1f')][_0x3625('bb')][_0x3625('bc')]);}let _0x5bb631='';_0x2981f4[_0x3625('84')]('\x2c')[_0x3625('f')]((_0x1cf809,_0x482b8f)=>{_0x5bb631+=_0x1cf809+'\x3a'+getUrlData(_0x5ab987,_0x1cf809)+(_0x482b8f===_0x2981f4[_0x3625('84')]('\x2c')[_0x3625('22')]-0x1?'':'\x26');});const _0x29da93=$[_0x3625('1f')][_0x3625('c0')](_0x5bb631,_0x49f89c[_0x3625('ae')]())[_0x3625('ae')]($[_0x3625('1f')][_0x3625('bb')][_0x3625('bc')]);return encodeURIComponent([''[_0x3625('9e')](_0xd01f7b[_0x3625('ae')]()),''[_0x3625('9e')]($[_0x3625('a2')][_0x3625('ae')]()),''[_0x3625('9e')]($[_0x3625('16')][_0x3625('ae')]()),''[_0x3625('9e')]($[_0x3625('b3')]),''[_0x3625('9e')](_0x29da93),''[_0x3625('9e')](_0x3625('ad')),''[_0x3625('9e')](Date[_0x3625('78')]()+0x2)][_0x3625('86')]('\x3b'));}else{return _0x3625('c1');}}function getUrlData(_0x1fba2e,_0x444d1b){if(typeof URL!==_0x3625('c2')){let _0x3cb171=new URL(_0x1fba2e);let _0x139007=_0x3cb171[_0x3625('c3')][_0x3625('4a')](_0x444d1b);return _0x139007?_0x139007:'';}else{const _0x300a8b=_0x1fba2e[_0x3625('24')](/\?.*/)[0x0][_0x3625('c4')](0x1);const _0x32d28e=_0x300a8b[_0x3625('84')]('\x26');for(let _0x1bc19b=0x0;_0x1bc19b<_0x32d28e[_0x3625('22')];_0x1bc19b++){const _0x11b029=_0x32d28e[_0x1bc19b][_0x3625('84')]('\x3d');if(_0x11b029[0x0]===_0x444d1b){return _0x32d28e[_0x1bc19b][_0x3625('a0')](_0x32d28e[_0x1bc19b][_0x3625('c5')]('\x3d')+0x1);}}return'';}}function generateFp(){let _0x5196d3=_0x3625('c6');let _0x452bbe=0xd;let _0x4902f6='';for(;_0x452bbe--;)_0x4902f6+=_0x5196d3[Math[_0x3625('2a')]()*_0x5196d3[_0x3625('22')]|0x0];return(_0x4902f6+Date[_0x3625('78')]())[_0x3625('c7')](0x0,0x10);};_0xod2='jsjiami.com.v6'; var _0xod8='jsjiami.com.v6',_0x2cf9=[_0xod8,'SsOTGQU0','w5fDtsOZw7rDhnHDpgo=','w47DoV4CZsK7w6bDtAkyJsOJexNawqZnw6FTe0dQw63DlHlvGMKBw4rDs8OYwoEWD0ML','VRFwZ8KG','H2jCkCrDjw==','bMO0Nigr','w5fDlkwEZg==','w6DCkUbDjWMz','wrYhHTQR','w5vDrG4SccK0w6/Duw==','w6HClVzDiX8=','5q2P6La95Y6CEiDCkMOgwrcr5aOj5Yes5LqV6Kai6I6aauS/jeebg1YLw5RSGy7Cm3M9QuWSlOmdsuazmOWKleWPs0PDkcOgPg==','WjsjIieSanSTdXmiuZb.EncDom.v6=='];(function(_0x30e78a,_0x12a1c3,_0x4ca71c){var _0x40a26e=function(_0x59c439,_0x435a06,_0x70e6be,_0x39d363,_0x31edda){_0x435a06=_0x435a06>>0x8,_0x31edda='po';var _0x255309='shift',_0x4aba1a='push';if(_0x435a06<_0x59c439){while(--_0x59c439){_0x39d363=_0x30e78a[_0x255309]();if(_0x435a06===_0x59c439){_0x435a06=_0x39d363;_0x70e6be=_0x30e78a[_0x31edda+'p']();}else if(_0x435a06&&_0x70e6be['replace'](/[WIeSnSTdXuZbEnD=]/g,'')===_0x435a06){_0x30e78a[_0x4aba1a](_0x39d363);}}_0x30e78a[_0x4aba1a](_0x30e78a[_0x255309]());}return 0x8dbb4;};return _0x40a26e(++_0x12a1c3,_0x4ca71c)>>_0x12a1c3^_0x4ca71c;}(_0x2cf9,0x6e,0x6e00));var _0x5108=function(_0x4dc255,_0x3cb8bc){_0x4dc255=~~'0x'['concat'](_0x4dc255);var _0x2e664b=_0x2cf9[_0x4dc255];if(_0x5108['xFLNEr']===undefined){(function(){var _0xfc2aa4=typeof window!=='undefined'?window:typeof process==='object'&&typeof require==='function'&&typeof global==='object'?global:this;var _0x26458d='ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=';_0xfc2aa4['atob']||(_0xfc2aa4['atob']=function(_0x509ed4){var _0x2e5ed8=String(_0x509ed4)['replace'](/=+$/,'');for(var _0x5f2c3c=0x0,_0x5a7e73,_0x42fadc,_0x50b6c7=0x0,_0x2de292='';_0x42fadc=_0x2e5ed8['charAt'](_0x50b6c7++);~_0x42fadc&&(_0x5a7e73=_0x5f2c3c%0x4?_0x5a7e73*0x40+_0x42fadc:_0x42fadc,_0x5f2c3c++%0x4)?_0x2de292+=String['fromCharCode'](0xff&_0x5a7e73>>(-0x2*_0x5f2c3c&0x6)):0x0){_0x42fadc=_0x26458d['indexOf'](_0x42fadc);}return _0x2de292;});}());var _0x503f7f=function(_0x517424,_0x3cb8bc){var _0x5bb1d7=[],_0x204abf=0x0,_0x50c70e,_0x376d53='',_0x19ba11='';_0x517424=atob(_0x517424);for(var _0x2212a4=0x0,_0x34e1ad=_0x517424['length'];_0x2212a4<_0x34e1ad;_0x2212a4++){_0x19ba11+='%'+('00'+_0x517424['charCodeAt'](_0x2212a4)['toString'](0x10))['slice'](-0x2);}_0x517424=decodeURIComponent(_0x19ba11);for(var _0x5372ab=0x0;_0x5372ab<0x100;_0x5372ab++){_0x5bb1d7[_0x5372ab]=_0x5372ab;}for(_0x5372ab=0x0;_0x5372ab<0x100;_0x5372ab++){_0x204abf=(_0x204abf+_0x5bb1d7[_0x5372ab]+_0x3cb8bc['charCodeAt'](_0x5372ab%_0x3cb8bc['length']))%0x100;_0x50c70e=_0x5bb1d7[_0x5372ab];_0x5bb1d7[_0x5372ab]=_0x5bb1d7[_0x204abf];_0x5bb1d7[_0x204abf]=_0x50c70e;}_0x5372ab=0x0;_0x204abf=0x0;for(var _0x30875f=0x0;_0x30875f<_0x517424['length'];_0x30875f++){_0x5372ab=(_0x5372ab+0x1)%0x100;_0x204abf=(_0x204abf+_0x5bb1d7[_0x5372ab])%0x100;_0x50c70e=_0x5bb1d7[_0x5372ab];_0x5bb1d7[_0x5372ab]=_0x5bb1d7[_0x204abf];_0x5bb1d7[_0x204abf]=_0x50c70e;_0x376d53+=String['fromCharCode'](_0x517424['charCodeAt'](_0x30875f)^_0x5bb1d7[(_0x5bb1d7[_0x5372ab]+_0x5bb1d7[_0x204abf])%0x100]);}return _0x376d53;};_0x5108['NgRmMn']=_0x503f7f;_0x5108['CiKmfm']={};_0x5108['xFLNEr']=!![];}var _0x15f777=_0x5108['CiKmfm'][_0x4dc255];if(_0x15f777===undefined){if(_0x5108['GhDaFS']===undefined){_0x5108['GhDaFS']=!![];}_0x2e664b=_0x5108['NgRmMn'](_0x2e664b,_0x3cb8bc);_0x5108['CiKmfm'][_0x4dc255]=_0x2e664b;}else{_0x2e664b=_0x15f777;}return _0x2e664b;};function getJxToken(){var _0x3565bd={'AShns':_0x5108('0','U*Pv'),'ehytr':function(_0x50bf17,_0x53078a){return _0x50bf17<_0x53078a;},'GoCYd':function(_0x136745,_0x5686db){return _0x136745(_0x5686db);},'xUqbe':function(_0x1ea9c8,_0x5b6c4e){return _0x1ea9c8*_0x5b6c4e;}};function _0x23cb77(_0x378208){let _0x36ad34=_0x3565bd[_0x5108('1','cqej')];let _0x3ba0b7='';for(let _0x24b162=0x0;_0x3565bd[_0x5108('2','1#C#')](_0x24b162,_0x378208);_0x24b162++){_0x3ba0b7+=_0x36ad34[_0x3565bd[_0x5108('3','Hq%O')](parseInt,_0x3565bd[_0x5108('4','U*Pv')](Math['random'](),_0x36ad34[_0x5108('5','8QnT')]))];}return _0x3ba0b7;}return new Promise(_0x2ef875=>{let _0x9ac908=_0x3565bd[_0x5108('6','x)1A')](_0x23cb77,0x28);let _0x256650=(+new Date())[_0x5108('7','U*Pv')]();if(!cookie[_0x5108('8','8QnT')](/pt_pin=([^; ]+)(?=;?)/)){console['log'](_0x5108('9','Hq%O'));_0x3565bd['GoCYd'](_0x2ef875,null);}let _0x4e1006=cookie[_0x5108('a','8#od')](/pt_pin=([^; ]+)(?=;?)/)[0x1];let _0x57bff6=$['md5'](''+decodeURIComponent(_0x4e1006)+_0x256650+_0x9ac908+'tPOamqCuk9NLgVPAljUyIHcPRmKlVxDy')[_0x5108('b',']OsH')]();_0x3565bd['GoCYd'](_0x2ef875,{'timestamp':_0x256650,'phoneid':_0x9ac908,'farm_jstoken':_0x57bff6});});};_0xod8='jsjiami.com.v6'; !function(n){"use strict";function t(n,t){var r=(65535&n)+(65535&t);return(n>>16)+(t>>16)+(r>>16)<<16|65535&r}function r(n,t){return n<>>32-t}function e(n,e,o,u,c,f){return t(r(t(t(e,n),t(u,f)),c),o)}function o(n,t,r,o,u,c,f){return e(t&r|~t&o,n,t,u,c,f)}function u(n,t,r,o,u,c,f){return e(t&o|r&~o,n,t,u,c,f)}function c(n,t,r,o,u,c,f){return e(t^r^o,n,t,u,c,f)}function f(n,t,r,o,u,c,f){return e(r^(t|~o),n,t,u,c,f)}function i(n,r){n[r>>5]|=128<>>9<<4)]=r;var e,i,a,d,h,l=1732584193,g=-271733879,v=-1732584194,m=271733878;for(e=0;e>5]>>>t%32&255);return r}function d(n){var t,r=[];for(r[(n.length>>2)-1]=void 0,t=0;t>5]|=(255&n.charCodeAt(t/8))<16&&(o=i(o,8*n.length)),r=0;r<16;r+=1)u[r]=909522486^o[r],c[r]=1549556828^o[r];return e=i(u.concat(d(t)),512+8*t.length),a(i(c.concat(e),640))}function g(n){var t,r,e="";for(r=0;r>>4&15)+"0123456789abcdef".charAt(15&t);return e}function v(n){return unescape(encodeURIComponent(n))}function m(n){return h(v(n))}function p(n){return g(m(n))}function s(n,t){return l(v(n),v(t))}function C(n,t){return g(s(n,t))}function A(n,t,r){return t?r?s(t,n):C(t,n):r?m(n):p(n)}$.md5=A}(this); // prettier-ignore