├── .gitattributes ├── desktop.ini ├── icon ├── bark.jpg ├── fork.png ├── git1.jpg ├── git2.jpg ├── git3.jpg ├── git4.jpg ├── git5.jpg ├── git6.jpg ├── git7.png ├── git8.jpg ├── git9.jpg ├── jd1.jpg ├── jd2.jpg ├── jd3.jpg ├── jd4.jpg ├── jd5.png ├── jd6.png ├── jd7.png ├── jd8.png ├── qh1.png ├── qh2.png ├── qh3.png ├── txy.png ├── DD_bot.png ├── git10.jpg ├── git11.jpg ├── git12.jpg ├── git13.jpg ├── git14.jpg ├── jd_pet.png ├── TG_PUSH1.png ├── TG_PUSH2.png ├── TG_PUSH3.png ├── action1.png ├── action2.png ├── action3.png ├── iCloud1.png ├── iCloud2.png ├── iCloud3.png ├── iCloud4.png ├── iCloud5.png ├── iCloud6.png ├── iCloud7.png ├── iCloud8.png ├── disable-action.jpg ├── jd_moneyTree.png ├── bean_sign_simple.jpg └── Snipaste_2020-08-28_09-31-42.png ├── function ├── config.js ├── jdcookie.js ├── eval.js ├── ql.js ├── jxAlgo.js └── common.js ├── docker ├── bot │ ├── jd.png │ ├── requirements.txt │ └── setup.py ├── notify_docker_user.js ├── proc_file.sh ├── docker_entrypoint.sh ├── example │ ├── jd_scripts.custom-append.syno.json │ ├── default.yml │ ├── jd_scripts.custom-overwrite.syno.json │ ├── custom-append.yml │ ├── custom-overwrite.yml │ ├── multi.yml │ ├── jd_scripts.syno.json │ └── docker多账户使用独立容器使用说明.md ├── Dockerfile ├── auto_help.sh ├── crontab_list.sh └── default_task.sh ├── shareCodes └── joypark.json ├── .gitignore ├── backUp ├── TG_PUSH.md ├── GetJdCookie.md ├── GetJdCookie2.md ├── gitSync.md ├── tencentscf.md ├── AlipayManor.js ├── iCloud.md └── webhook.js ├── package.json ├── QuantumultX └── lxk0301_cookies.conf ├── README.md ├── jdPetShareCodes.js ├── jdFruitShareCodes.js ├── jdDreamFactoryShareCodes.js ├── jdFactoryShareCodes.js ├── jdPlantBeanShareCodes.js ├── jdJxncShareCodes.js ├── index.js ├── activity ├── jd_ftzy_help.js ├── jd_jxhlk.py ├── jd_fanli.py └── jd_jx_cfd_pearl_exchange.js ├── jd_sign.js ├── utils ├── jdShareCodes.js ├── share_code.js └── MoveMentFaker.js ├── jd_jx_cashback.js ├── jd_jx_factory.js ├── jdCookie.js ├── ql.js ├── jd_disable.py ├── jd_price.js ├── jd_zqfl.py ├── JD_extra_cookie.js └── Loon └── lxk0301_LoonTask.conf /.gitattributes: -------------------------------------------------------------------------------- 1 | * text eol=lf 2 | *.png -text 3 | *.jpg -text -------------------------------------------------------------------------------- /desktop.ini: -------------------------------------------------------------------------------- 1 | [LocalizedFileNames] 2 | jd_mohe.js=@jd_mohe.js,0 3 | -------------------------------------------------------------------------------- /icon/bark.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/crazyuyun/JDJB-1/HEAD/icon/bark.jpg -------------------------------------------------------------------------------- /icon/fork.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/crazyuyun/JDJB-1/HEAD/icon/fork.png -------------------------------------------------------------------------------- /icon/git1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/crazyuyun/JDJB-1/HEAD/icon/git1.jpg -------------------------------------------------------------------------------- /icon/git2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/crazyuyun/JDJB-1/HEAD/icon/git2.jpg -------------------------------------------------------------------------------- /icon/git3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/crazyuyun/JDJB-1/HEAD/icon/git3.jpg -------------------------------------------------------------------------------- /icon/git4.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/crazyuyun/JDJB-1/HEAD/icon/git4.jpg -------------------------------------------------------------------------------- /icon/git5.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/crazyuyun/JDJB-1/HEAD/icon/git5.jpg -------------------------------------------------------------------------------- /icon/git6.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/crazyuyun/JDJB-1/HEAD/icon/git6.jpg -------------------------------------------------------------------------------- /icon/git7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/crazyuyun/JDJB-1/HEAD/icon/git7.png -------------------------------------------------------------------------------- /icon/git8.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/crazyuyun/JDJB-1/HEAD/icon/git8.jpg -------------------------------------------------------------------------------- /icon/git9.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/crazyuyun/JDJB-1/HEAD/icon/git9.jpg -------------------------------------------------------------------------------- /icon/jd1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/crazyuyun/JDJB-1/HEAD/icon/jd1.jpg -------------------------------------------------------------------------------- /icon/jd2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/crazyuyun/JDJB-1/HEAD/icon/jd2.jpg -------------------------------------------------------------------------------- /icon/jd3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/crazyuyun/JDJB-1/HEAD/icon/jd3.jpg -------------------------------------------------------------------------------- /icon/jd4.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/crazyuyun/JDJB-1/HEAD/icon/jd4.jpg -------------------------------------------------------------------------------- /icon/jd5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/crazyuyun/JDJB-1/HEAD/icon/jd5.png -------------------------------------------------------------------------------- /icon/jd6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/crazyuyun/JDJB-1/HEAD/icon/jd6.png -------------------------------------------------------------------------------- /icon/jd7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/crazyuyun/JDJB-1/HEAD/icon/jd7.png -------------------------------------------------------------------------------- /icon/jd8.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/crazyuyun/JDJB-1/HEAD/icon/jd8.png -------------------------------------------------------------------------------- /icon/qh1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/crazyuyun/JDJB-1/HEAD/icon/qh1.png -------------------------------------------------------------------------------- /icon/qh2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/crazyuyun/JDJB-1/HEAD/icon/qh2.png -------------------------------------------------------------------------------- /icon/qh3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/crazyuyun/JDJB-1/HEAD/icon/qh3.png -------------------------------------------------------------------------------- /icon/txy.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/crazyuyun/JDJB-1/HEAD/icon/txy.png -------------------------------------------------------------------------------- /function/config.js: -------------------------------------------------------------------------------- 1 | module.exports = {"ThreadJs":[],"invokeKey":"RtKLB8euDo7KwsO0"} -------------------------------------------------------------------------------- /icon/DD_bot.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/crazyuyun/JDJB-1/HEAD/icon/DD_bot.png -------------------------------------------------------------------------------- /icon/git10.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/crazyuyun/JDJB-1/HEAD/icon/git10.jpg -------------------------------------------------------------------------------- /icon/git11.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/crazyuyun/JDJB-1/HEAD/icon/git11.jpg -------------------------------------------------------------------------------- /icon/git12.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/crazyuyun/JDJB-1/HEAD/icon/git12.jpg -------------------------------------------------------------------------------- /icon/git13.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/crazyuyun/JDJB-1/HEAD/icon/git13.jpg -------------------------------------------------------------------------------- /icon/git14.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/crazyuyun/JDJB-1/HEAD/icon/git14.jpg -------------------------------------------------------------------------------- /icon/jd_pet.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/crazyuyun/JDJB-1/HEAD/icon/jd_pet.png -------------------------------------------------------------------------------- /docker/bot/jd.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/crazyuyun/JDJB-1/HEAD/docker/bot/jd.png -------------------------------------------------------------------------------- /icon/TG_PUSH1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/crazyuyun/JDJB-1/HEAD/icon/TG_PUSH1.png -------------------------------------------------------------------------------- /icon/TG_PUSH2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/crazyuyun/JDJB-1/HEAD/icon/TG_PUSH2.png -------------------------------------------------------------------------------- /icon/TG_PUSH3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/crazyuyun/JDJB-1/HEAD/icon/TG_PUSH3.png -------------------------------------------------------------------------------- /icon/action1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/crazyuyun/JDJB-1/HEAD/icon/action1.png -------------------------------------------------------------------------------- /icon/action2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/crazyuyun/JDJB-1/HEAD/icon/action2.png -------------------------------------------------------------------------------- /icon/action3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/crazyuyun/JDJB-1/HEAD/icon/action3.png -------------------------------------------------------------------------------- /icon/iCloud1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/crazyuyun/JDJB-1/HEAD/icon/iCloud1.png -------------------------------------------------------------------------------- /icon/iCloud2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/crazyuyun/JDJB-1/HEAD/icon/iCloud2.png -------------------------------------------------------------------------------- /icon/iCloud3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/crazyuyun/JDJB-1/HEAD/icon/iCloud3.png -------------------------------------------------------------------------------- /icon/iCloud4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/crazyuyun/JDJB-1/HEAD/icon/iCloud4.png -------------------------------------------------------------------------------- /icon/iCloud5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/crazyuyun/JDJB-1/HEAD/icon/iCloud5.png -------------------------------------------------------------------------------- /icon/iCloud6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/crazyuyun/JDJB-1/HEAD/icon/iCloud6.png -------------------------------------------------------------------------------- /icon/iCloud7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/crazyuyun/JDJB-1/HEAD/icon/iCloud7.png -------------------------------------------------------------------------------- /icon/iCloud8.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/crazyuyun/JDJB-1/HEAD/icon/iCloud8.png -------------------------------------------------------------------------------- /icon/disable-action.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/crazyuyun/JDJB-1/HEAD/icon/disable-action.jpg -------------------------------------------------------------------------------- /icon/jd_moneyTree.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/crazyuyun/JDJB-1/HEAD/icon/jd_moneyTree.png -------------------------------------------------------------------------------- /shareCodes/joypark.json: -------------------------------------------------------------------------------- 1 | ["VxQJC6Sr0QZkcOHwxoTjrw","oRY9YryofcNg71MZeKSZseKD6P6BJzKv2NBGxfiuJ20"] -------------------------------------------------------------------------------- /icon/bean_sign_simple.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/crazyuyun/JDJB-1/HEAD/icon/bean_sign_simple.jpg -------------------------------------------------------------------------------- /function/jdcookie.js: -------------------------------------------------------------------------------- 1 | // 本地测试在这边填写cookie 2 | let cookie = [ 3 | ]; 4 | module.exports = { 5 | cookie 6 | } 7 | -------------------------------------------------------------------------------- /icon/Snipaste_2020-08-28_09-31-42.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/crazyuyun/JDJB-1/HEAD/icon/Snipaste_2020-08-28_09-31-42.png -------------------------------------------------------------------------------- /docker/bot/requirements.txt: -------------------------------------------------------------------------------- 1 | python_telegram_bot==13.0 2 | requests==2.23.0 3 | MyQR==2.3.1 4 | telegram==0.0.1 5 | tzlocal<3.0 6 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | /node_modules/ 2 | /yarn.lock 3 | /.idea 4 | /.history 5 | /box.dat 6 | /CookieSet.json 7 | /jdCookie.js 8 | /logs 9 | # /JD_DailyBonus.js 10 | /result.txt -------------------------------------------------------------------------------- /docker/bot/setup.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | # @Author : iouAkira(lof) 3 | # @mail : e.akimoto.akira@gmail.com 4 | # @CreateTime: 2020-11-02 5 | # @UpdateTime: 2021-03-21 6 | 7 | from setuptools import setup 8 | 9 | setup( 10 | name='jd-scripts-bot', 11 | version='0.2', 12 | scripts=['jd_bot', ], 13 | ) 14 | -------------------------------------------------------------------------------- /backUp/TG_PUSH.md: -------------------------------------------------------------------------------- 1 | **TG_PUSH教程** 2 | 3 | 利用Telegram机器人推送通知,需要在环境变量填入正确的```TG_BOT_TOKEN```以及```TG_USER_ID```,以下教程简明阐述如何获取token以及UserID 4 | 5 | Ⅰ.首先在Telegram上搜索[BotFather](https://t.me/BotFather)机器人
6 | 7 | ![TG_PUSH1](../icon/TG_PUSH1.png) 8 | 9 | Ⅱ.利用[BotFather](https://t.me/BotFather)创建一个属于自己的通知机器人,按照下图中的1、2、3步骤拿到token,格式形如```10xxx4:AAFcqxxxxgER5uw```。填入```TG_BOT_TOKEN```
10 | 11 | ![TG_PUSH2](../icon/TG_PUSH2.png)
12 | 13 | **新创建的机器人需要跟它发一条消息来开启对话,否则可能会遇到secret填对了但是收不到消息的情况**
14 | 15 | Ⅲ.再次在Telegram上搜索[getuserIDbot](https://t.me/getuserIDbot)机器人,获取UserID。填入```TG_USER_ID```
16 | 17 | ![TG_PUSH3](../icon/TG_PUSH3.png) 18 | 19 | 至此,获取**TG_BOT_TOKEN**以及**TG_USER_ID**的教程结束 20 | -------------------------------------------------------------------------------- /docker/notify_docker_user.js: -------------------------------------------------------------------------------- 1 | const notify = require('../sendNotify'); 2 | const fs = require('fs'); 3 | const notifyPath = '/scripts/logs/notify.txt'; 4 | async function image_update_notify() { 5 | if (fs.existsSync(notifyPath)) { 6 | const content = await fs.readFileSync(`${notifyPath}`, 'utf8');//读取notify.txt内容 7 | if (process.env.NOTIFY_CONTENT && !content.includes(process.env.NOTIFY_CONTENT)) { 8 | await notify.sendNotify("⚠️Docker镜像版本更新通知⚠️", process.env.NOTIFY_CONTENT); 9 | await fs.writeFileSync(`${notifyPath}`, process.env.NOTIFY_CONTENT); 10 | } 11 | } else { 12 | if (process.env.NOTIFY_CONTENT) { 13 | notify.sendNotify("⚠️Docker镜像版本更新通知⚠️", process.env.NOTIFY_CONTENT) 14 | await fs.writeFileSync(`${notifyPath}`, process.env.NOTIFY_CONTENT); 15 | } 16 | } 17 | } 18 | !(async() => { 19 | await image_update_notify(); 20 | })().catch((e) => console.log(e)) -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "LXK9301", 3 | "version": "1.0.0", 4 | "description": "{**When you're done, you can delete the content in this README and update the file with details for others getting started with your repository**}", 5 | "main": "AlipayManor.js", 6 | "scripts": { 7 | "test": "echo \"Error: no test specified\" && exit 1" 8 | }, 9 | "repository": { 10 | "type": "git", 11 | "url": "https://github.com/LXK9301/jd_scripts.git" 12 | }, 13 | "keywords": [ 14 | "京东薅羊毛工具, 京东水果、宠物、种豆等等" 15 | ], 16 | "author": "LXK9301", 17 | "license": "ISC", 18 | "dependencies": { 19 | "crypto-js": "^4.0.0", 20 | "download": "^6.2.5", 21 | "got": "^11.5.1", 22 | "http-server": "^0.12.3", 23 | "qrcode-terminal": "^0.12.0", 24 | "request": "^2.88.2", 25 | "tough-cookie": "^4.0.0", 26 | "tunnel": "0.0.6", 27 | "ws": "^7.4.3", 28 | "png-js": "^1.0.0", 29 | "jsdom": "^17.0.0" 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /backUp/GetJdCookie.md: -------------------------------------------------------------------------------- 1 | ## 浏览器获取京东cookie教程 2 | 3 | **以下浏览器都行** 4 | 5 | - Chrome浏览器 6 | - 新版Edge浏览器 7 | - 国产360,QQ浏览器切换到极速模式 8 | 9 | ### 操作步骤 10 | 11 | 1. 电脑浏览器打开京东网址 [https://m.jd.com/](https://m.jd.com/) 12 | 2. 按键盘F12键打开开发者工具,然后点下图中的图标 13 | ![切换到手机模式](../icon/jd1.jpg) 14 | 3. 此时是未登录状态(使用手机短信验证码登录),如已登录请忽略此步骤 15 | - 使用手机短信验证码登录(此方式cookie有效时长大概31天,其他登录方式比较短) 16 | 4. 登录后,选择Network,有很多链接的话点箭头这里清空下 17 | ![清空](../icon/jd2.jpg) 18 | 5. 然后再点我的,链接就变少了 19 | ![再次点击我的](../icon/jd3.jpg) 20 | 6. 点第一个链接(log.gif)进去,找到cookie,复制出来,新建一个TXT文本临时保存一下,下面需要用到 21 | ![寻找log.gi](../icon/jd4.jpg) 22 | 7. 第六步复制出来的cookie比较长,我们只需要`pt_pin=xxxx;`和 `pt_key=xxxx;`部分的内容即可(注:英文引号`;`是必要的)。可以用下面的脚本,在Chrome浏览器按F12,console里面输入下面脚本按enter回车键 23 | ``` 24 | var CV = '单引号里面放第六步拿到的cookie'; 25 | var CookieValue = CV.match(/pt_pin=.+?;/) + CV.match(/pt_key=.+?;/); 26 | copy(CookieValue); 27 | ``` 28 | 8. 这样子整理出关键的的cookie已经在你的剪贴板上, 可直接粘贴 29 | 30 | 9. 如果需获取第二个京东账号的cookie,不要在刚才的浏览器上面退出登录账号一(否则刚才获取的cookie会失效),需另外换一个浏览器(Chrome浏览器 `ctr+shift+n` 打开无痕模式也行),然后继续按上面步骤操作即可 31 | 32 | 33 | -------------------------------------------------------------------------------- /docker/proc_file.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | 3 | if [[ -f /usr/bin/jd_bot && -z "$DISABLE_SPNODE" ]]; then 4 | CMD="spnode" 5 | else 6 | CMD="node" 7 | fi 8 | 9 | echo "处理jd_crazy_joy_coin任务。。。" 10 | if [ ! $CRZAY_JOY_COIN_ENABLE ]; then 11 | echo "默认启用jd_crazy_joy_coin杀掉jd_crazy_joy_coin任务,并重启" 12 | eval $(ps -ef | grep "jd_crazy_joy_coin" | grep -v "grep" | awk '{print "kill "$1}') 13 | echo '' >/scripts/logs/jd_crazy_joy_coin.log 14 | $CMD /scripts/jd_crazy_joy_coin.js | ts >>/scripts/logs/jd_crazy_joy_coin.log 2>&1 & 15 | echo "默认jd_crazy_joy_coin重启完成" 16 | else 17 | if [ $CRZAY_JOY_COIN_ENABLE = "Y" ]; then 18 | echo "配置启用jd_crazy_joy_coin,杀掉jd_crazy_joy_coin任务,并重启" 19 | eval $(ps -ef | grep "jd_crazy_joy_coin" | grep -v "grep" | awk '{print "kill "$1}') 20 | echo '' >/scripts/logs/jd_crazy_joy_coin.log 21 | $CMD /scripts/jd_crazy_joy_coin.js | ts >>/scripts/logs/jd_crazy_joy_coin.log 2>&1 & 22 | echo "配置jd_crazy_joy_coin重启完成" 23 | else 24 | eval $(ps -ef | grep "jd_crazy_joy_coin" | grep -v "grep" | awk '{print "kill "$1}') 25 | echo "已配置不启用jd_crazy_joy_coin任务,仅杀掉" 26 | fi 27 | fi 28 | -------------------------------------------------------------------------------- /QuantumultX/lxk0301_cookies.conf: -------------------------------------------------------------------------------- 1 | hostname = draw.jdfcloud.com, jdjoy.jd.com, account.huami.com, me-api.jd.com 2 | 3 | # 获取多账号京东Cookie 4 | https:\/\/me-api\.jd\.com\/user_new\/info\/GetJDUserInfoUnion url script-request-header https://gitee.com/lxk0301/jd_scripts/raw/master/JD_extra_cookie.js 5 | 6 | # 宠汪汪强制为别人助力 7 | ^https:\/\/draw\.jdfcloud\.com\/\/common\/pet\/enterRoom\/h5\?invitePin=.*(&inviteSource=task_invite&shareSource=\w+&inviteTimeStamp=\d+&openId=\w+)?&reqSource=weapp|^https:\/\/draw\.jdfcloud\.com(\/mirror)?\/\/pet\/helpFriend\?friendPin url script-request-header https://gitee.com/lxk0301/jd_scripts/raw/master/jd_joy_help.js 8 | 9 | # 宠汪汪赛跑 10 | ^https:\/\/draw\.jdfcloud\.com(\/mirror)?\/\/api\/user\/addUser\?code= url script-response-body https://gitee.com/lxk0301/jd_scripts/raw/master/jd_joy_run.js 11 | 12 | # 宠汪汪赛跑 13 | ^https:\/\/draw\.jdfcloud\.com(\/mirror)?\/\/api\/user\/user\/detail\?openId= url script-request-header https://gitee.com/lxk0301/jd_scripts/raw/master/jd_joy_run.js 14 | 15 | # 小米运动 16 | ^https:\/\/account\.huami\.com\/v2\/client\/login url script-response-body https://gitee.com/lxk0301/jd_scripts/raw/master/backUp/xmSports.js 17 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # JDJB 2 | 个人自用最全主库,集合可用脚本,适用于青龙面板。 3 | 4 | 频道:https://t.me/KingRan521 5 | 6 | 拉库命令: 7 | 8 | 国内鸡: 9 | 10 | ql repo https://ghproxy.com/github.com/KingRan/JDJB.git "jd_|jx_|jdCookie" "activity|backUp" "^jd[^_]|USER|utils|function|sign|sendNotify|ql|JDJR" 11 | 12 | 国外鸡: 13 | 14 | ql repo https://github.com/KingRan/JDJB.git "jd_|jx_|jdCookie" "activity|backUp" "^jd[^_]|USER|utils|function|sign|sendNotify|ql|JDJR" 15 | 16 | 17 | 1、搬运整理,感谢所有原作者。 18 | 19 | 2、个人学习目的,请下载后24小时内删除下载的代码。 20 | 21 | 22 | 1.出现这种错误: 23 | 24 | Cannot find module 'xxxx' 25 | 26 | 依赖不完整,解决方法: 27 | 28 | docker exec -it qinglong(容器名称) bash 29 | 30 | cd /ql/scripts/ 31 | 32 | pnpm install 'xxxx' 33 | 34 | npm install 'xxxx' 35 | 36 | 这两个安装命令都可以用 37 | 38 | 2.出现这种错误: 39 | 40 | Cannot find module './xxxx' 41 | 42 | 那就很有是拉库命令不完整,请检查或复制完整的拉库命令。 43 | 44 | 部分需要的依赖:自行安装 45 | 46 | "npm install -g npm" 47 | 48 | "pip3 install requests" 49 | 50 | "pip3 install pytz" 51 | 52 | "npm install -g download" 53 | 54 | "pnpm install jsdom" 55 | 56 | "apk add --no-cache build-base g++ cairo-dev pango-dev giflib-dev && cd scripts && npm install canvas png-js md5 date-fns axios crypto-js tslib ts-md5 @types/node --build-from-source" 57 | 58 | -------------------------------------------------------------------------------- /jdPetShareCodes.js: -------------------------------------------------------------------------------- 1 | /* 2 | 东东萌宠互助码 3 | 此文件为Node.js专用。其他用户请忽略 4 | 支持京东N个账号 5 | */ 6 | //云服务器腾讯云函数等NOde.js用户在此处填写东东萌宠的好友码。 7 | // 同一个京东账号的好友互助码用@符号隔开,不同京东账号之间用&符号或者换行隔开,下面给一个示例 8 | // 如: 京东账号1的shareCode1@京东账号1的shareCode2&京东账号2的shareCode1@京东账号2的shareCode2 9 | let PetShareCodes = [ 10 | ''] 11 | 12 | // 从日志获取互助码 13 | // const logShareCodes = require('./utils/jdShareCodes'); 14 | // if (logShareCodes.PETSHARECODES.length > 0 && !process.env.PETSHARECODES) { 15 | // process.env.PETSHARECODES = logShareCodes.PETSHARECODES.join('&'); 16 | // } 17 | 18 | // 判断github action里面是否有东东萌宠互助码 19 | if (process.env.PETSHARECODES) { 20 | if (process.env.PETSHARECODES.indexOf('&') > -1) { 21 | console.log(`您的东东萌宠互助码选择的是用&隔开\n`) 22 | PetShareCodes = process.env.PETSHARECODES.split('&'); 23 | } else if (process.env.PETSHARECODES.indexOf('\n') > -1) { 24 | console.log(`您的东东萌宠互助码选择的是用换行隔开\n`) 25 | PetShareCodes = process.env.PETSHARECODES.split('\n'); 26 | } else { 27 | PetShareCodes = process.env.PETSHARECODES.split(); 28 | } 29 | } else { 30 | console.log(`由于您环境变量(PETSHARECODES)里面未提供助力码,故此处运行将会给脚本内置的码进行助力,请知晓!`) 31 | } 32 | for (let i = 0; i < PetShareCodes.length; i++) { 33 | const index = (i + 1 === 1) ? '' : (i + 1); 34 | exports['PetShareCode' + index] = PetShareCodes[i]; 35 | } -------------------------------------------------------------------------------- /jdFruitShareCodes.js: -------------------------------------------------------------------------------- 1 | /* 2 | 东东农场互助码 3 | 此文件为Node.js专用。其他用户请忽略 4 | 支持京东N个账号 5 | */ 6 | //云服务器腾讯云函数等NOde.js用户在此处填写京东东农场的好友码。 7 | // 同一个京东账号的好友互助码用@符号隔开,不同京东账号之间用&符号或者换行隔开,下面给一个示例 8 | // 如: 京东账号1的shareCode1@京东账号1的shareCode2&京东账号2的shareCode1@京东账号2的shareCode2 9 | let FruitShareCodes = [ 10 | ''] 11 | 12 | // 从日志获取互助码 13 | // const logShareCodes = require('./utils/jdShareCodes'); 14 | // if (logShareCodes.FRUITSHARECODES.length > 0 && !process.env.FRUITSHARECODES) { 15 | // process.env.FRUITSHARECODES = logShareCodes.FRUITSHARECODES.join('&'); 16 | // } 17 | 18 | // 判断github action里面是否有东东农场互助码 19 | if (process.env.FRUITSHARECODES) { 20 | if (process.env.FRUITSHARECODES.indexOf('&') > -1) { 21 | console.log(`您的东东农场互助码选择的是用&隔开\n`) 22 | FruitShareCodes = process.env.FRUITSHARECODES.split('&'); 23 | } else if (process.env.FRUITSHARECODES.indexOf('\n') > -1) { 24 | console.log(`您的东东农场互助码选择的是用换行隔开\n`) 25 | FruitShareCodes = process.env.FRUITSHARECODES.split('\n'); 26 | } else { 27 | FruitShareCodes = process.env.FRUITSHARECODES.split(); 28 | } 29 | } else { 30 | console.log(`由于您环境变量(FRUITSHARECODES)里面未提供助力码,故此处运行将会给脚本内置的码进行助力,请知晓!`) 31 | } 32 | for (let i = 0; i < FruitShareCodes.length; i++) { 33 | const index = (i + 1 === 1) ? '' : (i + 1); 34 | exports['FruitShareCode' + index] = FruitShareCodes[i]; 35 | } 36 | -------------------------------------------------------------------------------- /jdDreamFactoryShareCodes.js: -------------------------------------------------------------------------------- 1 | /* 2 | 京喜工厂互助码 3 | 此文件为Node.js专用。其他用户请忽略 4 | 支持京东N个账号 5 | */ 6 | //云服务器腾讯云函数等NOde.js用户在此处填写东东萌宠的好友码。 7 | // 同一个京东账号的好友互助码用@符号隔开,不同京东账号之间用&符号或者换行隔开,下面给一个示例 8 | // 如: 京东账号1的shareCode1@京东账号1的shareCode2&京东账号2的shareCode1@京东账号2的shareCode2 9 | let shareCodes = [ 10 | ''] 11 | 12 | // 从日志获取互助码 13 | // const logShareCodes = require('./utils/jdShareCodes'); 14 | // if (logShareCodes.DREAM_FACTORY_SHARE_CODES.length > 0 && !process.env.DREAM_FACTORY_SHARE_CODES) { 15 | // process.env.DREAM_FACTORY_SHARE_CODES = logShareCodes.DREAM_FACTORY_SHARE_CODES.join('&'); 16 | // } 17 | 18 | // 判断环境变量里面是否有京喜工厂互助码 19 | if (process.env.DREAM_FACTORY_SHARE_CODES) { 20 | if (process.env.DREAM_FACTORY_SHARE_CODES.indexOf('&') > -1) { 21 | console.log(`您的互助码选择的是用&隔开\n`) 22 | shareCodes = process.env.DREAM_FACTORY_SHARE_CODES.split('&'); 23 | } else if (process.env.DREAM_FACTORY_SHARE_CODES.indexOf('\n') > -1) { 24 | console.log(`您的互助码选择的是用换行隔开\n`) 25 | shareCodes = process.env.DREAM_FACTORY_SHARE_CODES.split('\n'); 26 | } else { 27 | shareCodes = process.env.DREAM_FACTORY_SHARE_CODES.split(); 28 | } 29 | } else { 30 | console.log(`由于您环境变量(DREAM_FACTORY_SHARE_CODES)里面未提供助力码,故此处运行将会给脚本内置的码进行助力,请知晓!`) 31 | } 32 | for (let i = 0; i < shareCodes.length; i++) { 33 | const index = (i + 1 === 1) ? '' : (i + 1); 34 | exports['shareCodes' + index] = shareCodes[i]; 35 | } 36 | -------------------------------------------------------------------------------- /jdFactoryShareCodes.js: -------------------------------------------------------------------------------- 1 | /* 2 | 东东工厂互助码 3 | 此文件为Node.js专用。其他用户请忽略 4 | 支持京东N个账号 5 | */ 6 | //云服务器腾讯云函数等NOde.js用户在此处填写东东萌宠的好友码。 7 | // 同一个京东账号的好友互助码用@符号隔开,不同京东账号之间用&符号或者换行隔开,下面给一个示例 8 | // 如: 京东账号1的shareCode1@京东账号1的shareCode2&京东账号2的shareCode1@京东账号2的shareCode2 9 | let shareCodes = [ 10 | '',//账号一的好友shareCode,不同好友中间用@符号隔开 11 | '',//账号二的好友shareCode,不同好友中间用@符号隔开 12 | ] 13 | 14 | // 从日志获取互助码 15 | // const logShareCodes = require('./utils/jdShareCodes'); 16 | // if (logShareCodes.DDFACTORY_SHARECODES.length > 0 && !process.env.DDFACTORY_SHARECODES) { 17 | // process.env.DDFACTORY_SHARECODES = logShareCodes.DDFACTORY_SHARECODES.join('&'); 18 | // } 19 | 20 | // 判断环境变量里面是否有东东工厂互助码 21 | if (process.env.DDFACTORY_SHARECODES) { 22 | if (process.env.DDFACTORY_SHARECODES.indexOf('&') > -1) { 23 | console.log(`您的互助码选择的是用&隔开\n`) 24 | shareCodes = process.env.DDFACTORY_SHARECODES.split('&'); 25 | } else if (process.env.DDFACTORY_SHARECODES.indexOf('\n') > -1) { 26 | console.log(`您的互助码选择的是用换行隔开\n`) 27 | shareCodes = process.env.DDFACTORY_SHARECODES.split('\n'); 28 | } else { 29 | shareCodes = process.env.DDFACTORY_SHARECODES.split(); 30 | } 31 | } else { 32 | console.log(`由于您环境变量(DDFACTORY_SHARECODES)里面未提供助力码,故此处运行将会给脚本内置的码进行助力,请知晓!`) 33 | } 34 | for (let i = 0; i < shareCodes.length; i++) { 35 | const index = (i + 1 === 1) ? '' : (i + 1); 36 | exports['shareCodes' + index] = shareCodes[i]; 37 | } -------------------------------------------------------------------------------- /backUp/GetJdCookie2.md: -------------------------------------------------------------------------------- 1 | ## 浏览器插件获取京东cookie教程 2 | > 此教程内容由tg用户@wukongdada提供,特此感谢 3 | 4 | **以下浏览器都行** 5 | 6 | - Chrome浏览器 7 | - 新版Edge浏览器(chrome内核) 8 | 9 | ### 操作步骤 10 | 11 | 1. 电脑浏览器打开京东网址 [https://m.jd.com/](https://m.jd.com/) 12 | 2. Chrome类浏览器安装EditThisCookie插件 13 | - Chrome插件商店搜EditThisCookie, 或者[打开此网站](https://chrome.google.com/webstore/detail/editthiscookie/fngmhnnpilhplaeedifhccceomclgfbg?utm_source=chrome-ntp-icon) 进行安装 14 | - 仅使用百分浏览器,谷歌浏览器测试过,其他谷歌类浏览器请自行测试。 15 | - 无法登录Chrome插件商店或者打不开网址建议使用edge chrome版。 16 | 3. edge chrome浏览器安装Cookie Editor插件 17 | - [edge插件商店](edge://extensions/)搜Cookie Editor,或[打开以下网址](https://microsoftedge.microsoft.com/addons/detail/cookie-editor/ajfboaconbpkglpfanbmlfgojgndmhmc?hl=zh-CN) 完成插件安装 18 | 4. 以下是chrome和edge的相关设置截图,输入的网址是 ``jd.com`` 19 | 20 | ![Chrome浏览器相关设置](../icon/jd5.png) 21 | 22 | ![Edge浏览器相关设置](../icon/jd6.png) 23 | 24 | 5. 现在点击回到京东触屏版,再点击EditThisCookie/Cookie Editor,再点击搜索,输入key或pin,如下图所示的pt_key,复制pt_key的value值。此插件可以看到cookie的有效期。 25 | 26 | ![插件显示](../icon/jd7.png) 27 | 28 | 6. 按照以下格式形成自己的jd_cookie 29 | - `pt_key=复制插件搜索出来的key值;pt_pin=复制插件搜索出来的pin值;` ,后面的英文引号`;`是必须要的 30 | - 给一个京东cookie具体示例 `pt_key=jdDC2F833333EFDGTCE5BD4AD1A952D4F4DF84A46052;pt_pin=jd_123456;` 31 | 32 | 7. 如果需获取第二个京东账号的cookie,不要在刚才的浏览器上面退出登录账号一(否则刚才获取的cookie会失效),需另外换一个浏览器(Chrome浏览器 `ctr+shift+n` 打开无痕模式也行),然后继续按上面步骤操作即可 33 | 34 | 35 | -------------------------------------------------------------------------------- /jdPlantBeanShareCodes.js: -------------------------------------------------------------------------------- 1 | /* 2 | 京东种豆得豆互助码 3 | 此文件为Node.js专用。其他用户请忽略 4 | 支持京东N个账号 5 | */ 6 | //云服务器腾讯云函数等NOde.js用户在此处填写东东萌宠的好友码。 7 | // 同一个京东账号的好友互助码用@符号隔开,不同京东账号之间用&符号或者换行隔开,下面给一个示例 8 | // 如: 京东账号1的shareCode1@京东账号1的shareCode2&京东账号2的shareCode1@京东账号2的shareCode2 9 | let PlantBeanShareCodes = [ 10 | ''] 11 | 12 | // 从日志获取互助码 13 | // const logShareCodes = require('./utils/jdShareCodes'); 14 | // if (logShareCodes.PLANT_BEAN_SHARECODES.length > 0 && !process.env.PLANT_BEAN_SHARECODES) { 15 | // process.env.PLANT_BEAN_SHARECODES = logShareCodes.PLANT_BEAN_SHARECODES.join('&'); 16 | // } 17 | 18 | // 判断github action里面是否有种豆得豆互助码 19 | if (process.env.PLANT_BEAN_SHARECODES) { 20 | if (process.env.PLANT_BEAN_SHARECODES.indexOf('&') > -1) { 21 | console.log(`您的种豆互助码选择的是用&隔开\n`) 22 | PlantBeanShareCodes = process.env.PLANT_BEAN_SHARECODES.split('&'); 23 | } else if (process.env.PLANT_BEAN_SHARECODES.indexOf('\n') > -1) { 24 | console.log(`您的种豆互助码选择的是用换行隔开\n`) 25 | PlantBeanShareCodes = process.env.PLANT_BEAN_SHARECODES.split('\n'); 26 | } else { 27 | PlantBeanShareCodes = process.env.PLANT_BEAN_SHARECODES.split(); 28 | } 29 | } else { 30 | console.log(`由于您环境变量(PLANT_BEAN_SHARECODES)里面未提供助力码,故此处运行将会给脚本内置的码进行助力,请知晓!`) 31 | } 32 | for (let i = 0; i < PlantBeanShareCodes.length; i++) { 33 | const index = (i + 1 === 1) ? '' : (i + 1); 34 | exports['PlantBeanShareCodes' + index] = PlantBeanShareCodes[i]; 35 | } 36 | -------------------------------------------------------------------------------- /jdJxncShareCodes.js: -------------------------------------------------------------------------------- 1 | /* 2 | 京喜农场助力码 3 | 此助力码要求种子 active 相同才能助力,多个账号的话可以种植同样的种子,如果种子不同的话,会自动跳过使用云端助力 4 | 此文件为Node.js专用。其他用户请忽略 5 | 支持京东N个账号 6 | */ 7 | //云服务器腾讯云函数等NOde.js用户在此处填写京京喜农场的好友码。 8 | // 同一个京东账号的好友助力码用@符号隔开,不同京东账号之间用&符号或者换行隔开,下面给一个示例 9 | // 如: 京东账号1的shareCode1@京东账号1的shareCode2&京东账号2的shareCode1@京东账号2的shareCode2 10 | // 注意:京喜农场 种植种子发生变化的时候,互助码也会变!! 11 | // 注意:京喜农场 种植种子发生变化的时候,互助码也会变!! 12 | // 注意:京喜农场 种植种子发生变化的时候,互助码也会变!! 13 | // 每个账号 shareCdoe 是一个 json,示例如下 14 | // {"smp":"22bdadsfaadsfadse8a","active":"jdnc_1_btorange210113_2","joinnum":"1"} 15 | let JxncShareCodes = [ 16 | '',//账号一的好友shareCode,不同好友中间用@符号隔开 17 | '',//账号二的好友shareCode,不同好友中间用@符号隔开 18 | ] 19 | // 判断github action里面是否有京喜农场助力码 20 | if (process.env.JXNC_SHARECODES) { 21 | if (process.env.JXNC_SHARECODES.indexOf('&') > -1) { 22 | console.log(`您的京喜农场助力码选择的是用&隔开\n`) 23 | JxncShareCodes = process.env.JXNC_SHARECODES.split('&'); 24 | } else if (process.env.JXNC_SHARECODES.indexOf('\n') > -1) { 25 | console.log(`您的京喜农场助力码选择的是用换行隔开\n`) 26 | JxncShareCodes = process.env.JXNC_SHARECODES.split('\n'); 27 | } else { 28 | JxncShareCodes = process.env.JXNC_SHARECODES.split(); 29 | } 30 | } else { 31 | console.log(`由于您环境变量里面(JXNC_SHARECODES)未提供助力码,故此处运行将会给脚本内置的码进行助力,请知晓!`) 32 | } 33 | JxncShareCodes = JxncShareCodes.filter(item => !!item); 34 | for (let i = 0; i < JxncShareCodes.length; i++) { 35 | const index = (i + 1 === 1) ? '' : (i + 1); 36 | exports['JxncShareCode' + index] = JxncShareCodes[i]; 37 | } 38 | -------------------------------------------------------------------------------- /index.js: -------------------------------------------------------------------------------- 1 | //'use strict'; 2 | exports.main_handler = async (event, context, callback) => { 3 | try { 4 | const { TENCENTSCF_SOURCE_TYPE, TENCENTSCF_SOURCE_URL } = process.env 5 | //如果想在一个定时触发器里面执行多个js文件需要在定时触发器的【附加信息】里面填写对应的名称,用 & 链接 6 | //例如我想一个定时触发器里执行jd_speed.js和jd_bean_change.js,在定时触发器的【附加信息】里面就填写 jd_speed&jd_bean_change 7 | for (const v of event["Message"].split("&")) { 8 | console.log(v); 9 | var request = require('request'); 10 | switch (TENCENTSCF_SOURCE_TYPE) { 11 | case 'local': 12 | //1.执行自己上传的js文件 13 | delete require.cache[require.resolve('./'+v+'.js')]; 14 | require('./'+v+'.js') 15 | break; 16 | case 'git': 17 | //2.执行github远端的js文件(因github的raw类型的文件被墙,此方法云函数不推荐) 18 | request(`https://raw.githubusercontent.com/xxx/jd_scripts/master/${v}.js`, function (error, response, body) { 19 | eval(response.body) 20 | }) 21 | break; 22 | case 'custom': 23 | //3.执行自定义远端js文件网址 24 | if (!TENCENTSCF_SOURCE_URL) return console.log('自定义模式需要设置TENCENTSCF_SOURCE_URL变量') 25 | request(`${TENCENTSCF_SOURCE_URL}${v}.js`, function (error, response, body) { 26 | eval(response.body) 27 | }) 28 | break; 29 | default: 30 | //4.执行国内gitee远端的js文件(如果部署在国内节点,选择1或3。默认使用gitee的方式) 31 | request(`${v}.js`, function (error, response, body) { 32 | eval(response.body) 33 | }) 34 | break; 35 | } 36 | } 37 | } catch (e) { 38 | console.error(e) 39 | } 40 | } 41 | -------------------------------------------------------------------------------- /docker/docker_entrypoint.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | set -e 3 | 4 | #获取配置的自定义参数 5 | if [ -n "$1" ]; then 6 | run_cmd=$1 7 | fi 8 | 9 | ( 10 | if [ -f "/scripts/logs/pull.lock" ]; then 11 | echo "存在更新锁定文件,跳过git pull操作..." 12 | else 13 | echo "设定远程仓库地址..." 14 | cd /scripts 15 | git remote set-url origin "$REPO_URL" 16 | git reset --hard 17 | echo "git pull拉取最新代码..." 18 | git -C /scripts pull --rebase 19 | echo "npm install 安装最新依赖" 20 | npm install --prefix /scripts 21 | fi 22 | ) || exit 0 23 | 24 | # 默认启动telegram交互机器人的条件 25 | # 确认容器启动时调用的docker_entrypoint.sh 26 | # 必须配置TG_BOT_TOKEN、TG_USER_ID, 27 | # 且未配置DISABLE_BOT_COMMAND禁用交互, 28 | # 且未配置自定义TG_API_HOST,因为配置了该变量,说明该容器环境可能并能科学的连到telegram服务器 29 | if [[ -n "$run_cmd" && -n "$TG_BOT_TOKEN" && -n "$TG_USER_ID" && -z "$DISABLE_BOT_COMMAND" && -z "$TG_API_HOST" ]]; then 30 | ENABLE_BOT_COMMAND=True 31 | else 32 | ENABLE_BOT_COMMAND=False 33 | fi 34 | 35 | echo "------------------------------------------------执行定时任务任务shell脚本------------------------------------------------" 36 | #测试 37 | # sh /jd_docker/docker/default_task.sh "$ENABLE_BOT_COMMAND" "$run_cmd" 38 | #合并 39 | sh /scripts/docker/default_task.sh "$ENABLE_BOT_COMMAND" "$run_cmd" 40 | echo "--------------------------------------------------默认定时任务执行完成---------------------------------------------------" 41 | 42 | if [ -n "$run_cmd" ]; then 43 | # 增加一层jd_bot指令已经正确安装成功校验 44 | # 以上条件都满足后会启动jd_bot交互,否还是按照以前的模式启动,最大程度避免现有用户改动调整 45 | if [[ "$ENABLE_BOT_COMMAND" == "True" && -f /usr/bin/jd_bot ]]; then 46 | echo "启动crontab定时任务主进程..." 47 | crond 48 | echo "启动telegram bot指令交主进程..." 49 | jd_bot 50 | else 51 | echo "启动crontab定时任务主进程..." 52 | crond -f 53 | fi 54 | 55 | else 56 | echo "默认定时任务执行结束。" 57 | fi 58 | -------------------------------------------------------------------------------- /docker/example/jd_scripts.custom-append.syno.json: -------------------------------------------------------------------------------- 1 | { 2 | "cap_add" : [], 3 | "cap_drop" : [], 4 | "cmd" : "", 5 | "cpu_priority" : 50, 6 | "devices" : null, 7 | "enable_publish_all_ports" : false, 8 | "enable_restart_policy" : true, 9 | "enabled" : true, 10 | "env_variables" : [ 11 | { 12 | "key" : "PATH", 13 | "value" : "/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin" 14 | }, 15 | { 16 | "key" : "CDN_JD_DAILYBONUS", 17 | "value" : "true" 18 | }, 19 | { 20 | "key" : "JD_COOKIE", 21 | "value" : "pt_key=xxx;pt_pin=xxx;" 22 | }, 23 | { 24 | "key" : "PUSH_KEY", 25 | "value" : "" 26 | }, 27 | { 28 | "key" : "CUSTOM_LIST_FILE", 29 | "value" : "my_crontab_list.sh" 30 | } 31 | ], 32 | "exporting" : false, 33 | "id" : "3a2f6f27c23f93bc104585c22569c760cc9ce82df09cdb41d53b491fe1d0341c", 34 | "image" : "lxk0301/jd_scripts", 35 | "is_ddsm" : false, 36 | "is_package" : false, 37 | "links" : [], 38 | "memory_limit" : 0, 39 | "name" : "jd_scripts", 40 | "network" : [ 41 | { 42 | "driver" : "bridge", 43 | "name" : "bridge" 44 | } 45 | ], 46 | "network_mode" : "default", 47 | "port_bindings" : [], 48 | "privileged" : false, 49 | "shortcut" : { 50 | "enable_shortcut" : false 51 | }, 52 | "use_host_network" : false, 53 | "volume_bindings" : [ 54 | { 55 | "host_volume_file" : "/docker/jd_scripts/my_crontab_list.sh", 56 | "mount_point" : "/scripts/docker/my_crontab_list.sh", 57 | "type" : "rw" 58 | }, 59 | { 60 | "host_volume_file" : "/docker/jd_scripts/logs", 61 | "mount_point" : "/scripts/logs", 62 | "type" : "rw" 63 | } 64 | ] 65 | } 66 | -------------------------------------------------------------------------------- /docker/example/default.yml: -------------------------------------------------------------------------------- 1 | jd_scripts: 2 | image: lxk0301/jd_scripts 3 | # 配置服务器资源约束。此例子中服务被限制为使用内存不超过200M以及cpu不超过0.2(单核的20%) 4 | # 经过实际测试,建议不低于200M 5 | # deploy: 6 | # resources: 7 | # limits: 8 | # cpus: '0.2' 9 | # memory: 200M 10 | container_name: jd_scripts 11 | restart: always 12 | volumes: 13 | - ./logs:/scripts/logs 14 | tty: true 15 | # 因为更换仓库地址可能git pull的dns解析不到,可以在配置追加hosts 16 | extra_hosts: 17 | - "gitee.com:180.97.125.228" 18 | - "github.com:13.229.188.59" 19 | - "raw.githubusercontent.com:151.101.228.133" 20 | environment: 21 | #脚本更新仓库地址,配置了会切换到对应的地址 22 | - REPO_URL=git@gitee.com:lxk0301/jd_scripts.git 23 | # 注意环境变量填写值的时候一律不需要引号(""或者'')下面这些只是示例,根据自己的需求增加删除 24 | #jd cookies 25 | # 例: JD_COOKIE=pt_key=XXX;pt_pin=XXX; 26 | # 例(多账号): JD_COOKIE=pt_key=XXX;pt_pin=XXX;&pt_key=XXX;pt_pin=XXX;&pt_key=XXX;pt_pin=XXX; 27 | - JD_COOKIE= 28 | #微信server酱通知 29 | - PUSH_KEY= 30 | #Bark App通知 31 | - BARK_PUSH= 32 | #telegram机器人通知 33 | - TG_BOT_TOKEN= 34 | - TG_USER_ID= 35 | #钉钉机器人通知 36 | - DD_BOT_TOKEN= 37 | - DD_BOT_SECRET= 38 | #企业微信机器人通知 39 | - QYWX_KEY= 40 | #京东种豆得豆 41 | - PLANT_BEAN_SHARECODES= 42 | #京东农场 43 | # 例: FRUITSHARECODES=京东农场的互助码 44 | - FRUITSHARECODES= 45 | #京东萌宠 46 | # 例: PETSHARECODES=东东萌宠的互助码 47 | - PETSHARECODES= 48 | # 宠汪汪的喂食数量 49 | - JOY_FEED_COUNT= 50 | #东东超市 51 | # - SUPERMARKET_SHARECODES= 52 | #兑换多少数量的京豆(20,或者1000京豆,或者其他奖品的文字) 53 | # 例: MARKET_COIN_TO_BEANS=1000 54 | - MARKET_COIN_TO_BEANS= 55 | 56 | #如果设置了 RANDOM_DELAY_MAX ,则会启用随机延迟功能,延迟随机 0 到 RANDOM_DELAY_MAX-1 秒。如果不设置此项,则不使用延迟。 57 | #并不是所有的脚本都会被启用延迟,因为有一些脚本需要整点触发。延迟的目的有两个,1是降低抢占cpu资源几率,2是降低检查风险(主要是1) 58 | #填写数字,单位为秒,比如写为 RANDOM_DELAY_MAX=30 就是随机产生0到29之间的一个秒数,执行延迟的意思。 59 | - RANDOM_DELAY_MAX=120 60 | -------------------------------------------------------------------------------- /activity/jd_ftzy_help.js: -------------------------------------------------------------------------------- 1 | let common = require("./function/common"); 2 | let $ = new common.env('京东沸腾之夜助力'); 3 | let min = 3, 4 | help = $.config[$.filename(__filename)] || Math.min(min, $.config.JdMain) || min 5 | $.setOptions({ 6 | headers: { 7 | 'content-type': 'application/json', 8 | 'user-agent': 'jdapp;iPhone;9.4.6;14.2;965af808880443e4c1306a54afdd5d5ae771de46;network/wifi;supportApplePay/0;hasUPPay/0;hasOCPay/0;model/iPhone8,4;addressid/;supportBestPay/0;appBuild/167618;jdSupportDarkMode/0;Mozilla/5.0 (iPhone; CPU iPhone OS 14_2 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148;supportJDSHWK/1', 9 | 'referer': 'https://happy.m.jd.com/babelDiy/Zeus/3ugedFa7yA6NhxLN5gw2L3PF9sQC/index.html', 10 | } 11 | }); 12 | $.readme = ` 13 | 0 0 * * * task ${$.runfile} 14 | exprot ${$.runfile}=2 # 如需修改被助力账号个数,请自行修改环境变量 15 | ` 16 | eval(common.eval.mainEval($)); 17 | async function prepare() { 18 | for (let i of cookies['help']) { 19 | let s = await $.curl({ 20 | 'url': `https://api.m.jd.com/client.action?advId=party1031_init`, 21 | 'form': `functionId=party1031_init&body={}&client=wh5&clientVersion=1.0.0&appid=o2_act&uuid=cf7d66dca8a794007c133227f504a8e2aff131e7`, 22 | cookie: i 23 | },'s') 24 | try { 25 | $.sharecode.push($.compact($.s.data.result, ['inviteCode'])) 26 | } catch (e) {} 27 | } 28 | } 29 | async function main(p) { 30 | let cookie = p.cookie 31 | await $.curl({ 32 | 'url': `https://api.m.jd.com/client.action?advId=party1031_assist`, 33 | 'form': `functionId=party1031_assist&client=wh5&clientVersion=1.0.0&appid=o2_act&_stk=appid,body,client,clientVersion,functionId&_ste=1&h5st=&body={"inviteCode":"${p.inviteCode}"}&uuid=cf7d66dca8a794007c133227f504a8e2aff131e7`, 34 | cookie 35 | },'s') 36 | console.log($.s.data); 37 | } 38 | -------------------------------------------------------------------------------- /docker/example/jd_scripts.custom-overwrite.syno.json: -------------------------------------------------------------------------------- 1 | { 2 | "cap_add" : [], 3 | "cap_drop" : [], 4 | "cmd" : "", 5 | "cpu_priority" : 50, 6 | "devices" : null, 7 | "enable_publish_all_ports" : false, 8 | "enable_restart_policy" : true, 9 | "enabled" : true, 10 | "env_variables" : [ 11 | { 12 | "key" : "PATH", 13 | "value" : "/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin" 14 | }, 15 | { 16 | "key" : "CDN_JD_DAILYBONUS", 17 | "value" : "true" 18 | }, 19 | { 20 | "key" : "JD_COOKIE", 21 | "value" : "pt_key=xxx;pt_pin=xxx;" 22 | }, 23 | { 24 | "key" : "PUSH_KEY", 25 | "value" : "" 26 | }, 27 | { 28 | "key" : "CUSTOM_LIST_FILE", 29 | "value" : "my_crontab_list.sh" 30 | }, 31 | { 32 | "key" : "CUSTOM_LIST_MERGE_TYPE", 33 | "value" : "overwrite" 34 | } 35 | ], 36 | "exporting" : false, 37 | "id" : "3a2f6f27c23f93bc104585c22569c760cc9ce82df09cdb41d53b491fe1d0341c", 38 | "image" : "lxk0301/jd_scripts", 39 | "is_ddsm" : false, 40 | "is_package" : false, 41 | "links" : [], 42 | "memory_limit" : 0, 43 | "name" : "jd_scripts", 44 | "network" : [ 45 | { 46 | "driver" : "bridge", 47 | "name" : "bridge" 48 | } 49 | ], 50 | "network_mode" : "default", 51 | "port_bindings" : [], 52 | "privileged" : false, 53 | "shortcut" : { 54 | "enable_shortcut" : false 55 | }, 56 | "use_host_network" : false, 57 | "volume_bindings" : [ 58 | { 59 | "host_volume_file" : "/docker/jd_scripts/my_crontab_list.sh", 60 | "mount_point" : "/scripts/docker/my_crontab_list.sh", 61 | "type" : "rw" 62 | }, 63 | { 64 | "host_volume_file" : "/docker/jd_scripts/logs", 65 | "mount_point" : "/scripts/logs", 66 | "type" : "rw" 67 | } 68 | ] 69 | } 70 | -------------------------------------------------------------------------------- /docker/example/custom-append.yml: -------------------------------------------------------------------------------- 1 | jd_scripts: 2 | image: lxk0301/jd_scripts 3 | # 配置服务器资源约束。此例子中服务被限制为使用内存不超过200M以及cpu不超过0.2(单核的20%) 4 | # 经过实际测试,建议不低于200M 5 | # deploy: 6 | # resources: 7 | # limits: 8 | # cpus: '0.2' 9 | # memory: 200M 10 | container_name: jd_scripts 11 | restart: always 12 | volumes: 13 | - ./my_crontab_list.sh:/scripts/docker/my_crontab_list.sh 14 | - ./logs:/scripts/logs 15 | tty: true 16 | # 因为更换仓库地址可能git pull的dns解析不到,可以在配置追加hosts 17 | extra_hosts: 18 | - "gitee.com:180.97.125.228" 19 | - "github.com:13.229.188.59" 20 | - "raw.githubusercontent.com:151.101.228.133" 21 | environment: 22 | #脚本更新仓库地址,配置了会切换到对应的地址 23 | - REPO_URL=git@gitee.com:lxk0301/jd_scripts.git 24 | # 注意环境变量填写值的时候一律不需要引号(""或者'')下面这些只是示例,根据自己的需求增加删除 25 | #jd cookies 26 | # 例: JD_COOKIE=pt_key=XXX;pt_pin=XXX; 27 | # 例(多账号): JD_COOKIE=pt_key=XXX;pt_pin=XXX;&pt_key=XXX;pt_pin=XXX;&pt_key=XXX;pt_pin=XXX; 28 | - JD_COOKIE= 29 | #微信server酱通知 30 | - PUSH_KEY= 31 | #Bark App通知 32 | - BARK_PUSH= 33 | #telegram机器人通知 34 | - TG_BOT_TOKEN= 35 | - TG_USER_ID= 36 | #钉钉机器人通知 37 | - DD_BOT_TOKEN= 38 | - DD_BOT_SECRET= 39 | #企业微信机器人通知 40 | - QYWX_KEY= 41 | #京东种豆得豆 42 | - PLANT_BEAN_SHARECODES= 43 | #京东农场 44 | # 例: FRUITSHARECODES=京东农场的互助码 45 | - FRUITSHARECODES= 46 | #京东萌宠 47 | # 例: PETSHARECODES=东东萌宠的互助码 48 | - PETSHARECODES= 49 | # 宠汪汪的喂食数量 50 | - JOY_FEED_COUNT= 51 | #东东超市 52 | # - SUPERMARKET_SHARECODES= 53 | #兑换多少数量的京豆(20,或者1000京豆,或者其他奖品的文字) 54 | # 例: MARKET_COIN_TO_BEANS=1000 55 | - MARKET_COIN_TO_BEANS= 56 | #如果设置了 RANDOM_DELAY_MAX ,则会启用随机延迟功能,延迟随机 0 到 RANDOM_DELAY_MAX-1 秒。如果不设置此项,则不使用延迟。 57 | #并不是所有的脚本都会被启用延迟,因为有一些脚本需要整点触发。延迟的目的有两个,1是降低抢占cpu资源几率,2是降低检查风险(主要是1) 58 | #填写数字,单位为秒,比如写为 RANDOM_DELAY_MAX=30 就是随机产生0到29之间的一个秒数,执行延迟的意思。 59 | - RANDOM_DELAY_MAX=120 60 | #使用自定义定任务追加默认任务之后,上面volumes挂载之后这里配置对应的文件名 61 | - CUSTOM_LIST_FILE=my_crontab_list.sh 62 | 63 | -------------------------------------------------------------------------------- /docker/example/custom-overwrite.yml: -------------------------------------------------------------------------------- 1 | jd_scripts: 2 | image: lxk0301/jd_scripts 3 | # 配置服务器资源约束。此例子中服务被限制为使用内存不超过200M以及cpu不超过0.2(单核的20%) 4 | # 经过实际测试,建议不低于200M 5 | # deploy: 6 | # resources: 7 | # limits: 8 | # cpus: '0.2' 9 | # memory: 200M 10 | container_name: jd_scripts 11 | restart: always 12 | volumes: 13 | - ./my_crontab_list.sh:/scripts/docker/my_crontab_list.sh 14 | - ./logs:/scripts/logs 15 | tty: true 16 | # 因为更换仓库地址可能git pull的dns解析不到,可以在配置追加hosts 17 | extra_hosts: 18 | - "gitee.com:180.97.125.228" 19 | - "github.com:13.229.188.59" 20 | - "raw.githubusercontent.com:151.101.228.133" 21 | environment: 22 | #脚本更新仓库地址,配置了会切换到对应的地址 23 | - REPO_URL=git@gitee.com:lxk0301/jd_scripts.git 24 | # 注意环境变量填写值的时候一律不需要引号(""或者'')下面这些只是示例,根据自己的需求增加删除 25 | #jd cookies 26 | # 例: JD_COOKIE=pt_key=XXX;pt_pin=XXX; 27 | #例(多账号): JD_COOKIE=pt_key=XXX;pt_pin=XXX;&pt_key=XXX;pt_pin=XXX;&pt_key=XXX;pt_pin=XXX; 28 | - JD_COOKIE= 29 | #微信server酱通知 30 | - PUSH_KEY= 31 | #Bark App通知 32 | - BARK_PUSH= 33 | #telegram机器人通知 34 | - TG_BOT_TOKEN= 35 | - TG_USER_ID= 36 | #钉钉机器人通知 37 | - DD_BOT_TOKEN= 38 | - DD_BOT_SECRET= 39 | #企业微信机器人通知 40 | - QYWX_KEY= 41 | #京东种豆得豆 42 | - PLANT_BEAN_SHARECODES= 43 | #京东农场 44 | # 例: FRUITSHARECODES=京东农场的互助码 45 | - FRUITSHARECODES= 46 | #京东萌宠 47 | # 例: PETSHARECODES=东东萌宠的互助码 48 | - PETSHARECODES= 49 | # 宠汪汪的喂食数量 50 | - JOY_FEED_COUNT= 51 | #东东超市 52 | # - SUPERMARKET_SHARECODES= 53 | #兑换多少数量的京豆(20,或者1000京豆,或者其他奖品的文字) 54 | # 例: MARKET_COIN_TO_BEANS=1000 55 | - MARKET_COIN_TO_BEANS= 56 | #如果设置了 RANDOM_DELAY_MAX ,则会启用随机延迟功能,延迟随机 0 到 RANDOM_DELAY_MAX-1 秒。如果不设置此项,则不使用延迟。 57 | #并不是所有的脚本都会被启用延迟,因为有一些脚本需要整点触发。延迟的目的有两个,1是降低抢占cpu资源几率,2是降低检查风险(主要是1) 58 | #填写数字,单位为秒,比如写为 RANDOM_DELAY_MAX=30 就是随机产生0到29之间的一个秒数,执行延迟的意思。 59 | - RANDOM_DELAY_MAX=120 60 | #使用自定义定任务覆盖默认任务,上面volumes挂载之后这里配置对应的文件名,和自定义文件使用方式为overwrite 61 | - CUSTOM_LIST_FILE=my_crontab_list.sh 62 | - CUSTOM_LIST_MERGE_TYPE=overwrite 63 | -------------------------------------------------------------------------------- /jd_sign.js: -------------------------------------------------------------------------------- 1 | //48 9,22 * * * jd_sign.js 2 | /* 3 | [task_local] 4 | 京东签到 5 | 48 9,22 * * * jd_sign.js, tag=京东签到, enabled=true 6 | ================Loon============== 7 | [Script] 8 | cron "48 9,22 * * *" script-path=jd_sign.js,tag=京东签到 9 | */ 10 | const {Env} = require('./utils/magic'); 11 | const $ = new Env('M京东签到') 12 | $.logic = async function () { 13 | await signBeanIndex() 14 | await $.wait(3000, 5000) 15 | await cgame(); 16 | } 17 | $.run({filename: __filename, wait: [1000, 2000], random: true}) 18 | .catch(reason => console.log(reason)) 19 | 20 | async function signBeanIndex() { 21 | let url = `https://api.m.jd.com/client.action` 22 | let headers = { 23 | "Content-Type": "application/x-www-form-urlencoded", 24 | 'Host': `api.m.jd.com`, 25 | 'Origin': 'https://api.m.jd.com', 26 | 'Referer': `https://api.m.jd.com`, 27 | 'Cookie': $.cookie 28 | } 29 | let body = "functionId=signBeanIndex&appid=ld" 30 | let data = await $.post(url, body, headers) 31 | let title = data.data?.dailyAward?.title 32 | || data.data?.continuityAward?.title; 33 | let bean = data.data?.dailyAward?.beanAward?.beanCount 34 | || data.data?.continuityAward?.beanAward?.beanCount; 35 | if (bean) { 36 | $.log(`${title} 获得${bean}京豆`) 37 | } 38 | } 39 | 40 | async function cgame() { 41 | let url = `https://cgame-stadium.jd.com/api/v1/sign` 42 | let headers = { 43 | 'Connection': 'keep-alive', 44 | 'Accept-Encoding': 'gzip, deflate, br', 45 | 'Content-Type': 'application/json', 46 | 'Origin': 'https://pro.m.jd.com', 47 | 'ActivityId': 'a54e9a0a1b6044189753e7eba51aab19', 48 | 'Host': 'cgame-stadium.jd.com', 49 | 'Referer': 'https://pro.m.jd.com/mall/active/dj6us2JJRLMMBb4iDaSK4wxvBMt/index.html', 50 | 'Accept-Language': 'zh-cn', 51 | 'Accept': 'application/json', 52 | 'Cookie': $.cookie 53 | } 54 | let data = await $.post(url, {}, headers) 55 | let bean = data?.data?.beanNum || 0; 56 | if (bean > 0) { 57 | $.log(`汽车签到 获得${bean}京豆`) 58 | } 59 | } 60 | 61 | -------------------------------------------------------------------------------- /docker/example/multi.yml: -------------------------------------------------------------------------------- 1 | version: "3" 2 | services: 3 | jd_scripts1: #默认 4 | image: lxk0301/jd_scripts 5 | # 配置服务器资源约束。此例子中服务被限制为使用内存不超过200M以及cpu不超过 0.2(单核的20%) 6 | # 经过实际测试,建议不低于200M 7 | # deploy: 8 | # resources: 9 | # limits: 10 | # cpus: '0.2' 11 | # memory: 200M 12 | restart: always 13 | container_name: jd_scripts1 14 | tty: true 15 | volumes: 16 | - ./logs1:/scripts/logs 17 | environment: 18 | - JD_COOKIE=pt_key=AAJfjaNrADAS8ygfgIsOxxxxxxxKpfDaZ2pSBOYTxtPqLK8U1Q;pt_pin=lxxxxxx5; 19 | - TG_BOT_TOKEN=130xxxx280:AAExxxxxxWP10zNf91WQ 20 | - TG_USER_ID=12xxxx206 21 | # 互助助码等参数可自行增加,如下。 22 | # 京东种豆得豆 23 | # - PLANT_BEAN_SHARECODES= 24 | 25 | jd_scripts2: #默认 26 | image: lxk0301/jd_scripts 27 | restart: always 28 | container_name: jd_scripts2 29 | tty: true 30 | volumes: 31 | - ./logs2:/scripts/logs 32 | environment: 33 | - JD_COOKIE=pt_key=AAJfjaNrADAS8ygfgIsOxxxxxxxKpfDaZ2pSBOYTxtPqLK8U1Q;pt_pin=lxxxxxx5; 34 | - TG_BOT_TOKEN=130xxxx280:AAExxxxxxWP10zNf91WQ 35 | - TG_USER_ID=12xxxx206 36 | jd_scripts4: #自定义追加默认之后 37 | image: lxk0301/jd_scripts 38 | restart: always 39 | container_name: jd_scripts4 40 | tty: true 41 | volumes: 42 | - ./logs4:/scripts/logs 43 | - ./my_crontab_list4.sh:/scripts/docker/my_crontab_list.sh 44 | environment: 45 | - JD_COOKIE=pt_key=AAJfjaNrADAS8ygfgIsOxxxxxxxKpfDaZ2pSBOYTxtPqLK8U1Q;pt_pin=lxxxxxx5; 46 | - TG_BOT_TOKEN=130xxxx280:AAExxxxxxWP10zNf91WQ 47 | - TG_USER_ID=12xxxx206 48 | - CUSTOM_LIST_FILE=my_crontab_list.sh 49 | jd_scripts5: #自定义覆盖默认 50 | image: lxk0301/jd_scripts 51 | restart: always 52 | container_name: jd_scripts5 53 | tty: true 54 | volumes: 55 | - ./logs5:/scripts/logs 56 | - ./my_crontab_list5.sh:/scripts/docker/my_crontab_list.sh 57 | environment: 58 | - JD_COOKIE=pt_key=AAJfjaNrADAS8ygfgIsOxxxxxxxKpfDaZ2pSBOYTxtPqLK8U1Q;pt_pin=lxxxxxx5; 59 | - TG_BOT_TOKEN=130xxxx280:AAExxxxxxWP10zNf91WQ 60 | - TG_USER_ID=12xxxx206 61 | - CUSTOM_LIST_FILE=my_crontab_list.sh 62 | - CUSTOM_LIST_MERGE_TYPE=overwrite 63 | -------------------------------------------------------------------------------- /docker/example/jd_scripts.syno.json: -------------------------------------------------------------------------------- 1 | { 2 | "cap_add" : null, 3 | "cap_drop" : null, 4 | "cmd" : "", 5 | "cpu_priority" : 0, 6 | "devices" : null, 7 | "enable_publish_all_ports" : false, 8 | "enable_restart_policy" : true, 9 | "enabled" : false, 10 | "env_variables" : [ 11 | { 12 | "key" : "PATH", 13 | "value" : "/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin" 14 | }, 15 | { 16 | "key" : "CDN_JD_DAILYBONUS", 17 | "value" : "true" 18 | }, 19 | { 20 | "key" : "JD_COOKIE", 21 | "value" : "pt_key=AAJfjaNrADASxxxxxxxKpfDaZ2pSBOYTxtPqLK8U1Q;pt_pin=lxxxxx5;" 22 | }, 23 | { 24 | "key" : "TG_BOT_TOKEN", 25 | "value" : "13xxxxxx80:AAEkNxxxxxxzNf91WQ" 26 | }, 27 | { 28 | "key" : "TG_USER_ID", 29 | "value" : "12xxxx206" 30 | }, 31 | { 32 | "key" : "PLANT_BEAN_SHARECODES", 33 | "value" : "" 34 | }, 35 | { 36 | "key" : "FRUITSHARECODES", 37 | "value" : "" 38 | }, 39 | { 40 | "key" : "PETSHARECODES", 41 | "value" : "" 42 | }, 43 | { 44 | "key" : "SUPERMARKET_SHARECODES", 45 | "value" : "" 46 | }, 47 | { 48 | "key" : "CRONTAB_LIST_FILE", 49 | "value" : "crontab_list.sh" 50 | } 51 | ], 52 | "exporting" : false, 53 | "id" : "18af38bc0ac37a40e4b9608a86fef56c464577cc160bbdddec90155284fcf4e5", 54 | "image" : "lxk0301/jd_scripts", 55 | "is_ddsm" : false, 56 | "is_package" : false, 57 | "links" : [], 58 | "memory_limit" : 0, 59 | "name" : "jd_scripts", 60 | "network" : [ 61 | { 62 | "driver" : "bridge", 63 | "name" : "bridge" 64 | } 65 | ], 66 | "network_mode" : "default", 67 | "port_bindings" : [], 68 | "privileged" : false, 69 | "shortcut" : { 70 | "enable_shortcut" : false, 71 | "enable_status_page" : false, 72 | "enable_web_page" : false, 73 | "web_page_url" : "" 74 | }, 75 | "use_host_network" : false, 76 | "volume_bindings" : [ 77 | { 78 | "host_volume_file" : "/docker/jd_scripts/logs", 79 | "mount_point" : "/scripts/logs", 80 | "type" : "rw" 81 | } 82 | ] 83 | } 84 | -------------------------------------------------------------------------------- /utils/jdShareCodes.js: -------------------------------------------------------------------------------- 1 | // 从日志中获取互助码 2 | 3 | // process.env.SHARE_CODE_FILE = "/scripts/logs/sharecode.log"; 4 | // process.env.JD_COOKIE = "cookie1&cookie2"; 5 | 6 | exports.JDZZ_SHARECODES = []; 7 | exports.DDFACTORY_SHARECODES = []; 8 | exports.DREAM_FACTORY_SHARE_CODES = []; 9 | exports.PLANT_BEAN_SHARECODES = []; 10 | exports.FRUITSHARECODES = []; 11 | exports.PETSHARECODES = []; 12 | exports.JDJOY_SHARECODES = []; 13 | 14 | let fileContent = ''; 15 | if (process.env.SHARE_CODE_FILE) { 16 | try { 17 | const fs = require('fs'); 18 | if (fs.existsSync(process.env.SHARE_CODE_FILE)) fileContent = fs.readFileSync(process.env.SHARE_CODE_FILE, 'utf8'); 19 | } catch (err) { 20 | console.error(err) 21 | } 22 | } 23 | let lines = fileContent.split('\n'); 24 | 25 | let shareCodesMap = { 26 | "JDZZ_SHARECODES": [], 27 | "DDFACTORY_SHARECODES": [], 28 | "DREAM_FACTORY_SHARE_CODES": [], 29 | "PLANT_BEAN_SHARECODES": [], 30 | "FRUITSHARECODES": [], 31 | "PETSHARECODES": [], 32 | "JDJOY_SHARECODES": [], 33 | }; 34 | for (let i = 0; i < lines.length; i++) { 35 | if (lines[i].includes('京东赚赚')) { 36 | shareCodesMap.JDZZ_SHARECODES.push(lines[i].split('】')[1].trim()); 37 | } else if (lines[i].includes('东东工厂')) { 38 | shareCodesMap.DDFACTORY_SHARECODES.push(lines[i].split('】')[1].trim()); 39 | } else if (lines[i].includes('京喜工厂')) { 40 | shareCodesMap.DREAM_FACTORY_SHARE_CODES.push(lines[i].split('】')[1].trim()); 41 | } else if (lines[i].includes('京东种豆得豆')) { 42 | shareCodesMap.PLANT_BEAN_SHARECODES.push(lines[i].split('】')[1].trim()); 43 | } else if (lines[i].includes('东东农场')) { 44 | shareCodesMap.FRUITSHARECODES.push(lines[i].split('】')[1].trim()); 45 | } else if (lines[i].includes('东东萌宠')) { 46 | shareCodesMap.PETSHARECODES.push(lines[i].split('】')[1].trim()); 47 | } else if (lines[i].includes('crazyJoy')) { 48 | shareCodesMap.JDJOY_SHARECODES.push(lines[i].split('】')[1].trim()); 49 | } 50 | } 51 | for (let key in shareCodesMap) { 52 | shareCodesMap[key] = shareCodesMap[key].reduce((prev, cur) => prev.includes(cur) ? prev : [...prev, cur], []); // 去重 53 | } 54 | let cookieCount = 0; 55 | if (process.env.JD_COOKIE) { 56 | if (process.env.JD_COOKIE.indexOf('&') > -1) { 57 | cookieCount = process.env.JD_COOKIE.split('&').length; 58 | } else { 59 | cookieCount = process.env.JD_COOKIE.split('\n').length; 60 | } 61 | } 62 | 63 | for (let key in shareCodesMap) { 64 | exports[key] = []; 65 | if (shareCodesMap[key].length === 0) { 66 | continue; 67 | } 68 | for (let i = 0; i < cookieCount; i++) { 69 | exports[key][i] = shareCodesMap[key].sort(() => Math.random() - 0.5).join('@'); 70 | } 71 | } 72 | 73 | -------------------------------------------------------------------------------- /utils/share_code.js: -------------------------------------------------------------------------------- 1 | var allShareCodes = []; 2 | var removedShareCodes = []; 3 | var chetou_number = process.env.CHETOU_NUMBER ? process.env.CHETOU_NUMBER : 0 4 | var fair_mode = process.env.FAIR_MODE ? true : false 5 | var precode_mode = process.env.PRECODE_MODE ? false : true 6 | 7 | exports.ModCK = function(cks) { 8 | console.log(`您${fair_mode ? "有" : "没有"}设置雨露均沾模式。`) 9 | console.log(`您设置了${chetou_number}个车头。`) 10 | if (cks.length <= chetou_number || !fair_mode) { 11 | return cks 12 | } 13 | var sck = [] 14 | var eck = [] 15 | for (var i = 0; i < cks.length; i++) { 16 | if (i <= chetou_number - 1) { 17 | sck.push(cks[i]) 18 | } else { 19 | eck.push(cks[i]) 20 | } 21 | } 22 | eck.sort(function() { 23 | return Math.random() - 0.5; 24 | }) 25 | console.log(`已对${eck.length}个ck做了随机处理。`) 26 | for (var i = 0; i < eck.length; i++) { 27 | sck.push(eck[i]) 28 | } 29 | if (!precode_mode) { 30 | if (sck.length >= 2) { 31 | sck.push(sck[0]) 32 | } 33 | if (sck.length >= 3) { 34 | sck.push(sck[1]) 35 | } 36 | if (sck.length >= 4) { 37 | sck.push(sck[2]) 38 | } 39 | if (sck.length >= 5) { 40 | sck.push(sck[3]) 41 | } 42 | if (sck.length >= 6) { 43 | sck.push(sck[4]) 44 | } 45 | } 46 | return sck 47 | } 48 | 49 | 50 | 51 | 52 | exports.setDefaultShareCodes = function(str) { 53 | if (!str) { 54 | return 55 | } 56 | var shareCodes = str.split("@") 57 | console.log(`您提供了${shareCodes.length}个账号的助力码\n`); 58 | if (shareCodes && shareCodes.length) { 59 | for (var shareCode of shareCodes) { 60 | if (shareCode && shareCode != "undefined" && allShareCodes.indexOf(shareCode) == -1) { 61 | allShareCodes.push(shareCode) 62 | } 63 | } 64 | } 65 | } 66 | 67 | exports.addShareCode = function(shareCode) { 68 | if (shareCode && allShareCodes.indexOf(shareCode) == -1) { 69 | allShareCodes.push(shareCode) 70 | } 71 | } 72 | 73 | exports.removeShareCode = function(shareCode) { 74 | removedShareCodes.push(shareCode) 75 | } 76 | 77 | exports.forEachShareCode = function(func) { 78 | for (var shareCode of allShareCodes) { 79 | if (removedShareCodes.indexOf(shareCode) == -1) { 80 | if (func(shareCode)) { 81 | break 82 | } 83 | } 84 | } 85 | } 86 | 87 | exports.getShareCodes = function() { 88 | var shareCodes = [] 89 | for (var shareCode of allShareCodes) { 90 | if (removedShareCodes.indexOf(shareCode) == -1) { 91 | shareCodes.push(shareCode) 92 | } 93 | } 94 | return shareCodes 95 | } 96 | 97 | exports.getAllShareCodes = function() { 98 | return allShareCodes 99 | } -------------------------------------------------------------------------------- /jd_jx_cashback.js: -------------------------------------------------------------------------------- 1 | /* 2 | 京京喜购物返红包助力 3 | 更新时间:2021-9-10 4 | 备注:京喜购物返红包助力,多个请看下方变量填写 5 | 6 | ## exprot jd_jx_cashback=10 #如需增加被助力账号,在这边修改人数 7 | 44 0-23/6 * * * jd_jx_cashback.js, tag=京喜购物返红包助力, enabled=true 8 | */ 9 | let common = require("./function/common"); 10 | let $ = new common.env('京喜购物返红包助力'); 11 | let min = 5, 12 | help = $.config[$.filename(__filename)] || Math.min(min, $.config.JdMain) || min; 13 | $.setOptions({ 14 | headers: { 15 | 'content-type': 'application/json', 16 | 'user-agent': 'jdapp;iPhone;9.4.6;14.2;965af808880443e4c1306a54afdd5d5ae771de46;network/wifi;supportApplePay/0;hasUPPay/0;hasOCPay/0;model/iPhone8,4;addressid/;supportBestPay/0;appBuild/167618;jdSupportDarkMode/0;Mozilla/5.0 (iPhone; CPU iPhone OS 14_2 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148;supportJDSHWK/1', 17 | 'referer': 'https://happy.m.jd.com/babelDiy/Zeus/3ugedFa7yA6NhxLN5gw2L3PF9sQC/index.html?asid=287215626&un_area=12_904_905_57901&lng=117.612969135975&lat=23.94014745198865', 18 | } 19 | }); 20 | $.readme = ` 21 | 在京喜下单,如订单有购物返现,脚本会自动查询返现groupid并予以助力,目前每个账号每天能助力3次 22 | 44 */6 * * * task ${$.runfile} 23 | exprot ${$.runfile}=10 #如需增加被助力账号,在这边修改人数 24 | ` 25 | eval(common.eval.mainEval($)); 26 | async function prepare() { 27 | let url = `https://wq.jd.com/bases/orderlist/list?order_type=3&start_page=1&last_page=0&page_size=10&callersource=newbiz&t=${$.timestamp}&traceid=&g_ty=ls&g_tk=606717070` 28 | for (let j of cookies['help']) { 29 | $.setCookie(j); 30 | await $.curl(url) 31 | try { 32 | for (let k of $.source.orderList) { 33 | try { 34 | let orderid = k.parentId != '0' ? k.parentId : k.orderId 35 | let url = `https://wq.jd.com/fanxianzl/zhuli/QueryGroupDetail?isquerydraw=1&orderid=${orderid}&groupid=&sceneval=2&g_login_type=1&g_ty=ls` 36 | let dec = await jxAlgo.dec(url) 37 | await $.curl(dec.url) 38 | let now = parseInt(new Date() / 1000) 39 | let end = $.source.data.groupinfo.end_time 40 | if (end > now && $.source.data.groupinfo.openhongbaosum != $.source.data.groupinfo.totalhongbaosum) { 41 | let groupid = $.source.data.groupinfo.groupid; 42 | $.sharecode.push({ 43 | 'groupid': groupid 44 | }) 45 | } 46 | } catch (e) {} 47 | } 48 | } catch (e) {} 49 | } 50 | } 51 | async function main(id) { 52 | common.assert(id.groupid, '没有可助力ID') 53 | let url = `http://wq.jd.com/fanxianzl/zhuli/Help?groupid=${id.groupid}&_stk=groupid&_ste=2&g_ty=ls&g_tk=1710198667&sceneval=2&g_login_type=1` 54 | let dec = await jxAlgo.dec(url) 55 | await $.curl(dec.url) 56 | console.log($.source.data.prize.discount) 57 | } 58 | -------------------------------------------------------------------------------- /docker/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM node:lts-alpine3.12 2 | 3 | LABEL AUTHOR="none" \ 4 | VERSION=0.1.4 5 | 6 | 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-----" 7 | 8 | ENV DEFAULT_LIST_FILE=crontab_list.sh \ 9 | CUSTOM_LIST_MERGE_TYPE=append \ 10 | COOKIES_LIST=/scripts/logs/cookies.list \ 11 | REPO_URL=git@gitee.com:lxk0301/jd_scripts.git \ 12 | REPO_BRANCH=master 13 | 14 | RUN set -ex \ 15 | && apk update \ 16 | && apk upgrade \ 17 | && apk add --no-cache bash tzdata git moreutils curl jq openssh-client \ 18 | && rm -rf /var/cache/apk/* \ 19 | && ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime \ 20 | && echo "Asia/Shanghai" > /etc/timezone \ 21 | && mkdir -p /root/.ssh \ 22 | && echo -e $KEY > /root/.ssh/id_rsa \ 23 | && chmod 600 /root/.ssh/id_rsa \ 24 | && ssh-keyscan gitee.com > /root/.ssh/known_hosts \ 25 | && git clone -b $REPO_BRANCH $REPO_URL /scripts \ 26 | && cd /scripts \ 27 | && mkdir logs \ 28 | && npm config set registry https://registry.npm.taobao.org \ 29 | && npm install \ 30 | && cp /scripts/docker/docker_entrypoint.sh /usr/local/bin \ 31 | && chmod +x /usr/local/bin/docker_entrypoint.sh 32 | 33 | WORKDIR /scripts 34 | 35 | ENTRYPOINT ["docker_entrypoint.sh"] 36 | 37 | CMD [ "crond" ] -------------------------------------------------------------------------------- /function/eval.js: -------------------------------------------------------------------------------- 1 | function mainEval($) { 2 | return ` 3 | !(async () => { 4 | jdcookie = process.env.JD_COOKIE ? process.env.JD_COOKIE.split("&") : require("./function/jdcookie").cookie; 5 | cookies={ 6 | 'all':jdcookie, 7 | 'help': typeof(help) != 'undefined' ? [...jdcookie].splice(0,parseInt(help)):[] 8 | } 9 | $.sleep=cookies['all'].length * 500 10 | taskCookie=cookies['all'] 11 | jxAlgo = new common.jxAlgo(); 12 | if ($.readme) { 13 | console.log(\`使用说明:\\n\${$.readme}\\n以上内容仅供参考,有需求自行添加\\n\`,) 14 | } 15 | console.log(\`======================本次任务共\${taskCookie.length}个京东账户Cookie======================\\n\`) 16 | try{ 17 | await prepare(); 18 | 19 | if ($.sharecode.length > 0) { 20 | $.sharecode = $.sharecode.filter(d=>d && JSON.stringify(d)!='{}') 21 | console.log('助力码', $.sharecode ) 22 | } 23 | }catch(e1){console.log("初始函数不存在,将继续执行主函数Main\\n")} 24 | if (typeof(main) != 'undefined') { 25 | try{ 26 | for (let i = 0; i < taskCookie.filter(d => d).length; i++) { 27 | $.cookie = taskCookie[i]; 28 | $.user = decodeURIComponent($.cookie.match(/pt_pin=([^;]+)/)[1]) 29 | $.index = parseInt(i) + 1; 30 | let info = { 31 | 'index': $.index, 32 | 'user': $.user, 33 | 'cookie': $.cookie 34 | } 35 | if (!$.thread) { 36 | console.log(\`\n******开始【京东账号\${$.index}】\${$.user} 任务*********\n\`); 37 | } 38 | if ($.config[\`\${$.runfile}_except\`] && $.config[\`\${$.runfile}_except\`].includes(\$.user)) { 39 | console.log(\`全局变量\${$.runfile}_except中配置了该账号pt_pin,跳过此次任务\`) 40 | }else{ 41 | $.setCookie($.cookie) 42 | try{ 43 | if ($.sharecode.length > 0) { 44 | for (let smp of $.sharecode) { 45 | smp = Object.assign({ ...info}, smp); 46 | $.thread ? main(smp) : await main(smp); 47 | } 48 | }else{ 49 | $.thread ? main(info) : await main(info); 50 | } 51 | } 52 | catch(em){ 53 | console.log(em.message) 54 | } 55 | } 56 | 57 | 58 | } 59 | }catch(em){console.log(em.message)} 60 | if ($.thread) { 61 | await $.wait($.sleep) 62 | } 63 | } 64 | if (typeof(extra) != 'undefined') { 65 | console.log(\`============================开始运行额外任务============================\`) 66 | try{ 67 | await extra(); 68 | }catch(e4){console.log(e4.message)} 69 | } 70 | })().catch((e) => { 71 | console.log(e.message) 72 | }).finally(() => { 73 | if ($.message.length > 0) { 74 | $.notify($.message) 75 | } 76 | $.done(); 77 | }); 78 | 79 | ` 80 | } 81 | module.exports = { 82 | mainEval 83 | } 84 | -------------------------------------------------------------------------------- /backUp/gitSync.md: -------------------------------------------------------------------------------- 1 | ## 保持自己github的forks自动和上游仓库同步的教程 2 | - 信息来源于 [https://github.com/wei/pull](https://github.com/wei/pull) 3 | - 以下教程仅是出于个人爱好,不保证本教程的完全正确性,最终请以作者 [https://github.com/wei/pull](https://github.com/wei/pull) 的描述为准。 4 | - 注:此教程由telegram用户@wukongdada提供 5 | ### 1、只同步默认分支的教程 6 | 7 | > 当上游的仓库仅有一个默认分支。或者上游仓库有两个分支,我们仅需要同步他的默认分支,其他分支对内容对我们来说无关紧要。 8 | 9 | 10 | 11 | ![git1.jpg](../icon/git1.jpg) 12 | 13 | 14 | 15 | a) 登录自己的github账号,另开网页打开 [https://github.com/wei/pull](https://github.com/wei/pull) 16 | 17 | 18 | 19 | b) 点击Pull app进行安装。 20 | 21 | ![../icon/git2.jpg](../icon/git2.jpg) 22 | 23 | 24 | 25 | c) 安装过程中会让你选择要选择那一种方式,All repositories(就是同步已经frok的仓库以及未来fork的仓库),Only select repositories(仅选择要自己需要同步的仓库,其他fork的仓库不会被同步),根据自己需求选择,实在不知道怎么选择,就选All repositories;点击install,完成安装。 26 | 27 | ![../icon/git3.jpg](../icon/git3.jpg) 28 | 29 | 30 | 31 | d) 后续,如果要调整1.c中的选项,打开 [https://github.com/apps/pull](https://github.com/apps/pull) ,点击Configure,输入github密码进入pull的相关设置。 32 | 33 | ![../icon/git4.jpg](../icon/git4.jpg) 34 | 35 | 36 | 37 | e) 进入后,找到Repository access,根据自己的需求,重新选择:All repositories(就是同步已经frok的仓库以及未来fork的仓库),Only select repositories(仅选择要自己需要同步的仓库,其他fork的仓库不会被同步),Save后保存生效。 38 | 39 | ![../icon/git5.jpg](../icon/git5.jpg) 40 | 41 | 42 | 43 | f) Pull app作者虽然在项目中写道keeps your forks up-to-date with upstream via automated pull requests,但当上游仓库有更改时,自己的仓库会在3个小时内完成与上游的同步,3个小时是Pull app作者说的最长时间。当然也可以通过手动触发同步上游仓库,手动触发方式:`https://pull.git.ci/process/你的GitHub名字/你的仓库名字` (例如:`https://pull.git.ci/process/xxxxx/test` ),手动触发可能会进行人机验证,验证通过后会显示Success。 44 | 45 | ![../icon/git12.jpg](../icon/git6.jpg) 46 | 47 | ![../icon/git13.jpg](../icon/git7.png) 48 | 49 | ### 2、同步其他分支的教程 50 | 51 | ![../icon/git8.jpg](../icon/git8.jpg) 52 | 53 | 54 | 55 | a) 假设你fork了上游仓库后,你fork后的地址为 `https://github.com/你的仓库名字/test` ,首先设置完成第1部分内容,注意在1.c步骤没有设置全部同步的,要回到1.e步,确认是否设置同步了 `你的仓库名字/test`,如果没有,请添加上。 56 | 57 | ![../icon/git9.jpg](../icon/git9.jpg) 58 | 59 | 60 | 61 | b) 在默认分支下添加一个文件。 62 | 63 | ![../icon/git10.jpg](../icon/git10.jpg) 64 | 65 | 66 | 67 | c) 复制 ``.github/pull.yml`` 粘贴后看到以下页面,注意github前面的那个.别漏掉了。 68 | 69 | ![../icon/git11.jpg](../icon/git11.jpg) 70 | 71 | 72 | 73 | d) 请在https://github.com/wei/pull\#advanced-setup-with-config 页复制代码, 74 | 75 | 注意:upstream处要修改为上游仓库作者名字。 76 | 77 | ![../icon/git12.jpg](../icon/git12.jpg) 78 | 79 | ![../icon/git13.jpg](../icon/git13.jpg) 80 | 81 | 82 | 83 | e) 最终的示例如下,假设上游作者是zhangsan,所有的注意点都用红线圈出来了,保存后生效。 84 | 85 | ![../icon/git14.jpg](../icon/git14.jpg) 86 | 87 | 88 | 89 | f) Pull app作者虽然在项目中写道keeps your forks up-to-date with upstream via automated pull requests,但当上游仓库有更改时,自己的仓库会在3个小时内完成与上游的同步,3个小时是Pull app作者说的最长时间。当然也可以通过手动触发同步上游仓库,手动触发方式:`https://pull.git.ci/process/你的GitHub名字/你的仓库名字` (例如:`https://pull.git.ci/process/xxxxx/test`),手动触发可能会进行人机验证,验证通过后会显示Success。具体见1.f提供的图片。 90 | 91 | 92 | 93 | g) 本人仅测试过forks一个仓库只有2个分支的项目,如果有多个分支,不能保证是否可行,请自行测试,或者是使用本教程第3部分高级玩法。 94 | 95 | ### 高级玩法 96 | 97 | >当然,作者还有其他更好的项目用于同步所有分支,例如使用 GitHub actions 进行同步。请参考原作者的项目 98 | 99 | - [https://github.com/wei/git-sync](https://github.com/wei/git-sync) 100 | - [https://github.com/repo-sync/github-sync](https://github.com/repo-sync/github-sync) 101 | -------------------------------------------------------------------------------- /docker/example/docker多账户使用独立容器使用说明.md: -------------------------------------------------------------------------------- 1 | ### 使用此方式,请先理解学会使用[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)的使用方式 2 | > 发现有人好像希望不同账户任务并发执行,不想一个账户执行完了才能再执行另一个,这里写一个`docker办法一`的基础上实现方式,其实就是不同账户创建不同的容器,他们互不干扰单独定时执行自己的任务。 3 | 配置使用起来还是比较简单的,具体往下看 4 | ### 文件夹目录参考 5 | ![image](https://user-images.githubusercontent.com/6993269/97781779-885ae700-1bc8-11eb-93a4-b274cbd6062c.png) 6 | ### 具体使用说明直接在图片标注了,文件参考[图片下方](https://github.com/LXK9301/jd_scripts/new/master/docker#docker-composeyml%E6%96%87%E4%BB%B6%E5%8F%82%E8%80%83),配置完成后的[执行命令]() 7 | ![image](https://user-images.githubusercontent.com/6993269/97781610-a1af6380-1bc7-11eb-9397-903b47f5ad6b.png) 8 | #### `docker-compose.yml`文件参考 9 | ```yaml 10 | version: "3" 11 | services: 12 | jd_scripts1: #默认 13 | image: lxk0301/jd_scripts 14 | # 配置服务器资源约束。此例子中服务被限制为使用内存不超过200M以及cpu不超过 0.2(单核的20%) 15 | # 经过实际测试,建议不低于200M 16 | # deploy: 17 | # resources: 18 | # limits: 19 | # cpus: '0.2' 20 | # memory: 200M 21 | restart: always 22 | container_name: jd_scripts1 23 | tty: true 24 | volumes: 25 | - ./logs1:/scripts/logs 26 | environment: 27 | - JD_COOKIE=pt_key=AAJfjaNrADAS8ygfgIsOxxxxxxxKpfDaZ2pSBOYTxtPqLK8U1Q;pt_pin=lxxxxxx5; 28 | - TG_BOT_TOKEN=130xxxx280:AAExxxxxxWP10zNf91WQ 29 | - TG_USER_ID=12xxxx206 30 | # 互助助码等参数可自行增加,如下。 31 | # 京东种豆得豆 32 | # - PLANT_BEAN_SHARECODES= 33 | 34 | jd_scripts2: #默认 35 | image: lxk0301/jd_scripts 36 | restart: always 37 | container_name: jd_scripts2 38 | tty: true 39 | volumes: 40 | - ./logs2:/scripts/logs 41 | environment: 42 | - JD_COOKIE=pt_key=AAJfjaNrADAS8ygfgIsOxxxxxxxKpfDaZ2pSBOYTxtPqLK8U1Q;pt_pin=lxxxxxx5; 43 | - TG_BOT_TOKEN=130xxxx280:AAExxxxxxWP10zNf91WQ 44 | - TG_USER_ID=12xxxx206 45 | jd_scripts4: #自定义追加默认之后 46 | image: lxk0301/jd_scripts 47 | restart: always 48 | container_name: jd_scripts4 49 | tty: true 50 | volumes: 51 | - ./logs4:/scripts/logs 52 | - ./my_crontab_list4.sh:/scripts/docker/my_crontab_list.sh 53 | environment: 54 | - JD_COOKIE=pt_key=AAJfjaNrADAS8ygfgIsOxxxxxxxKpfDaZ2pSBOYTxtPqLK8U1Q;pt_pin=lxxxxxx5; 55 | - TG_BOT_TOKEN=130xxxx280:AAExxxxxxWP10zNf91WQ 56 | - TG_USER_ID=12xxxx206 57 | - CUSTOM_LIST_FILE=my_crontab_list.sh 58 | jd_scripts5: #自定义覆盖默认 59 | image: lxk0301/jd_scripts 60 | restart: always 61 | container_name: jd_scripts5 62 | tty: true 63 | volumes: 64 | - ./logs5:/scripts/logs 65 | - ./my_crontab_list5.sh:/scripts/docker/my_crontab_list.sh 66 | environment: 67 | - JD_COOKIE=pt_key=AAJfjaNrADAS8ygfgIsOxxxxxxxKpfDaZ2pSBOYTxtPqLK8U1Q;pt_pin=lxxxxxx5; 68 | - TG_BOT_TOKEN=130xxxx280:AAExxxxxxWP10zNf91WQ 69 | - TG_USER_ID=12xxxx206 70 | - CUSTOM_LIST_FILE=my_crontab_list.sh 71 | - CUSTOM_LIST_MERGE_TYPE=overwrite 72 | 73 | ``` 74 | #### 目录文件配置好之后在 `jd_scripts_multi`目录执行 75 | `docker-compose up -d` 启动; 76 | `docker-compose logs` 打印日志; 77 | `docker-compose pull` 更新镜像; 78 | `docker-compose stop` 停止容器; 79 | `docker-compose restart` 重启容器; 80 | `docker-compose down` 停止并删除容器; 81 | ![image](https://user-images.githubusercontent.com/6993269/97781935-8fcec000-1bc9-11eb-9d1a-d219e7a1caa9.png) 82 | 83 | 84 | -------------------------------------------------------------------------------- /activity/jd_jxhlk.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf8 -*- 2 | """ 3 | cron: 55 1 * * * 4 | new Env('京喜欢乐砍'); 5 | 活动入口:https://st.jingxi.com/sns/202103/20/jxhlk/list.html 6 | """ 7 | import requests,os,json 8 | def env(key): 9 | return os.environ.get(key) 10 | 11 | # Cookie 12 | cookies = [] 13 | if env("JD_COOKIE"): 14 | cookies.extend(env("JD_COOKIE").split('&')) 15 | 16 | # launchid=os.environ['launchid'] 17 | # print ("环境变量:export launchi=\"\"") 18 | 19 | print ("活动入口:https://st.jingxi.com/sns/202103/20/jxhlk/list.html") 20 | print ("进入活动页面后选择需要砍价的商品,然后运行脚本即可") 21 | print ("脚本会自动查找CK1下面的砍价商品进行砍价,如有剩余助力次数则会助力作者") 22 | print ("可以设置为禁用,需要的时候运行即可") 23 | 24 | headers={ 25 | "Host":"m.jingxi.com", 26 | "Connection":"keep-alive", 27 | "Sec-Fetch-Mode":"no-cors", 28 | "User-Agent":"jdpingou;android;5.8.0;11;58f90d6af88fe89f;network/wifi;model/Mi 10;appBuild/19037;partner/xiaomi;;session/199;aid/58f90d6653589f;oaid/60446b553564e;pap/JA2019_3111789;brand/;eu/53836346635;35636fv/6563656853666;Mozilla/5.0 (Linux; Android 11; Mi 10 Build/RKQ1.200826.002; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/94.0.4606.85 Mobile Safari/537.36", 29 | "Accept":"*/*", 30 | "X-Requested-With":"com.jd.pingou", 31 | "Sec-Fetch-Site":"same-site", 32 | "Referer":"https://st.jingxi.com/sns/202103/20/jxhlk/record.html?newwebview=1", 33 | "Accept-Encoding":"gzip, deflate, br", 34 | "Accept-Language":"zh-CN,zh;q=0.9,en-US;q=0.8,en;q=0.7", 35 | "Cookie":cookies[0] 36 | } 37 | 38 | res=requests.get("https://m.jingxi.com/kjactive/jxhlk/jxhlk_myonline?t=1634969716452&_=1634969716452&sceneval=2&g_login_type=1&callback=jsonpCBKA&g_ty=ls",headers=headers).text 39 | x = slice(10, -1) 40 | data=json.loads(res[x]) 41 | if data["data"]["onling"] != []: 42 | launchid=data["data"]["onling"][0]["launchid"] 43 | print("你当前商品邀请码:"+launchid) 44 | else: 45 | print("账号1未选择商品!") 46 | 47 | for i in cookies: 48 | headers={ 49 | "Host":"m.jingxi.com", 50 | "Connection":"keep-alive", 51 | "Sec-Fetch-Mode":"no-cors", 52 | "User-Agent":"jdpingou;android;5.8.0;11;58f90d6af88fe89f;network/wifi;model/Mi 10;appBuild/19037;partner/xiaomi;;session/186;aid/58f90d6af88fe14f;oaid/60446b582895464e;pap/JA2019_3111789;brand/;eu/5383669303466316;fv/6683836656839366;Mozilla/5.0 (Linux; Android 11; Mi 10 Build/RKQ1.200826.002; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/94.0.4606.85 Mobile Safari/537.36", 53 | "Accept":"*/*", 54 | "X-Requested-With":"com.jd.pingou", 55 | "Sec-Fetch-Site":"same-site", 56 | "Referer":"https://st.jingxi.com/sns/202103/20/jxhlk/list.html?launchid="+launchid+"=139022.1.2&srv=jx_cxyw_https%3A%2F%2Fwq.jd.com%2Fcube%2Ffront%2FactivePublish%2Fjxhlkv2%2F486449.html_jing", 57 | "Accept-Encoding":"gzip, deflate, br", 58 | "Accept-Language":"zh-CN,zh;q=0.9,en-US;q=0.8,en;q=0.7", 59 | "Cookie":i 60 | } 61 | try: 62 | res=requests.get("https://m.jingxi.com/kjactive/jxhlk/jxhlk_queryhelp?launchid="+launchid+"&clicktype=0&nomoving=1&_stk=clicktype%2Claunchid%2Cnomoving&_ste=1&h5st=20211022212829803%3B0265027467319163%3B10029%3Btk01wc6341d3830nxrLb%2FUIVQp4wf3n7VRx5NUooArjZTUCs3pdnDbigVtSczYSc%2B3fu2%2BtrlWLO9CuLwzUOU6zStqPq%3Bfb2561fe9086095abb45032f148c54fbaa3cc308307e6f52716969b32bab452c&t=1634909309853&_=1634909309853&sceneval=2&g_login_type=1&callback=jsonpCBKC&g_ty=ls",headers=headers).text 63 | x = slice(10, -1) 64 | data=json.loads(res[x]) 65 | msg=data["data"]["guestinfo"]["contenttips"] 66 | print(msg) 67 | if "我已经拿走了" in msg: 68 | launchid=requests.get("https://gitee.com/KingRan521/JD-Scripts/raw/master/shareCodes/jxhlk.json").text 69 | except: 70 | print("错误") -------------------------------------------------------------------------------- /jd_jx_factory.js: -------------------------------------------------------------------------------- 1 | /* 2 | 京喜工厂开团助力 3 | 更新时间:2021-9-10 4 | 备注:京喜工厂开团助力,多个请看下方变量填写 5 | 6 | ## exprot jd_jx_factory=10 #如需增加被助力账号,在这边修改人数 7 | 18 1 * * * jd_jx_factory.js, tag=京喜工厂开团助力, enabled=true 8 | */ 9 | let common = require("./function/common"); 10 | let $ = new common.env('京喜工厂开团助力'); 11 | let min = 3, 12 | help = $.config[$.filename(__filename)] || Math.min(min, $.config.JdMain) || min; 13 | $.setOptions({ 14 | headers: { 15 | 'content-type': 'application/json', 16 | 'user-agent': 'jdpingou;iPhone;4.8.2;13.7;a3b4e844090b28d5c38e7529af8115172079be4d;network/wifi;model/iPhone8,1;appBuild/100546;ADID/00000000-0000-0000-0000-000000000000;supportApplePay/1;hasUPPay/0;pushNoticeIsOpen/0;hasOCPay/0;supportBestPay/0;session/374;pap/JA2019_3111789;brand/apple;supportJDSHWK/1;Mozilla/5.0 (iPhone; CPU iPhone OS 13_7 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148', 17 | 'referer': 'https://st.jingxi.com/pingou/dream_factory/divide.html?activeId=laD7IwPwDF1-Te-MvbW9Iw==&_close=1&jxsid=16232028831911667857', 18 | } 19 | }); 20 | $.readme = ` 21 | 44 */6 * * * task ${$.runfile} 22 | exprot ${$.runfile}=4 #如需增加被助力账号,在这边修改人数 23 | ` 24 | eval(common.eval.mainEval($)); 25 | async function prepare() { 26 | let deramUrl = 'https://st.jingxi.com/pingou/dream_factory/index.html?ptag=7155.9.46' 27 | let html = await $.curl(deramUrl) 28 | try { 29 | ary = $.matchall(/activeId=([^\&\,]+)","bgImg".+?"start":"([^\"]+)"/g, html) 30 | dicts = {} 31 | for (let i of ary) { 32 | dicts[new Date(i[1]).getTime()] = i[0] 33 | } 34 | max = Math.max(...Object.keys(dicts).filter(d => parseInt(d) < $.timestamp)) 35 | $.activeId = dicts[max] 36 | } catch (e) { 37 | $.activeId = 'MaiSqG4Q1P3lVFK0Hud3NA==' 38 | } 39 | console.log("开团ID:", $.activeId) 40 | let url = `https://m.jingxi.com/dreamfactory/tuan/QueryActiveConfig?activeId=${$.activeId}&tuanId=&_time=1623214804148&_stk=_time%2CactiveId%2CtuanId&_ste=1&sceneval=2&g_login_type=1&callback=jsonpCBKA&g_ty=ls` 41 | let dec = await jxAlgo.dec(url) 42 | for (let j of cookies['help']) { 43 | $.setCookie(j); 44 | await $.curl(dec.url) 45 | try { 46 | if ($.source.data.userTuanInfo.tuanId) { 47 | $.sharecode.push($.compact($.source.data.userTuanInfo, ['activeId', 'tuanId'])) 48 | } else {} 49 | } catch (e) {} 50 | } 51 | } 52 | async function main(id) { 53 | common.assert(id.activeId, '没有开团ID') 54 | let url = `https://m.jingxi.com/dreamfactory/tuan/JoinTuan?activeId=${id.activeId}&tuanId=${id.tuanId}&_time=1623214617107&_stk=_time%2CactiveId%2CtuanId&_ste=1&sceneval=2&g_login_type=1&g_ty=ls` 55 | let dec = await jxAlgo.dec(url) 56 | let params = { 57 | 'url': dec.url, 58 | 'cookie': id.cookie 59 | } 60 | await $.curl(params) 61 | console.log($.source) 62 | } 63 | async function extra() { 64 | for (let j of cookies['help']) { 65 | $.setCookie(j); 66 | let url = `https://m.jingxi.com/dreamfactory/tuan/QueryActiveConfig?activeId=${$.activeId}&tuanId=&_time=1623214804148&_stk=_time%2CactiveId%2CtuanId&_ste=1&sceneval=2&g_login_type=1&callback=jsonpCBKA&g_ty=ls` 67 | let dec = await jxAlgo.dec(url) 68 | await $.curl(dec.url) 69 | url = `https://m.jingxi.com/dreamfactory/tuan/Award?activeId=${$.source.data.userTuanInfo.activeId}&tuanId=${$.source.data.userTuanInfo.tuanId}&_time=1623518911051&_stk=_time%2CactiveId%2CtuanId&_ste=1&_=1623518911082&sceneval=2&g_login_type=1&callback=jsonpCBKF&g_ty=ls` 70 | dec = await jxAlgo.dec(url) 71 | await $.curl(dec.url) 72 | console.log($.source) 73 | if ($.source.msg != '您还没有成团') { 74 | url = `https://m.jingxi.com/dreamfactory/tuan/CreateTuan?activeId=${$.activeId}&isOpenApp=1&_time=1624120758151&_stk=_time%2CactiveId%2CisOpenApp&_ste=1` 75 | dec = await jxAlgo.dec(url) 76 | await $.curl(dec.url) 77 | console.log($.source) 78 | } 79 | } 80 | } 81 | -------------------------------------------------------------------------------- /jdCookie.js: -------------------------------------------------------------------------------- 1 | /* 2 | ================================================================================ 3 | 魔改自 https://github.com/shufflewzc/faker2/blob/main/jdCookie.js 4 | 修改内容:与task_before.sh配合,由task_before.sh设置要设置要做互助的活动的 ShareCodeConfigName 和 ShareCodeEnvName 环境变量, 5 | 然后在这里实际解析/ql/log/.ShareCode中该活动对应的配置信息(由code.sh生成和维护),注入到nodejs的环境变量中 6 | 修改原因:原先的task_before.sh直接将互助信息注入到shell的env中,在ck超过45以上时,互助码环境变量过大会导致调用一些系统命令 7 | (如date/cat)时报 Argument list too long,而在node中修改环境变量不会受这个限制,也不会影响外部shell环境,确保脚本可以正常运行 8 | 魔改作者:风之凌殇 9 | ================================================================================ 10 | 11 | 此文件为Node.js专用。其他用户请忽略 12 | */ 13 | //此处填写京东账号cookie。 14 | let CookieJDs = [ 15 | ] 16 | // 判断环境变量里面是否有京东ck 17 | if (process.env.JD_COOKIE) { 18 | if (process.env.JD_COOKIE.indexOf('&') > -1) { 19 | CookieJDs = process.env.JD_COOKIE.split('&'); 20 | } else if (process.env.JD_COOKIE.indexOf('\n') > -1) { 21 | CookieJDs = process.env.JD_COOKIE.split('\n'); 22 | } else { 23 | CookieJDs = [process.env.JD_COOKIE]; 24 | } 25 | } 26 | if (JSON.stringify(process.env).indexOf('GITHUB')>-1) { 27 | console.log(`请勿使用github action运行此脚本,无论你是从你自己的私库还是其他哪里拉取的源代码,都会导致我被封号\n`); 28 | !(async () => { 29 | await require('./sendNotify').sendNotify('提醒', `请勿使用github action、滥用github资源会封我仓库以及账号`) 30 | await process.exit(0); 31 | })() 32 | } 33 | CookieJDs = [...new Set(CookieJDs.filter(item => !!item))] 34 | console.log(`\n====================共${CookieJDs.length}个京东账号Cookie=========\n`); 35 | console.log(`==================脚本执行- 北京时间(UTC+8):${new Date(new Date().getTime() + new Date().getTimezoneOffset()*60*1000 + 8*60*60*1000).toLocaleString('zh', {hour12: false}).replace(' 24:',' 00:')}=====================\n`) 36 | if (process.env.JD_DEBUG && process.env.JD_DEBUG === 'false') console.log = () => {}; 37 | for (let i = 0; i < CookieJDs.length; i++) { 38 | if (!CookieJDs[i].match(/pt_pin=(.+?);/) || !CookieJDs[i].match(/pt_key=(.+?);/)) console.log(`\n提示:京东cookie 【${CookieJDs[i]}】填写不规范,可能会影响部分脚本正常使用。正确格式为: pt_key=xxx;pt_pin=xxx;(分号;不可少)\n`); 39 | const index = (i + 1 === 1) ? '' : (i + 1); 40 | exports['CookieJD' + index] = CookieJDs[i].trim(); 41 | } 42 | 43 | // 以下为注入互助码环境变量(仅nodejs内起效)的代码 44 | function SetShareCodesEnv(nameChinese = "", nameConfig = "", envName = "") { 45 | let rawCodeConfig = {} 46 | 47 | // 读取互助码 48 | shareCodeLogPath = `${process.env.QL_DIR}/log/.ShareCode/${nameConfig}.log` 49 | let fs = require('fs') 50 | if (fs.existsSync(shareCodeLogPath)) { 51 | // 因为faker2目前没有自带ini,改用已有的dotenv来解析 52 | // // 利用ini模块读取原始互助码和互助组信息 53 | // let ini = require('ini') 54 | // rawCodeConfig = ini.parse(fs.readFileSync(shareCodeLogPath, 'utf-8')) 55 | 56 | // 使用env模块 57 | require('dotenv').config({path: shareCodeLogPath}) 58 | rawCodeConfig = process.env 59 | } 60 | 61 | // 解析每个用户的互助码 62 | codes = {} 63 | Object.keys(rawCodeConfig).forEach(function (key) { 64 | if (key.startsWith(`My${nameConfig}`)) { 65 | codes[key] = rawCodeConfig[key] 66 | } 67 | }); 68 | 69 | // 解析每个用户要帮助的互助码组,将用户实际的互助码填充进去 70 | let helpOtherCodes = {} 71 | Object.keys(rawCodeConfig).forEach(function (key) { 72 | if (key.startsWith(`ForOther${nameConfig}`)) { 73 | helpCode = rawCodeConfig[key] 74 | for (const [codeEnv, codeVal] of Object.entries(codes)) { 75 | helpCode = helpCode.replace("${" + codeEnv + "}", codeVal) 76 | } 77 | 78 | helpOtherCodes[key] = helpCode 79 | } 80 | }); 81 | 82 | // 按顺序用&拼凑到一起,并放入环境变量,供目标脚本使用 83 | let shareCodes = [] 84 | let totalCodeCount = Object.keys(helpOtherCodes).length 85 | for (let idx = 1; idx <= totalCodeCount; idx++) { 86 | shareCodes.push(helpOtherCodes[`ForOther${nameConfig}${idx}`]) 87 | } 88 | let shareCodesStr = shareCodes.join('&') 89 | process.env[envName] = shareCodesStr 90 | 91 | console.info(`${nameChinese} 的 互助码环境变量 ${envName},共计 ${totalCodeCount} 组互助码,总大小为 ${shareCodesStr.length} 字节`) 92 | } 93 | 94 | // 若在task_before.sh 中设置了要设置互助码环境变量的活动名称和环境变量名称信息,则在nodejs中处理,供活动使用 95 | let nameChinese = process.env.ShareCodeConfigChineseName 96 | let nameConfig = process.env.ShareCodeConfigName 97 | let envName = process.env.ShareCodeEnvName 98 | if (nameChinese && nameConfig && envName) { 99 | SetShareCodesEnv(nameChinese, nameConfig, envName) 100 | } 101 | -------------------------------------------------------------------------------- /ql.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | const got = require('got'); 4 | require('dotenv').config(); 5 | const { readFile } = require('fs/promises'); 6 | const path = require('path'); 7 | 8 | const qlDir = '/ql'; 9 | const authFile = path.join(qlDir, 'config/auth.json'); 10 | 11 | const api = got.extend({ 12 | prefixUrl: 'http://127.0.0.1:5600', 13 | retry: { limit: 0 }, 14 | }); 15 | 16 | async function getToken() { 17 | const authConfig = JSON.parse(await readFile(authFile)); 18 | return authConfig.token; 19 | } 20 | 21 | module.exports.getEnvs = async () => { 22 | const token = await getToken(); 23 | const body = await api({ 24 | url: 'api/envs', 25 | searchParams: { 26 | searchValue: 'JD_COOKIE', 27 | t: Date.now(), 28 | }, 29 | headers: { 30 | Accept: 'application/json', 31 | authorization: `Bearer ${token}`, 32 | }, 33 | }).json(); 34 | return body.data; 35 | }; 36 | 37 | module.exports.getEnvsCount = async () => { 38 | const data = await this.getEnvs(); 39 | return data.length; 40 | }; 41 | 42 | module.exports.addEnv = async (cookie, remarks) => { 43 | const token = await getToken(); 44 | const body = await api({ 45 | method: 'post', 46 | url: 'api/envs', 47 | params: { t: Date.now() }, 48 | json: [{ 49 | name: 'JD_COOKIE', 50 | value: cookie, 51 | remarks, 52 | }], 53 | headers: { 54 | Accept: 'application/json', 55 | authorization: `Bearer ${token}`, 56 | 'Content-Type': 'application/json;charset=UTF-8', 57 | }, 58 | }).json(); 59 | return body; 60 | }; 61 | 62 | module.exports.updateEnv = async (cookie, eid, remarks) => { 63 | const token = await getToken(); 64 | const body = await api({ 65 | method: 'put', 66 | url: 'api/envs', 67 | params: { t: Date.now() }, 68 | json: { 69 | name: 'JD_COOKIE', 70 | value: cookie, 71 | _id: eid, 72 | remarks, 73 | }, 74 | headers: { 75 | Accept: 'application/json', 76 | authorization: `Bearer ${token}`, 77 | 'Content-Type': 'application/json;charset=UTF-8', 78 | }, 79 | }).json(); 80 | return body; 81 | }; 82 | 83 | module.exports.DisableCk = async (eid) => { 84 | const token = await getToken(); 85 | const body = await api({ 86 | method: 'put', 87 | url: 'api/envs/disable', 88 | params: { t: Date.now() }, 89 | body: JSON.stringify([eid]), 90 | headers: { 91 | Accept: 'application/json', 92 | authorization: `Bearer ${token}`, 93 | 'Content-Type': 'application/json;charset=UTF-8', 94 | }, 95 | }).json(); 96 | return body; 97 | }; 98 | 99 | module.exports.EnableCk = async (eid) => { 100 | const token = await getToken(); 101 | const body = await api({ 102 | method: 'put', 103 | url: 'api/envs/enable', 104 | params: { t: Date.now() }, 105 | body: JSON.stringify([eid]), 106 | headers: { 107 | Accept: 'application/json', 108 | authorization: `Bearer ${token}`, 109 | 'Content-Type': 'application/json;charset=UTF-8', 110 | }, 111 | }).json(); 112 | return body; 113 | }; 114 | 115 | module.exports.getstatus = async (eid) => { 116 | const envs = await this.getEnvs(); 117 | for (let i = 0; i < envs.length; i++) { 118 | if(envs[i]._id==eid){ 119 | return envs[i].status; 120 | } 121 | } 122 | return 99; 123 | }; 124 | 125 | module.exports.getEnvById = async (eid) => { 126 | const envs = await this.getEnvs(); 127 | for (let i = 0; i < envs.length; i++) { 128 | if(envs[i]._id==eid){ 129 | return envs[i].value; 130 | } 131 | } 132 | return ""; 133 | }; 134 | 135 | module.exports.getEnvByPtPin = async (Ptpin) => { 136 | const envs = await this.getEnvs(); 137 | for (let i = 0; i < envs.length; i++) { 138 | var tempptpin = decodeURIComponent(envs[i].value.match(/pt_pin=([^; ]+)(?=;?)/) && envs[i].value.match(/pt_pin=([^; ]+)(?=;?)/)[1]); 139 | if(tempptpin==Ptpin){ 140 | return envs[i]; 141 | } 142 | } 143 | return ""; 144 | }; 145 | 146 | module.exports.delEnv = async (eid) => { 147 | const token = await getToken(); 148 | const body = await api({ 149 | method: 'delete', 150 | url: 'api/envs', 151 | params: { t: Date.now() }, 152 | body: JSON.stringify([eid]), 153 | headers: { 154 | Accept: 'application/json', 155 | authorization: `Bearer ${token}`, 156 | 'Content-Type': 'application/json;charset=UTF-8', 157 | }, 158 | }).json(); 159 | return body; 160 | }; 161 | -------------------------------------------------------------------------------- /function/ql.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | const got = require('got'); 4 | require('dotenv').config(); 5 | const { readFile } = require('fs/promises'); 6 | const path = require('path'); 7 | 8 | const qlDir = '/ql'; 9 | const authFile = path.join(qlDir, 'config/auth.json'); 10 | 11 | const api = got.extend({ 12 | prefixUrl: 'http://127.0.0.1:5600', 13 | retry: { limit: 0 }, 14 | }); 15 | 16 | async function getToken() { 17 | const authConfig = JSON.parse(await readFile(authFile)); 18 | return authConfig.token; 19 | } 20 | 21 | module.exports.getEnvs = async () => { 22 | const token = await getToken(); 23 | const body = await api({ 24 | url: 'api/envs', 25 | searchParams: { 26 | searchValue: 'JD_COOKIE', 27 | t: Date.now(), 28 | }, 29 | headers: { 30 | Accept: 'application/json', 31 | authorization: `Bearer ${token}`, 32 | }, 33 | }).json(); 34 | return body.data; 35 | }; 36 | 37 | module.exports.getEnvsCount = async () => { 38 | const data = await this.getEnvs(); 39 | return data.length; 40 | }; 41 | 42 | module.exports.addEnv = async (cookie, remarks) => { 43 | const token = await getToken(); 44 | const body = await api({ 45 | method: 'post', 46 | url: 'api/envs', 47 | params: { t: Date.now() }, 48 | json: [{ 49 | name: 'JD_COOKIE', 50 | value: cookie, 51 | remarks, 52 | }], 53 | headers: { 54 | Accept: 'application/json', 55 | authorization: `Bearer ${token}`, 56 | 'Content-Type': 'application/json;charset=UTF-8', 57 | }, 58 | }).json(); 59 | return body; 60 | }; 61 | 62 | module.exports.updateEnv = async (cookie, eid, remarks) => { 63 | const token = await getToken(); 64 | const body = await api({ 65 | method: 'put', 66 | url: 'api/envs', 67 | params: { t: Date.now() }, 68 | json: { 69 | name: 'JD_COOKIE', 70 | value: cookie, 71 | _id: eid, 72 | remarks, 73 | }, 74 | headers: { 75 | Accept: 'application/json', 76 | authorization: `Bearer ${token}`, 77 | 'Content-Type': 'application/json;charset=UTF-8', 78 | }, 79 | }).json(); 80 | return body; 81 | }; 82 | 83 | module.exports.DisableCk = async (eid) => { 84 | const token = await getToken(); 85 | const body = await api({ 86 | method: 'put', 87 | url: 'api/envs/disable', 88 | params: { t: Date.now() }, 89 | body: JSON.stringify([eid]), 90 | headers: { 91 | Accept: 'application/json', 92 | authorization: `Bearer ${token}`, 93 | 'Content-Type': 'application/json;charset=UTF-8', 94 | }, 95 | }).json(); 96 | return body; 97 | }; 98 | 99 | module.exports.EnableCk = async (eid) => { 100 | const token = await getToken(); 101 | const body = await api({ 102 | method: 'put', 103 | url: 'api/envs/enable', 104 | params: { t: Date.now() }, 105 | body: JSON.stringify([eid]), 106 | headers: { 107 | Accept: 'application/json', 108 | authorization: `Bearer ${token}`, 109 | 'Content-Type': 'application/json;charset=UTF-8', 110 | }, 111 | }).json(); 112 | return body; 113 | }; 114 | 115 | module.exports.getstatus = async (eid) => { 116 | const envs = await this.getEnvs(); 117 | for (let i = 0; i < envs.length; i++) { 118 | if(envs[i]._id==eid){ 119 | return envs[i].status; 120 | } 121 | } 122 | return 99; 123 | }; 124 | 125 | module.exports.getEnvById = async (eid) => { 126 | const envs = await this.getEnvs(); 127 | for (let i = 0; i < envs.length; i++) { 128 | if(envs[i]._id==eid){ 129 | return envs[i].value; 130 | } 131 | } 132 | return ""; 133 | }; 134 | 135 | module.exports.getEnvByPtPin = async (Ptpin) => { 136 | const envs = await this.getEnvs(); 137 | for (let i = 0; i < envs.length; i++) { 138 | var tempptpin = decodeURIComponent(envs[i].value.match(/pt_pin=([^; ]+)(?=;?)/) && envs[i].value.match(/pt_pin=([^; ]+)(?=;?)/)[1]); 139 | if(tempptpin==Ptpin){ 140 | return envs[i]; 141 | } 142 | } 143 | return ""; 144 | }; 145 | 146 | module.exports.delEnv = async (eid) => { 147 | const token = await getToken(); 148 | const body = await api({ 149 | method: 'delete', 150 | url: 'api/envs', 151 | params: { t: Date.now() }, 152 | body: JSON.stringify([eid]), 153 | headers: { 154 | Accept: 'application/json', 155 | authorization: `Bearer ${token}`, 156 | 'Content-Type': 'application/json;charset=UTF-8', 157 | }, 158 | }).json(); 159 | return body; 160 | }; 161 | -------------------------------------------------------------------------------- /utils/MoveMentFaker.js: -------------------------------------------------------------------------------- 1 | const https = require('https'); 2 | const fs = require('fs/promises'); 3 | const { R_OK } = require('fs').constants; 4 | const vm = require('vm'); 5 | const UA = require('../USER_AGENTS.js').USER_AGENT; 6 | 7 | const URL = 'https://wbbny.m.jd.com/babelDiy/Zeus/2rtpffK8wqNyPBH6wyUDuBKoAbCt/index.html'; 8 | // const REG_MODULE = /(\d+)\:function\(.*(?=smashUtils\.get_risk_result)/gm; 9 | const SYNTAX_MODULE = '!function(n){var r={};function o(e){if(r[e])'; 10 | const REG_SCRIPT = /`, options); 179 | await $.wait(1000) 180 | try { 181 | feSt = 's' 182 | jab = new $.dom.window.JAB({ 183 | bizId: 'jdjiabao', 184 | initCaptcha: false 185 | }) 186 | $.token = jab.getToken() 187 | } catch (e) {} 188 | } 189 | -------------------------------------------------------------------------------- /function/jxAlgo.js: -------------------------------------------------------------------------------- 1 | let request = require("request"); 2 | let CryptoJS = require('crypto-js'); 3 | let qs = require("querystring"); 4 | Date.prototype.Format = function(fmt) { 5 | var e, 6 | n = this, 7 | d = fmt, 8 | l = { 9 | "M+": n.getMonth() + 1, 10 | "d+": n.getDate(), 11 | "D+": n.getDate(), 12 | "h+": n.getHours(), 13 | "H+": n.getHours(), 14 | "m+": n.getMinutes(), 15 | "s+": n.getSeconds(), 16 | "w+": n.getDay(), 17 | "q+": Math.floor((n.getMonth() + 3) / 3), 18 | "S+": n.getMilliseconds() 19 | }; 20 | /(y+)/i.test(d) && (d = d.replace(RegExp.$1, "".concat(n.getFullYear()).substr(4 - RegExp.$1.length))); 21 | for (var k in l) { 22 | if (new RegExp("(".concat(k, ")")).test(d)) { 23 | var t, a = "S+" === k ? "000" : "00"; 24 | d = d.replace(RegExp.$1, 1 == RegExp.$1.length ? l[k] : ("".concat(a) + l[k]).substr("".concat(l[k]).length)) 25 | } 26 | } 27 | return d; 28 | } 29 | 30 | function generateFp() { 31 | let e = "0123456789"; 32 | let a = 13; 33 | let i = ''; 34 | for (; a--;) i += e[Math.random() * e.length | 0]; 35 | return (i + Date.now()).slice(0, 16) 36 | } 37 | 38 | function getUrlData(url, name) { 39 | if (typeof URL !== "undefined") { 40 | let urls = new URL(url); 41 | let data = urls.searchParams.get(name); 42 | return data ? data : ''; 43 | } else { 44 | const query = url.match(/\?.*/)[0].substring(1) 45 | const vars = query.split('&') 46 | for (let i = 0; i < vars.length; i++) { 47 | const pair = vars[i].split('=') 48 | if (pair[0] === name) { 49 | return vars[i].substr(vars[i].indexOf('=') + 1); 50 | } 51 | } 52 | return '' 53 | } 54 | } 55 | class jxAlgo { 56 | constructor(params = {}) { 57 | this.appId = 10001 58 | this.result = {} 59 | this.timestamp = Date.now(); 60 | for (let i in params) { 61 | this[i] = params[i] 62 | } 63 | } 64 | set(params = {}) { 65 | for (let i in params) { 66 | this[i] = params[i] 67 | } 68 | } 69 | get(key) { 70 | return this[key] 71 | } 72 | async dec(url) { 73 | if (!this.tk) { 74 | this.fingerprint = generateFp(); 75 | await this.requestAlgo() 76 | } 77 | let obj = qs.parse(url.split("?")[1]); 78 | let stk = obj['_stk']; 79 | return this.h5st(this.timestamp, stk, url) 80 | } 81 | h5st(time, stk, url) { 82 | stk = stk || (url ? getUrlData(url, '_stk') : '') 83 | const timestamp = new Date(time).Format("yyyyMMddhhmmssSSS"); 84 | let hash1 = this.enCryptMethodJD(this.tk, this.fingerprint.toString(), timestamp.toString(), this.appId.toString(), CryptoJS).toString(CryptoJS.enc.Hex); 85 | let st = ''; 86 | stk.split(',').map((item, index) => { 87 | st += `${item}:${getUrlData(url, item)}${index === stk.split(',').length - 1 ? '' : '&'}`; 88 | }) 89 | const hash2 = CryptoJS.HmacSHA256(st, hash1.toString()).toString(CryptoJS.enc.Hex); 90 | const enc = (["".concat(timestamp.toString()), "".concat(this.fingerprint.toString()), "".concat(this.appId.toString()), "".concat(this.tk), "".concat(hash2)].join(";")) 91 | this.result['fingerprint'] = this.fingerprint; 92 | this.result['timestamp'] = this.timestamp 93 | this.result['stk'] = stk; 94 | this.result['h5st'] = enc 95 | let sp = url.split("?"); 96 | let obj = qs.parse(sp[1]) 97 | if (obj.callback) { 98 | delete obj.callback 99 | } 100 | let params = Object.assign(obj, { 101 | '_time': this.timestamp, 102 | '_': this.timestamp, 103 | 'timestamp': this.timestamp, 104 | 'sceneval': 2, 105 | 'g_login_type': 1, 106 | 'h5st': enc, 107 | }) 108 | this.result['url'] = `${sp[0]}?${qs.stringify(params)}` 109 | return this.result 110 | } 111 | token(user) { 112 | let nickname = user.includes('pt_pin') ? user.match(/pt_pin=([^;]+)/)[1] : user; 113 | let phoneId = this.createuuid(40, 'lc'); 114 | 115 | let token = this.md5(decodeURIComponent(nickname) + this.timestamp + phoneId + 'tPOamqCuk9NLgVPAljUyIHcPRmKlVxDy'); 116 | return { 117 | 'strPgtimestamp': this.timestamp, 118 | 'strPhoneID': phoneId, 119 | 'strPgUUNum': token 120 | } 121 | } 122 | md5(encryptString) { 123 | return CryptoJS.MD5(encryptString).toString() 124 | } 125 | createuuid(a, c) { 126 | switch (c) { 127 | case "a": 128 | c = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"; 129 | break; 130 | case "n": 131 | c = "0123456789"; 132 | break; 133 | case "c": 134 | c = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; 135 | break; 136 | case "l": 137 | c = "abcdefghijklmnopqrstuvwxyz"; 138 | break; 139 | case 'cn': 140 | case 'nc': 141 | c = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789' 142 | break; 143 | case "lc": 144 | case "cl": 145 | c = "abcdefghijklmnopqrstuvwxyz0123456789"; 146 | break; 147 | default: 148 | c = "0123456789abcdef" 149 | } 150 | var e = ""; 151 | for (var g = 0; g < a; g++) e += c[Math.ceil(1E8 * Math.random()) % c.length]; 152 | return e 153 | } 154 | async requestAlgo() { 155 | const options = { 156 | "url": `https://cactus.jd.com/request_algo?g_ty=ajax`, 157 | "headers": { 158 | 'Authority': 'cactus.jd.com', 159 | 'Pragma': 'no-cache', 160 | 'Cache-Control': 'no-cache', 161 | 'Accept': 'application/json', 162 | 'User-Agent': 'jdpingou;iPhone;4.9.4;12.4;ae49fae72d0a8976f5155267f56ec3a5b0da75c3;network/wifi;model/iPhone8,4;appBuild/100579;ADID/00000000-0000-0000-0000-000000000000;supportApplePay/1;hasUPPay/0;pushNoticeIsOpen/0;hasOCPay/0;supportBestPay/0;session/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', 163 | 'Content-Type': 'application/json', 164 | 'Origin': 'https://st.jingxi.com', 165 | 'Sec-Fetch-Site': 'cross-site', 166 | 'Sec-Fetch-Mode': 'cors', 167 | 'Sec-Fetch-Dest': 'empty', 168 | 'Referer': 'https://st.jingxi.com/pingou/dream_factory/index.html?ptag=7155.9.4', 169 | 'Accept-Language': 'zh-CN,zh;q=0.9,zh-TW;q=0.8,en;q=0.7' 170 | }, 171 | 'body': JSON.stringify({ 172 | "version": "1.0", 173 | "fp": this.fingerprint, 174 | "appId": this.appId.toString(), 175 | "timestamp": this.timestamp, 176 | "platform": "web", 177 | "expandParams": "" 178 | }) 179 | } 180 | return new Promise(async resolve => { 181 | request.post(options, (err, resp, data) => { 182 | try { 183 | if (data) { 184 | data = JSON.parse(data); 185 | if (data['status'] === 200) { 186 | let result = data.data.result 187 | this.tk = result.tk; 188 | let enCryptMethodJDString = result.algo; 189 | if (enCryptMethodJDString) { 190 | this.enCryptMethodJD = new Function(`return ${enCryptMethodJDString}`)(); 191 | } 192 | this.result = result 193 | } 194 | } 195 | } catch (e) { 196 | console.log(e) 197 | } finally { 198 | resolve(this.result); 199 | } 200 | }) 201 | }) 202 | } 203 | } 204 | module.exports = jxAlgo 205 | -------------------------------------------------------------------------------- /backUp/iCloud.md: -------------------------------------------------------------------------------- 1 | ## 1.安装 Node.js 环境 2 | 3 | [下载地址](https://nodejs.org/zh-tw/download/ ) 4 | 5 | 根据自己的操作系统下载 6 | 7 | 傻瓜式安装,一直下一步即可。 8 | 9 | 10 | 11 | ## 2.下载源码 12 | 13 | ![BclSld.png](https://s1.ax1x.com/2020/11/04/BclSld.png) 14 | 15 | 点击红框处下载压缩包 16 | 17 | ## 3.安装依赖、增加入口文件、增加cookie 18 | 19 | 压缩包解压后进入项目文件夹 20 | 21 | - Windows 用户按住 **shift** 点击右键,点击 **在此处打开命令窗口** 22 | - Mac 用户通过终端,自行进入该文件夹 23 | 24 | 在命令行内输入 `npm i `,等待运行完成。 25 | 26 | 此时,项目文件夹内会多出一个 `node_modules`文件夹 27 | 28 | **增加入口文件** 29 | 30 | 方案一:同一个仓库下同一个时间,执行多个脚本 31 | 32 | 在项目文件夹内新建 `index.js` 33 | 34 | 编辑文件 35 | 36 | ```javascript 37 | 'use strict'; 38 | exports.main_handler = async (event, context, callback) => { 39 | //解决云函数热启动问题 40 | delete require.cache[require.resolve('./jd_xtg1.js')]; 41 | require('./jd_xtg1.js') //这里写你想要的脚本 42 | require('./jd_xtg2.js') //这里写你想要的脚本 43 | require('./jd_xtg3.js') //这里写你想要的脚本 44 | } 45 | 46 | ``` 47 | 此时,同一时间点下,会同时执行多个脚本,触发器触发后,index.js文件中require()下的所有脚本都会被执行 48 | 49 | **优点**:同一时间下可以同时执行多个脚本,适合脚本种类少的repository,对脚本数量少的repository推荐使用此方案
**缺点**:多个脚本不同时间点运行无法满足 50 | 51 | 方案二:同一个仓库下不同的时间点,分别执行不同的脚本(类似GitHub Action执行机制) 52 | 53 | 在项目文件夹内新建 `index.js` 54 | 55 | 编辑文件 56 | 57 | ```javascript 58 | 'use strict'; 59 | exports.main_handler = async (event, context, callback) => { 60 | for (const v of event["Message"].split("\r\n")) { 61 | //解决云函数热启动问题 62 | delete require.cache[require.resolve(`./${v}.js`)]; 63 | console.log(v); 64 | require(`./${v}.js`) 65 | } 66 | } 67 | 68 | ``` 69 | 70 | 此时触发管理按照下图中进行设置,附加信息选择“是”,内容填写需要传递执行的具体脚本文件名,以回车键换行。触发器触发后,附加信息栏内的脚本会被执行,设置多个不同时间点的触发器达到类似GitHub Action的效果 71 | 72 | **优点**:可以满足个性化需求,同一个repository下只需要设置不同的触发器,可以实现不同时间点分别执行不同的脚本
**缺点**:repository下脚本过多,如果需要设置多个触发器,实现个性化运行效果,由于云函数的限制,最多只能设置10个 73 | 74 | [![B20KxI.png](https://s1.ax1x.com/2020/11/05/B20KxI.png)](https://imgchr.com/i/B20KxI) 75 | [![BRCG0H.png](https://s1.ax1x.com/2020/11/05/BRCG0H.png)](https://imgchr.com/i/BRCG0H) 76 | 77 | **注意:**
78 | Ⅰ方案一与方案二不能混合到同一个index.js文件中使用,同一个仓库下,二者只能选择其一。
79 | Ⅱ感谢[issues#115](https://github.com/LXK9301/jd_scripts/issues/115)中的解决方案,目前云函数连续测试已经可以规避热启动问题了。
80 | Ⅲ在确保完全按照本教程设置的情况下测试云函数运行情况,对于部分人运行日志中出现某些脚本运行失败其他正常,并且错误提示带有strict字样的,请自行删除index.js中的```'use strict';```,再做测试
81 | 82 | **增加cookie** 83 | 84 | 打开项目文件内的 `jdCookie.js` 85 | 86 | 在最上面的 `CookieJDs`里写入 cookie ,多个账号以逗号分隔 87 | 88 | 例如 89 | 90 | ```javascript 91 | let CookieJDs = [ 92 | 'pt_key=xxx;pt_pin=xxx;', 93 | 'pt_key=zzz;pt_pin=zzz;', 94 | 'pt_key=aaa;pt_pin=xxxaaa' 95 | ] 96 | ``` 97 | 98 | 99 | 100 | ## 4.上传至腾讯云 101 | 102 | [腾讯云函数地址]( https://console.cloud.tencent.com/scf/index ) 103 | 104 | 编写函数 105 | 106 | 登录后,点击管理控制台 107 | 108 | 单击左侧导航栏**函数服务**,进入“函数服务”页面。 109 | 在页面上方选择一个地域,最好选择离你常用地区近点的,不至于导致账号异常。单击**新建**。如下图所示: 110 | 111 | ![iCloud1](../icon/iCloud1.png) 112 | 113 | 在“新建函数”页面填写函数基础信息,单击**下一步**。如下图所示: 114 | 115 | ![iCloud2](../icon/iCloud2.png) 116 | 117 | **函数名称**:可以自定义,比如为jd。
**运行环境**:选择 “Nodejs 12.16”。
**创建方式**:选择 “空白函数”。 118 | 119 | 确保环境为Nodejs 12.16,执行方法改为:index.main_handler,提交方式建议选本地文件夹,然后从GitHub项目克隆Zip压缩包,解压成文件夹,然后点击这个上传把文件夹上传进来(记得node_modules文件夹一并上传或者将node_modules文件夹上传到“层”,之后选择“函数管理”-“层管理”绑定上传好的层),完了后点击下面的高级设置。 120 | 121 | ![iCloud3](../icon/iCloud3.png) 122 | 123 | 内存用不了太大,64MB就够了(64M内存,免费时长6,400,000秒,内存与免费时长大致关系可以参看云函数官方说明),超时时间改为最大的900秒,然后点击最下面的完成。 124 | 125 | ![iCloud4](../icon/iCloud4.png) 126 | 127 | 默认设置下,云函数运行时长最长900s,可以通过设置突破900s限制,**此方法仅适用于新建函数名时设置,已建的无法更改,需要删除后重建**。
128 | 129 | 新建函数,选择**高级配置**,**执行配置**,启用**异步执行**,之后在**环境配置**下**执行超时时间**,最大可以选择**86400秒**的执行时间。
130 | 131 | ![iCloud7](../icon/iCloud7.png) 132 | 133 | ![iCloud8](../icon/iCloud7.png) 134 | 135 | ## 5.设置触发器 136 | 137 | 点击刚创建的函数 138 | 139 | ![BcGa8O.png](https://s1.ax1x.com/2020/11/04/BcGa8O.png) 140 | 141 | 点击如图所示 142 | 143 | ![BcGvM4.png](https://s1.ax1x.com/2020/11/04/BcGvM4.png) 144 | 145 | 创建触发器 146 | 147 | ![iCloud6](../icon/iCloud6.png) 148 | 149 | 触发方式默认“**定时触发**”,定时任务名称随便起个名字,触发周期根据自己需要自行设置。 150 | 151 | 想进阶使用触发器的自行查看本文中方案一和方案二中的说明 152 | 153 | 关于触发周期中的自定义触发周期,使用的是 Cron表达式,这个自行学习下吧 154 | 155 | 156 | [Corn文档](https://cloud.tencent.com/document/product/583/9708#cron-.E8.A1.A8.E8.BE.BE.E5.BC.8F) 157 | 158 | 目前repo中按照每个脚本一个定时器的方式设置到云函数中,大约需要触发器10多个,由于云函数触发器限制最多10个,需要对触发器进行整合,整合后触发器保持在10个以内,以下设置仅供参考
159 | 160 | | JavaScript | 脚本名称 | 活动时间 | serverless.yml | 161 | | :------------------: | :-----------------------: | :------: | :---------------: | 162 | | `getJDCookie` | 扫码获取京东Cookie | 长期 | / | 163 | | `jd_bean_change` | 京豆变动通知 | 长期 | 30 7 * * * | 164 | | `jd_bean_home` | 领京豆额外奖励 | 长期 | 30 7 * * * | 165 | | `jd_bean_sign` | 京豆签到 | 长期 | 0 0 * * * | 166 | | `jd_beauty` | 美丽研究院 | 长期 | 0 0-16/8,20 * * * | 167 | | `jd_blueCoin` | 京小超兑换奖品 | 长期 | 0 0 * * * | 168 | | `jd_bookshop` | 口袋书店 | 长期 | 5 6-18/6,8 * * * | 169 | | `jd_car` | 京东汽车 | 长期 | 10 0 * * * | 170 | | `jd_car_exchange` | 京东汽车兑换 | 长期 | 0 0 * * * | 171 | | `jd_cash` | 签到领现金 | 长期 | 0 0-16/8,20 * * * | 172 | | `jd_cfd` | 京喜财富岛 | 长期 | 0 0-16/8,20 * * * | 173 | | `jd_club_lottery` | 摇京豆 | 长期 | 0 0 * * * | 174 | | `jd_crazy_joy` | 疯狂的joy | 长期 | 30 7 * * * | 175 | | `jd_crazy_joy_bonus` | 监控crazyJoy分红 | 长期 | 30 7 * * * | 176 | | `jd_crazy_joy_coin` | 疯狂的joy挂机 | 长期 | / | 177 | | `jd_daily_egg` | 京东金融-天天提额 | 长期 | 8 */3 * * * | 178 | | `jd_delCoupon` | 删除优惠券 | 长期 | / | 179 | | `jd_dreamFactory` | 京喜工厂 | 长期 | 3 */1 * * * | 180 | | `jd_family` | 京东家庭号 | 长期 | 5 6-18/6,8 * * * | 181 | | `jd_fruit` | 东东农场 | 长期 | 5 6-18/6,8 * * * | 182 | | `jd_get_share_code` | 获取互助码 | 长期 | / | 183 | | `jd_jdfactory` | 东东工厂 | 长期 | 3 */1 * * * | 184 | | `jd_jdzz` | 京东赚赚 | 长期 | 3 1 * * * | 185 | | `jd_joy` | 宠汪汪 | 长期 | 3 */1 * * * | 186 | | `jd_joy_feedPets` | 宠汪汪单独喂食 | 长期 | 3 */1 * * * | 187 | | `jd_joy_help` | 宠汪汪强制为别人助力 | 长期 | / | 188 | | `jd_joy_reward` | 宠汪汪兑换奖品 | 长期 | 0 0-16/8,20 * * * | 189 | | `jd_joy_run` | 宠汪汪邀请助力与赛跑助力 | 长期 | / | 190 | | `jd_jxd` | 京小兑 | 长期 | 30 7 * * * | 191 | | `jd_jxnc` | 京喜农场 | 长期 | 5 6-18/6,8 * * * | 192 | | `jd_kd` | 京东快递 | 长期 | 3 1 * * * | 193 | | `jd_live` | 京东直播18豆 | 长期 | 0 0-16/8,20 * * * | 194 | | `jd_live_redrain` | 超级直播间红包雨 | 长期 | / | 195 | | `jd_lotteryMachine` | 京东抽奖机 | 长期 | 10 0 * * * | 196 | | `jd_moneyTree` | 摇钱树 | 长期 | 3 */1 * * * | 197 | | `jd_ms` | 京东秒秒币 | 长期 | 10 0 * * * | 198 | | `jd_necklace` | 点点券 | 长期 | 0 0-16/8,20 * * * | 199 | | `jd_pet` | 东东萌宠 | 长期 | 5 6-18/6,8 * * * | 200 | | `jd_pigPet` | 京东金融-养猪猪 | 长期 | 3 1 * * * | 201 | | `jd_plantBean` | 种豆得豆 | 长期 | 3 */1 * * * | 202 | | `jd_price` | 京东保价 | 长期 | 30 7 * * * | 203 | | `jd_rankingList` | 京东排行榜 | 长期 | 30 7 * * * | 204 | | `jd_redPacket` | 全民开红包 | 长期 | 10 0 * * * | 205 | | `jd_sgmh` | 闪购盲盒 | 长期 | 30 7 * * * | 206 | | `jd_shop` | 进店领豆 | 长期 | 10 0 * * * | 207 | | `jd_small_home` | 东东小窝 | 长期 | 0 0-16/8,20 * * * | 208 | | `jd_speed` | 天天加速 | 长期 | 8 */3 * * * | 209 | | `jd_speed_sign` | 京东极速版签到+赚现金任务 | 长期 | 5 6-18/6,8 * * * | 210 | | `jd_superMarket` | 东东超市 | 长期 | 15 */6 * * * | 211 | | `jd_syj` | 十元街 | 长期 | 3 1 * * * | 212 | | `jd_unsubscribe` | 取关京东店铺和商品 | 长期 | 10 0 * * * | 213 | | `jx_sign` | 京喜签到 | 长期 | 3 1 * * * | 214 | 215 | 点击提交,所有流程就结束了。 216 | -------------------------------------------------------------------------------- /jd_zqfl.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python3 2 | # -*- coding: utf-8 -* 3 | """ 4 | 领京豆-早起福利,每天8点前访问领取额外京豆奖励 5 | 2021-07-05 修改增加错误重试 6 | """ 7 | 8 | cookies = '' 9 | 10 | # 建议调整一下的参数 11 | # UA 可自定义你的,注意格式 12 | UserAgent = 'jdappiPhone10.0.413.7ca6eb91a888be488f194b9d9216cf711dd1b221anetwork/wifiADID/8679C062-A41A-4A25-88F1-50A7A3EEF34Amodel/iPhone8,1addressid/3723896896appBuild/167707jdSupportDarkMode/0Mozilla/5.0 (iPhone CPU iPhone OS 13_7 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148supportJDSHWK/1' 13 | 14 | import os, re 15 | try: 16 | import requests 17 | except Exception as e: 18 | print(e, "\n缺少requests 模块,请执行命令安装:python3 -m pip install requests") 19 | exit(3) 20 | from urllib.parse import unquote 21 | import json 22 | import time 23 | 24 | requests.packages.urllib3.disable_warnings() 25 | 26 | ss = requests.session() 27 | 28 | pwd = os.path.dirname(os.path.abspath(__file__)) + os.sep 29 | t = time.time() 30 | 31 | 32 | class getJDCookie(object): 33 | # 适配各种平台环境ck 34 | def getckfile(self): 35 | if os.path.exists(pwd + 'JDCookies.txt'): 36 | return pwd + 'JDCookies.txt' 37 | elif os.path.exists('/ql/config/env.sh'): 38 | print("当前环境青龙面板新版") 39 | return '/ql/config/env.sh' 40 | elif os.path.exists('/ql/config/cookie.sh'): 41 | print("当前环境青龙面板旧版") 42 | return '/ql/config/env.sh' 43 | elif os.path.exists('/jd/config/config.sh'): 44 | print("当前环境V4") 45 | return '/jd/config/config.sh' 46 | elif os.path.exists(pwd + 'JDCookies.txt'): 47 | return pwd + 'JDCookies.txt' 48 | return pwd + 'JDCookies.txt' 49 | 50 | # 获取cookie 51 | def getCookie(self): 52 | global cookies 53 | ckfile = self.getckfile() 54 | try: 55 | if os.path.exists(ckfile): 56 | with open(ckfile, "r", encoding="utf-8") as f: 57 | cks = f.read() 58 | f.close() 59 | if 'pt_key=' in cks and 'pt_pin=' in cks: 60 | r = re.compile(r"pt_key=.*?pt_pin=.*?;", re.M | re.S | re.I) 61 | cks = r.findall(cks) 62 | if len(cks) > 0: 63 | if 'JDCookies.txt' in ckfile: 64 | print("当前获取使用 JDCookies.txt 的cookie") 65 | cookies = '' 66 | for i in cks: 67 | cookies += i 68 | return 69 | else: 70 | with open(pwd + 'JDCookies.txt', "w", encoding="utf-8") as f: 71 | cks = "#多账号换行,以下示例:(通过正则获取此文件的ck,理论上可以自定义名字标记ck,也可以随意摆放ck)\n账号1【Curtinlv】cookie1;\n账号2【TopStyle】cookie2;" 72 | f.write(cks) 73 | f.close() 74 | if "JD_COOKIE" in os.environ: 75 | if len(os.environ["JD_COOKIE"]) > 10: 76 | cookies = os.environ["JD_COOKIE"] 77 | print("已获取并使用Env环境 Cookie") 78 | except Exception as e: 79 | print(f"【getCookie Error】{e}") 80 | 81 | # 检测cookie格式是否正确 82 | def getUserInfo(self, ck, pinName, userNum): 83 | url = 'https://me-api.jd.com/user_new/info/GetJDUserInfoUnion?orgFlag=JD_PinGou_New&callSource=mainorder&channel=4&isHomewhite=0&sceneval=2&sceneval=2&callback=GetJDUserInfoUnion' 84 | headers = { 85 | 'Cookie': ck, 86 | 'Accept': '*/*', 87 | 'Connection': 'close', 88 | 'Referer': 'https://home.m.jd.com/myJd/home.action', 89 | 'Accept-Encoding': 'gzip, deflate, br', 90 | 'Host': 'me-api.jd.com', 91 | 'User-Agent': 'Mozilla/5.0 (iPhone; CPU iPhone OS 14_3 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/14.0.2 Mobile/15E148 Safari/604.1', 92 | 'Accept-Language': 'zh-cn' 93 | } 94 | try: 95 | resp = requests.get(url=url, verify=False, headers=headers, timeout=60).text 96 | r = re.compile(r'GetJDUserInfoUnion.*?\((.*?)\)') 97 | result = r.findall(resp) 98 | userInfo = json.loads(result[0]) 99 | nickname = userInfo['data']['userInfo']['baseInfo']['nickname'] 100 | return ck, nickname 101 | except Exception: 102 | context = f"账号{userNum}【{pinName}】Cookie 已失效!请重新获取。" 103 | print(context) 104 | return ck, False 105 | 106 | def iscookie(self): 107 | """ 108 | :return: cookiesList,userNameList,pinNameList 109 | """ 110 | cookiesList = [] 111 | userNameList = [] 112 | pinNameList = [] 113 | if 'pt_key=' in cookies and 'pt_pin=' in cookies: 114 | r = re.compile(r"pt_key=.*?pt_pin=.*?;", re.M | re.S | re.I) 115 | result = r.findall(cookies) 116 | if len(result) >= 1: 117 | print("您已配置{}个账号".format(len(result))) 118 | u = 1 119 | for i in result: 120 | r = re.compile(r"pt_pin=(.*?);") 121 | pinName = r.findall(i) 122 | pinName = unquote(pinName[0]) 123 | # 获取账号名 124 | ck, nickname = self.getUserInfo(i, pinName, u) 125 | if nickname != False: 126 | cookiesList.append(ck) 127 | userNameList.append(nickname) 128 | pinNameList.append(pinName) 129 | else: 130 | u += 1 131 | continue 132 | u += 1 133 | if len(cookiesList) > 0 and len(userNameList) > 0: 134 | return cookiesList, userNameList, pinNameList 135 | else: 136 | print("没有可用Cookie,已退出") 137 | exit(3) 138 | else: 139 | print("cookie 格式错误!...本次操作已退出") 140 | exit(4) 141 | else: 142 | print("cookie 格式错误!...本次操作已退出") 143 | exit(4) 144 | 145 | 146 | getCk = getJDCookie() 147 | getCk.getCookie() 148 | 149 | 150 | def start(): 151 | print("### 领京豆-早起福利 ###") 152 | global cookiesList, userNameList, pinNameList 153 | cookiesList, userNameList, pinNameList = getCk.iscookie() 154 | for ck in cookiesList: 155 | url = 'https://api.m.jd.com/client.action?functionId=morningGetBean&area=22_1930_50948_52157&body=%7B%22rnVersion%22%3A%224.7%22%2C%22fp%22%3A%22-1%22%2C%22eid%22%3A%22%22%2C%22shshshfp%22%3A%22-1%22%2C%22userAgent%22%3A%22-1%22%2C%22shshshfpa%22%3A%22-1%22%2C%22referUrl%22%3A%22-1%22%2C%22jda%22%3A%22-1%22%7D&build=167724&client=apple&clientVersion=10.0.6&d_brand=apple&d_model=iPhone12%2C8&eid=eidI1aaf8122bas5nupxDQcTRriWjt7Slv2RSJ7qcn6zrB99mPt31yO9nye2dnwJ/OW%2BUUpYt6I0VSTk7xGpxEHp6sM62VYWXroGATSgQLrUZ4QHLjQw&isBackground=N&joycious=60&lang=zh_CN&networkType=wifi&networklibtype=JDNetworkBaseAF&openudid=32280b23f8a48084816d8a6c577c6573c162c174&osVersion=14.4&partner=apple&rfs=0000&scope=01&screen=750%2A1334&sign=0c19e5962cea97520c1ef9a2e67dda60&st=1625354180413&sv=112&uemps=0-0&uts=0f31TVRjBSsqndu4/jgUPz6uymy50MQJSPYvHJMKdY9TUw/AQc1o/DLA/rOTDwEjG4Ar9s7IY4H6IPf3pAz7rkIVtEeW7XkXSOXGvEtHspPvqFlAueK%2B9dfB7ZbI91M9YYXBBk66bejZnH/W/xDy/aPsq2X3k4dUMOkS4j5GHKOGQO3o2U1rhx5O70ZrLaRm7Jy/DxCjm%2BdyfXX8v8rwKw%3D%3D&uuid=hjudwgohxzVu96krv/T6Hg%3D%3D&wifiBssid=c99b216a4acd3bce759e369eaeeafd7' 156 | header = { 157 | 'Cookie': ck, 158 | 'Accept': '*/*', 159 | 'Connection': 'keep-alive', 160 | 'Accept-Encoding': 'gzip, deflate, br', 161 | 'User-Agent': 'jdapp;iPhone;10.0.6;14.1;99c79220e330f7bfeff44d53f29b7e43017dc898;network/wifi;model/iPhone10,1;addressid/138664467;appBuild/167724;jdSupportDarkMode/0;Mozilla/5.0 (iPhone; CPU iPhone OS 14_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148;supportJDSHWK/', 162 | 'Accept-Language': 'zh-Hans-CN;q=1', 163 | 'Host': 'api.m.jd.com' 164 | } 165 | maxTryNum = 20 166 | tries=1 167 | print(f"账号:{userNameList[cookiesList.index(ck)]}") 168 | for tries in range(maxTryNum): 169 | try: 170 | resp = requests.get(url=url, headers=header, verify=False, timeout=30).json() 171 | print(resp['data']['bizMsg']) 172 | if int(resp['data']['awardResultFlag']) == 1: 173 | print(f"获得{resp['data']['beanNum']}京豆") 174 | else: 175 | print("任务失败,可能已过时间或者已经领取过!") 176 | break 177 | except: 178 | if tries < (maxTryNum - 1): 179 | continue 180 | else: 181 | print("重试了20次仍然无法获取返回数据, 任务失败!") 182 | break 183 | 184 | 185 | print("运行结束") 186 | 187 | 188 | if __name__ == '__main__': 189 | start() -------------------------------------------------------------------------------- /function/common.js: -------------------------------------------------------------------------------- 1 | let request = require('request'); 2 | let CryptoJS = require('crypto-js'); 3 | let qs = require('querystring'); 4 | let urls = require('url'); 5 | let path = require('path'); 6 | let notify = require('./sendNotify'); 7 | let mainEval = require("./eval"); 8 | let assert = require('assert'); 9 | let jxAlgo = require("./jxAlgo"); 10 | let config = require("./config"); 11 | let user = {} 12 | try { 13 | user = require("./user") 14 | } catch (e) {} 15 | class env { 16 | constructor(name) { 17 | this.config = { ...config, 18 | ...process.env, 19 | ...user, 20 | }; 21 | this.name = name; 22 | this.message = []; 23 | this.sharecode = []; 24 | this.code = []; 25 | this.timestamp = new Date().getTime(); 26 | this.time = this.start = parseInt(this.timestamp / 1000); 27 | this.options = { 28 | 'headers': {} 29 | }; 30 | console.log(`\n🔔${this.name}, 开始!\n`) 31 | console.log(`=========== 脚本执行-北京时间(UTC+8):${new Date(new Date().getTime() + new Date().getTimezoneOffset()*60*1000 + 8*60*60*1000).toLocaleString()} ===========\n`) 32 | } 33 | done() { 34 | let timestamp = new Date().getTime(); 35 | let work = ((timestamp - this.timestamp) / 1000).toFixed(2) 36 | console.log(`=========================脚本执行完成,耗时${work}s============================\n`) 37 | console.log(`🔔${this.name}, 结束!\n`) 38 | } 39 | notify(array) { 40 | let text = ''; 41 | for (let i of array) { 42 | text += `${i.user} -- ${i.msg}\n` 43 | } 44 | console.log(`\n=============================开始发送提醒消息=============================`) 45 | notify.sendNotify(this.name + "消息提醒", text) 46 | } 47 | wait(t) { 48 | return new Promise(e => setTimeout(e, t)) 49 | } 50 | setOptions(params) { 51 | this.options = params; 52 | } 53 | setCookie(cookie) { 54 | this.options.headers.cookie = cookie 55 | } 56 | jsonParse(str) { 57 | try { 58 | return JSON.parse(str); 59 | } catch (e) { 60 | try { 61 | let data = this.match([/try\s*\{\w+\s*\(([^\)]+)/, /\w+\s*\(([^\)]+)/], str) 62 | return JSON.parse(data); 63 | } catch (ee) { 64 | try { 65 | let cb = this.match(/try\s*\{\s*(\w+)/, str) 66 | if (cb) { 67 | let func = ""; 68 | let data = str.replace(cb, `func=`) 69 | eval(data); 70 | return func 71 | } 72 | } catch (eee) { 73 | return str 74 | } 75 | } 76 | } 77 | } 78 | curl(params, extra = '') { 79 | if (typeof(params) != 'object') { 80 | params = { 81 | 'url': params 82 | } 83 | } 84 | params = Object.assign({ ...this.options 85 | }, params); 86 | params.method = params.body ? 'POST' : 'GET'; 87 | if (params.hasOwnProperty('cookie')) { 88 | params.headers.cookie = params.cookie 89 | } 90 | if (params.hasOwnProperty('ua') || params.hasOwnProperty('useragent')) { 91 | params.headers['user-agent'] = params.ua 92 | } 93 | if (params.hasOwnProperty('referer')) { 94 | params.headers.referer = params.referer 95 | } 96 | if (params.hasOwnProperty('params')) { 97 | params.url += '?' + qs.stringify(params.params) 98 | } 99 | if (params.hasOwnProperty('form')) { 100 | params.method = 'POST' 101 | } 102 | return new Promise(resolve => { 103 | request(params, async (err, resp, data) => { 104 | try { 105 | if (params.console) { 106 | console.log(data) 107 | } 108 | this.source = this.jsonParse(data); 109 | if (extra) { 110 | this[extra] = this.source 111 | } 112 | } catch (e) { 113 | console.log(e, resp) 114 | } finally { 115 | resolve(data); 116 | } 117 | }) 118 | }) 119 | } 120 | dumps(dict) { 121 | return JSON.stringify(dict) 122 | } 123 | loads(str) { 124 | return JSON.parse(str) 125 | } 126 | notice(msg) { 127 | this.message.push({ 128 | 'index': this.index, 129 | 'user': this.user, 130 | 'msg': msg 131 | }) 132 | } 133 | notices(msg, user, index = '') { 134 | this.message.push({ 135 | 'user': user, 136 | 'msg': msg, 137 | 'index': index 138 | }) 139 | } 140 | urlparse(url) { 141 | return urls.parse(url, true, true) 142 | } 143 | md5(encryptString) { 144 | return CryptoJS.MD5(encryptString).toString() 145 | } 146 | haskey(data, key, value) { 147 | value = typeof value !== 'undefined' ? value : ''; 148 | var spl = key.split('.'); 149 | for (var i of spl) { 150 | i = !isNaN(i) ? parseInt(i) : i; 151 | try { 152 | data = data[i]; 153 | } catch (error) { 154 | return ''; 155 | } 156 | } 157 | if (data == undefined) { 158 | return '' 159 | } 160 | if (value !== '') { 161 | return data === value ? true : false; 162 | } else { 163 | return data 164 | } 165 | } 166 | match(pattern, string) { 167 | pattern = (pattern instanceof Array) ? pattern : [pattern]; 168 | for (let pat of pattern) { 169 | // var match = string.match(pat); 170 | var match = pat.exec(string) 171 | if (match) { 172 | var len = match.length; 173 | if (len == 1) { 174 | return match; 175 | } else if (len == 2) { 176 | return match[1]; 177 | } else { 178 | var r = []; 179 | for (let i = 1; i < len; i++) { 180 | r.push(match[i]) 181 | } 182 | return r; 183 | } 184 | break; 185 | } 186 | // console.log(pat.exec(string)) 187 | } 188 | return ''; 189 | } 190 | matchall(pattern, string) { 191 | pattern = (pattern instanceof Array) ? pattern : [pattern]; 192 | var match; 193 | var result = []; 194 | for (var pat of pattern) { 195 | while ((match = pat.exec(string)) != null) { 196 | var len = match.length; 197 | if (len == 1) { 198 | result.push(match); 199 | } else if (len == 2) { 200 | result.push(match[1]); 201 | } else { 202 | var r = []; 203 | for (let i = 1; i < len; i++) { 204 | r.push(match[i]) 205 | } 206 | result.push(r); 207 | } 208 | } 209 | } 210 | return result; 211 | } 212 | compare(property) { 213 | return function(a, b) { 214 | var value1 = a[property]; 215 | var value2 = b[property]; 216 | return value1 - value2; 217 | } 218 | } 219 | filename(file, rename = '') { 220 | if (!this.runfile) { 221 | this.runfile = path.basename(file).replace(".js", '').replace(/-/g, '_') 222 | } 223 | if (rename) { 224 | rename = `_${rename}`; 225 | } 226 | return path.basename(file).replace(".js", rename).replace(/-/g, '_'); 227 | } 228 | rand(n, m) { 229 | var random = Math.floor(Math.random() * (m - n + 1) + n); 230 | return random; 231 | } 232 | random(arr, num) { 233 | var temp_array = new Array(); 234 | for (var index in arr) { 235 | temp_array.push(arr[index]); 236 | } 237 | var return_array = new Array(); 238 | for (var i = 0; i < num; i++) { 239 | if (temp_array.length > 0) { 240 | var arrIndex = Math.floor(Math.random() * temp_array.length); 241 | return_array[i] = temp_array[arrIndex]; 242 | temp_array.splice(arrIndex, 1); 243 | } else { 244 | break; 245 | } 246 | } 247 | return return_array; 248 | } 249 | compact(lists, keys) { 250 | let array = {}; 251 | for (let i of keys) { 252 | if (lists[i]) { 253 | array[i] = lists[i]; 254 | } 255 | } 256 | return array; 257 | } 258 | unique(arr) { 259 | return Array.from(new Set(arr)); 260 | } 261 | end(args) { 262 | return args[args.length - 1] 263 | } 264 | } 265 | module.exports = { 266 | env, 267 | eval: mainEval, 268 | assert, 269 | jxAlgo, 270 | } 271 | -------------------------------------------------------------------------------- /docker/default_task.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | set -e 3 | 4 | # 放在这个初始化python3环境,目的减小镜像体积,一些不需要使用bot交互的用户可以不用拉体积比较大的镜像 5 | # 在这个任务里面还有初始化还有目的就是为了方便bot更新了新功能的话只需要重启容器就完成更新 6 | function initPythonEnv() { 7 | echo "开始安装运行jd_bot需要的python环境及依赖..." 8 | apk add --update python3-dev py3-pip py3-cryptography py3-numpy py-pillow 9 | echo "开始安装jd_bot依赖..." 10 | #测试 11 | #cd /jd_docker/docker/bot 12 | #合并 13 | cd /scripts/docker/bot 14 | pip3 install --upgrade pip 15 | pip3 install -r requirements.txt 16 | python3 setup.py install 17 | } 18 | 19 | #启动tg bot交互前置条件成立,开始安装配置环境 20 | if [ "$1" == "True" ]; then 21 | initPythonEnv 22 | if [ -z "$DISABLE_SPNODE" ]; then 23 | echo "增加命令组合spnode ,使用该命令spnode jd_xxxx.js 执行js脚本会读取cookies.conf里面的jd cokie账号来执行脚本" 24 | ( 25 | cat </usr/local/bin/spnode 50 | chmod +x /usr/local/bin/spnode 51 | fi 52 | 53 | echo "spnode需要使用的到,cookie写入文件,该文件同时也为jd_bot扫码获自动取cookies服务" 54 | if [ -z "$JD_COOKIE" ]; then 55 | if [ ! -f "$COOKIES_LIST" ]; then 56 | echo "" >"$COOKIES_LIST" 57 | echo "未配置JD_COOKIE环境变量,$COOKIES_LIST文件已生成,请将cookies写入$COOKIES_LIST文件,格式每个Cookie一行" 58 | fi 59 | else 60 | if [ -f "$COOKIES_LIST" ]; then 61 | echo "cookies.conf文件已经存在跳过,如果需要更新cookie请修改$COOKIES_LIST文件内容" 62 | else 63 | echo "环境变量 cookies写入$COOKIES_LIST文件,如果需要更新cookie请修改cookies.conf文件内容" 64 | echo $JD_COOKIE | sed "s/[ &]/\\n/g" | sed "/^$/d" >$COOKIES_LIST 65 | fi 66 | fi 67 | 68 | CODE_GEN_CONF=/scripts/logs/code_gen_conf.list 69 | echo "生成互助消息需要使用的到的 logs/code_gen_conf.list 文件,后续需要自己根据说明维护更新删除..." 70 | if [ ! -f "$CODE_GEN_CONF" ]; then 71 | ( 72 | cat <$CODE_GEN_CONF 106 | else 107 | echo "logs/code_gen_conf.list 文件已经存在跳过初始化操作" 108 | fi 109 | 110 | echo "容器jd_bot交互所需环境已配置安装已完成..." 111 | 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 112 | 113 | fi 114 | 115 | #echo "暂停更新配置,不要尝试删掉这个文件,你的容器可能会起不来" 116 | #echo '' >/scripts/logs/pull.lock 117 | 118 | echo "定义定时任务合并处理用到的文件路径..." 119 | defaultListFile="/scripts/docker/$DEFAULT_LIST_FILE" 120 | echo "默认文件定时任务文件路径为 ${defaultListFile}" 121 | mergedListFile="/scripts/docker/merged_list_file.sh" 122 | echo "合并后定时任务文件路径为 ${mergedListFile}" 123 | 124 | echo "第1步将默认定时任务列表添加到并后定时任务文件..." 125 | cat $defaultListFile >$mergedListFile 126 | 127 | echo "第2步判断是否存在自定义任务任务列表并追加..." 128 | if [ $CUSTOM_LIST_FILE ]; then 129 | echo "您配置了自定义任务文件:$CUSTOM_LIST_FILE,自定义任务类型为:$CUSTOM_LIST_MERGE_TYPE..." 130 | # 无论远程还是本地挂载, 均复制到 $customListFile 131 | customListFile="/scripts/docker/custom_list_file.sh" 132 | echo "自定义定时任务文件临时工作路径为 ${customListFile}" 133 | if expr "$CUSTOM_LIST_FILE" : 'http.*' &>/dev/null; then 134 | echo "自定义任务文件为远程脚本,开始下载自定义远程任务。" 135 | wget -O $customListFile $CUSTOM_LIST_FILE 136 | echo "下载完成..." 137 | elif [ -f /scripts/docker/$CUSTOM_LIST_FILE ]; then 138 | echo "自定义任务文件为本地挂载。" 139 | cp /scripts/docker/$CUSTOM_LIST_FILE $customListFile 140 | fi 141 | 142 | if [ -f "$customListFile" ]; then 143 | if [ $CUSTOM_LIST_MERGE_TYPE == "append" ]; then 144 | echo "合并默认定时任务文件:$DEFAULT_LIST_FILE 和 自定义定时任务文件:$CUSTOM_LIST_FILE" 145 | echo -e "" >>$mergedListFile 146 | cat $customListFile >>$mergedListFile 147 | elif [ $CUSTOM_LIST_MERGE_TYPE == "overwrite" ]; then 148 | echo "配置了自定义任务文件:$CUSTOM_LIST_FILE,自定义任务类型为:$CUSTOM_LIST_MERGE_TYPE..." 149 | cat $customListFile >$mergedListFile 150 | else 151 | echo "配置配置了错误的自定义定时任务类型:$CUSTOM_LIST_MERGE_TYPE,自定义任务类型为只能为append或者overwrite..." 152 | fi 153 | else 154 | echo "配置的自定义任务文件:$CUSTOM_LIST_FILE未找到,使用默认配置$DEFAULT_LIST_FILE..." 155 | fi 156 | else 157 | echo "当前只使用了默认定时任务文件 $DEFAULT_LIST_FILE ..." 158 | fi 159 | 160 | echo "第3步判断是否配置了随机延迟参数..." 161 | if [ $RANDOM_DELAY_MAX ]; then 162 | if [ $RANDOM_DELAY_MAX -ge 1 ]; then 163 | echo "已设置随机延迟为 $RANDOM_DELAY_MAX , 设置延迟任务中..." 164 | 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 165 | fi 166 | else 167 | echo "未配置随机延迟对应的环境变量,故不设置延迟任务..." 168 | fi 169 | 170 | echo "第4步判断是否配置自定义shell执行脚本..." 171 | if [ 0"$CUSTOM_SHELL_FILE" = "0" ]; then 172 | echo "未配置自定shell脚本文件,跳过执行。" 173 | else 174 | if expr "$CUSTOM_SHELL_FILE" : 'http.*' &>/dev/null; then 175 | echo "自定义shell脚本为远程脚本,开始下载自定义远程脚本。" 176 | wget -O /scripts/docker/shell_script_mod.sh $CUSTOM_SHELL_FILE 177 | echo "下载完成,开始执行..." 178 | echo "#远程自定义shell脚本追加定时任务" >>$mergedListFile 179 | sh -x /scripts/docker/shell_script_mod.sh 180 | echo "自定义远程shell脚本下载并执行结束。" 181 | else 182 | if [ ! -f $CUSTOM_SHELL_FILE ]; then 183 | echo "自定义shell脚本为docker挂载脚本文件,但是指定挂载文件不存在,跳过执行。" 184 | else 185 | echo "docker挂载的自定shell脚本,开始执行..." 186 | echo "#docker挂载自定义shell脚本追加定时任务" >>$mergedListFile 187 | sh -x $CUSTOM_SHELL_FILE 188 | echo "docker挂载的自定shell脚本,执行结束。" 189 | fi 190 | fi 191 | fi 192 | 193 | echo "第5步删除不运行的脚本任务..." 194 | if [ $DO_NOT_RUN_SCRIPTS ]; then 195 | echo "您配置了不运行的脚本:$DO_NOT_RUN_SCRIPTS" 196 | arr=${DO_NOT_RUN_SCRIPTS//&/ } 197 | for item in $arr; do 198 | sed -ie '/'"${item}"'/d' ${mergedListFile} 199 | done 200 | 201 | fi 202 | 203 | echo "第6步设定下次运行docker_entrypoint.sh时间..." 204 | echo "删除原有docker_entrypoint.sh任务" 205 | sed -ie '/'docker_entrypoint.sh'/d' ${mergedListFile} 206 | 207 | # 12:00前生成12:00后的cron,12:00后生成第二天12:00前的cron,一天只更新两次代码 208 | if [ $(date +%-H) -lt 12 ]; then 209 | random_h=$(($RANDOM % 12 + 12)) 210 | else 211 | random_h=$(($RANDOM % 12)) 212 | fi 213 | random_m=$(($RANDOM % 60)) 214 | 215 | echo "设定 docker_entrypoint.sh cron为:" 216 | echo -e "\n# 必须要的默认定时任务请勿删除" >>$mergedListFile 217 | echo -e "${random_m} ${random_h} * * * docker_entrypoint.sh >> /scripts/logs/default_task.log 2>&1" | tee -a $mergedListFile 218 | 219 | echo "第7步 自动助力" 220 | if [ -n "$ENABLE_AUTO_HELP" ]; then 221 | #直接判断变量,如果未配置,会导致sh抛出一个错误,所以加了上面一层 222 | if [ "$ENABLE_AUTO_HELP" = "true" ]; then 223 | echo "开启自动助力" 224 | #在所有脚本执行前,先执行助力码导出 225 | sed -i 's/node/ . \/scripts\/docker\/auto_help.sh export > \/scripts\/logs\/auto_help_export.log \&\& node /g' ${mergedListFile} 226 | else 227 | echo "未开启自动助力" 228 | fi 229 | fi 230 | 231 | echo "第8步增加 |ts 任务日志输出时间戳..." 232 | sed -i "/\( ts\| |ts\|| ts\)/!s/>>/\|ts >>/g" $mergedListFile 233 | 234 | echo "第9步执行proc_file.sh脚本任务..." 235 | sh /scripts/docker/proc_file.sh 236 | 237 | echo "第10步加载最新的定时任务文件..." 238 | if [[ -f /usr/bin/jd_bot && -z "$DISABLE_SPNODE" ]]; then 239 | echo "bot交互与spnode 前置条件成立,替换任务列表的node指令为spnode" 240 | sed -i "s/ node / spnode /g" $mergedListFile 241 | #conc每个cookies独立并行执行脚本示例,cookies数量多使用该功能可能导致内存爆掉,默认不开启 有需求,请在自定义shell里面实现 242 | #sed -i "/\(jd_xtg.js\|jd_car_exchange.js\)/s/spnode/spnode conc/g" $mergedListFile 243 | fi 244 | crontab $mergedListFile 245 | 246 | echo "第11步将仓库的docker_entrypoint.sh脚本更新至系统/usr/local/bin/docker_entrypoint.sh内..." 247 | cat /scripts/docker/docker_entrypoint.sh >/usr/local/bin/docker_entrypoint.sh 248 | 249 | echo "发送通知" 250 | export NOTIFY_CONTENT="" 251 | cd /scripts/docker 252 | node notify_docker_user.js 253 | -------------------------------------------------------------------------------- /JD_extra_cookie.js: -------------------------------------------------------------------------------- 1 | /* 2 | 感谢github@dompling的PR 3 | 4 | Author: 2Ya 5 | 6 | Github: https://github.com/dompling 7 | 8 | =================== 9 | 特别说明: 10 | 1.获取多个京东cookie的脚本,不和NobyDa的京东cookie冲突。注:如与NobyDa的京东cookie重复,建议在BoxJs处删除重复的cookie 11 | =================== 12 | =================== 13 | 使用方式:在代理软件配置好下方配置后,复制 https://home.m.jd.com/myJd/newhome.action 到浏览器打开 ,在个人中心自动获取 cookie, 14 | 若弹出成功则正常使用。否则继续再此页面继续刷新一下试试。 15 | 16 | 注:建议通过脚本去获取cookie,若要在BoxJs处手动修改,请按照JSON格式修改(注:可使用此JSON校验 https://www.bejson.com/json/format) 17 | 示例:[{"userName":"jd_xxx","cookie":"pt_key=AAJ;pt_pin=jd_xxx;"},{"userName":"jd_66","cookie":"pt_key=AAJ;pt_pin=jd_66;"}] 18 | =================== 19 | new Env('获取多账号京东Cookie');//此处忽略即可,为自动生成iOS端软件配置文件所需 20 | =================== 21 | [MITM] 22 | hostname = me-api.jd.com 23 | 24 | ===================Quantumult X===================== 25 | [rewrite_local] 26 | # 获取多账号京东Cookie 27 | https:\/\/me-api\.jd\.com\/user_new\/info\/GetJDUserInfoUnion url script-request-header JD_extra_cookie.js 28 | 29 | ===================Loon=================== 30 | [Script] 31 | http-request https:\/\/me-api\.jd\.com\/user_new\/info\/GetJDUserInfoUnion script-path=JD_extra_cookie.js, tag=获取多账号京东Cookie 32 | 33 | ===================Surge=================== 34 | [Script] 35 | 获取多账号京东Cookie = type=http-request,pattern=^https:\/\/me-api\.jd\.com\/user_new\/info\/GetJDUserInfoUnion,requires-body=1,max-size=0,script-path=JD_extra_cookie.js,script-update-interval=0 36 | */ 37 | 38 | const APIKey = "CookiesJD"; 39 | $ = new API(APIKey, true); 40 | const CacheKey = `#${APIKey}`; 41 | if ($request) GetCookie(); 42 | 43 | function getCache() { 44 | var cache = $.read(CacheKey) || "[]"; 45 | $.log(cache); 46 | return JSON.parse(cache); 47 | } 48 | 49 | function GetCookie() { 50 | try { 51 | if ($request.headers && $request.url.indexOf("GetJDUserInfoUnion") > -1) { 52 | var CV = $request.headers["Cookie"] || $request.headers["cookie"]; 53 | if (CV.match(/(pt_key=.+?pt_pin=|pt_pin=.+?pt_key=)/)) { 54 | var CookieValue = CV.match(/pt_key=.+?;/)[0] + CV.match(/pt_pin=([^; ]+)(?=;?)/)[0] + ';'; 55 | var UserName = CookieValue.match(/pt_pin=([^; ]+)(?=;?)/)[1]; 56 | var DecodeName = decodeURIComponent(UserName); 57 | var CookiesData = getCache(); 58 | var updateCookiesData = [...CookiesData]; 59 | var updateIndex; 60 | var CookieName = "【账号】"; 61 | var updateCodkie = CookiesData.find((item, index) => { 62 | var ck = item.cookie; 63 | var Account = ck 64 | ? ck.match(/pt_pin=([^; ]+)(?=;?)/) 65 | ? ck.match(/pt_pin=([^; ]+)(?=;?)/)[1] 66 | : null 67 | : null; 68 | const verify = UserName === Account; 69 | if (verify) { 70 | updateIndex = index; 71 | } 72 | return verify; 73 | }); 74 | var tipPrefix = ""; 75 | if (updateCodkie) { 76 | updateCookiesData[updateIndex].cookie = CookieValue; 77 | CookieName = `【账号${updateIndex + 1}】`; 78 | tipPrefix = "更新京东"; 79 | } else { 80 | updateCookiesData.push({ 81 | userName: DecodeName, 82 | cookie: CookieValue, 83 | }); 84 | CookieName = "【账号" + updateCookiesData.length + "】"; 85 | tipPrefix = "首次写入京东"; 86 | } 87 | const cacheValue = JSON.stringify(updateCookiesData, null, "\t"); 88 | $.write(cacheValue, CacheKey); 89 | $.notify( 90 | "用户名: " + DecodeName, 91 | "", 92 | tipPrefix + CookieName + "Cookie成功 🎉" 93 | ); 94 | } else { 95 | $.notify("写入京东Cookie失败", "", "请查看脚本内说明, 登录网页获取 ‼️"); 96 | } 97 | $.done(); 98 | return; 99 | } else { 100 | $.notify("写入京东Cookie失败", "", "请检查匹配URL或配置内脚本类型 ‼️"); 101 | } 102 | } catch (eor) { 103 | $.write("", CacheKey); 104 | $.notify("写入京东Cookie失败", "", "已尝试清空历史Cookie, 请重试 ⚠️"); 105 | console.log( 106 | `\n写入京东Cookie出现错误 ‼️\n${JSON.stringify( 107 | eor 108 | )}\n\n${eor}\n\n${JSON.stringify($request.headers)}\n` 109 | ); 110 | } 111 | $.done(); 112 | } 113 | 114 | // prettier-ignore 115 | function ENV(){const isQX=typeof $task!=="undefined";const isLoon=typeof $loon!=="undefined";const isSurge=typeof $httpClient!=="undefined"&&!isLoon;const isJSBox=typeof require=="function"&&typeof $jsbox!="undefined";const isNode=typeof require=="function"&&!isJSBox;const isRequest=typeof $request!=="undefined";const isScriptable=typeof importModule!=="undefined";return{isQX,isLoon,isSurge,isNode,isJSBox,isRequest,isScriptable}} 116 | // prettier-ignore 117 | function HTTP(baseURL,defaultOptions={}){const{isQX,isLoon,isSurge,isScriptable,isNode}=ENV();const methods=["GET","POST","PUT","DELETE","HEAD","OPTIONS","PATCH"];function send(method,options){options=typeof options==="string"?{url:options}:options;options.url=baseURL?baseURL+options.url:options.url;options={...defaultOptions,...options};const timeout=options.timeout;const events={...{onRequest:()=>{},onResponse:(resp)=>resp,onTimeout:()=>{},},...options.events,};events.onRequest(method,options);let worker;if(isQX){worker=$task.fetch({method,...options})}else if(isLoon||isSurge||isNode){worker=new Promise((resolve,reject)=>{const request=isNode?require("request"):$httpClient;request[method.toLowerCase()](options,(err,response,body)=>{if(err)reject(err);else resolve({statusCode:response.status||response.statusCode,headers:response.headers,body,})})})}else if(isScriptable){const request=new Request(options.url);request.method=method;request.headers=options.headers;request.body=options.body;worker=new Promise((resolve,reject)=>{request.loadString().then((body)=>{resolve({statusCode:request.response.statusCode,headers:request.response.headers,body,})}).catch((err)=>reject(err))})}let timeoutid;const timer=timeout?new Promise((_,reject)=>{timeoutid=setTimeout(()=>{events.onTimeout();return reject(`${method}URL:${options.url}exceeds the timeout ${timeout}ms`)},timeout)}):null;return(timer?Promise.race([timer,worker]).then((res)=>{clearTimeout(timeoutid);return res}):worker).then((resp)=>events.onResponse(resp))}const http={};methods.forEach((method)=>(http[method.toLowerCase()]=(options)=>send(method,options)));return http} 118 | // prettier-ignore 119 | function API(name="untitled",debug=false){const{isQX,isLoon,isSurge,isNode,isJSBox,isScriptable}=ENV();return new(class{constructor(name,debug){this.name=name;this.debug=debug;this.http=HTTP();this.env=ENV();this.node=(()=>{if(isNode){const fs=require("fs");return{fs}}else{return null}})();this.initCache();const delay=(t,v)=>new Promise(function(resolve){setTimeout(resolve.bind(null,v),t)});Promise.prototype.delay=function(t){return this.then(function(v){return delay(t,v)})}}initCache(){if(isQX)this.cache=JSON.parse($prefs.valueForKey(this.name)||"{}");if(isLoon||isSurge)this.cache=JSON.parse($persistentStore.read(this.name)||"{}");if(isNode){let fpath="root.json";if(!this.node.fs.existsSync(fpath)){this.node.fs.writeFileSync(fpath,JSON.stringify({}),{flag:"wx"},(err)=>console.log(err))}this.root={};fpath=`${this.name}.json`;if(!this.node.fs.existsSync(fpath)){this.node.fs.writeFileSync(fpath,JSON.stringify({}),{flag:"wx"},(err)=>console.log(err));this.cache={}}else{this.cache=JSON.parse(this.node.fs.readFileSync(`${this.name}.json`))}}}persistCache(){const data=JSON.stringify(this.cache);if(isQX)$prefs.setValueForKey(data,this.name);if(isLoon||isSurge)$persistentStore.write(data,this.name);if(isNode){this.node.fs.writeFileSync(`${this.name}.json`,data,{flag:"w"},(err)=>console.log(err));this.node.fs.writeFileSync("root.json",JSON.stringify(this.root),{flag:"w"},(err)=>console.log(err))}}write(data,key){this.log(`SET ${key}`);if(key.indexOf("#")!==-1){key=key.substr(1);if(isSurge||isLoon){return $persistentStore.write(data,key)}if(isQX){return $prefs.setValueForKey(data,key)}if(isNode){this.root[key]=data}}else{this.cache[key]=data}this.persistCache()}read(key){this.log(`READ ${key}`);if(key.indexOf("#")!==-1){key=key.substr(1);if(isSurge||isLoon){return $persistentStore.read(key)}if(isQX){return $prefs.valueForKey(key)}if(isNode){return this.root[key]}}else{return this.cache[key]}}delete(key){this.log(`DELETE ${key}`);if(key.indexOf("#")!==-1){key=key.substr(1);if(isSurge||isLoon){$persistentStore.write(null,key)}if(isQX){$prefs.removeValueForKey(key)}if(isNode){delete this.root[key]}}else{delete this.cache[key]}this.persistCache()}notify(title,subtitle="",content="",options={}){const openURL=options["open-url"];const mediaURL=options["media-url"];if(isQX)$notify(title,subtitle,content,options);if(isSurge){$notification.post(title,subtitle,content+`${mediaURL?"\n多媒体:"+mediaURL:""}`,{url:openURL})}if(isLoon){let opts={};if(openURL)opts["openUrl"]=openURL;if(mediaURL)opts["mediaUrl"]=mediaURL;if(JSON.stringify(opts)=="{}"){$notification.post(title,subtitle,content)}else{$notification.post(title,subtitle,content,opts)}}if(isNode||isScriptable){const content_=content+(openURL?`\n点击跳转:${openURL}`:"")+(mediaURL?`\n多媒体:${mediaURL}`:"");if(isJSBox){const push=require("push");push.schedule({title:title,body:(subtitle?subtitle+"\n":"")+content_,})}else{console.log(`${title}\n${subtitle}\n${content_}\n\n`)}}}log(msg){if(this.debug)console.log(msg)}info(msg){console.log(msg)}error(msg){console.log("ERROR: "+msg)}wait(millisec){return new Promise((resolve)=>setTimeout(resolve,millisec))}done(value={}){if(isQX||isLoon||isSurge){$done(value)}else if(isNode&&!isJSBox){if(typeof $context!=="undefined"){$context.headers=value.headers;$context.statusCode=value.statusCode;$context.body=value.body}}}})(name,debug)} 120 | -------------------------------------------------------------------------------- /Loon/lxk0301_LoonTask.conf: -------------------------------------------------------------------------------- 1 | # IOS Loon Task&Cookies配置 2 | # TG通知频道 (https://t.me/jdfruit) 3 | # 使用方法:打开APP,顶部的配置 -> 脚本 -> 订阅脚本- > 点击右上角+号 -> 添加url链接 4 | 5 | hostname = me-api.jd.com, draw.jdfcloud.com, jdjoy.jd.com, account.huami.com 6 | 7 | # 京东资产变动通知 8 | cron "2 9 * * *" script-path=https://gitee.com/lxk0301/jd_scripts/raw/master/jd_bean_change.js, tag=京东资产变动通知 9 | 10 | # 领京豆额外奖励 11 | cron "10 7 * * *" script-path=https://gitee.com/lxk0301/jd_scripts/raw/master/jd_bean_home.js, tag=领京豆额外奖励 12 | 13 | # 省钱大赢家之翻翻乐 14 | cron "20 * * * *" script-path=https://gitee.com/lxk0301/jd_scripts/raw/master/jd_big_winner.js,tag=省钱大赢家之翻翻乐 15 | 16 | # 东东超市兑换奖品 17 | cron "0 0 0 * * *" script-path=https://gitee.com/lxk0301/jd_scripts/raw/master/jd_blueCoin.js,tag=东东超市兑换奖品 18 | 19 | # 口袋书店 20 | cron "1 8,12,18 * * *" script-path=https://gitee.com/lxk0301/jd_scripts/raw/master/jd_bookshop.js,tag=口袋书店 21 | 22 | # 京东汽车 23 | cron "10 7 * * *" script-path=https://gitee.com/lxk0301/jd_scripts/raw/master/jd_car.js, tag=京东汽车 24 | 25 | # 京东汽车兑换 26 | cron "0 0 * * *" script-path=https://gitee.com/lxk0301/jd_scripts/raw/master/jd_car_exchange.js, tag=京东汽车兑换 27 | 28 | # 京东手机狂欢城 29 | cron "0 0-18/6 * * *" script-path=https://gitee.com/lxk0301/jd_scripts/raw/master/jd_carnivalcity.js, tag=京东手机狂欢城 30 | 31 | # 签到领现金 32 | cron "2 0-23/4 * * *" script-path=https://gitee.com/lxk0301/jd_scripts/raw/master/jd_cash.js,tag=签到领现金 33 | 34 | # 京喜财富岛 35 | cron "5 8,13,19 * * *" script-path=https://gitee.com/lxk0301/jd_scripts/raw/master/jd_cfd.js,tag=京喜财富岛 36 | 37 | # 摇京豆 38 | cron "5 0,23 * * *" script-path=https://gitee.com/lxk0301/jd_scripts/raw/master/jd_club_lottery.js,tag=摇京豆 39 | 40 | # crazyJoy任务 41 | cron "10 9 * * *" script-path=https://gitee.com/lxk0301/jd_scripts/raw/master/jd_crazy_joy.js,tag=crazyJoy任务 42 | 43 | # 监控crazyJoy分红 44 | cron "10 12 * * *" script-path=https://gitee.com/lxk0301/jd_scripts/raw/master/jd_crazy_joy_bonus.js,tag=监控crazyJoy分红 45 | 46 | # crazyJoy挂机 47 | cron "10 1,12 * * *" script-path=https://gitee.com/lxk0301/jd_scripts/raw/master/jd_crazy_joy_coin.js,tag=crazyJoy挂机 48 | 49 | # 天天提鹅 50 | cron "10 * * * *" script-path=https://gitee.com/lxk0301/jd_scripts/raw/master/jd_daily_egg.js,tag=天天提鹅 51 | 52 | # 小鸽有礼-每日抽奖 53 | cron "13 1,22,23 * * *" script-path=https://gitee.com/lxk0301/jd_scripts/raw/master/jd_daily_lottery.js, tag=每日抽奖 54 | 55 | # 京喜工厂 56 | cron "10 * * * *" script-path=https://gitee.com/lxk0301/jd_scripts/raw/master/jd_dreamFactory.js,tag=京喜工厂 57 | 58 | # 获取多账号京东Cookie 59 | http-request https:\/\/me-api\.jd\.com\/user_new\/info\/GetJDUserInfoUnion script-path=https://gitee.com/lxk0301/jd_scripts/raw/master/JD_extra_cookie.js, tag=获取多账号京东Cookie 60 | 61 | # 京东家庭号 62 | cron "1 12,23 * * *" script-path=https://gitee.com/lxk0301/jd_scripts/raw/master/jd_family.js,tag=京东家庭号 63 | 64 | # 东东农场 65 | cron "5 6-18/6 * * *" script-path=https://gitee.com/lxk0301/jd_scripts/raw/master/jd_fruit.js,tag=东东农场 66 | 67 | # 获取互助码 68 | cron "20 13 * * 6" script-path=https://gitee.com/lxk0301/jd_scripts/raw/master/jd_get_share_code.js, tag=获取互助码 69 | 70 | # 金榜创造营 71 | cron "13 1,22 * * *" script-path=https://gitee.com/lxk0301/jd_scripts/raw/master/jd_gold_creator.js, tag=金榜创造营 72 | 73 | # 东东健康社区 74 | cron "13 1,6,22 * * *" script-path=https://gitee.com/lxk0301/jd_scripts/raw/master/jd_health.js, tag=东东健康社区 75 | 76 | # 东东健康社区收集能量收集 77 | cron "5-45/20 * * * *" script-path=https://gitee.com/lxk0301/jd_scripts/raw/master/jd_health_collect.js, tag=东东健康社区收集能量 78 | 79 | # 东东工厂 80 | cron "10 * * * *" script-path=https://gitee.com/lxk0301/jd_scripts/raw/master/jd_jdfactory.js,tag=东东工厂 81 | 82 | # 京东赚赚 83 | cron "10 0 * * *" script-path=https://gitee.com/lxk0301/jd_scripts/raw/master/jd_jdzz.js,tag=京东赚赚 84 | 85 | # 领金贴 86 | cron "10 0 * * *" script-path=https://gitee.com/lxk0301/jd_scripts/raw/master/jd_jin_tie.js,tag=领金贴 87 | 88 | # 宠汪汪 89 | cron "15 0-23/2 * * *" script-path=https://gitee.com/lxk0301/jd_scripts/raw/master/jd_joy.js,tag=京东宠汪汪 90 | 91 | # 宠汪汪🐕喂食 92 | cron "15 0-23/1 * * *" script-path=https://gitee.com/lxk0301/jd_scripts/raw/master/jd_joy_feedPets.js,tag=京东宠汪汪喂食 93 | 94 | # 宠汪汪强制为别人助力 95 | http-request ^https:\/\/draw\.jdfcloud\.com\/\/common\/pet\/enterRoom\/h5\?invitePin=.*(&inviteSource=task_invite&shareSource=\w+&inviteTimeStamp=\d+&openId=\w+)?&reqSource=weapp|^https:\/\/draw\.jdfcloud\.com(\/mirror)?\/\/pet\/helpFriend\?friendPin script-path=https://gitee.com/lxk0301/jd_scripts/raw/master/jd_joy_help.js, requires-body=true, timeout=3600, tag=宠汪汪强制为别人助力 96 | 97 | # 宠汪汪积分兑换奖品 98 | cron "0 0-16/8 * * *" script-path=https://gitee.com/lxk0301/jd_scripts/raw/master/jd_joy_reward.js,tag=宠汪汪积分兑换奖品 99 | 100 | # 宠汪汪赛跑 101 | cron "15 10 * * *" script-path=https://gitee.com/lxk0301/jd_scripts/raw/master/jd_joy_run.js, tag=宠汪汪邀请助力与赛跑助力 102 | 103 | # 宠汪汪助力更新Token 104 | http-response ^https:\/\/draw\.jdfcloud\.com(\/mirror)?\/\/api\/user\/addUser\?code= script-path=https://gitee.com/lxk0301/jd_scripts/raw/master/jd_joy_run.js, requires-body=true, timeout=10, tag=宠汪汪助力更新Token 105 | 106 | # 宠汪汪助力获取Token 107 | http-request ^https:\/\/draw\.jdfcloud\.com(\/mirror)?\/\/api\/user\/user\/detail\?openId= script-path=https://gitee.com/lxk0301/jd_scripts/raw/master/jd_joy_run.js, timeout=3600, tag=宠汪汪助力获取Token 108 | 109 | # 宠汪汪偷好友积分与狗粮 110 | cron "10 0-21/3 * * *" script-path=https://gitee.com/lxk0301/jd_scripts/raw/master/jd_joy_steal.js,tag=宠汪汪偷好友积分与狗粮 111 | 112 | # 跳跳乐瓜分京豆 113 | cron "1 0,11,21 * * *" script-path=https://gitee.com/lxk0301/jd_scripts/raw/master/jd_jump.js, tag=跳跳乐瓜分京豆 114 | 115 | # 京喜领88元红包 116 | cron "4 10 * * *" script-path=https://gitee.com/lxk0301/jd_scripts/raw/master/jd_jxlhb.js,tag=京喜领88元红包 117 | 118 | # 惊喜牧场 119 | cron "20 0-23/3 * * *" script-path=https://gitee.com/lxk0301/jd_scripts/raw/master/jd_jxmc.js,tag=惊喜牧场 120 | 121 | # 京喜农场 122 | cron "0 9,12,18 * * *" script-path=https://gitee.com/lxk0301/jd_scripts/raw/master/jd_jxnc.js,tag=京喜农场 123 | 124 | # 京东快递签到 125 | cron "10 0 * * *" script-path=https://gitee.com/lxk0301/jd_scripts/raw/master/jd_kd.js, tag=京东快递签到 126 | 127 | # 京东直播 128 | cron "10-20/5 12 * * *" script-path=https://gitee.com/lxk0301/jd_scripts/raw/master/jd_live.js,tag=京东直播 129 | 130 | # 超级直播间红包雨 131 | cron "0,30 0-23/1 * * *" script-path=https://gitee.com/lxk0301/jd_scripts/raw/master/jd_live_redrain.js,tag=超级直播间红包雨 132 | 133 | # 幸运大转盘 134 | cron "4 10 * * *" script-path=https://gitee.com/lxk0301/jd_scripts/raw/master/jd_market_lottery.js,tag=幸运大转盘 135 | 136 | # 新潮品牌狂欢 137 | cron "4 10 * * *" script-path=https://gitee.com/lxk0301/jd_scripts/raw/master/jd_mcxhd.js,tag=新潮品牌狂欢 138 | 139 | # 5G超级盲盒 140 | cron "0 0,1-23/3 * * *" script-path=https://gitee.com/lxk0301/jd_scripts/raw/master/jd_mohe.js,tag=5G超级盲盒 141 | 142 | # 京东摇钱树 143 | cron "3 0-23/2 * * *" script-path=https://gitee.com/lxk0301/jd_scripts/raw/master/jd_moneyTree.js,tag=京东摇钱树 144 | 145 | # 京东秒秒币 146 | cron "10 7 * * *" script-path=https://gitee.com/lxk0301/jd_scripts/raw/master/jd_ms.js,tag=京东秒秒币 147 | 148 | # 点点券 149 | cron "10 0,20 * * *" script-path=https://gitee.com/lxk0301/jd_scripts/raw/master/jd_necklace.js,tag=点点券 150 | 151 | # 女装盲盒抽京豆 152 | cron "35 1,23 * * *" script-path=https://gitee.com/lxk0301/jd_scripts/raw/master/jd_nzmh.js,tag=女装盲盒 153 | 154 | # 东东萌宠 155 | cron "15 6-18/6 * * *" script-path=https://gitee.com/lxk0301/jd_scripts/raw/master/jd_pet.js,tag=东东萌宠 156 | 157 | # 金融养猪 158 | cron "12 0-23/6 * * *" script-path=https://gitee.com/lxk0301/jd_scripts/raw/master/jd_pigPet.js, tag=京东金融养猪猪 159 | 160 | # 京东种豆得豆 161 | cron "1 7-21/2 * * *" script-path=https://gitee.com/lxk0301/jd_scripts/raw/master/jd_plantBean.js,tag=京东种豆得豆 162 | 163 | # 京东保价 164 | cron "0 2 * * *" script-path=https://gitee.com/lxk0301/jd_scripts/raw/master/jd_price.js,tag=京东保价 165 | 166 | # 京东全民开红包 167 | cron "1 1,2,23 * * *" script-path=https://gitee.com/lxk0301/jd_scripts/raw/master/jd_redPacket.js, tag=京东全民开红包 168 | 169 | # 闪购盲盒 170 | cron "20 8 * * *" script-path=https://gitee.com/lxk0301/jd_scripts/raw/master/jd_sgmh.js, tag=闪购盲盒 171 | 172 | # 进店领豆 173 | cron "10 0 * * *" script-path=https://gitee.com/lxk0301/jd_scripts/raw/master/jd_shop.js,tag=进店领豆 174 | 175 | # 东东小窝 176 | cron "16 22 * * *" script-path=https://gitee.com/lxk0301/jd_scripts/raw/master/jd_small_home.js, tag=东东小窝 177 | 178 | # ✈️天天加速 179 | cron "8 0-23/3 * * *" script-path=https://gitee.com/lxk0301/jd_scripts/raw/master/jd_speed.js,tag=京东天天加速 180 | 181 | # 京东极速版红包 182 | cron "20 0,22 * * *" script-path=https://gitee.com/lxk0301/jd_scripts/raw/master/jd_speed_redpocke.js,tag=京东极速版红包 183 | 184 | # 京东极速版 185 | cron "0 7 * * *" script-path=https://gitee.com/lxk0301/jd_scripts/raw/master/jd_speed_sign.js,tag=京东极速版 186 | 187 | # 明星小店 188 | cron "0 1,21 * * *" script-path=https://gitee.com/lxk0301/jd_scripts/raw/master/jd_star_shop.js,tag=明星小店 189 | 190 | # 东东超市 191 | cron "11 * * * *" script-path=https://gitee.com/lxk0301/jd_scripts/raw/master/jd_superMarket.js,tag=东东超市 192 | 193 | # 赚京豆 194 | cron "10 0,7,23 * * *" script-path=https://gitee.com/lxk0301/jd_scripts/raw/master/jd_syj.js, tag=赚京豆 195 | 196 | # 取关京东店铺和商品 197 | cron "55 23 * * *" script-path=https://gitee.com/lxk0301/jd_scripts/raw/master/jd_unsubscribe.js,tag=取关京东店铺商品 198 | 199 | # 家电星推官 200 | cron "0 0 0 * * *" script-path=https://gitee.com/lxk0301/jd_scripts/raw/master/jd_xtg.js,tag=家电星推官 201 | 202 | # 家电星推官好友互助 203 | cron "0 0 0 * * *" script-path=https://gitee.com/lxk0301/jd_scripts/raw/master/jd_xtg_help.js,tag=家电星推官好友互助 204 | 205 | # 618动物联萌 206 | cron "33 0,6-23/2 * * *" script-path=https://gitee.com/lxk0301/jd_scripts/raw/master/jd_zoo.js, tag=618动物联萌 207 | 208 | # 618动物联萌收集金币 209 | cron "0-59/30 * * * *" script-path=https://gitee.com/lxk0301/jd_scripts/raw/master/jd_zooCollect.js,tag=618动物联萌收集金币 210 | 211 | # 小米运动 212 | cron "15 17 * * *" script-path=https://gitee.com/lxk0301/jd_scripts/raw/master/backUp/xmSports.js, tag=小米运动 213 | 214 | # 小米运动获取Token 215 | http-response ^https:\/\/account\.huami\.com\/v2\/client\/login script-path=https://gitee.com/lxk0301/jd_scripts/raw/master/backUp/xmSports.js, requires-body=true, timeout=3600, tag=小米运动获取Token 216 | -------------------------------------------------------------------------------- /backUp/webhook.js: -------------------------------------------------------------------------------- 1 | /* 2 | * @Date: 2020-10-24 18:53:29 3 | * @Last Modified time: 2020-11-05 18:54:13 4 | */ 5 | 6 | const $ = new Env('Webhook触发Action'); 7 | let ACTIONS_TRIGGER_TOKEN = '';//Personal access tokens,申请教程:https://www.jianshu.com/p/bb82b3ad1d11 记得勾选repo权限就行 8 | let TRIGGER_KEYWORDS = '';//.github/workflows/路径里面yml文件里面repository_dispatch项目的types值,例如jd_fruit.yml里面的值为fruit 9 | let githubUser = '';//github用户名,例:xxxx 10 | let repo = '';//需要触发的 Github Action 所在的仓库名称 例:scripts 11 | 12 | !(async () => { 13 | ACTIONS_TRIGGER_TOKEN = $.getdata('ACTIONS_TRIGGER_TOKEN') ? $.getdata('ACTIONS_TRIGGER_TOKEN') : ACTIONS_TRIGGER_TOKEN; 14 | githubUser = $.getdata('githubUser') ? $.getdata('githubUser') : githubUser; 15 | repo = $.getdata('repo') ? $.getdata('repo') : repo; 16 | TRIGGER_KEYWORDS = $.getdata('TRIGGER_KEYWORDS') ? $.getdata('TRIGGER_KEYWORDS') : TRIGGER_KEYWORDS; 17 | TRIGGER_KEYWORDS = TRIGGER_KEYWORDS.split(','); 18 | for (let item of TRIGGER_KEYWORDS) { 19 | if (!item) { 20 | $.msg($.name, `失败`, `触发关键词未提供`) 21 | return 22 | } 23 | if (!ACTIONS_TRIGGER_TOKEN) { 24 | $.msg($.name, `失败`, `github token未提供`) 25 | return 26 | } 27 | if (!githubUser) { 28 | $.msg($.name, `失败`, `github 用户名未提供`) 29 | return 30 | } 31 | if (!repo) { 32 | $.msg($.name, `失败`, `需触发的github仓库名未提供`) 33 | return 34 | } 35 | if (ACTIONS_TRIGGER_TOKEN && githubUser && repo && item) { 36 | await hook(item); 37 | } 38 | } 39 | })() 40 | .catch((e) => { 41 | $.log('', `❌ ${$.name}, 失败! 原因: ${e}!`, '') 42 | }) 43 | .finally(() => { 44 | $.done(); 45 | }) 46 | 47 | function hook(key) { 48 | const options = { 49 | 'url': `https://api.github.com/repos/${githubUser}/${repo}/dispatches`, 50 | 'body': `${JSON.stringify({"event_type": key})}`, 51 | 'headers': { 52 | 'Accept': 'application/vnd.github.everest-preview+json', 53 | 'Authorization': `token ${ACTIONS_TRIGGER_TOKEN}` 54 | } 55 | } 56 | return new Promise((resolve) => { 57 | $.post(options, (err, resp, data) => { 58 | try { 59 | if (err) { 60 | if (data && data.match('404')) { 61 | $.msg($.name, ``, `触发[${key}]失败,请仔细检查提供的参数`, {"open-url": `https://github.com/${githubUser}/${repo}`}) 62 | } else if (data && data.match('401')) { 63 | $.msg($.name, ``, `触发[${key}]失败,github token权限不足`, {"open-url": `https://github.com/settings/tokens`}) 64 | } else { 65 | console.log(`${JSON.stringify(err)}`) 66 | } 67 | console.log(`${$.name} API请求失败,请检查网路重试`) 68 | } else { 69 | $.msg($.name, ``, `触发[${key}]成功`, {"open-url": `https://github.com/${githubUser}/${repo}/actions`}) 70 | } 71 | } catch (e) { 72 | $.logErr(e, resp); 73 | } finally { 74 | resolve(data); 75 | } 76 | }) 77 | }) 78 | } 79 | // prettier-ignore 80 | function Env(t,e){"undefined"!=typeof process&&JSON.stringify(process.env).indexOf("GITHUB")>-1&&process.exit(0);class s{constructor(t){this.env=t}send(t,e="GET"){t="string"==typeof t?{url:t}:t;let s=this.get;return"POST"===e&&(s=this.post),new Promise((e,i)=>{s.call(this,t,(t,s,r)=>{t?i(t):e(s)})})}get(t){return this.send.call(this.env,t)}post(t){return this.send.call(this.env,t,"POST")}}return new class{constructor(t,e){this.name=t,this.http=new s(this),this.data=null,this.dataFile="box.dat",this.logs=[],this.isMute=!1,this.isNeedRewrite=!1,this.logSeparator="\n",this.startTime=(new Date).getTime(),Object.assign(this,e),this.log("",`🔔${this.name}, 开始!`)}isNode(){return"undefined"!=typeof module&&!!module.exports}isQuanX(){return"undefined"!=typeof $task}isSurge(){return"undefined"!=typeof $httpClient&&"undefined"==typeof $loon}isLoon(){return"undefined"!=typeof $loon}toObj(t,e=null){try{return JSON.parse(t)}catch{return e}}toStr(t,e=null){try{return JSON.stringify(t)}catch{return e}}getjson(t,e){let s=e;const i=this.getdata(t);if(i)try{s=JSON.parse(this.getdata(t))}catch{}return s}setjson(t,e){try{return this.setdata(JSON.stringify(t),e)}catch{return!1}}getScript(t){return new Promise(e=>{this.get({url:t},(t,s,i)=>e(i))})}runScript(t,e){return new Promise(s=>{let i=this.getdata("@chavy_boxjs_userCfgs.httpapi");i=i?i.replace(/\n/g,"").trim():i;let r=this.getdata("@chavy_boxjs_userCfgs.httpapi_timeout");r=r?1*r:20,r=e&&e.timeout?e.timeout:r;const[o,h]=i.split("@"),n={url:`http://${h}/v1/scripting/evaluate`,body:{script_text:t,mock_type:"cron",timeout:r},headers:{"X-Key":o,Accept:"*/*"}};this.post(n,(t,e,i)=>s(i))}).catch(t=>this.logErr(t))}loaddata(){if(!this.isNode())return{};{this.fs=this.fs?this.fs:require("fs"),this.path=this.path?this.path:require("path");const t=this.path.resolve(this.dataFile),e=this.path.resolve(process.cwd(),this.dataFile),s=this.fs.existsSync(t),i=!s&&this.fs.existsSync(e);if(!s&&!i)return{};{const i=s?t:e;try{return JSON.parse(this.fs.readFileSync(i))}catch(t){return{}}}}}writedata(){if(this.isNode()){this.fs=this.fs?this.fs:require("fs"),this.path=this.path?this.path:require("path");const t=this.path.resolve(this.dataFile),e=this.path.resolve(process.cwd(),this.dataFile),s=this.fs.existsSync(t),i=!s&&this.fs.existsSync(e),r=JSON.stringify(this.data);s?this.fs.writeFileSync(t,r):i?this.fs.writeFileSync(e,r):this.fs.writeFileSync(t,r)}}lodash_get(t,e,s){const i=e.replace(/\[(\d+)\]/g,".$1").split(".");let r=t;for(const t of i)if(r=Object(r)[t],void 0===r)return s;return r}lodash_set(t,e,s){return Object(t)!==t?t:(Array.isArray(e)||(e=e.toString().match(/[^.[\]]+/g)||[]),e.slice(0,-1).reduce((t,s,i)=>Object(t[s])===t[s]?t[s]:t[s]=Math.abs(e[i+1])>>0==+e[i+1]?[]:{},t)[e[e.length-1]]=s,t)}getdata(t){let e=this.getval(t);if(/^@/.test(t)){const[,s,i]=/^@(.*?)\.(.*?)$/.exec(t),r=s?this.getval(s):"";if(r)try{const t=JSON.parse(r);e=t?this.lodash_get(t,i,""):e}catch(t){e=""}}return e}setdata(t,e){let s=!1;if(/^@/.test(e)){const[,i,r]=/^@(.*?)\.(.*?)$/.exec(e),o=this.getval(i),h=i?"null"===o?null:o||"{}":"{}";try{const e=JSON.parse(h);this.lodash_set(e,r,t),s=this.setval(JSON.stringify(e),i)}catch(e){const o={};this.lodash_set(o,r,t),s=this.setval(JSON.stringify(o),i)}}else s=this.setval(t,e);return s}getval(t){return this.isSurge()||this.isLoon()?$persistentStore.read(t):this.isQuanX()?$prefs.valueForKey(t):this.isNode()?(this.data=this.loaddata(),this.data[t]):this.data&&this.data[t]||null}setval(t,e){return this.isSurge()||this.isLoon()?$persistentStore.write(t,e):this.isQuanX()?$prefs.setValueForKey(t,e):this.isNode()?(this.data=this.loaddata(),this.data[e]=t,this.writedata(),!0):this.data&&this.data[e]||null}initGotEnv(t){this.got=this.got?this.got:require("got"),this.cktough=this.cktough?this.cktough:require("tough-cookie"),this.ckjar=this.ckjar?this.ckjar:new this.cktough.CookieJar,t&&(t.headers=t.headers?t.headers:{},void 0===t.headers.Cookie&&void 0===t.cookieJar&&(t.cookieJar=this.ckjar))}get(t,e=(()=>{})){t.headers&&(delete t.headers["Content-Type"],delete t.headers["Content-Length"]),this.isSurge()||this.isLoon()?(this.isSurge()&&this.isNeedRewrite&&(t.headers=t.headers||{},Object.assign(t.headers,{"X-Surge-Skip-Scripting":!1})),$httpClient.get(t,(t,s,i)=>{!t&&s&&(s.body=i,s.statusCode=s.status),e(t,s,i)})):this.isQuanX()?(this.isNeedRewrite&&(t.opts=t.opts||{},Object.assign(t.opts,{hints:!1})),$task.fetch(t).then(t=>{const{statusCode:s,statusCode:i,headers:r,body:o}=t;e(null,{status:s,statusCode:i,headers:r,body:o},o)},t=>e(t))):this.isNode()&&(this.initGotEnv(t),this.got(t).on("redirect",(t,e)=>{try{if(t.headers["set-cookie"]){const s=t.headers["set-cookie"].map(this.cktough.Cookie.parse).toString();s&&this.ckjar.setCookieSync(s,null),e.cookieJar=this.ckjar}}catch(t){this.logErr(t)}}).then(t=>{const{statusCode:s,statusCode:i,headers:r,body:o}=t;e(null,{status:s,statusCode:i,headers:r,body:o},o)},t=>{const{message:s,response:i}=t;e(s,i,i&&i.body)}))}post(t,e=(()=>{})){if(t.body&&t.headers&&!t.headers["Content-Type"]&&(t.headers["Content-Type"]="application/x-www-form-urlencoded"),t.headers&&delete t.headers["Content-Length"],this.isSurge()||this.isLoon())this.isSurge()&&this.isNeedRewrite&&(t.headers=t.headers||{},Object.assign(t.headers,{"X-Surge-Skip-Scripting":!1})),$httpClient.post(t,(t,s,i)=>{!t&&s&&(s.body=i,s.statusCode=s.status),e(t,s,i)});else if(this.isQuanX())t.method="POST",this.isNeedRewrite&&(t.opts=t.opts||{},Object.assign(t.opts,{hints:!1})),$task.fetch(t).then(t=>{const{statusCode:s,statusCode:i,headers:r,body:o}=t;e(null,{status:s,statusCode:i,headers:r,body:o},o)},t=>e(t));else if(this.isNode()){this.initGotEnv(t);const{url:s,...i}=t;this.got.post(s,i).then(t=>{const{statusCode:s,statusCode:i,headers:r,body:o}=t;e(null,{status:s,statusCode:i,headers:r,body:o},o)},t=>{const{message:s,response:i}=t;e(s,i,i&&i.body)})}}time(t,e=null){const s=e?new Date(e):new Date;let i={"M+":s.getMonth()+1,"d+":s.getDate(),"H+":s.getHours(),"m+":s.getMinutes(),"s+":s.getSeconds(),"q+":Math.floor((s.getMonth()+3)/3),S:s.getMilliseconds()};/(y+)/.test(t)&&(t=t.replace(RegExp.$1,(s.getFullYear()+"").substr(4-RegExp.$1.length)));for(let e in i)new RegExp("("+e+")").test(t)&&(t=t.replace(RegExp.$1,1==RegExp.$1.length?i[e]:("00"+i[e]).substr((""+i[e]).length)));return t}msg(e=t,s="",i="",r){const o=t=>{if(!t)return t;if("string"==typeof t)return this.isLoon()?t:this.isQuanX()?{"open-url":t}:this.isSurge()?{url:t}:void 0;if("object"==typeof t){if(this.isLoon()){let e=t.openUrl||t.url||t["open-url"],s=t.mediaUrl||t["media-url"];return{openUrl:e,mediaUrl:s}}if(this.isQuanX()){let e=t["open-url"]||t.url||t.openUrl,s=t["media-url"]||t.mediaUrl;return{"open-url":e,"media-url":s}}if(this.isSurge()){let e=t.url||t.openUrl||t["open-url"];return{url:e}}}};if(this.isMute||(this.isSurge()||this.isLoon()?$notification.post(e,s,i,o(r)):this.isQuanX()&&$notify(e,s,i,o(r))),!this.isMuteLog){let t=["","==============📣系统通知📣=============="];t.push(e),s&&t.push(s),i&&t.push(i),console.log(t.join("\n")),this.logs=this.logs.concat(t)}}log(...t){t.length>0&&(this.logs=[...this.logs,...t]),console.log(t.join(this.logSeparator))}logErr(t,e){const s=!this.isSurge()&&!this.isQuanX()&&!this.isLoon();s?this.log("",`❗️${this.name}, 错误!`,t.stack):this.log("",`❗️${this.name}, 错误!`,t)}wait(t){return new Promise(e=>setTimeout(e,t))}done(t={}){const e=(new Date).getTime(),s=(e-this.startTime)/1e3;this.log("",`🔔${this.name}, 结束! 🕛 ${s} 秒`),this.log(),(this.isSurge()||this.isQuanX()||this.isLoon())&&$done(t)}}(t,e)} --------------------------------------------------------------------------------