├── .gitattributes ├── .github └── workflows │ ├── deploy_tencent_scf.yml │ ├── docker_build.yml │ ├── repo_sync.yml │ ├── update_ios_task.yml │ └── update_list.yml ├── .gitignore ├── JD_extra_cookie.js ├── JS_USER_AGENTS.js ├── Loon └── lxk0301_LoonTask.conf ├── QuantumultX ├── lxk0301_cookies.conf └── lxk0301_gallery.json ├── README.md ├── Surge └── lxk0301_Task.sgmodule.sgmodule ├── USER_AGENTS.js ├── activity ├── jd_5g.js ├── jd_818.js ├── jd_GoldcoinToGift.js ├── jd_apple_live.js ├── jd_bean_home.js ├── jd_big_winner.js ├── jd_blueCoin.js ├── jd_bookshop.js ├── jd_carnivalcity.js ├── jd_carnivalcity_help.js ├── jd_cfd_loop.js ├── jd_cfd_mooncake.js ├── jd_cfdtx.js ├── jd_city.js ├── jd_connoisseur.js ├── jd_coupon.js ├── jd_crazy_joy.js ├── jd_crazy_joy_bonus.js ├── jd_crazy_joy_coin.js ├── jd_daily_egg.js ├── jd_ddworld.js ├── jd_ddworld_exchange.js ├── jd_digital_floor.js ├── jd_ds.js ├── jd_esManager.js ├── jd_exchangejxbeans.js ├── jd_family.js ├── jd_festival.js ├── jd_firecrackers.js ├── jd_firecrackers2.js ├── jd_foodRunning.js ├── jd_global.js ├── jd_global_mh.js ├── jd_gold_creator.js ├── jd_health.js ├── jd_immortal.js ├── jd_immortal_answer.js ├── jd_industryLottery.js ├── jd_jdh.js ├── jd_joy.js ├── jd_joy_feedPets.js ├── jd_joy_reward.js ├── jd_joy_run.js ├── jd_joy_steal.js ├── jd_jump.js ├── jd_jxd.js ├── jd_jxg.js ├── jd_jxlhb.js ├── jd_jxnc.js ├── jd_jxstory.js ├── jd_live.js ├── jd_live_redrain.js ├── jd_live_redrain2.js ├── jd_market_lottery.js ├── jd_mcxhd.js ├── jd_mf.js ├── jd_mh.js ├── jd_mohe.js ├── jd_ms.js ├── jd_ms_redrain.js ├── jd_necklace.js ├── jd_newYearMoney.js ├── jd_newYearMoney_lottery.js ├── jd_nh.js ├── jd_nhRedEnvelope.js ├── jd_nian.js ├── jd_nian_ar.js ├── jd_nian_sign.js ├── jd_nian_wechat.js ├── jd_nzmh.js ├── jd_party_night.js ├── jd_petTreasureBox.js ├── jd_plusLottery.js ├── jd_pubg.js ├── jd_redPacket.js ├── jd_sendBeans.js ├── jd_shop.js ├── jd_small_home.js ├── jd_speed.js ├── jd_split.js ├── jd_star_shop.js ├── jd_summer_movement.js ├── jd_superMarket.js ├── jd_super_box.js ├── jd_syj.js ├── jd_tcl.js ├── jd_unbind.js ├── jd_watch.js ├── jd_xg.js ├── jd_xgyl.js ├── jd_xtg.js ├── jd_xtg_help.js ├── jd_ys.js ├── jd_zoo.js ├── jd_zooCollect.js └── jr_sign.js ├── backUp ├── AlipayManor.js ├── GetJdCookie.md ├── GetJdCookie2.md ├── TG_PUSH.md ├── gitSync.md ├── iCloud.md ├── iOS_Weather_AQI_Standard.js ├── jd_joy_help.js ├── tencentscf.md ├── webhook.js └── xmSports.js ├── docker ├── Dockerfile ├── Readme.md ├── auto_help.sh ├── bot │ ├── jd.png │ ├── jd_bot │ ├── requirements.txt │ └── setup.py ├── crontab_list.sh ├── default_task.sh ├── docker_entrypoint.sh ├── example │ ├── custom-append.yml │ ├── custom-overwrite.yml │ ├── default.yml │ ├── docker多账户使用独立容器使用说明.md │ ├── jd_scripts.custom-append.syno.json │ ├── jd_scripts.custom-overwrite.syno.json │ ├── jd_scripts.syno.json │ └── multi.yml ├── notify_docker_user.js └── proc_file.sh ├── getJDCookie.js ├── githubAction.md ├── icon ├── DD_bot.png ├── Snipaste_2020-08-28_09-31-42.png ├── TG_PUSH1.png ├── TG_PUSH2.png ├── TG_PUSH3.png ├── action1.png ├── action2.png ├── action3.png ├── bark.jpg ├── bean_sign_simple.jpg ├── disable-action.jpg ├── fork.png ├── git1.jpg ├── git10.jpg ├── git11.jpg ├── git12.jpg ├── git13.jpg ├── git14.jpg ├── git2.jpg ├── git3.jpg ├── git4.jpg ├── git5.jpg ├── git6.jpg ├── git7.png ├── git8.jpg ├── git9.jpg ├── iCloud1.png ├── iCloud2.png ├── iCloud3.png ├── iCloud4.png ├── iCloud5.png ├── iCloud6.png ├── iCloud7.png ├── iCloud8.png ├── jd1.jpg ├── jd2.jpg ├── jd3.jpg ├── jd4.jpg ├── jd5.png ├── jd6.png ├── jd7.png ├── jd8.png ├── jd_moneyTree.png ├── jd_pet.png ├── qh1.png ├── qh2.png ├── qh3.png └── txy.png ├── index.js ├── jdCookie.js ├── jdDreamFactoryShareCodes.js ├── jdFactoryShareCodes.js ├── jdFruitShareCodes.js ├── jdJxncShareCodes.js ├── jdPetShareCodes.js ├── jdPlantBeanShareCodes.js ├── jd_bean_change.js ├── jd_bean_sign.js ├── jd_beauty.js ├── jd_cash.js ├── jd_ccSign.js ├── jd_cfd.js ├── jd_club_lottery.js ├── jd_daily_lottery.js ├── jd_delCoupon.js ├── jd_dreamFactory.js ├── jd_fruit.js ├── jd_get_share_code.js ├── jd_health.js ├── jd_health_collect.js ├── jd_jdfactory.js ├── jd_jdzz.js ├── jd_jin_tie.js ├── jd_jxmc.js ├── jd_kd.js ├── jd_moneyTree.js ├── jd_pet.js ├── jd_pigPet.js ├── jd_plantBean.js ├── jd_sgmh.js ├── jd_speed_redpocke.js ├── jd_speed_sign.js ├── jd_try.js ├── jd_unsubscribe.js ├── jd_wish.js ├── jx_sign.js ├── lxk0301.boxjs.json ├── package.json ├── sendNotify.js ├── serverless.yml ├── tencentscf.js ├── update_list.sh ├── update_task.sh └── utils ├── JDJRValidator.js ├── JDJRValidator_Pure.js ├── JDSignValidator.js ├── MoveMentFaker.js ├── ZooFaker_Necklace.js └── jdShareCodes.js /.gitattributes: -------------------------------------------------------------------------------- 1 | * text eol=lf 2 | *.png -text 3 | *.jpg -text -------------------------------------------------------------------------------- /.github/workflows/docker_build.yml: -------------------------------------------------------------------------------- 1 | name: 构建JD Scripts镜像 2 | on: 3 | #防止fork乱用action设置只能手动触发构建 4 | workflow_dispatch: 5 | 6 | jobs: 7 | build-and-push: 8 | runs-on: ubuntu-latest 9 | steps: 10 | - name: Checkout 11 | uses: actions/checkout@master 12 | 13 | - name: Set up QEMU 14 | uses: docker/setup-qemu-action@v1 15 | 16 | - name: Set up Docker Buildx 17 | uses: docker/setup-buildx-action@v1 18 | 19 | - name: Login to DockerHub 20 | uses: docker/login-action@v1 21 | with: 22 | username: ${{ secrets.DOCKERHUB_USERNAME }} 23 | password: ${{ secrets.DOCKERHUB_TOKEN }} 24 | 25 | - name: 构建并推送到Dockerhub镜像仓库 26 | uses: docker/build-push-action@v2 27 | with: 28 | context: . 29 | file: ./docker/Dockerfile 30 | platforms: linux/amd64,linux/arm/v6,linux/arm/v7,linux/arm64 31 | push: true 32 | tags: | 33 | lxk0301/jd_scripts:latest 34 | -------------------------------------------------------------------------------- /.github/workflows/repo_sync.yml: -------------------------------------------------------------------------------- 1 | # File: .github/workflows/repo-sync.yml 2 | name: sync-LXK9301-scripts 3 | on: 4 | schedule: 5 | - cron: '1 0,15 * * *' 6 | workflow_dispatch: 7 | watch: 8 | types: started 9 | push: 10 | branches: [ master ] 11 | repository_dispatch: 12 | types: sync-LXK9301-scripts 13 | jobs: 14 | repo-sync: 15 | env: 16 | PAT: ${{ secrets.PAT }} #此处PAT需要申请,教程详见:https://www.jianshu.com/p/bb82b3ad1d11 17 | dst_key: ${{ secrets.GITEE_PRIVATE_KEY }} # 我自己同步到gitee使用,其他人可忽略 18 | runs-on: ubuntu-latest 19 | if: github.event.repository.owner.id == github.event.sender.id 20 | steps: 21 | - uses: actions/checkout@v2 22 | with: 23 | persist-credentials: false 24 | 25 | - name: sync LXK9301-scripts 26 | uses: repo-sync/github-sync@v2 27 | if: env.PAT 28 | with: 29 | source_repo: "https://gitee.com/lxk0301/jd_scripts.git" 30 | source_branch: "master" 31 | destination_branch: "master" 32 | github_token: ${{ secrets.PAT }} 33 | # 我自己同步到gitee使用,其他人可忽略 34 | - name: sync github -> gitee 35 | uses: Yikun/hub-mirror-action@master 36 | if: env.dst_key 37 | with: 38 | src: github/LXK9301 39 | dst: gitee/lxk0301 40 | static_list: "jd_scripts" 41 | dst_key: ${{ secrets.GITEE_PRIVATE_KEY }} 42 | dst_token: ${{ secrets.GITEE_TOKEN }} 43 | -------------------------------------------------------------------------------- /.github/workflows/update_ios_task.yml: -------------------------------------------------------------------------------- 1 | name: update_ios_task 2 | 3 | 4 | on: 5 | workflow_dispatch: 6 | #schedule: 7 | #- cron: '0 4,16 * * *' 8 | repository_dispatch: 9 | types: update_ios_task 10 | push: 11 | branches: [ master ] 12 | jobs: 13 | build: 14 | runs-on: ubuntu-latest 15 | #if: github.event.repository.owner.id == github.event.sender.id 16 | steps: 17 | - name: Checkout 18 | uses: actions/checkout@v2 19 | with: 20 | repository: ${{ github.repository }} 21 | 22 | - name: "更新iOS端3大订阅软件订阅配置" 23 | run: | 24 | bash update_task.sh 25 | - name: commit 26 | run: | 27 | git config --global user.email ${{ secrets.EMAIL }} 28 | git config --global user.name lxk0301 29 | git add . 30 | git commit -m "更新iOS端3大软件订阅配置 by lxk0301 Github Action" -a || echo "Nothing to update" 31 | - name: Push changes 32 | uses: ad-m/github-push-action@master 33 | with: 34 | github_token: ${{ secrets.TOKEN }} 35 | branch: master 36 | -------------------------------------------------------------------------------- /.github/workflows/update_list.yml: -------------------------------------------------------------------------------- 1 | name: update_list 2 | 3 | 4 | on: 5 | workflow_dispatch: 6 | #schedule: 7 | #- cron: '1 5,17 * * *' 8 | repository_dispatch: 9 | types: update_list 10 | push: 11 | branches: [ master ] 12 | jobs: 13 | build: 14 | runs-on: ubuntu-latest 15 | #if: github.event.repository.owner.id == github.event.sender.id 16 | steps: 17 | - name: Checkout 18 | uses: actions/checkout@v2 19 | with: 20 | repository: ${{ github.repository }} 21 | 22 | - name: "更新Readme中脚本清单列表" 23 | run: | 24 | bash update_list.sh 25 | - name: commit 26 | run: | 27 | git config --global user.email ${{ secrets.EMAIL }} 28 | git config --global user.name lxk0301 29 | git add . 30 | git commit -m "更新Readme中脚本清单列表 by lxk0301 Github Action" -a || echo "Nothing to update" 31 | - name: Push changes 32 | uses: ad-m/github-push-action@master 33 | with: 34 | github_token: ${{ secrets.TOKEN }} 35 | branch: master 36 | -------------------------------------------------------------------------------- /.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 -------------------------------------------------------------------------------- /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 | -------------------------------------------------------------------------------- /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 | 仓库脚本已内置本人远程助力地址和助力码,请不要使用!!!请不要使用!!!请不要使用!!! 2 | -------------------------------------------------------------------------------- /Surge/lxk0301_Task.sgmodule.sgmodule: -------------------------------------------------------------------------------- 1 | #!name=lxk0301 iOS Tasks&Cookies Module 2 | #!desc=iOS Tasks&Cookies 模块配置 3 | 4 | # Task&Cookies模块配置 5 | # TG讨论组 (https://t.me/JD_fruit_pet) 6 | 7 | [Script] 8 | 京东资产变动通知 = type=cron,cronexp="2 9 * * *",wake-system=1,timeout=3600,script-path=https://gitee.com/lxk0301/jd_scripts/raw/master/jd_bean_change.js 9 | 领京豆额外奖励 = type=cron,cronexp="10 7 * * *",wake-system=1,timeout=3600,script-path=https://gitee.com/lxk0301/jd_scripts/raw/master/jd_bean_home.js 10 | 省钱大赢家之翻翻乐 = type=cron,cronexp="20 * * * *",wake-system=1,timeout=3600,script-path=https://gitee.com/lxk0301/jd_scripts/raw/master/jd_big_winner.js 11 | 东东超市兑换奖品 = type=cron,cronexp="0 0 0 * * *",wake-system=1,timeout=3600,script-path=https://gitee.com/lxk0301/jd_scripts/raw/master/jd_blueCoin.js 12 | 口袋书店 = type=cron,cronexp="1 8,12,18 * * *",wake-system=1,timeout=3600,script-path=https://gitee.com/lxk0301/jd_scripts/raw/master/jd_bookshop.js 13 | 京东汽车 = type=cron,cronexp="10 7 * * *",wake-system=1,timeout=3600,script-path=https://gitee.com/lxk0301/jd_scripts/raw/master/jd_car.js 14 | 京东汽车兑换 = type=cron,cronexp="0 0 * * *",wake-system=1,timeout=3600,script-path=https://gitee.com/lxk0301/jd_scripts/raw/master/jd_car_exchange.js 15 | 京东手机狂欢城 = type=cron,cronexp=0 0-18/6 * * *,wake-system=1,timeout=3600,script-path=https://gitee.com/lxk0301/jd_scripts/raw/master/jd_carnivalcity.js 16 | 签到领现金 = type=cron,cronexp="2 0-23/4 * * *",wake-system=1,timeout=3600,script-path=https://gitee.com/lxk0301/jd_scripts/raw/master/jd_cash.js 17 | 京喜财富岛 = type=cron,cronexp="5 8,13,19 * * *",wake-system=1,timeout=3600,script-path=https://gitee.com/lxk0301/jd_scripts/raw/master/jd_cfd.js 18 | 摇京豆 = type=cron,cronexp="5 0,23 * * *",wake-system=1,timeout=3600,script-path=https://gitee.com/lxk0301/jd_scripts/raw/master/jd_club_lottery.js 19 | crazyJoy任务 = type=cron,cronexp="10 9 * * *",wake-system=1,timeout=3600,script-path=https://gitee.com/lxk0301/jd_scripts/raw/master/jd_crazy_joy.js 20 | 监控crazyJoy分红 = type=cron,cronexp="10 12 * * *",wake-system=1,timeout=3600,script-path=https://gitee.com/lxk0301/jd_scripts/raw/master/jd_crazy_joy_bonus.js 21 | crazyJoy挂机 = type=cron,cronexp="10 1,12 * * *",wake-system=1,timeout=20,script-path=https://gitee.com/lxk0301/jd_scripts/raw/master/jd_crazy_joy_coin.js 22 | 天天提鹅 = type=cron,cronexp="10 * * * *",wake-system=1,timeout=3600,script-path=https://gitee.com/lxk0301/jd_scripts/raw/master/jd_daily_egg.js 23 | 每日抽奖 = type=cron,cronexp="13 1,22,23 * * *",wake-system=1,timeout=3600,script-path=https://gitee.com/lxk0301/jd_scripts/raw/master/jd_daily_lottery.js 24 | 京喜工厂 = type=cron,cronexp="10 * * * *",wake-system=1,timeout=3600,script-path=https://gitee.com/lxk0301/jd_scripts/raw/master/jd_dreamFactory.js 25 | 获取多账号京东Cookie = type=http-request,pattern=^https:\/\/me-api\.jd\.com\/user_new\/info\/GetJDUserInfoUnion,requires-body=1,max-size=0,script-path=https://gitee.com/lxk0301/jd_scripts/raw/master/JD_extra_cookie.js,script-update-interval=0 26 | 京东家庭号 = type=cron,cronexp="1 12,23 * * *",wake-system=1,timeout=3600,script-path=https://gitee.com/lxk0301/jd_scripts/raw/master/jd_family.js 27 | 东东农场 = type=cron,cronexp="5 6-18/6 * * *",wake-system=1,timeout=3600,script-path=https://gitee.com/lxk0301/jd_scripts/raw/master/jd_fruit.js 28 | 获取互助码 = type=cron,cronexp="20 13 * * 6",wake-system=1,timeout=3600,script-path=https://gitee.com/lxk0301/jd_scripts/raw/master/jd_get_share_code.js 29 | 金榜创造营 = type=cron,cronexp="13 1,22 * * *",wake-system=1,timeout=3600,script-path=https://gitee.com/lxk0301/jd_scripts/raw/master/jd_gold_creator.js 30 | 东东健康社区 = type=cron,cronexp="13 1,6,22 * * *",wake-system=1,timeout=3600,script-path=https://gitee.com/lxk0301/jd_scripts/raw/master/jd_health.js 31 | 东东健康社区收集能量 = type=cron,cronexp="5-45/20 * * * *",wake-system=1,timeout=3600,script-path=https://gitee.com/lxk0301/jd_scripts/raw/master/jd_health_collect.js 32 | 东东工厂 = type=cron,cronexp="10 * * * *",wake-system=1,timeout=3600,script-path=https://gitee.com/lxk0301/jd_scripts/raw/master/jd_jdfactory.js 33 | 京东赚赚 = type=cron,cronexp="10 0 * * *",wake-system=1,timeout=3600,script-path=https://gitee.com/lxk0301/jd_scripts/raw/master/jd_jdzz.js 34 | 领金贴 = type=cron,cronexp="10 0 * * *",wake-system=1,timeout=3600,script-path=https://gitee.com/lxk0301/jd_scripts/raw/master/jd_jin_tie.js 35 | 京东宠汪汪 = type=cron,cronexp="15 0-23/2 * * *",wake-system=1,timeout=3600,script-path=https://gitee.com/lxk0301/jd_scripts/raw/master/jd_joy.js 36 | 京东宠汪汪喂食 = type=cron,cronexp="15 0-23/1 * * *",wake-system=1,timeout=3600,script-path=https://gitee.com/lxk0301/jd_scripts/raw/master/jd_joy_feedPets.js 37 | 宠汪汪强制为别人助力= type=http-request,pattern=^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,requires-body=1,max-size=0,script-path=https://gitee.com/lxk0301/jd_scripts/raw/master/jd_joy_help.js 38 | 宠汪汪积分兑换奖品 = type=cron,cronexp="0 0-16/8 * * *",wake-system=1,timeout=3600,script-path=https://gitee.com/lxk0301/jd_scripts/raw/master/jd_joy_reward.js 39 | 宠汪汪邀请助力与赛跑助力 = type=cron,cronexp="15 10 * * *",wake-system=1,timeout=3600,script-path=https://gitee.com/lxk0301/jd_scripts/raw/master/jd_joy_run.js 40 | 宠汪汪助力更新Token = type=http-response,pattern=^https:\/\/draw\.jdfcloud\.com(\/mirror)?\/\/api\/user\/addUser\?code=, requires-body=1, max-size=0, script-path=https://gitee.com/lxk0301/jd_scripts/raw/master/jd_joy_run.js 41 | 宠汪汪助力获取Token = type=http-request,pattern=^https:\/\/draw\.jdfcloud\.com(\/mirror)?\/\/api\/user\/user\/detail\?openId=, max-size=0, script-path=https://gitee.com/lxk0301/jd_scripts/raw/master/jd_joy_run.js 42 | 宠汪汪偷好友积分与狗粮 = type=cron,cronexp="10 0-21/3 * * *",wake-system=1,timeout=3600,script-path=https://gitee.com/lxk0301/jd_scripts/raw/master/jd_joy_steal.js 43 | 跳跳乐瓜分京豆 = type=cron,cronexp="1 0,11,21 * * *",wake-system=1,timeout=3600,script-path=https://gitee.com/lxk0301/jd_scripts/raw/master/jd_jump.js 44 | 京喜领88元红包 = type=cron,cronexp="4 10 * * *",wake-system=1,timeout=3600,script-path=https://gitee.com/lxk0301/jd_scripts/raw/master/jd_jxlhb.js 45 | 惊喜牧场 = type=cron,cronexp="20 0-23/3 * * *",wake-system=1,timeout=3600,script-path=https://gitee.com/lxk0301/jd_scripts/raw/master/jd_jxmc.js 46 | 京喜农场 = type=cron,cronexp="0 9,12,18 * * *",timeout=3600,script-path=https://gitee.com/lxk0301/jd_scripts/raw/master/jd_jxnc.js 47 | 京东快递签到 = type=cron,cronexp="10 0 * * *",wake-system=1,timeout=3600,script-path=https://gitee.com/lxk0301/jd_scripts/raw/master/jd_kd.js 48 | 京东直播 = type=cron,cronexp="10-20/5 12 * * *",wake-system=1,timeout=3600,script-path=https://gitee.com/lxk0301/jd_scripts/raw/master/jd_live.js 49 | 超级直播间红包雨 = type=cron,cronexp="0,30 0-23/1 * * *",wake-system=1,timeout=3600,script-path=https://gitee.com/lxk0301/jd_scripts/raw/master/jd_live_redrain.js 50 | 幸运大转盘 = type=cron,cronexp="4 10 * * *",wake-system=1,timeout=3600,script-path=https://gitee.com/lxk0301/jd_scripts/raw/master/jd_market_lottery.js 51 | 新潮品牌狂欢 = type=cron,cronexp="4 10 * * *",wake-system=1,timeout=3600,script-path=https://gitee.com/lxk0301/jd_scripts/raw/master/jd_mcxhd.js 52 | 5G超级盲盒 = type=cron,cronexp="0 0,1-23/3 * * *",wake-system=1,timeout=3600,script-path=https://gitee.com/lxk0301/jd_scripts/raw/master/jd_mohe.js 53 | 京东摇钱树 = type=cron,cronexp="3 0-23/2 * * *",wake-system=1,timeout=3600,script-path=https://gitee.com/lxk0301/jd_scripts/raw/master/jd_moneyTree.js 54 | 京东秒秒币 = type=cron,cronexp="10 7 * * *",wake-system=1,timeout=200,script-path=https://gitee.com/lxk0301/jd_scripts/raw/master/jd_ms.js 55 | 点点券 = type=cron,cronexp="10 0,20 * * *",wake-system=1,timeout=3600,script-path=https://gitee.com/lxk0301/jd_scripts/raw/master/jd_necklace.js 56 | 女装盲盒 = type=cron,cronexp="35 1,23 * * *",wake-system=1,timeout=3600,script-path=https://gitee.com/lxk0301/jd_scripts/raw/master/jd_nzmh.js 57 | 东东萌宠 = type=cron,cronexp="15 6-18/6 * * *",wake-system=1,timeout=3600,script-path=https://gitee.com/lxk0301/jd_scripts/raw/master/jd_pet.js 58 | 京东金融养猪猪 = type=cron,cronexp="12 0-23/6 * * *",wake-system=1,timeout=3600,script-path=https://gitee.com/lxk0301/jd_scripts/raw/master/jd_pigPet.js 59 | 京东种豆得豆 = type=cron,cronexp="1 7-21/2 * * *",wake-system=1,timeout=3600,script-path=https://gitee.com/lxk0301/jd_scripts/raw/master/jd_plantBean.js 60 | 京东保价 = type=cron,cronexp="0 2 * * *",wake-system=1,timeout=3600,script-path=https://gitee.com/lxk0301/jd_scripts/raw/master/jd_price.js 61 | 京东全民开红包 = type=cron,cronexp="1 1,2,23 * * *",wake-system=1,timeout=3600,script-path=https://gitee.com/lxk0301/jd_scripts/raw/master/jd_redPacket.js 62 | 闪购盲盒 = type=cron,cronexp="20 8 * * *",wake-system=1,timeout=3600,script-path=https://gitee.com/lxk0301/jd_scripts/raw/master/jd_sgmh.js 63 | 进店领豆 = type=cron,cronexp="10 0 * * *",wake-system=1,timeout=3600,script-path=https://gitee.com/lxk0301/jd_scripts/raw/master/jd_shop.js 64 | 东东小窝 = type=cron,cronexp="16 22 * * *",wake-system=1,timeout=3600,script-path=https://gitee.com/lxk0301/jd_scripts/raw/master/jd_small_home.js 65 | 天天加速 = type=cron,cronexp="8 0-23/3 * * *",wake-system=1,timeout=3600,script-path=https://gitee.com/lxk0301/jd_scripts/raw/master/jd_speed.js 66 | 京东极速版红包 = type=cron,cronexp="20 0,22 * * *",wake-system=1,timeout=3600,script-path=https://gitee.com/lxk0301/jd_scripts/raw/master/jd_speed_redpocke.js 67 | 京东极速版 = type=cron,cronexp="0 7 * * *",wake-system=1,timeout=33600,script-path=https://gitee.com/lxk0301/jd_scripts/raw/master/jd_speed_sign.js 68 | 明星小店 = type=cron,cronexp="0 1,21 * * *",wake-system=1,timeout=3600,script-path=https://gitee.com/lxk0301/jd_scripts/raw/master/jd_star_shop.js 69 | 东东超市 = type=cron,cronexp="11 * * * *",wake-system=1,timeout=3600,script-path=https://gitee.com/lxk0301/jd_scripts/raw/master/jd_superMarket.js 70 | 赚京豆 = type=cron,cronexp="10 0,7,23 * * *",wake-system=1,timeout=3600,script-path=https://gitee.com/lxk0301/jd_scripts/raw/master/jd_syj.js 71 | 取关京东店铺商品 = type=cron,cronexp="55 23 * * *",wake-system=1,timeout=3600,script-path=https://gitee.com/lxk0301/jd_scripts/raw/master/jd_unsubscribe.js 72 | 家电星推官 = type=cron,cronexp="0 0 0 * * *",wake-system=1,timeout=3600,script-path=https://gitee.com/lxk0301/jd_scripts/raw/master/jd_xtg.js 73 | 家电星推官好友互助 = type=cron,cronexp="0 0 0 * * *",wake-system=1,timeout=3600,script-path=https://gitee.com/lxk0301/jd_scripts/raw/master/jd_xtg_help.js 74 | 618动物联萌 = type=cron,cronexp="33 0,6-23/2 * * *",wake-system=1,timeout=3600,script-path=https://gitee.com/lxk0301/jd_scripts/raw/master/jd_zoo.js 75 | 618动物联萌收集金币 = type=cron,cronexp="0-59/30 * * * *",wake-system=1,timeout=3600,script-path=https://gitee.com/lxk0301/jd_scripts/raw/master/jd_zooCollect.js 76 | 小米运动 = type=cron,cronexp="15 17 * * *",wake-system=1,timeout=3600,script-path=https://gitee.com/lxk0301/jd_scripts/raw/master/backUp/xmSports.js 77 | 小米运动获取Token = type=http-response,pattern=^https:\/\/account\.huami\.com\/v2\/client\/login, requires-body=1, max-size=0, script-path=https://gitee.com/lxk0301/jd_scripts/raw/master/backUp/xmSports.js 78 | 79 | [MITM] 80 | hostname = %APPEND% me-api.jd.com, draw.jdfcloud.com, jdjoy.jd.com, account.huami.com 81 | -------------------------------------------------------------------------------- /USER_AGENTS.js: -------------------------------------------------------------------------------- 1 | const USER_AGENTS = [ 2 | "jdapp;android;10.1.6;10;network/wifi;Mozilla/5.0 (Linux; Android 10; ONEPLUS A5010 Build/QKQ1.191014.012; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/77.0.3865.120 MQQBrowser/6.2 TBS/045230 Mobile Safari/537.36", 3 | "jdapp;iPhone;10.1.6;14.3;network/4g;Mozilla/5.0 (iPhone; CPU iPhone OS 14_3 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148;supportJDSHWK/1", 4 | "jdapp;android;10.1.6;9;network/4g;Mozilla/5.0 (Linux; Android 9; Mi Note 3 Build/PKQ1.181007.001; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/66.0.3359.126 MQQBrowser/6.2 TBS/045131 Mobile Safari/537.36", 5 | "jdapp;android;10.1.6;10;network/wifi;Mozilla/5.0 (Linux; Android 10; GM1910 Build/QKQ1.190716.003; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/77.0.3865.120 MQQBrowser/6.2 TBS/045230 Mobile Safari/537.36", 6 | "jdapp;android;10.1.6;9;network/wifi;Mozilla/5.0 (Linux; Android 9; 16T Build/PKQ1.190616.001; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/66.0.3359.126 MQQBrowser/6.2 TBS/044942 Mobile Safari/537.36", 7 | "jdapp;iPhone;10.1.6;13.6;network/wifi;Mozilla/5.0 (iPhone; CPU iPhone OS 13_6 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148;supportJDSHWK/1", 8 | "jdapp;iPhone;10.1.6;13.6;network/wifi;Mozilla/5.0 (iPhone; CPU iPhone OS 13_6 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148;supportJDSHWK/1", 9 | "jdapp;iPhone;10.1.6;13.5;network/wifi;Mozilla/5.0 (iPhone; CPU iPhone OS 13_5 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148;supportJDSHWK/1", 10 | "jdapp;iPhone;10.1.6;14.1;network/wifi;Mozilla/5.0 (iPhone; CPU iPhone OS 14_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148;supportJDSHWK/1", 11 | "jdapp;iPhone;10.1.6;13.3;network/wifi;Mozilla/5.0 (iPhone; CPU iPhone OS 13_3 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148;supportJDSHWK/1", 12 | "jdapp;iPhone;10.1.6;13.7;network/wifi;Mozilla/5.0 (iPhone; CPU iPhone OS 13_7 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148;supportJDSHWK/1", 13 | "jdapp;iPhone;10.1.6;14.1;network/wifi;Mozilla/5.0 (iPhone; CPU iPhone OS 14_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148;supportJDSHWK/1", 14 | "jdapp;iPhone;10.1.6;13.3;network/wifi;Mozilla/5.0 (iPhone; CPU iPhone OS 13_3 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148;supportJDSHWK/1", 15 | "jdapp;iPhone;10.1.6;13.4;network/wifi;Mozilla/5.0 (iPhone; CPU iPhone OS 13_4 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148;supportJDSHWK/1", 16 | "jdapp;iPhone;10.1.6;14.3;network/wifi;Mozilla/5.0 (iPhone; CPU iPhone OS 14_3 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148;supportJDSHWK/1", 17 | "jdapp;android;10.1.6;9;network/wifi;Mozilla/5.0 (Linux; Android 9; MI 6 Build/PKQ1.190118.001; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/66.0.3359.126 MQQBrowser/6.2 TBS/044942 Mobile Safari/537.36", 18 | "jdapp;android;10.1.6;11;network/wifi;Mozilla/5.0 (Linux; Android 11; Redmi K30 5G Build/RKQ1.200826.002; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/77.0.3865.120 MQQBrowser/6.2 TBS/045511 Mobile Safari/537.36", 19 | "jdapp;iPhone;10.1.6;11.4;network/wifi;Mozilla/5.0 (iPhone; CPU iPhone OS 11_4 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15F79", 20 | "jdapp;android;10.1.6;10;;network/wifi;Mozilla/5.0 (Linux; Android 10; M2006J10C Build/QP1A.190711.020; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/77.0.3865.120 MQQBrowser/6.2 TBS/045230 Mobile Safari/537.36", 21 | "jdapp;android;10.1.6;10;network/wifi;Mozilla/5.0 (Linux; Android 10; M2006J10C Build/QP1A.190711.020; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/77.0.3865.120 MQQBrowser/6.2 TBS/045230 Mobile Safari/537.36", 22 | "jdapp;android;10.1.6;10;network/wifi;Mozilla/5.0 (Linux; Android 10; ONEPLUS A6000 Build/QKQ1.190716.003; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/77.0.3865.120 MQQBrowser/6.2 TBS/045224 Mobile Safari/537.36", 23 | "jdapp;android;10.1.6;9;network/wifi;Mozilla/5.0 (Linux; Android 9; MHA-AL00 Build/HUAWEIMHA-AL00; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/66.0.3359.126 MQQBrowser/6.2 TBS/044942 Mobile Safari/537.36", 24 | "jdapp;android;10.1.6;8.1.0;network/wifi;Mozilla/5.0 (Linux; Android 8.1.0; 16 X Build/OPM1.171019.026; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/66.0.3359.126 MQQBrowser/6.2 TBS/044942 Mobile Safari/537.36", 25 | "jdapp;android;10.1.6;8.0.0;network/wifi;Mozilla/5.0 (Linux; Android 8.0.0; HTC U-3w Build/OPR6.170623.013; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/66.0.3359.126 MQQBrowser/6.2 TBS/044942 Mobile Safari/537.36", 26 | "jdapp;iPhone;10.1.6;14.0.1;network/wifi;Mozilla/5.0 (iPhone; CPU iPhone OS 14_0_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148;supportJDSHWK/1", 27 | "jdapp;android;10.1.6;10;network/wifi;Mozilla/5.0 (Linux; Android 10; LYA-AL00 Build/HUAWEILYA-AL00L; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/77.0.3865.120 MQQBrowser/6.2 TBS/045230 Mobile Safari/537.36", 28 | "jdapp;iPhone;10.1.6;14.2;network/wifi;Mozilla/5.0 (iPhone; CPU iPhone OS 14_2 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148;supportJDSHWK/1", 29 | "jdapp;iPhone;10.1.6;14.3;network/wifi;Mozilla/5.0 (iPhone; CPU iPhone OS 14_3 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148;supportJDSHWK/1", 30 | "jdapp;iPhone;10.1.6;14.2;network/wifi;Mozilla/5.0 (iPhone; CPU iPhone OS 14_2 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148;supportJDSHWK/1", 31 | "jdapp;android;10.1.6;8.1.0;network/wifi;Mozilla/5.0 (Linux; Android 8.1.0; MI 8 Build/OPM1.171019.026; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/66.0.3359.126 MQQBrowser/6.2 TBS/045131 Mobile Safari/537.36", 32 | "jdapp;android;10.1.6;10;network/wifi;Mozilla/5.0 (Linux; Android 10; Redmi K20 Pro Premium Edition Build/QKQ1.190825.002; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/77.0.3865.120 MQQBrowser/6.2 TBS/045227 Mobile Safari/537.36", 33 | "jdapp;iPhone;10.1.6;14.3;network/wifi;Mozilla/5.0 (iPhone; CPU iPhone OS 14_3 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148;supportJDSHWK/1", 34 | "jdapp;iPhone;10.1.6;14.3;network/4g;Mozilla/5.0 (iPhone; CPU iPhone OS 14_3 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148;supportJDSHWK/1", 35 | "jdapp;android;10.1.6;11;network/wifi;Mozilla/5.0 (Linux; Android 11; Redmi K20 Pro Premium Edition Build/RKQ1.200826.002; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/77.0.3865.120 MQQBrowser/6.2 TBS/045513 Mobile Safari/537.36", 36 | "jdapp;android;10.1.6;10;network/wifi;Mozilla/5.0 (Linux; Android 10; MI 8 Build/QKQ1.190828.002; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/77.0.3865.120 MQQBrowser/6.2 TBS/045227 Mobile Safari/537.36", 37 | "jdapp;iPhone;10.1.6;14.1;network/wifi;Mozilla/5.0 (iPhone; CPU iPhone OS 14_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148;supportJDSHWK/1", 38 | ] 39 | /** 40 | * 生成随机数字 41 | * @param {number} min 最小值(包含) 42 | * @param {number} max 最大值(不包含) 43 | */ 44 | function randomNumber(min = 0, max = 100) { 45 | return Math.min(Math.floor(min + Math.random() * (max - min)), max); 46 | } 47 | const USER_AGENT = USER_AGENTS[randomNumber(0, USER_AGENTS.length)]; 48 | 49 | module.exports = { 50 | USER_AGENT 51 | } 52 | -------------------------------------------------------------------------------- /activity/jd_petTreasureBox.js: -------------------------------------------------------------------------------- 1 | /* 2 | 更新时间:2020-11-12 3 | 活动入口:京东APP我的-更多工具-宠汪汪 4 | 从github@Zero-S1搬的[https://github.com/Zero-S1/JD_tools/blob/master/jbp.js] 5 | 【宠汪汪聚宝盆辅助脚本】 6 | 1、进入聚宝盆,显示本轮狗粮池投入总数,方便估算 7 | 2、可能有两位数误差,影响不大 8 | 3、聚宝盆最下方显示上轮前六名的投入狗粮,收入积分,以及纯收益(即:收入积分 - 投入狗粮) 9 | new Env('聚宝盆投狗粮辅助');//此处忽略即可,为自动生成iOS端软件配置文件所需 10 | [MITM] 11 | hostname = jdjoy.jd.com,draw.jdfcloud.com 12 | 13 | ==========Surge============= 14 | [Script] 15 | 聚宝盆投狗粮辅助 = type=http-response,pattern=^https:\/\/jdjoy\.jd\.com\/pet\/getPetTreasureBox|^https:\/\/draw\.jdfcloud\.com\/\/pet\/getPetTreasureBox,requires-body=1,max-size=0,script-path=jd_petTreasureBox.js 16 | 17 | ===================Quantumult X===================== 18 | [rewrite_local] 19 | ^https:\/\/jdjoy\.jd\.com\/pet\/getPetTreasureBox|^https:\/\/draw\.jdfcloud\.com\/\/pet\/getPetTreasureBox url script-response-body jd_petTreasureBox.js 20 | 21 | =====================Loon===================== 22 | [Script] 23 | http-response ^https:\/\/jdjoy\.jd\.com\/pet\/getPetTreasureBox|^https:\/\/draw\.jdfcloud\.com\/\/pet\/getPetTreasureBox script-path=jd_petTreasureBox.js, requires-body=true, timeout=3600, tag=聚宝盆投狗粮辅助 24 | 25 | */ 26 | let body = $response.body; 27 | try { 28 | body = JSON.parse(body) 29 | food = body['data']['food'] 30 | function f(v) { 31 | return (v < 0) ? v : `+${v}`; 32 | } 33 | var sum = 0 34 | lastHourWinInfos = body["data"]["lastHourWinInfos"] 35 | for (var i in lastHourWinInfos) { 36 | sum += lastHourWinInfos[i]["petCoin"] 37 | } 38 | for (var i in lastHourWinInfos) { 39 | body["data"]["lastHourWinInfos"][i]["petCoin"] = `{${lastHourWinInfos[i]["food"]}} [${lastHourWinInfos[i]["petCoin"]}] (${f(lastHourWinInfos[i]["petCoin"] - lastHourWinInfos[i]["food"])}) ` 40 | } 41 | 42 | body["data"]["lastHourWinInfos"].unshift({ 43 | 'pin': "", 44 | 'nickName': '', 45 | 'investHour': lastHourWinInfos[0]['investHour'], 46 | 'stage': '2', 47 | 'food': 0, 48 | 'rank': 0, 49 | 'foodDif': "", 50 | 'petCoin': '{投} [收入] (纯收入)', 51 | 'userTag': "", 52 | 'win': true 53 | }) 54 | lastTurnFood = parseInt(sum / 0.09 * 0.91) 55 | body['data']['food'] = `${food} (+${food - lastTurnFood})` 56 | body = JSON.stringify(body) 57 | } catch (e) { 58 | console.log(e) 59 | } finally { 60 | $done({ body }) 61 | } 62 | 63 | -------------------------------------------------------------------------------- /backUp/AlipayManor.js: -------------------------------------------------------------------------------- 1 | // qx 及 loon 可用。 2 | // 半自动提醒支付宝蚂蚁庄园喂食。 3 | // 15 */4 * * * AlipayManor.js 4 | // 自用 Modified from zZPiglet 5 | 6 | const $ = new Env('蚂蚁庄园'); 7 | const manor = "alipays://platformapi/startapp?appId=66666674"; 8 | 9 | $.msg("支付宝", "蚂蚁庄园喂食啦", "alipays://platformapi/startapp?appId=66666674", manor); 10 | 11 | $.done() 12 | 13 | // prettier-ignore 14 | function Env(t,s){return new class{constructor(t,s){this.name=t,this.data=null,this.dataFile="box.dat",this.logs=[],this.logSeparator="\n",this.startTime=(new Date).getTime(),Object.assign(this,s),this.log("",`\ud83d\udd14${this.name}, \u5f00\u59cb!`)}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}getScript(t){return new Promise(s=>{$.get({url:t},(t,e,i)=>s(i))})}runScript(t,s){return new Promise(e=>{let i=this.getdata("@chavy_boxjs_userCfgs.httpapi");i=i?i.replace(/\n/g,"").trim():i;let o=this.getdata("@chavy_boxjs_userCfgs.httpapi_timeout");o=o?1*o:20,o=s&&s.timeout?s.timeout:o;const[h,a]=i.split("@"),r={url:`http://${a}/v1/scripting/evaluate`,body:{script_text:t,mock_type:"cron",timeout:o},headers:{"X-Key":h,Accept:"*/*"}};$.post(r,(t,s,i)=>e(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),s=this.path.resolve(process.cwd(),this.dataFile),e=this.fs.existsSync(t),i=!e&&this.fs.existsSync(s);if(!e&&!i)return{};{const i=e?t:s;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),s=this.path.resolve(process.cwd(),this.dataFile),e=this.fs.existsSync(t),i=!e&&this.fs.existsSync(s),o=JSON.stringify(this.data);e?this.fs.writeFileSync(t,o):i?this.fs.writeFileSync(s,o):this.fs.writeFileSync(t,o)}}lodash_get(t,s,e){const i=s.replace(/\[(\d+)\]/g,".$1").split(".");let o=t;for(const t of i)if(o=Object(o)[t],void 0===o)return e;return o}lodash_set(t,s,e){return Object(t)!==t?t:(Array.isArray(s)||(s=s.toString().match(/[^.[\]]+/g)||[]),s.slice(0,-1).reduce((t,e,i)=>Object(t[e])===t[e]?t[e]:t[e]=Math.abs(s[i+1])>>0==+s[i+1]?[]:{},t)[s[s.length-1]]=e,t)}getdata(t){let s=this.getval(t);if(/^@/.test(t)){const[,e,i]=/^@(.*?)\.(.*?)$/.exec(t),o=e?this.getval(e):"";if(o)try{const t=JSON.parse(o);s=t?this.lodash_get(t,i,""):s}catch(t){s=""}}return s}setdata(t,s){let e=!1;if(/^@/.test(s)){const[,i,o]=/^@(.*?)\.(.*?)$/.exec(s),h=this.getval(i),a=i?"null"===h?null:h||"{}":"{}";try{const s=JSON.parse(a);this.lodash_set(s,o,t),e=this.setval(JSON.stringify(s),i)}catch(s){const h={};this.lodash_set(h,o,t),e=this.setval(JSON.stringify(h),i)}}else e=$.setval(t,s);return e}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,s){return this.isSurge()||this.isLoon()?$persistentStore.write(t,s):this.isQuanX()?$prefs.setValueForKey(t,s):this.isNode()?(this.data=this.loaddata(),this.data[s]=t,this.writedata(),!0):this.data&&this.data[s]||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,s=(()=>{})){t.headers&&(delete t.headers["Content-Type"],delete t.headers["Content-Length"]),this.isSurge()||this.isLoon()?$httpClient.get(t,(t,e,i)=>{!t&&e&&(e.body=i,e.statusCode=e.status),s(t,e,i)}):this.isQuanX()?$task.fetch(t).then(t=>{const{statusCode:e,statusCode:i,headers:o,body:h}=t;s(null,{status:e,statusCode:i,headers:o,body:h},h)},t=>s(t)):this.isNode()&&(this.initGotEnv(t),this.got(t).on("redirect",(t,s)=>{try{const e=t.headers["set-cookie"].map(this.cktough.Cookie.parse).toString();this.ckjar.setCookieSync(e,null),s.cookieJar=this.ckjar}catch(t){this.logErr(t)}}).then(t=>{const{statusCode:e,statusCode:i,headers:o,body:h}=t;s(null,{status:e,statusCode:i,headers:o,body:h},h)},t=>s(t)))}post(t,s=(()=>{})){if(t.body&&t.headers&&!t.headers["Content-Type"]&&(t.headers["Content-Type"]="application/x-www-form-urlencoded"),delete t.headers["Content-Length"],this.isSurge()||this.isLoon())$httpClient.post(t,(t,e,i)=>{!t&&e&&(e.body=i,e.statusCode=e.status),s(t,e,i)});else if(this.isQuanX())t.method="POST",$task.fetch(t).then(t=>{const{statusCode:e,statusCode:i,headers:o,body:h}=t;s(null,{status:e,statusCode:i,headers:o,body:h},h)},t=>s(t));else if(this.isNode()){this.initGotEnv(t);const{url:e,...i}=t;this.got.post(e,i).then(t=>{const{statusCode:e,statusCode:i,headers:o,body:h}=t;s(null,{status:e,statusCode:i,headers:o,body:h},h)},t=>s(t))}}time(t){let s={"M+":(new Date).getMonth()+1,"d+":(new Date).getDate(),"H+":(new Date).getHours(),"m+":(new Date).getMinutes(),"s+":(new Date).getSeconds(),"q+":Math.floor(((new Date).getMonth()+3)/3),S:(new Date).getMilliseconds()};/(y+)/.test(t)&&(t=t.replace(RegExp.$1,((new Date).getFullYear()+"").substr(4-RegExp.$1.length)));for(let e in s)new RegExp("("+e+")").test(t)&&(t=t.replace(RegExp.$1,1==RegExp.$1.length?s[e]:("00"+s[e]).substr((""+s[e]).length)));return t}msg(s=t,e="",i="",o){const h=t=>!t||!this.isLoon()&&this.isSurge()?t:"string"==typeof t?this.isLoon()?t:this.isQuanX()?{"open-url":t}:void 0:"object"==typeof t&&(t["open-url"]||t["media-url"])?this.isLoon()?t["open-url"]:this.isQuanX()?t:void 0:void 0;this.isSurge()||this.isLoon()?$notification.post(s,e,i,h(o)):this.isQuanX()&&$notify(s,e,i,h(o)),this.logs.push("","==============\ud83d\udce3\u7cfb\u7edf\u901a\u77e5\ud83d\udce3=============="),this.logs.push(s),e&&this.logs.push(e),i&&this.logs.push(i)}log(...t){t.length>0?this.logs=[...this.logs,...t]:console.log(this.logs.join(this.logSeparator))}logErr(t,s){const e=!this.isSurge()&&!this.isQuanX()&&!this.isLoon();e?$.log("",`\u2757\ufe0f${this.name}, \u9519\u8bef!`,t.stack):$.log("",`\u2757\ufe0f${this.name}, \u9519\u8bef!`,t)}wait(t){return new Promise(s=>setTimeout(s,t))}done(t={}){const s=(new Date).getTime(),e=(s-this.startTime)/1e3;this.log("",`\ud83d\udd14${this.name}, \u7ed3\u675f! \ud83d\udd5b ${e} \u79d2`),this.log(),(this.isSurge()||this.isQuanX()||this.isLoon())&&$done(t)}}(t,s)} -------------------------------------------------------------------------------- /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 | -------------------------------------------------------------------------------- /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 | -------------------------------------------------------------------------------- /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 | -------------------------------------------------------------------------------- /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 | -------------------------------------------------------------------------------- /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 | -------------------------------------------------------------------------------- /backUp/jd_joy_help.js: -------------------------------------------------------------------------------- 1 | /* 2 | 宠汪汪强制为别人助力(助力一个好友你自己可以获得30积分,一天上限是帮助3个好友,自己获得90积分,不管助力是否成功,对方都会成为你的好友) 3 | 更新地址:jd_joy_help.js 4 | 更新时间:2021-6-22 5 | 活动入口:京东APP我的-更多工具-宠汪汪 6 | 目前提供了30309位好友的friendPin供使用。脚本随机从里面获取一个,助力成功后,退出小程序重新点击进去开始助力新的好友 7 | 欢迎大家使用 https://jdjoy.jd.com/pet/getFriends?itemsPerPage=20¤tPage=1 (currentPage=1表示第一页好友,=2表示第二页好友) 8 | 提供各自账号列表的friendPin给我 9 | 如果想设置固定好友,那下载下来放到本地使用,可以修改friendPin换好友(助力一好友后,更换一次friendPin里面的内容) 10 | 感谢github @Zero-S1提供 11 | 使用方法: 12 | ①设置好相应软件的重写 13 | ②从京东APP宠汪汪->领狗粮->邀请好友助力,分享给你小号微信或者微信的文件传输助手。 自己再打开刚才的分享,助力成功后,返回到此小程序首页重新进去宠汪汪即可助力下一位好友 14 | ③如提示好友人气旺,说明此好友已满了三人助力,需重新进出小程序,重新进入来客有礼-宠汪汪。 15 | new Env('宠汪汪强制为别人助力');//此处忽略即可,为自动生成iOS端软件配置文件所需 16 | [MITM] 17 | hostname = draw.jdfcloud.com 18 | ======================Surge===================== 19 | [Script] 20 | 宠汪汪强制为别人助力= type=http-request,pattern=^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)?\/\/common\/pet\/helpFriend\?friendPin,requires-body=1,max-size=0,script-path=jd_joy_help.js 21 | 22 | ===================Quantumult X===================== 23 | [rewrite_local] 24 | ^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)?\/\/common\/pet\/helpFriend\?friendPin url script-request-header jd_joy_help.js 25 | 26 | =====================Loon===================== 27 | [Script] 28 | 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)?\/\/common\/pet\/helpFriend\?friendPin script-path=jd_joy_help.js, requires-body=true, timeout=3600, tag=宠汪汪强制为别人助力 29 | 30 | 31 | 你也可从下面链接拿好友的friendPin(复制链接到有京东ck的浏览器打开即可) 32 | 33 | https://jdjoy.jd.com/pet/getFriends?itemsPerPage=20¤tPage=1 34 | */ 35 | const friendsArr = ["zhaosen2580", "jd_47ee22449e303", "jd_6c5e39478ec3b", "jd_4346918b58d6e", "liuz9988", "88489948", "jd_61f1269fd3236", "jd_41345a6f96aa5", "jd_45a6b5953b15b", "jd_45a6b5953b15b", "jd_704a2e5e28a66", "jd_66f5cecc1efcd", "jd_sIhNpDXJehOr", "jd_5851f32d4a083", "yhr_19820404", "13008094886_p", "13966269193_p", "jd_4e4d9825e5fb1", "jd_5ff306cf94512", "ququkoko", "jd_59a9823f35496", "529577509-275616", "18923155789_p", "jd_455da88071d1e", "dreamscometrue5120", "蒋周南19620607", "jd_620ceca400151", "杉雨2011", "MARYMY88", "13682627696_p", "jd_6777ee65f9fcc", "夏海东12315", "jd_437b4f3fa5d83", "zyjyc9998", "meoygua", "MLHK7288", "jd_42d9ce3001acd", "jd_57650a30ef6eb", "jd_44ca1016e0f96", "jd_74332d1d62a97", "jd_7dbe4f8a40a7d", "jd_4fa238e4e3039", "elbereth1122", "jd_4d9be23908e41", "jd_51f0d43d78900", "13588108107_p", "123by456", "09niuniuma", "143798682-947527", "jd_560c6f30e6951", "jd_54ddb8af5374a", "夏革平", "247466310", "wang2011", "chensue", "1362245003-624122", "wdGefYCBlyOuvz", "jd_412f7eb363cd8", "18311575050_p", "1307976-34738981", "wdgOGLtOJjjbnp", "klhzdx", "jd_5fdcdcb183d7d", "jd_5862fd8834680", "jd_51a64a9da6b94", "302990512-553401", "jd_4078f69a72873", "jd_ewYCRdmukzQH", "13348822441_p", "hlcx86021", "390823571-784974", "jd_79af2bc7a56a3", "15053231812_p", "jd_6f53253d117c5", "jd_5bf29dffa62ea", "jd_47a1c4ad02103", "刘凤苓", "145391572-102667", "yanglan0409", "jd_4b8a70f3b06c3", "弑神X", "jd_59d962a076126", "sjw3000", "jd_4d4def8b59787", "L1518235423", "jd_579b891fbea9b", "frank818", "hellohuhua", "jd_4cf1918577871", "jd_akYbyiXqrIDC", "李纪红", "jd_54a4260ca986c", "jd_4cba35cfa8220", "13654075776_p", "13916051043", "jd_6f9b9a6769afb", "iamkgbfox", "jd_5fbda9be54d5b", "jd_76763ba485c5e", "jd_485c757b79422", "xiaojingang_0", "lanye1545", "chenzhiyun2002", "lmpbjs1988", "jd_SmPxpudoGYOb", "jwl19690905", "荷舞弄清影88", "jd_750d6a9734717", "jd_64e37854e713f", "jd_573c9832d8989", "wdkplHVQlgowTW", "wwk232323", "jd_6bfe51f915c90", "我手机号码", "13681610268_p", "ss836580793", "15868005933_p", "zooooo58", "陌上花开花又落", "jd_701f52f8badbb", "jd_462f9229c20e4", "jd_42193689987a0", "jd_7dc5829121bcc", "13656692651_phz", "jd_47f49f22f1dc3", "handechun959", "13775208986_p", "guoyizhang", "jd_677dd20bf2749", "jd_FfAnqFVEoBul", "jd_4e59841cae4f9", "jd_5279d593e7803", "思绪随风2011", "jd_62e335d785872", "suyugen", "jd_4e68b48d16f7b", "jd_56b7a4e092e85", "cocoty", "jd_7b6d6e7dc98f1", "jd_63423cd594e8b", "greatyunyun", "4349小丢丢", "18027486801_p", "15207695569_p", "llbai11", "wdNRUvbJItetlvB", "jd_54154982c707f", "85192cool", "jd_60d497271825b", "greatyunyun9320", "ky252571504", "jd_74e60dbcae365", "wdiicnSbYSHWwE", "jd_529a0a309d418", "jd_7be92b11b7e8f", "13486659225_p", "jd_iFnquhpWWAzO", "jd_6e348ece13e20", "jd_6f5b49bb757cb", "znz传奇", "418001066_m", "jd_67ded5748c3ab", "361372-27819972", "jd_5fafb631c98af", "jd_76dd04e844d63", "小鹿Jenny", "00数字方程式", "jd_77a82b603c6c3", "勇敢的小泪", "jd_4481f68984466", "jd_758f5224ee957", "mwb1992062_m", "15975229552_p", "zdj8341", "pet_virtual_friend_胡皋三", "pet_virtual_friend_绿茶sama", "pet_virtual_friend_Ainio", "jd_4915949b7bfa1", "jd_7ca74ed9224ef", "jd_42764f5ea2341", "5317123-63418293", "jd_40a2d9485cbdb", "qazmcl1230", "jd_7ced325aba4fd", "jd_402fe7425fcaf", "95581245-627991", "luffy-314_m", "jd_BCXgLlmxHdiS", "jd_610b3d00928e5", "你要醒来", "338379384-148135", "pet_virtual_friend_乔治桑", "jd_54130a3e282ea", "jd_6169b3411ed5b", "jd_428d930ca56a5", "qq6924309", "pet_virtual_friend_路遇狗与少年", "jd_712bd3bfd55d6", "jd_4e97fe5ca4003", "tommy_he1", "13981372001_p", "129867657-673064", "jd_525d6e7a57e7c", "wdZuirGekSHKmF", "jd_75e1da74980ab", "jd_RVMXldNSQNOP", "jd_5f94da0265e0d", "jd_67ab629be7e61", "13887490621_p", "jd_4e0d529ba3c35", "jd_493918e314b50", "jd_71a220104187a", "jd_vVhhkdUpTkJQ", "gary388jingdong", "wdjQkAbFobMTyo", "cloud_kim", "jd_558ed75f52d39", "15555448319_p", "wdhxZuEvXhhvCf", "jd_72b940be8c0f4", "congcong炒葱葱", "jd_7eb0de64eb25a", "13209558123_p", "jd_53bf7cb6fb8e6", "jd_4fe620f72fa7c", "夏雨的爱情", "jd_47ba82eb392a5", "jd_LXnFHXoJwXkW", "62160785-578856", "醒醒该睡了", "jd_LOEWgvNwQIWD", "xiiirww", "pet_virtual_friend_特兰克斯", "pet_virtual_friend_Talon", "jd_4f7cd5b108733", "jd_NgNWXMVkJIvk", "jadonglin", "玩家卫弈", "liangxuejingdong", "jd_627171efb7c0a", "jd_53bc7a14f64d6", "15809290902_p", "jd_65a2ab73d9aa5", "jd_6edb943cacbfb", "jd_7f7eabc5caf7d", "jd_725e17effb6a9", "蔡辉煌", "voxb", "gdxx_hhw_m", "jd_78f0d6524a1dc", "jd_sDtnONLeHwfG", "xyyshy1983", "yinlang46", "ypqian", "15817094457_p", "fdxwb", "wuyaoxin2012", "明子溪", "henry1927_m", "chamy99", "jd_461e384274c34", "248358330-645106", "jd_4fd63de4a6033", "蜜糖向日葵", "wonghe", "36453197-121619", "琳琅满目cbb", "jd_5b7cc9e532426", "134795344-89911673", "15211488203_p", "jd_6f1f0722f8365", "jd_JmGCpqgpCtqG", "墨明棋妙陈", "pet_virtual_friend_1314爱澳", "1209815-33190621", "zhouhuayh", "jd_6d3cbb8b0751a", "jd_6e00e826f939b", "mztvip", "davidharry", "sara35424", "sun5025", "jd_62ce2385bb364", "352834026-406289", "pet_virtual_friend_丁座的真爱粉", "jd_582eecf8d27a9", "jd_49acdb02e8514", "13976911784_p", "jd_uGzohbhFpRuz", "wzywolfgang", "yjbonny", "沧海不轮回", "649297742_327799447", "倚兰椒", "琳琳8796", "snzh2013", "jd_73751adc04afd", "wdNnlMzPGJJKgqI", "yygt1158", "jd_53df36eb204a0", "花开花花落", "jd_611e082213c89", "jd_71e77d9235cf5", "jd_596fd9fea411f", "jd_7277d200aa1ac", "15230573701_p", "zb19881021", "692620136落", "168876810-159969", "zhushidan100", "上自习的猪", "15602231009_p", "jd_5213fd3fd5e09", "jd_6711f97ee4dfe", "44787591-640051", "MisterGlasses", "jd_7b22bbfe1e7e5", "138555963-81748582", "jd_QEVVkkDTQAlJ", "4932713-24535180", "jd_6dce98c07a644", "jd_DUtPtiiDamDr", "wangyneu", "wBm1TsDy3p_m", "jd_6acd3a6cc79cc","jd_444f5c020f31c","jd_71caf6b3ec4cb", "shin_dynasty", "carola82", "jd_AOhLSBLdSnux", "ningbormb"] 36 | /** 37 | * 生成随机数字 38 | * @param {number} min 最小值(包含) 39 | * @param {number} max 最大值(不包含) 40 | */ 41 | let newUrl, url = $request.url; 42 | function randomNumber(min = 0, max = 100) { 43 | return Math.min(Math.floor(min + Math.random() * (max - min)), max); 44 | } 45 | try { 46 | console.log(`url:${url}`); 47 | let friendPin = encodeURI(friendsArr[randomNumber(0, friendsArr.length)]) //强制为对方助力,可成为好友关系 48 | const timestamp = new Date().getTime() 49 | // const lks = url.match(/lks=.*?$/g)[0]; 50 | const end = url.substring(url.indexOf('&openId'), url.length) 51 | newUrl = url.replace(/friendPin=.*?$/i, "friendPin=" + friendPin).replace(/invitePin=.*?$/i, "invitePin=" + friendPin).replace(/inviteTimeStamp=.*?$/i, "inviteTimeStamp=" + timestamp + "&") 52 | newUrl += `${end}`; 53 | console.log(`newUrl:${newUrl}`); 54 | } catch (e) { 55 | console.log(e); 56 | } finally { 57 | $done({ url: newUrl }) 58 | } 59 | -------------------------------------------------------------------------------- /backUp/tencentscf.md: -------------------------------------------------------------------------------- 1 | 2 | # 云函数快速部署京东脚本(由于云函数官方升级此方法暂时失效) 3 | > 4 | > - 本地安装依赖使用serverless部署,[点这里](tencentscf.md#1-安装-nodejs-环境) 5 | > - Github Action 部署[点这里](tencentscf.md#github-action-部署) 6 | 7 | ## 1. 安装 Node.js 环境 8 | 9 | Node.js 环境 [下载地址](https://nodejs.org/zh-tw/download/) ,根据自己的操作系统下载和安装。 10 | 11 | ## 2. 下载代码 12 | 13 | 点击红框处下载压缩包 14 | ![下载代码](https://imgbed-bucket-1251971143.cos.ap-guangzhou.myqcloud.com/1605497672397-zip.png) 15 | 16 | ## 3. 安装依赖,配置 cookie 17 | 18 | ### 3.1 安装依赖 19 | 20 | 压缩包解压后进入项目文件夹 21 | 22 | - Windows 用户按住 **shift** 点击右键,点击 **在此处打开命令窗口** 23 | - Mac 用户通过终端,自行进入该文件夹 24 | 25 | 在命令行内输入 `npm i `,等待运行完成。 26 | 27 | 此时,项目文件夹内会多出一个 `node_modules`文件夹 28 | 29 | ### 3.2 配置 cookie 30 | 31 | 打开项目文件内的 `jdCookie.js` 32 | 33 | 在最上面的 `CookieJDs`里写入 cookie ,多个账号以逗号分隔 34 | 35 | 例如 36 | 37 | ```javascript 38 | let CookieJDs = [ 39 | 'pt_key=xxx;pt_pin=xxx;', 40 | 'pt_key=zzz;pt_pin=zzz;', 41 | 'pt_key=aaa;pt_pin=xxxaaa' 42 | ] 43 | ``` 44 | 45 | > 注:获取京东 cookie 教程参考 [浏览器获取京东cookie教程](https://github.com/LXK9301/jd_scripts/blob/master/backUp/GetJdCookie.md) , [插件获取京东cookie教程](https://github.com/LXK9301/jd_scripts/blob/master/backUp/GetJdCookie2.md) 46 | 47 | 48 | ## 4. 部署到云函数 49 | 50 | ### 4.1 开通服务 51 | 52 | 依次登录 [SCF 云函数控制台](https://console.cloud.tencent.com/scf) 和 [SLS 控制台](https://console.cloud.tencent.com/sls) 开通相关服务,确保账户下已开通服务并创建相应[服务角色](https://console.cloud.tencent.com/cam/role) **SCF_QcsRole、SLS_QcsRole** 53 | 54 | > 注意!为了确保权限足够,获取这两个参数时不要使用子账户!此外,腾讯云账户需要[实名认证](https://console.cloud.tencent.com/developer/auth)。 55 | 56 | ### 4.2 工具部署 57 | 58 | 下载 Serverless 工具,快速部署函数 59 | ``` 60 | npm install -g serverless 61 | ``` 62 | 63 | 执行部署命令 64 | ``` 65 | serverless deploy 66 | ``` 67 | 68 | 如果已经配置了永久秘钥,则可以直接部署,如果没有,可以直接**微信扫码**登录腾讯云,并且授权部署。 69 | 70 | 过几秒后,查看输出,可以看到函数和定时触发器都已经配置完成。 71 | ``` 72 | serverless ⚡framework 73 | Action: "deploy" - Stage: "dev" - App: "jdscript" - Instance: "jdscript" 74 | 75 | functionName: scf-jdscript 76 | description: This is a function in jdscript application. 77 | namespace: default 78 | runtime: Nodejs12.16 79 | handler: index.main_handler 80 | memorySize: 64 81 | lastVersion: $LATEST 82 | traffic: 1 83 | triggers: 84 | timer: 85 | - timer-jdscript-dev 86 | 87 | 36s › jdscript › Success 88 | ``` 89 | 90 | ## 5. 查看和测试 91 | 92 | 登录后,在 [腾讯云函数地址](https://console.cloud.tencent.com/scf/index) 点击管理控制台,查看最新部署的函数。 93 | 94 | 在左侧栏的日志查询中,可以查看到触发的日志,包括是否打卡成功等。 95 | 96 | ![测试函数](https://user-images.githubusercontent.com/6993269/99628053-5a9eea80-2a70-11eb-906f-f1d5ea2bfa3a.png) 97 | 98 | > 如果需要配置永久秘钥,则可以在[访问秘钥页面](https://console.cloud.tencent.com/cam/capi)获取账号的 TENCENT_SECRET_ID,TENCENT_SECRET_KEY,并配置在代码根目录 .env 文件中。 99 | 100 | 101 | # Github Action 部署 102 | ## 1. 开通服务 103 | 104 | 依次登录 [SCF 云函数控制台](https://console.cloud.tencent.com/scf) 和 [SLS 控制台](https://console.cloud.tencent.com/sls) 开通相关服务,确保账户下已开通服务并创建相应[服务角色](https://console.cloud.tencent.com/cam/role) **SCF_QcsRole、SLS_QcsRole** 105 | 106 | > 注意!为了确保权限足够,获取这两个参数时不要使用子账户!此外,腾讯云账户需要[实名认证](https://console.cloud.tencent.com/developer/auth)。 107 | 108 | ## 2. 在这里新建一个访问密钥[新建密钥](https://console.cloud.tencent.com/cam/capi) 109 | > 将SecretId和SecretKey分别配置在仓库的secrets变量里面, TENCENT_SECRET_ID对应你的SecretId的值,TENCENT_SECRET_KEY对应你的SecretKey的值 110 | 111 | ## 3. 配置自己需要secrets变量[参考这里](githubAction.md#下方提供使用到的-secrets全集合) 112 | 113 | 目前因为云函数改版升级,原GitHub Action部署云函数方案需要作出相应调整,secret变量新增`SCF_REGION`和`TENCENT_FUNCTION_NAME`。`SCF_REGION`用于控制部署区域的选择,具体参数代码填写可以自行查找官方说明 [地域和可用区](https://cloud.tencent.com/document/product/213/6091) `TENCENT_FUNCTION_NAME`用于控制部署到云函数后函数名的命名。
114 | 115 | ## 4. 配置index.js中secrets变量说明 116 | 现在可以通过secret设置自定义index.js中的执行方式,环境变量分别为`TENCENTSCF_SOURCE_TYPE`和`TENCENTSCF_SOURCE_URL`,其中`TENCENTSCF_SOURCE_TYPE`值可以选取`local`、`git`、`custom`具体含义[参考这里](githubAction.md#下方提供使用到的-secrets全集合)。`TENCENTSCF_SOURCE_URL`格式为包含raw的URL,例如:`https://raw.githubusercontent.com/LXK9301/jd_scripts/master/`或`https://gitee.com/lxk0301/jd_scripts/raw/master/`
117 | 118 | 119 | ### __重要的说三遍__ 120 | ### 如果涉及一个变量配置多个值,如多个cookie,多个取消订阅关键字,去掉里面的 *__[空格]()__* 和 __*[换行]()*__ 使用 `&` 连接 121 | ### 如果涉及一个变量配置多个值,如多个cookie,多个取消订阅关键字,去掉里面的 *__[空格]()__* 和 __*[换行]()*__ 使用 `&` 连接 122 | ### 如果涉及一个变量配置多个值,如多个cookie,多个取消订阅关键字,去掉里面的 *__[空格]()__* 和 __*[换行]()*__ 使用 `&` 连接 123 | > 排查问题第一步先看自己[腾讯云函数](https://console.cloud.tencent.com/scf/list-detail?rid=5&ns=default&id=scf-jdscript)那边的环境变量跟自己在仓库配置的 `secrets` 是否一致 124 | ![image](https://user-images.githubusercontent.com/6993269/99937191-06617680-2da0-11eb-99ea-033f2c655683.png) 125 | 126 | 127 | ## 4.执行action workflow进行部署,workflow未报错即部署成功 128 | 129 | **在执行action workflow进行部署前,先在需要部署的区域下新建一个空函数,名称可以任意,比如:`jd`,此时secret中`TENCENT_FUNCTION_NAME`值也必须是`jd`,保持与云函数的函数名一致,目前部署云函数的策略是覆盖的方式,故而此步骤至关重要。**
130 | 131 | ![image](https://user-images.githubusercontent.com/6993269/99513289-6a152980-29c5-11eb-9266-3f56ba13d3b2.png) 132 | ## 5. 查看和测试 133 | 登录后,在 [腾讯云函数地址](https://console.cloud.tencent.com/scf/index) 点击管理控制台,查看最新部署的函数。 134 | 135 | 在左侧栏的日志查询中,可以查看到触发的日志,包括是否打卡成功等。 136 | 137 | ![测试函数](https://user-images.githubusercontent.com/6993269/99628053-5a9eea80-2a70-11eb-906f-f1d5ea2bfa3a.png) 138 | ## 6. 设置触发器[看这里](iCloud.md#5设置触发器) 或者看这里的[注释说明](https://github.com/iouAkira/jd_scripts/blob/patch-1/index.js#L4) 139 | -------------------------------------------------------------------------------- /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)} -------------------------------------------------------------------------------- /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" ] -------------------------------------------------------------------------------- /docker/auto_help.sh: -------------------------------------------------------------------------------- 1 | #set -e 2 | 3 | #日志路径 4 | logDir="/scripts/logs" 5 | 6 | # 处理后的log文件 7 | logFile=${logDir}/sharecodeCollection.log 8 | if [ -n "$1" ]; then 9 | parameter=${1} 10 | else 11 | echo "没有参数" 12 | fi 13 | 14 | # 收集助力码 15 | collectSharecode() { 16 | if [ -f ${2} ]; then 17 | echo "${1}:清理 ${preLogFile} 中的旧助力码,收集新助力码" 18 | 19 | #删除预处理旧助力码 20 | if [ -f "${logFile}" ]; then 21 | sed -i '/'"${1}"'/d' ${logFile} 22 | fi 23 | 24 | #收集日志中的互助码 25 | codes="$(sed -n '/'${1}'.*/'p ${2} | sed 's/京东账号/京东账号 /g' | sed 's/(/ (/g' | sed 's/】/】 /g' | awk '{print $4,$5,$6,$7}' | sort -gk2 | awk '!a[$2" "$3]++{print}')" 26 | 27 | #获取ck文件夹中的pin值集合 28 | if [ -f "/usr/local/bin/spnode" ]; then 29 | ptpins="$(awk -F "=" '{print $3}' $COOKIES_LIST | awk -F ";" '{print $1}')" 30 | else 31 | ptpins="$(echo $JD_COOKIE | sed "s/[ &]/\\n/g" | sed "/^$/d" | awk -F "=" '{print $3}' | awk -F ";" '{print $1}')" 32 | fi 33 | 34 | 35 | #遍历pt_pin值 36 | for item in $ptpins; do 37 | #中文pin解码 38 | if [ ${#item} > 20 ]; then 39 | item="$(printf $(echo -n "$item" | sed 's/\\/\\\\/g;s/\(%\)\([0-9a-fA-F][0-9a-fA-F]\)/\\x\2/g')"\n")" 40 | fi 41 | #根据pin值匹配第一个code结果输出到文件中 42 | echo "$codes" | grep -m1 $item >> $logFile 43 | done 44 | else 45 | echo "${1}:${2} 文件不存在,不清理 ${logFile} 中的旧助力码" 46 | fi 47 | 48 | } 49 | 50 | # 导出助力码 51 | exportSharecode() { 52 | if [ -f ${logFile} ]; then 53 | #账号数 54 | cookiecount=$(echo ${JD_COOKIE} | grep -o pt_key | grep -c pt_key) 55 | if [ -f /usr/local/bin/spnode ]; then 56 | cookiecount=$(cat "$COOKIES_LIST" | grep -o pt_key | grep -c pt_key) 57 | fi 58 | echo "cookie个数:${cookiecount}" 59 | 60 | # 单个账号助力码 61 | singleSharecode=$(sed -n '/'${1}'.*/'p ${logFile} | awk '{print $4}' | awk '{T=T"@"$1} END {print T}' | awk '{print substr($1,2)}') 62 | # | awk '{print $2,$4}' | sort -g | uniq 63 | # echo "singleSharecode:${singleSharecode}" 64 | 65 | # 拼接多个账号助力码 66 | num=1 67 | while [ ${num} -le ${cookiecount} ]; do 68 | local allSharecode=${allSharecode}"&"${singleSharecode} 69 | num=$(expr $num + 1) 70 | done 71 | 72 | allSharecode=$(echo ${allSharecode} | awk '{print substr($1,2)}') 73 | 74 | # echo "${1}:${allSharecode}" 75 | 76 | #判断合成的助力码长度是否大于账号数,不大于,则可知没有助力码 77 | if [ ${#allSharecode} -gt ${cookiecount} ]; then 78 | echo "${1}:导出助力码" 79 | echo "${3}=${allSharecode}" 80 | export ${3}=${allSharecode} 81 | else 82 | echo "${1}:没有助力码,不导出" 83 | fi 84 | 85 | else 86 | echo "${1}:${logFile} 不存在,不导出助力码" 87 | fi 88 | 89 | } 90 | 91 | #生成助力码 92 | autoHelp() { 93 | if [ ${parameter} == "collect" ]; then 94 | 95 | # echo "收集助力码" 96 | collectSharecode ${1} ${2} ${3} 97 | 98 | elif [ ${parameter} == "export" ]; then 99 | 100 | # echo "导出助力码" 101 | exportSharecode ${1} ${2} ${3} 102 | fi 103 | } 104 | 105 | #日志需要为这种格式才能自动提取 106 | #Mar 07 00:15:10 【京东账号1(xxxxxx)的京喜财富岛好友互助码】3B41B250C4A369EE6DCA6834880C0FE0624BAFD83FC03CA26F8DEC7DB95D658C 107 | 108 | #新增自动助力活动格式 109 | # autoHelp 关键词 日志路径 变量名 110 | 111 | ############# 短期活动 ############# 112 | 113 | 114 | ############# 长期活动 ############# 115 | 116 | #东东农场 117 | autoHelp "东东农场好友互助码" "${logDir}/jd_fruit.log" "FRUITSHARECODES" 118 | 119 | #东东萌宠 120 | autoHelp "东东萌宠好友互助码" "${logDir}/jd_pet.log" "PETSHARECODES" 121 | 122 | #种豆得豆 123 | autoHelp "京东种豆得豆好友互助码" "${logDir}/jd_plantBean.log" "PLANT_BEAN_SHARECODES" 124 | 125 | #京喜工厂 126 | autoHelp "京喜工厂好友互助码" "${logDir}/jd_dreamFactory.log" "DREAM_FACTORY_SHARE_CODES" 127 | 128 | #东东工厂 129 | autoHelp "东东工厂好友互助码" "${logDir}/jd_jdfactory.log" "DDFACTORY_SHARECODES" 130 | 131 | #crazyJoy 132 | autoHelp "crazyJoy任务好友互助码" "${logDir}/jd_crazy_joy.log" "JDJOY_SHARECODES" 133 | 134 | #京喜财富岛 135 | autoHelp "京喜财富岛好友互助码" "${logDir}/jd_cfd.log" "JDCFD_SHARECODES" 136 | 137 | #京喜农场 138 | autoHelp "京喜农场好友互助码" "${logDir}/jd_jxnc.log" "JXNC_SHARECODES" 139 | 140 | #京东赚赚 141 | autoHelp "京东赚赚好友互助码" "${logDir}/jd_jdzz.log" "JDZZ_SHARECODES" 142 | 143 | ######### 日志打印格式需调整 ######### 144 | 145 | #口袋书店 146 | autoHelp "口袋书店好友互助码" "${logDir}/jd_bookshop.log" "BOOKSHOP_SHARECODES" 147 | 148 | #领现金 149 | autoHelp "签到领现金好友互助码" "${logDir}/jd_cash.log" "JD_CASH_SHARECODES" 150 | 151 | #闪购盲盒 152 | autoHelp "闪购盲盒好友互助码" "${logDir}/jd_sgmh.log" "JDSGMH_SHARECODES" 153 | 154 | #东东健康社区 155 | autoHelp "东东健康社区好友互助码" "${logDir}/jd_health.log" "JDHEALTH_SHARECODES" 156 | -------------------------------------------------------------------------------- /docker/bot/jd.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Aaron-lv/sync/9ecf260b01b7f9ea045256e5831b4601a23e4dfd/docker/bot/jd.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 | Pillow<=7.1.2 7 | -------------------------------------------------------------------------------- /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 | -------------------------------------------------------------------------------- /docker/crontab_list.sh: -------------------------------------------------------------------------------- 1 | # 每3天的23:50分清理一次日志(互助码不清理,proc_file.sh对该文件进行了去重) 2 | 50 23 */3 * * find /scripts/logs -name '*.log' | grep -v 'sharecodeCollection' | xargs rm -rf 3 | # 收集助力码 4 | 30 * * * * sh /scripts/docker/auto_help.sh collect >> /scripts/logs/auto_help_collect.log 2>&1 5 | 6 | ##############短期活动############## 7 | # 京东极速版红包(活动时间:2021-6-1至2021-6-30) 8 | 45 0,23 * * * node /scripts/jd_speed_redpocke.js >> /scripts/logs/jd_speed_redpocke.log 2>&1 9 | # 每日抽奖(活动时间:2021-05-01至2021-05-31) 10 | 30 1,22,23 * * * node /scripts/jd_daily_lottery.js >> /scripts/logs/jd_daily_lottery.log 2>&1 11 | # 众筹许愿池 12 | 20 0,2 * * * node /scripts/jd_wish.js >> /scripts/logs/jd_wish.log 2>&1 13 | 14 | ##############长期活动############## 15 | # 签到 16 | 7 0,17 * * * cd /scripts && node jd_bean_sign.js >> /scripts/logs/jd_bean_sign.log 2>&1 17 | # 京喜签到 18 | 5 1,8 * * * node /scripts/jx_sign.js >> /scripts/logs/jx_sign.log 2>&1 19 | # 摇京豆 20 | 6 0,23 * * * node /scripts/jd_club_lottery.js >> /scripts/logs/jd_club_lottery.log 2>&1 21 | # 东东农场 22 | 15 6-18/6 * * * node /scripts/jd_fruit.js >> /scripts/logs/jd_fruit.log 2>&1 23 | # 摇钱树 24 | 23 */2 * * * node /scripts/jd_moneyTree.js >> /scripts/logs/jd_moneyTree.log 2>&1 25 | # 东东萌宠 26 | 35 6-18/6 * * * node /scripts/jd_pet.js >> /scripts/logs/jd_pet.log 2>&1 27 | # 京东种豆得豆 28 | 10 7-22/1 * * * node /scripts/jd_plantBean.js >> /scripts/logs/jd_plantBean.log 2>&1 29 | # 取关京东店铺商品 30 | 45 23 * * * node /scripts/jd_unsubscribe.js >> /scripts/logs/jd_unsubscribe.log 2>&1 31 | # 京豆变动通知 32 | 20 10 * * * node /scripts/jd_bean_change.js >> /scripts/logs/jd_bean_change.log 2>&1 33 | # 金融养猪 34 | 32 0-23/6 * * * node /scripts/jd_pigPet.js >> /scripts/logs/jd_pigPet.log 2>&1 35 | # 京喜工厂 36 | 50 * * * * node /scripts/jd_dreamFactory.js >> /scripts/logs/jd_dreamFactory.log 2>&1 37 | # 东东工厂 38 | 26 * * * * node /scripts/jd_jdfactory.js >> /scripts/logs/jd_jdfactory.log 2>&1 39 | # 京东快递签到 40 | 47 1 * * * node /scripts/jd_kd.js >> /scripts/logs/jd_kd.log 2>&1 41 | # 领京豆额外奖励(每日可获得3京豆) 42 | # 23 1,12,22 * * * node /scripts/jd_bean_home.js >> /scripts/logs/jd_bean_home.log 2>&1 43 | # 微信小程序京东赚赚 44 | 6 0-5/1,11 * * * node /scripts/jd_jdzz.js >> /scripts/logs/jd_jdzz.log 2>&1 45 | # 导到所有互助码 46 | 23 7 * * * node /scripts/jd_get_share_code.js >> /scripts/logs/jd_get_share_code.log 2>&1 47 | # 签到领现金 48 | 10 */4 * * * node /scripts/jd_cash.js >> /scripts/logs/jd_cash.log 2>&1 49 | # 闪购盲盒 50 | 47 8,22 * * * node /scripts/jd_sgmh.js >> /scripts/logs/jd_sgmh.log 2>&1 51 | # 美丽研究院 52 | 41 7,12,19 * * * node /scripts/jd_beauty.js >> /scripts/logs/jd_beauty.log 2>&1 53 | # 京东极速版签到+赚现金任务 54 | 21 1,6 * * * node /scripts/jd_speed_sign.js >> /scripts/logs/jd_speed_sign.log 2>&1 55 | # 京喜财富岛 56 | 1 * * * * node /scripts/jd_cfd.js >> /scripts/logs/jd_cfd.log 2>&1 57 | # 家庭号 58 | # 10 6,7 * * * node /scripts/jd_family.js >> /scripts/logs/jd_family.log 2>&1 59 | # 京东健康社区 60 | 20 0,6,22 * * * node /scripts/jd_health.js >> /scripts/logs/jd_health.log 2>&1 61 | # 京东健康社区收集健康能量 62 | 5-45/20 * * * * node /scripts/jd_health_collect.js >> /scripts/logs/jd_health_collect.log 2>&1 63 | # 领金贴 64 | 5 0 * * * node /scripts/jd_jin_tie.js >> /scripts/logs/jd_jin_tie.log 2>&1 65 | # 京喜牧场 66 | 15 * * * * node /scripts/jd_jxmc.js >> /scripts/logs/jd_jxmc.log 2>&1 67 | # 领券中心签到 68 | 11 0 * * * node /scripts/jd_ccSign.js >> /scripts/logs/jd_ccSign.log 2>&1 69 | # # 宠汪汪 70 | # 5 */2,9,23 * * * node /scripts/jd_joy.js >> /scripts/logs/jd_joy.log 2>&1 71 | # # 宠汪汪积分兑换京豆 72 | # 59 7,15,23 * * * node /scripts/jd_joy_reward.js >> /scripts/logs/jd_joy_reward.log 2>&1 73 | # # 宠汪汪喂食 74 | # 35 */1 * * * node /scripts/jd_joy_feedPets.js >> /scripts/logs/jd_joy_feedPets.log 2>&1 75 | # # 宠汪汪偷好友积分与喂食 76 | # 30 0-21/3 * * * node /scripts/jd_joy_steal.js >> /scripts/logs/jd_joy_steal.log 2>&1 77 | # # 宠汪汪邀请助力 78 | # 10 9-20/1 * * * node /scripts/jd_joy_run.js >> /scripts/logs/jd_joy_run.log 2>&1 79 | -------------------------------------------------------------------------------- /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 | -------------------------------------------------------------------------------- /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/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 | -------------------------------------------------------------------------------- /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 | -------------------------------------------------------------------------------- /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 | -------------------------------------------------------------------------------- /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/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/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 | -------------------------------------------------------------------------------- /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/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)) -------------------------------------------------------------------------------- /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 | -------------------------------------------------------------------------------- /githubAction.md: -------------------------------------------------------------------------------- 1 | ## 环境变量说明 2 | 3 | ##### 京东(必须) 4 | 5 | | Name | 归属 | 属性 | 说明 | 6 | | :---------: | :--: | ---- | ------------------------------------------------------------ | 7 | | `JD_COOKIE` | 京东 | 必须 | 京东cookie,多个账号的cookie使用`&`隔开,例:`pt_key=XXX;pt_pin=XXX;&pt_key=XXX;pt_pin=XXX;&pt_key=XXX;pt_pin=XXX;`。具体获取参考[浏览器获取京东cookie教程](./backUp/GetJdCookie.md) 或者 [插件获取京东cookie教程](./backUp/GetJdCookie2.md) | 8 | 9 | ##### 京东隐私安全 环境变量 10 | 11 | | Name | 归属 | 属性 | 默认值 | 说明 | 12 | | :-------------: | :---------: | :----: | :----: | ------------------------------------------------------------ | 13 | | `JD_DEBUG` | 脚本打印log | 非必须 | true | 运行脚本时,是否显示log,默认显示。改成false表示不显示,注重隐私的人可以设置 JD_DEBUG 为false | 14 | | `JD_USER_AGENT` | 京东 | 非必须 | | 自定义此库里京东系列脚本的UserAgent,不懂不知不会UserAgent的请不要随意填写内容。如需使用此功能建议填写京东APP的UA | 15 | 16 | ##### 推送通知环境变量(目前提供`微信server酱`、`pushplus(推送加)`、`iOS Bark APP`、`telegram机器人`、`钉钉机器人`、`企业微信机器人`、`iGot`、`企业微信应用消息`等通知方式) 17 | 18 | | Name | 归属 | 属性 | 说明 | 19 | | :---------------: | :----------------------------------------------------------: | :----: | ------------------------------------------------------------ | 20 | | `PUSH_KEY` | 微信server酱推送 | 非必须 | server酱的微信通知[官方文档](http://sc.ftqq.com/3.version),已兼容 [Server酱·Turbo版](https://sct.ftqq.com/) | 21 | | `BARK_PUSH` | [BARK推送](https://apps.apple.com/us/app/bark-customed-notifications/id1403753865) | 非必须 | IOS用户下载BARK这个APP,填写内容是app提供的`设备码`,例如:https://api.day.app/123 ,那么此处的设备码就是`123`,再不懂看 [这个图](icon/bark.jpg)(注:支持自建填完整链接即可) | 22 | | `BARK_SOUND` | [BARK推送](https://apps.apple.com/us/app/bark-customed-notifications/id1403753865) | 非必须 | bark推送声音设置,例如`choo`,具体值请在`bark`-`推送铃声`-`查看所有铃声` | 23 | | `TG_BOT_TOKEN` | telegram推送 | 非必须 | tg推送(需设备可连接外网),`TG_BOT_TOKEN`和`TG_USER_ID`两者必需,填写自己申请[@BotFather](https://t.me/BotFather)的Token,如`10xxx4:AAFcqxxxxgER5uw` , [具体教程](./backUp/TG_PUSH.md) | 24 | | `TG_USER_ID` | telegram推送 | 非必须 | tg推送(需设备可连接外网),`TG_BOT_TOKEN`和`TG_USER_ID`两者必需,填写[@getuseridbot](https://t.me/getuseridbot)中获取到的纯数字ID, [具体教程](./backUp/TG_PUSH.md) | 25 | | `DD_BOT_TOKEN` | 钉钉推送 | 非必须 | 钉钉推送(`DD_BOT_TOKEN`和`DD_BOT_SECRET`两者必需)[官方文档](https://developers.dingtalk.com/document/app/custom-robot-access) ,只需`https://oapi.dingtalk.com/robot/send?access_token=XXX` 等于`=`符号后面的XXX即可 | 26 | | `DD_BOT_SECRET` | 钉钉推送 | 非必须 | (`DD_BOT_TOKEN`和`DD_BOT_SECRET`两者必需) ,密钥,机器人安全设置页面,加签一栏下面显示的SEC开头的`SECXXXXXXXXXX`等字符 , 注:钉钉机器人安全设置只需勾选`加签`即可,其他选项不要勾选,再不懂看 [这个图](icon/DD_bot.png) | 27 | | `QYWX_KEY` | 企业微信机器人推送 | 非必须 | 密钥,企业微信推送 webhook 后面的 key [详见官方说明文档](https://work.weixin.qq.com/api/doc/90000/90136/91770) | 28 | | `QYWX_AM` | 企业微信应用消息推送 | 非必须 | corpid,corpsecret,touser,agentid,素材库图片id [参考文档1](http://note.youdao.com/s/HMiudGkb) [参考文档2](http://note.youdao.com/noteshare?id=1a0c8aff284ad28cbd011b29b3ad0191)
素材库图片填0为图文消息, 填1为纯文本消息 | 29 | | `IGOT_PUSH_KEY` | iGot推送 | 非必须 | iGot聚合推送,支持多方式推送,确保消息可达。 [参考文档](https://wahao.github.io/Bark-MP-helper ) | 30 | | `PUSH_PLUS_TOKEN` | pushplus推送 | 非必须 | 微信扫码登录后一对一推送或一对多推送下面的token(您的Token) [官方网站](http://www.pushplus.plus/) | 31 | | `PUSH_PLUS_USER` | pushplus推送 | 非必须 | 一对多推送的“群组编码”(一对多推送下面->您的群组(如无则新建)->群组编码)注:(1、需订阅者扫描二维码 2、如果您是创建群组所属人,也需点击“查看二维码”扫描绑定,否则不能接受群组消息推送),只填`PUSH_PLUS_TOKEN`默认为一对一推送 | 32 | | `TG_PROXY_HOST` | Telegram 代理的 IP | 非必须 | 代理类型为 http。例子:http代理 http://127.0.0.1:1080 则填写 127.0.0.1 | 33 | | `TG_PROXY_PORT` | Telegram 代理的端口 | 非必须 | 例子:http代理 http://127.0.0.1:1080 则填写 1080 | 34 | | `TG_PROXY_AUTH` | Telegram 代理的认证参数 | 非必须 | 代理的认证参数 | 35 | | `TG_API_HOST` | Telegram api自建的反向代理地址 | 非必须 | 例子:反向代理地址 http://aaa.bbb.ccc 则填写 aaa.bbb.ccc [简略搭建教程](https://shimo.im/docs/JD38CJDQtYy3yTd8/read) | 36 | 37 | 38 | ##### 互助码类环境变量 39 | 40 | | Name | 归属 | 属性 | 需要助力次数/可提供助力次数 | 说明 | 41 | | :-------------------------: | :----------------: | :----: | :-----------------------: | ------------------------------------------------------------ | 42 | | `FRUITSHARECODES` | 东东农场
互助码 | 非必须 | 5/3 | 填写规则请看[jdFruitShareCodes.js](./jdFruitShareCodes.js)或见下方[互助码的填写规则](#互助码的填写规则) | 43 | | `PETSHARECODES` | 东东萌宠
互助码 | 非必须 | 5/5 | 填写规则和上面类似或见下方[互助码的填写规则](#互助码的填写规则) | 44 | | `PLANT_BEAN_SHARECODES` | 种豆得豆
互助码 | 非必须 | 9/3 | 填写规则和上面类似或见下方[互助码的填写规则](#互助码的填写规则) | 45 | | `DDFACTORY_SHARECODES` | 东东工厂
互助码 | 非必须 | 5/3 | 填写规则和上面类似或见下方[互助码的填写规则](#互助码的填写规则) | 46 | | `DREAM_FACTORY_SHARE_CODES` | 京喜工厂
互助码 | 非必须 | 不固定/3 | 填写规则和上面类似或见下方[互助码的填写规则](#互助码的填写规则) | 47 | | `JDZZ_SHARECODES` | 京东赚赚
互助码 | 非必须 | 5/2 | 填写规则和上面类似,或见下方[互助码的填写规则](#互助码的填写规则) | 48 | | `JDJOY_SHARECODES` | 疯狂的JOY
互助码 | 非必须 | 6/ | 填写规则和上面类似,或见下方[互助码的填写规则](#互助码的填写规则) | 49 | | `BOOKSHOP_SHARECODES` | 京东书店
互助码 | 非必须 | 10/ | 填写规则和上面类似,或见下方[互助码的填写规则](#互助码的填写规则) | 50 | | `JD_CASH_SHARECODES` | 签到领现金
互助码 | 非必须 | 10/ | 填写规则和上面类似,或见下方[互助码的填写规则](#互助码的填写规则) | 51 | | `JDSGMH_SHARECODES` | 闪购盲盒
互助码 | 非必须 | 10/ | 填写规则和上面类似,或见下方[互助码的填写规则](#互助码的填写规则) | 52 | | `JDCFD_SHARECODES` | 京喜财富岛
互助码 | 非必须 | 未知/未知 | 填写规则和上面类似,或见下方[互助码的填写规则](#互助码的填写规则) | 53 | | `JDHEALTH_SHARECODES` | 东东健康社区
互助码 | 非必须 | 未知/未知 | 填写规则和上面类似,或见下方[互助码的填写规则](#互助码的填写规则) | 54 | 55 | ##### 控制脚本功能环境变量 56 | 57 | 58 | | Name | 归属 | 属性 | 说明 | 59 | | :--------------------------: | :--------------------------: | :----: | ------------------------------------------------------------ | 60 | | `JD_BEAN_STOP` | 京东多合一签到 | 非必须 | `jd_bean_sign.js`自定义延迟签到,单位毫秒.默认分批并发无延迟,
延迟作用于每个签到接口,如填入延迟则切换顺序签到(耗时较长),
如需填写建议输入数字`1`,详见[此处说明](https://github.com/NobyDa/Script/blob/master/JD-DailyBonus/JD_DailyBonus.js#L93) | 61 | | `JD_BEAN_SIGN_STOP_NOTIFY` | 京东多合一签到 | 非必须 | `jd_bean_sign.js`脚本运行后不推送签到结果通知,默认推送,填`true`表示不发送通知 | 62 | | `JD_BEAN_SIGN_NOTIFY_SIMPLE` | 京东多合一签到 | 非必须 | `jd_bean_sign.js`脚本运行后推送签到结果简洁版通知,
默认推送签到简洁结果,填`true`表示推送简洁通知,[效果图](./icon/bean_sign_simple.jpg) | 63 | | `PET_NOTIFY_CONTROL` | 东东萌宠
推送开关 | 非必须 | 控制京东萌宠是否静默运行,
`false`为否(发送推送通知消息),`true`为是(即:不发送推送通知消息) | 64 | | `FRUIT_NOTIFY_CONTROL` | 东东农场
推送开关 | 非必须 | 控制京东农场是否静默运行,
`false`为否(发送推送通知消息),`true`为是(即:不发送推送通知消息) | 65 | | `CASH_NOTIFY_CONTROL` | 京东领现金
推送开关 | 非必须 | 控制京东领现金是否静默运行,
`false`为否(发送推送通知消息),`true`为是(即:不发送推送通知消息) | 66 | | `CASH_EXCHANGE` | 京东领现金
红包兑换京豆开关 | 非必须 | 控制京东领现金是否把红包兑换成京豆,
`false`为否,`true`为是(即:花费2元红包兑换200京豆,一周可换四次),默认为`false` | 67 | | `DDQ_NOTIFY_CONTROL` | 点点券
推送开关 | 非必须 | 控制点点券是否静默运行,
`false`为否(发送推送通知消息),`true`为是(即:不发送推送通知消息) | 68 | | `JDZZ_NOTIFY_CONTROL` | 京东赚赚小程序
推送开关 | 非必须 | 控制京东赚赚小程序是否静默运行,
`false`为否(发送推送通知消息),`true`为是(即:不发送推送通知消息) | 69 | | `MONEYTREE_NOTIFY_CONTROL` | 京东摇钱树
推送开关 | 非必须 | 控制京东摇钱树兑换0.07金贴后是否静默运行,
`false`为否(发送推送通知消息),`true`为是(即:不发送推送通知消息) | 70 | | `JD_JOY_REWARD_NOTIFY` | 宠汪汪
兑换京豆推送开关 | 非必须 | 控制`jd_joy_reward.js`脚本是否静默运行,
`false`为否(发送推送通知消息),`true`为是(即:不发送推送通知消息) | 71 | | `JOY_FEED_COUNT` | 宠汪汪喂食数量 | 非必须 | 控制`jd_joy_feedPets.js`脚本喂食数量,可以填的数字0,10,20,40,80,其他数字不可. | 72 | | `JOY_HELP_FEED` | 宠汪汪帮好友喂食 | 非必须 | 控制`jd_joy_steal.js`脚本是否给好友喂食,`false`为否,`true`为是(给好友喂食) | 73 | | `JOY_RUN_FLAG` | 宠汪汪是否赛跑 | 非必须 | 控制`jd_joy.js`脚本是否参加赛跑(默认参加双人赛跑),
`false`为否,`true`为是,脚本默认是`true` | 74 | | `JOY_TEAM_LEVEL` | 宠汪汪
参加什么级别的赛跑 | 非必须 | 控制`jd_joy.js`脚本参加几人的赛跑,可选数字为`2`,`10`,`50`,
其中2代表参加双人PK赛,10代表参加10人突围赛,
50代表参加50人挑战赛(注:此项功能在`JOY_RUN_FLAG`为true的时候才生效),
如若想设置不同账号参加不同类别的比赛则用&区分即可(如下三个账号:`2&10&50`) | 75 | | `JOY_RUN_NOTIFY` | 宠汪汪
宠汪汪赛跑获胜后是否推送通知 | 非必须 | 控制`jd_joy.js`脚本宠汪汪赛跑获胜后是否推送通知,
`false`为否(不推送通知消息),`true`为是(即:发送推送通知消息)
| 76 | | `JOY_RUN_HELP_MYSELF` | 宠汪汪
赛跑自己账号内部互助 | 非必须 | 输入`true`为开启内部互助 | 77 | | `JD_JOY_REWARD_NAME` | 宠汪汪
积分兑换多少京豆 | 非必须 | 目前可填值为`20`或者`500`,脚本默认`0`,`0`表示不兑换京豆 | 78 | | `JOY_RUN_TOKEN` | 宠汪汪
赛跑token | 非必须 | 需自行抓包,宠汪汪小程序获取token,点击`发现`或`我的`,寻找`^https:\/\/draw\.jdfcloud\.com(\/mirror)?\/\/api\/user\/user\/detail\?openId=`获取token | 79 | | `MARKET_COIN_TO_BEANS` | 东东超市
兑换京豆数量 | 非必须 | 控制`jd_blueCoin.js`兑换京豆数量,
可输入值为`20`或者`1000`的数字或者其他商品的名称,例如`碧浪洗衣凝珠` | 80 | | `MARKET_REWARD_NOTIFY` | 东东超市
兑换奖品推送开关 | 非必须 | 控制`jd_blueCoin.js`兑换奖品成功后是否静默运行,
`false`为否(发送推送通知消息),`true`为是(即:不发送推送通知消息) | 81 | | `JOIN_PK_TEAM` | 东东超市
自动参加PK队伍 | 非必须 | 每次pk活动参加作者创建的pk队伍,`true`表示参加,`false`表示不参加 | 82 | | `SUPERMARKET_LOTTERY` | 东东超市抽奖 | 非必须 | 每天运行脚本是否使用金币去抽奖,`true`表示抽奖,`false`表示不抽奖 | 83 | | `FRUIT_BEAN_CARD` | 东东农场
使用水滴换豆卡 | 非必须 | 东东农场使用水滴换豆卡(如果出现限时活动时100g水换20豆,此时比浇水划算,推荐换豆),
`true`表示换豆(不浇水),`false`表示不换豆(继续浇水),脚本默认是浇水 | 84 | | `UN_SUBSCRIBES` | jd_unsubscribe.js | 非必须 | 共四个参数,换行隔开.四个参数分别表示
`是否取关全部商品(0表示一个都不)`,`是否取关全部店铺数(0表示一个都不)`,`遇到此商品不再进行取关`,`遇到此店铺不再进行取关`,[具体使用往下看](#取关店铺环境变量的说明) | 85 | | `JDJOY_HELPSELF` | 疯狂的JOY
循环助力 | 非必须 | 疯狂的JOY循环助力,`true`表示循环助力,`false`表示不循环助力,默认不开启循环助力。 | 86 | | `JDJOY_APPLYJDBEAN` | 疯狂的JOY
京豆兑换 | 非必须 | 疯狂的JOY京豆兑换,目前最小值为2000京豆(详情请查看活动页面-提现京豆),
默认数字`0`不开启京豆兑换。 | 87 | | `BUY_JOY_LEVEL` | 疯狂的JOY
购买joy等级 | 非必须 | 疯狂的JOY自动购买什么等级的JOY | 88 | | `MONEY_TREE_SELL_FRUIT` | 摇钱树
是否卖出金果 | 非必须 | 控制摇钱树脚本是否自动卖出金果兑换成金币,`true`卖出,`false`不卖出,默认`false` | 89 | | `FACTORAY_WANTPRODUCT_NAME` | 东东工厂
心仪商品 | 非必须 | 提供心仪商品名称(请尽量填写完整和别的商品有区分度),达到条件后兑换,
如不提供则会兑换当前所选商品 | 90 | | `DREAMFACTORY_FORBID_ACCOUNT`| 京喜工厂
控制哪个京东账号不运行此脚本 | 非必须 | 输入`1`代表第一个京东账号不运行,多个使用`&`连接,例:`1&3`代表账号1和账号3不运行京喜工厂脚本,注:输入`0`,代表全部账号不运行京喜工厂脚本 | 91 | | `JDFACTORY_FORBID_ACCOUNT`| 东东工厂
控制哪个京东账号不运行此脚本 | 非必须 | 输入`1`代表第一个京东账号不运行,多个使用`&`连接,例:`1&3`代表账号1和账号3不运行东东工厂脚本,注:输入`0`,代表全部账号不运行东东工厂脚本 | 92 | | `CFD_NOTIFY_CONTROL` | 京喜财富岛
控制是否运行脚本后通知 | 非必须 | 输入`true`为通知,不填则为不通知 | 93 | | `JXNC_NOTIFY_LEVEL` | 京喜农场通知控制
推送开关,默认1 | 非必须 | 通知级别 0=只通知成熟;1=本次获得水滴>0;2=任务执行;3=任务执行+未种植种子 | 94 | | `JXGC_NOTIFY_LEVEL` | 京喜工厂通知控制
推送开关,默认2 | 非必须 | 通知级别 1=生产完毕可兑换通知;2=可兑换通知+生产超时通知+兑换超时通知;3=可兑换通知+生产超时通知+兑换超时通知+未选择商品生产通知(前提:已开通京喜工厂活动);默认第2种通知 | 95 | | `PURCHASE_SHOPS` | 执行`lxk0301/jd_scripts`仓库的脚本是否做加物品至购物车任务。默认关闭不做加购物车任务 | 非必须 | 如需做此类型任务。请设置`true`,目前东东小窝(jd_small_home.js)脚本会有加购任务 | 96 | | `TUAN_ACTIVEID` | 京喜工厂拼团瓜分电力活动的`activeId`
默认读取作者设置的 | 非必须 | 如出现脚本开团提示失败:`活动已结束,请稍后再试~`,可自行抓包替换(开启抓包,进入拼团瓜分电力页面,寻找带有`tuan`的链接里面的`activeId=`) | 97 | | `HELP_AUTHOR` | 是否给作者助力 免费拿,极速版拆红包,省钱大赢家等活动.
默认是 | 非必须 | 填`false`可关闭此助力 | 98 | 99 | 100 | ##### 互助码的填写规则 101 | 102 | > 互助码如何获取:长期活动可在jd_get_share_code.js里面查找,短期活动需运行相应脚本后,在日志里面可以找到。 103 | 104 | 同一个京东账号的好友互助码用@隔开,不同京东账号互助码用&或者换行隔开,下面给一个文字示例和具体互助码示例说明 105 | 106 | 两个账号各两个互助码的文字示例: 107 | 108 | ``` 109 | 京东账号1的shareCode1@京东账号1的shareCode2&京东账号2的shareCode1@京东账号2的shareCode2 110 | ``` 111 | 112 | 两个账号各两个互助码的真实示例: 113 | ``` 114 | 0a74407df5df4fa99672a037eec61f7e@dbb21614667246fabcfd9685b6f448f3&6fbd26cc27ac44d6a7fed34092453f77@61ff5c624949454aa88561f2cd721bf6&6fbd26cc27ac44d6a7fed34092453f77@61ff5c624949454aa88561f2cd721bf6 115 | ``` 116 | 117 | 118 | 119 | #### 取关店铺环境变量的说明 120 | 121 | > 环境变量内容的意思依次是`是否取关全部商品(0表示一个都不)`,`是否取关全部店铺数(0表示一个都不)`,`遇到此商品不再进行取关`,`遇到此店铺不再进行取关` 122 | 123 | 例如1:不要取关任何商品和店铺,则输入`0&0` 124 | 例如2:我想商品遇到关键字 `iPhone12` 停止取关,店铺遇到 `Apple京东自营旗舰店` 不再取关,则输入`10&10&iPhone12&Apple京东自营旗舰店`(前面两个参数非0即可) 125 | 126 | #### 关于脚本推送通知频率 127 | 128 | > 如果你填写了推送通知方式中的某一种通知所需环境变量,那么脚本通知情况如下: 129 | 130 | > 目前默认只有jd_fruit.js,jd_pet.js,jd_bean_sign.js,jd_bean_change.js,jd_jxnc.js这些脚本(默认)每次运行后都通知 131 | 132 | ``` 133 | 其余的脚本平常运行都是不通知,只有在京东cookie失效以及达到部分条件后,才会推送通知 134 | ``` 135 | 136 | -------------------------------------------------------------------------------- /icon/DD_bot.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Aaron-lv/sync/9ecf260b01b7f9ea045256e5831b4601a23e4dfd/icon/DD_bot.png -------------------------------------------------------------------------------- /icon/Snipaste_2020-08-28_09-31-42.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Aaron-lv/sync/9ecf260b01b7f9ea045256e5831b4601a23e4dfd/icon/Snipaste_2020-08-28_09-31-42.png -------------------------------------------------------------------------------- /icon/TG_PUSH1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Aaron-lv/sync/9ecf260b01b7f9ea045256e5831b4601a23e4dfd/icon/TG_PUSH1.png -------------------------------------------------------------------------------- /icon/TG_PUSH2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Aaron-lv/sync/9ecf260b01b7f9ea045256e5831b4601a23e4dfd/icon/TG_PUSH2.png -------------------------------------------------------------------------------- /icon/TG_PUSH3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Aaron-lv/sync/9ecf260b01b7f9ea045256e5831b4601a23e4dfd/icon/TG_PUSH3.png -------------------------------------------------------------------------------- /icon/action1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Aaron-lv/sync/9ecf260b01b7f9ea045256e5831b4601a23e4dfd/icon/action1.png -------------------------------------------------------------------------------- /icon/action2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Aaron-lv/sync/9ecf260b01b7f9ea045256e5831b4601a23e4dfd/icon/action2.png -------------------------------------------------------------------------------- /icon/action3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Aaron-lv/sync/9ecf260b01b7f9ea045256e5831b4601a23e4dfd/icon/action3.png -------------------------------------------------------------------------------- /icon/bark.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Aaron-lv/sync/9ecf260b01b7f9ea045256e5831b4601a23e4dfd/icon/bark.jpg -------------------------------------------------------------------------------- /icon/bean_sign_simple.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Aaron-lv/sync/9ecf260b01b7f9ea045256e5831b4601a23e4dfd/icon/bean_sign_simple.jpg -------------------------------------------------------------------------------- /icon/disable-action.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Aaron-lv/sync/9ecf260b01b7f9ea045256e5831b4601a23e4dfd/icon/disable-action.jpg -------------------------------------------------------------------------------- /icon/fork.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Aaron-lv/sync/9ecf260b01b7f9ea045256e5831b4601a23e4dfd/icon/fork.png -------------------------------------------------------------------------------- /icon/git1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Aaron-lv/sync/9ecf260b01b7f9ea045256e5831b4601a23e4dfd/icon/git1.jpg -------------------------------------------------------------------------------- /icon/git10.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Aaron-lv/sync/9ecf260b01b7f9ea045256e5831b4601a23e4dfd/icon/git10.jpg -------------------------------------------------------------------------------- /icon/git11.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Aaron-lv/sync/9ecf260b01b7f9ea045256e5831b4601a23e4dfd/icon/git11.jpg -------------------------------------------------------------------------------- /icon/git12.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Aaron-lv/sync/9ecf260b01b7f9ea045256e5831b4601a23e4dfd/icon/git12.jpg -------------------------------------------------------------------------------- /icon/git13.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Aaron-lv/sync/9ecf260b01b7f9ea045256e5831b4601a23e4dfd/icon/git13.jpg -------------------------------------------------------------------------------- /icon/git14.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Aaron-lv/sync/9ecf260b01b7f9ea045256e5831b4601a23e4dfd/icon/git14.jpg -------------------------------------------------------------------------------- /icon/git2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Aaron-lv/sync/9ecf260b01b7f9ea045256e5831b4601a23e4dfd/icon/git2.jpg -------------------------------------------------------------------------------- /icon/git3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Aaron-lv/sync/9ecf260b01b7f9ea045256e5831b4601a23e4dfd/icon/git3.jpg -------------------------------------------------------------------------------- /icon/git4.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Aaron-lv/sync/9ecf260b01b7f9ea045256e5831b4601a23e4dfd/icon/git4.jpg -------------------------------------------------------------------------------- /icon/git5.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Aaron-lv/sync/9ecf260b01b7f9ea045256e5831b4601a23e4dfd/icon/git5.jpg -------------------------------------------------------------------------------- /icon/git6.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Aaron-lv/sync/9ecf260b01b7f9ea045256e5831b4601a23e4dfd/icon/git6.jpg -------------------------------------------------------------------------------- /icon/git7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Aaron-lv/sync/9ecf260b01b7f9ea045256e5831b4601a23e4dfd/icon/git7.png -------------------------------------------------------------------------------- /icon/git8.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Aaron-lv/sync/9ecf260b01b7f9ea045256e5831b4601a23e4dfd/icon/git8.jpg -------------------------------------------------------------------------------- /icon/git9.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Aaron-lv/sync/9ecf260b01b7f9ea045256e5831b4601a23e4dfd/icon/git9.jpg -------------------------------------------------------------------------------- /icon/iCloud1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Aaron-lv/sync/9ecf260b01b7f9ea045256e5831b4601a23e4dfd/icon/iCloud1.png -------------------------------------------------------------------------------- /icon/iCloud2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Aaron-lv/sync/9ecf260b01b7f9ea045256e5831b4601a23e4dfd/icon/iCloud2.png -------------------------------------------------------------------------------- /icon/iCloud3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Aaron-lv/sync/9ecf260b01b7f9ea045256e5831b4601a23e4dfd/icon/iCloud3.png -------------------------------------------------------------------------------- /icon/iCloud4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Aaron-lv/sync/9ecf260b01b7f9ea045256e5831b4601a23e4dfd/icon/iCloud4.png -------------------------------------------------------------------------------- /icon/iCloud5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Aaron-lv/sync/9ecf260b01b7f9ea045256e5831b4601a23e4dfd/icon/iCloud5.png -------------------------------------------------------------------------------- /icon/iCloud6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Aaron-lv/sync/9ecf260b01b7f9ea045256e5831b4601a23e4dfd/icon/iCloud6.png -------------------------------------------------------------------------------- /icon/iCloud7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Aaron-lv/sync/9ecf260b01b7f9ea045256e5831b4601a23e4dfd/icon/iCloud7.png -------------------------------------------------------------------------------- /icon/iCloud8.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Aaron-lv/sync/9ecf260b01b7f9ea045256e5831b4601a23e4dfd/icon/iCloud8.png -------------------------------------------------------------------------------- /icon/jd1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Aaron-lv/sync/9ecf260b01b7f9ea045256e5831b4601a23e4dfd/icon/jd1.jpg -------------------------------------------------------------------------------- /icon/jd2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Aaron-lv/sync/9ecf260b01b7f9ea045256e5831b4601a23e4dfd/icon/jd2.jpg -------------------------------------------------------------------------------- /icon/jd3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Aaron-lv/sync/9ecf260b01b7f9ea045256e5831b4601a23e4dfd/icon/jd3.jpg -------------------------------------------------------------------------------- /icon/jd4.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Aaron-lv/sync/9ecf260b01b7f9ea045256e5831b4601a23e4dfd/icon/jd4.jpg -------------------------------------------------------------------------------- /icon/jd5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Aaron-lv/sync/9ecf260b01b7f9ea045256e5831b4601a23e4dfd/icon/jd5.png -------------------------------------------------------------------------------- /icon/jd6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Aaron-lv/sync/9ecf260b01b7f9ea045256e5831b4601a23e4dfd/icon/jd6.png -------------------------------------------------------------------------------- /icon/jd7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Aaron-lv/sync/9ecf260b01b7f9ea045256e5831b4601a23e4dfd/icon/jd7.png -------------------------------------------------------------------------------- /icon/jd8.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Aaron-lv/sync/9ecf260b01b7f9ea045256e5831b4601a23e4dfd/icon/jd8.png -------------------------------------------------------------------------------- /icon/jd_moneyTree.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Aaron-lv/sync/9ecf260b01b7f9ea045256e5831b4601a23e4dfd/icon/jd_moneyTree.png -------------------------------------------------------------------------------- /icon/jd_pet.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Aaron-lv/sync/9ecf260b01b7f9ea045256e5831b4601a23e4dfd/icon/jd_pet.png -------------------------------------------------------------------------------- /icon/qh1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Aaron-lv/sync/9ecf260b01b7f9ea045256e5831b4601a23e4dfd/icon/qh1.png -------------------------------------------------------------------------------- /icon/qh2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Aaron-lv/sync/9ecf260b01b7f9ea045256e5831b4601a23e4dfd/icon/qh2.png -------------------------------------------------------------------------------- /icon/qh3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Aaron-lv/sync/9ecf260b01b7f9ea045256e5831b4601a23e4dfd/icon/qh3.png -------------------------------------------------------------------------------- /icon/txy.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Aaron-lv/sync/9ecf260b01b7f9ea045256e5831b4601a23e4dfd/icon/txy.png -------------------------------------------------------------------------------- /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 | -------------------------------------------------------------------------------- /jdCookie.js: -------------------------------------------------------------------------------- 1 | /* 2 | 此文件为Node.js专用。其他用户请忽略 3 | */ 4 | //此处填写京东账号cookie。 5 | let CookieJDs = [ 6 | '',//账号一ck,例:pt_key=XXX;pt_pin=XXX; 7 | '',//账号二ck,例:pt_key=XXX;pt_pin=XXX;如有更多,依次类推 8 | ] 9 | // 判断环境变量里面是否有京东ck 10 | if (process.env.JD_COOKIE) { 11 | if (process.env.JD_COOKIE.indexOf('&') > -1) { 12 | CookieJDs = process.env.JD_COOKIE.split('&'); 13 | } else if (process.env.JD_COOKIE.indexOf('\n') > -1) { 14 | CookieJDs = process.env.JD_COOKIE.split('\n'); 15 | } else { 16 | CookieJDs = [process.env.JD_COOKIE]; 17 | } 18 | } 19 | if (JSON.stringify(process.env).indexOf('GITHUB')>-1) { 20 | console.log(`请勿使用github action运行此脚本,无论你是从你自己的私库还是其他哪里拉取的源代码,都会导致我被封号\n`); 21 | !(async () => { 22 | await require('./sendNotify').sendNotify('提醒', `请勿使用github action、滥用github资源会封我仓库以及账号`) 23 | await process.exit(0); 24 | })() 25 | } 26 | CookieJDs = [...new Set(CookieJDs.filter(item => !!item))] 27 | console.log(`\n====================共${CookieJDs.length}个京东账号Cookie=========\n`); 28 | console.log(`==================脚本执行- 北京时间(UTC+8):${new Date(new Date().getTime() + new Date().getTimezoneOffset()*60*1000 + 8*60*60*1000).toLocaleString()}=====================\n`) 29 | if (process.env.JD_DEBUG && process.env.JD_DEBUG === 'false') console.log = () => {}; 30 | for (let i = 0; i < CookieJDs.length; i++) { 31 | if (!CookieJDs[i].match(/pt_pin=(.+?);/) || !CookieJDs[i].match(/pt_key=(.+?);/)) console.log(`\n提示:京东cookie 【${CookieJDs[i]}】填写不规范,可能会影响部分脚本正常使用。正确格式为: pt_key=xxx;pt_pin=xxx;(分号;不可少)\n`); 32 | const index = (i + 1 === 1) ? '' : (i + 1); 33 | exports['CookieJD' + index] = CookieJDs[i].trim(); 34 | } 35 | -------------------------------------------------------------------------------- /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 | 'AXDgNYKNLs51h24hm7ZK-w==@2pMYXE95BIkCIGcO6UzTpQ==@DgHnSIl_Xks49TJjxzo7nw==@UO68abNzUTGatLzR4Z4RTg==@xJctChTp3ru2blH_WwFopg==@W2y011egxw55xNDYP8Xpww==@NRjbnfYENRVL9QSnLZZNrA==@dmgVOhr4JdUp1CG78ohkWw==@6nURqZ5tze71d9TbZGQg3Q==',//账号一的好友shareCode,不同好友中间用@符号隔开 11 | 'AXDgNYKNLs51h24hm7ZK-w==@2pMYXE95BIkCIGcO6UzTpQ==@DgHnSIl_Xks49TJjxzo7nw==@UO68abNzUTGatLzR4Z4RTg==@xJctChTp3ru2blH_WwFopg==@W2y011egxw55xNDYP8Xpww==@NRjbnfYENRVL9QSnLZZNrA==@dmgVOhr4JdUp1CG78ohkWw==@6nURqZ5tze71d9TbZGQg3Q==',//账号二的好友shareCode,不同好友中间用@符号隔开 12 | ] 13 | 14 | // 从日志获取互助码 15 | // const logShareCodes = require('./utils/jdShareCodes'); 16 | // if (logShareCodes.DREAM_FACTORY_SHARE_CODES.length > 0 && !process.env.DREAM_FACTORY_SHARE_CODES) { 17 | // process.env.DREAM_FACTORY_SHARE_CODES = logShareCodes.DREAM_FACTORY_SHARE_CODES.join('&'); 18 | // } 19 | 20 | // 判断环境变量里面是否有京喜工厂互助码 21 | if (process.env.DREAM_FACTORY_SHARE_CODES) { 22 | if (process.env.DREAM_FACTORY_SHARE_CODES.indexOf('&') > -1) { 23 | console.log(`您的互助码选择的是用&隔开\n`) 24 | shareCodes = process.env.DREAM_FACTORY_SHARE_CODES.split('&'); 25 | } else if (process.env.DREAM_FACTORY_SHARE_CODES.indexOf('\n') > -1) { 26 | console.log(`您的互助码选择的是用换行隔开\n`) 27 | shareCodes = process.env.DREAM_FACTORY_SHARE_CODES.split('\n'); 28 | } else { 29 | shareCodes = process.env.DREAM_FACTORY_SHARE_CODES.split(); 30 | } 31 | } else { 32 | console.log(`由于您环境变量(DREAM_FACTORY_SHARE_CODES)里面未提供助力码,故此处运行将会给脚本内置的码进行助力,请知晓!`) 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 | } 38 | -------------------------------------------------------------------------------- /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 | } -------------------------------------------------------------------------------- /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 | '5853550f71014282912b76d95beb84c0@48e6ec73af85409abbfd6bbb1bbed122@68c383d05e4747e5b34a579445db9459@b58ddba3317b44ceb0ac86ea8952998c@8d724eb95e3847b6a1526587d1836f27@a80b7d1db41a4381b742232da9d22443@ce107b8f64d24f62a92292180f764018@c73ea563a77d4464b273503d3838fec1@0dd9a7fd1feb449fb1bf854a3ec0e801',//账号一的好友shareCode,不同好友中间用@符号隔开 11 | '5853550f71014282912b76d95beb84c0@48e6ec73af85409abbfd6bbb1bbed122@68c383d05e4747e5b34a579445db9459@b58ddba3317b44ceb0ac86ea8952998c@8d724eb95e3847b6a1526587d1836f27@a80b7d1db41a4381b742232da9d22443@ce107b8f64d24f62a92292180f764018@c73ea563a77d4464b273503d3838fec1@0dd9a7fd1feb449fb1bf854a3ec0e801',//账号二的好友shareCode,不同好友中间用@符号隔开 12 | ] 13 | 14 | // 从日志获取互助码 15 | // const logShareCodes = require('./utils/jdShareCodes'); 16 | // if (logShareCodes.FRUITSHARECODES.length > 0 && !process.env.FRUITSHARECODES) { 17 | // process.env.FRUITSHARECODES = logShareCodes.FRUITSHARECODES.join('&'); 18 | // } 19 | 20 | // 判断github action里面是否有东东农场互助码 21 | if (process.env.FRUITSHARECODES) { 22 | if (process.env.FRUITSHARECODES.indexOf('&') > -1) { 23 | console.log(`您的东东农场互助码选择的是用&隔开\n`) 24 | FruitShareCodes = process.env.FRUITSHARECODES.split('&'); 25 | } else if (process.env.FRUITSHARECODES.indexOf('\n') > -1) { 26 | console.log(`您的东东农场互助码选择的是用换行隔开\n`) 27 | FruitShareCodes = process.env.FRUITSHARECODES.split('\n'); 28 | } else { 29 | FruitShareCodes = process.env.FRUITSHARECODES.split(); 30 | } 31 | } else { 32 | console.log(`由于您环境变量(FRUITSHARECODES)里面未提供助力码,故此处运行将会给脚本内置的码进行助力,请知晓!`) 33 | } 34 | for (let i = 0; i < FruitShareCodes.length; i++) { 35 | const index = (i + 1 === 1) ? '' : (i + 1); 36 | exports['FruitShareCode' + index] = FruitShareCodes[i]; 37 | } 38 | -------------------------------------------------------------------------------- /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 | -------------------------------------------------------------------------------- /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 | 'MTAxODcxOTI2NTAwMDAwMDAyNTE5ODU4OQ==@MTEzMzI1MTE4NDAwMDAwMDA1NzY3MDAwOQ==@MTEyNjE4NjQ2MDAwMDAwMDU3NzA1NjMx@MTAxODEyMjkyMDAwMDAwMDM5MzI3ODM1@MTE1NDUyMjEwMDAwMDAwMzUyNDI3Njk=@MTE1NDUyMjEwMDAwMDAwMzgxMjgwNjM=@MTE1NDAxNzYwMDAwMDAwMzk2NjQ2MjE=@MTE1NDQ5MzYwMDAwMDAwMzgwNzQxMTc=@MTAxODc2NTE0NzAwMDAwMDAyMTgwNDcwNw==',//账号一的好友shareCode,不同好友中间用@符号隔开 11 | 'MTAxODcxOTI2NTAwMDAwMDAyNTE5ODU4OQ==@MTEzMzI1MTE4NDAwMDAwMDA1NzY3MDAwOQ==@MTEyNjE4NjQ2MDAwMDAwMDU3NzA1NjMx@MTAxODEyMjkyMDAwMDAwMDM5MzI3ODM1@MTE1NDUyMjEwMDAwMDAwMzUyNDI3Njk=@MTE1NDUyMjEwMDAwMDAwMzgxMjgwNjM=@MTE1NDAxNzYwMDAwMDAwMzk2NjQ2MjE=@MTE1NDQ5MzYwMDAwMDAwMzgwNzQxMTc=@MTAxODc2NTE0NzAwMDAwMDAyMTgwNDcwNw==',//账号二的好友shareCode,不同好友中间用@符号隔开 12 | ] 13 | 14 | // 从日志获取互助码 15 | // const logShareCodes = require('./utils/jdShareCodes'); 16 | // if (logShareCodes.PETSHARECODES.length > 0 && !process.env.PETSHARECODES) { 17 | // process.env.PETSHARECODES = logShareCodes.PETSHARECODES.join('&'); 18 | // } 19 | 20 | // 判断github action里面是否有东东萌宠互助码 21 | if (process.env.PETSHARECODES) { 22 | if (process.env.PETSHARECODES.indexOf('&') > -1) { 23 | console.log(`您的东东萌宠互助码选择的是用&隔开\n`) 24 | PetShareCodes = process.env.PETSHARECODES.split('&'); 25 | } else if (process.env.PETSHARECODES.indexOf('\n') > -1) { 26 | console.log(`您的东东萌宠互助码选择的是用换行隔开\n`) 27 | PetShareCodes = process.env.PETSHARECODES.split('\n'); 28 | } else { 29 | PetShareCodes = process.env.PETSHARECODES.split(); 30 | } 31 | } else { 32 | console.log(`由于您环境变量(PETSHARECODES)里面未提供助力码,故此处运行将会给脚本内置的码进行助力,请知晓!`) 33 | } 34 | for (let i = 0; i < PetShareCodes.length; i++) { 35 | const index = (i + 1 === 1) ? '' : (i + 1); 36 | exports['PetShareCode' + index] = PetShareCodes[i]; 37 | } -------------------------------------------------------------------------------- /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 | 'lsvcdmfjrraodhrrvhcfiz7iye@o7eiltak46s2x3mao6ugdiywqv6t56rymtxfe4q@e7lhibzb3zek2zegsqjmjagw4c3zvnit3ipzuci@olmijoxgmjuty7323i6ijrv5tdhd32kefogty5i@gf2njfitdloxldekzam2flrji4@mq65ksgdrkobhiyvkoqfi7ff7i5ac3f4ijdgqji@wkmb7lejrmax2avk7bszvx7s74@4npkonnsy7xi3acvl3goi4ga5gpmpv2km4yj3di@rj7s6mzlk7uognpgua34bszhyf4cpqqtj5vfhta@olmijoxgmjutyif5p35uuja6gwp2ulsp2x6fjoi@dzfuhp3b2fz7mnj5ndxxqsradgg5bsrhuof2mbq',//账号一的好友shareCode,不同好友中间用@符号隔开 11 | 'lsvcdmfjrraodhrrvhcfiz7iye@o7eiltak46s2x3mao6ugdiywqv6t56rymtxfe4q@e7lhibzb3zek2zegsqjmjagw4c3zvnit3ipzuci@olmijoxgmjuty7323i6ijrv5tdhd32kefogty5i@gf2njfitdloxldekzam2flrji4@mq65ksgdrkobhiyvkoqfi7ff7i5ac3f4ijdgqji@wkmb7lejrmax2avk7bszvx7s74@4npkonnsy7xi3acvl3goi4ga5gpmpv2km4yj3di@rj7s6mzlk7uognpgua34bszhyf4cpqqtj5vfhta@olmijoxgmjutyif5p35uuja6gwp2ulsp2x6fjoi@dzfuhp3b2fz7mnj5ndxxqsradgg5bsrhuof2mbq',//账号二的好友shareCode,不同好友中间用@符号隔开 12 | ] 13 | 14 | // 从日志获取互助码 15 | // const logShareCodes = require('./utils/jdShareCodes'); 16 | // if (logShareCodes.PLANT_BEAN_SHARECODES.length > 0 && !process.env.PLANT_BEAN_SHARECODES) { 17 | // process.env.PLANT_BEAN_SHARECODES = logShareCodes.PLANT_BEAN_SHARECODES.join('&'); 18 | // } 19 | 20 | // 判断github action里面是否有种豆得豆互助码 21 | if (process.env.PLANT_BEAN_SHARECODES) { 22 | if (process.env.PLANT_BEAN_SHARECODES.indexOf('&') > -1) { 23 | console.log(`您的种豆互助码选择的是用&隔开\n`) 24 | PlantBeanShareCodes = process.env.PLANT_BEAN_SHARECODES.split('&'); 25 | } else if (process.env.PLANT_BEAN_SHARECODES.indexOf('\n') > -1) { 26 | console.log(`您的种豆互助码选择的是用换行隔开\n`) 27 | PlantBeanShareCodes = process.env.PLANT_BEAN_SHARECODES.split('\n'); 28 | } else { 29 | PlantBeanShareCodes = process.env.PLANT_BEAN_SHARECODES.split(); 30 | } 31 | } else { 32 | console.log(`由于您环境变量(PLANT_BEAN_SHARECODES)里面未提供助力码,故此处运行将会给脚本内置的码进行助力,请知晓!`) 33 | } 34 | for (let i = 0; i < PlantBeanShareCodes.length; i++) { 35 | const index = (i + 1 === 1) ? '' : (i + 1); 36 | exports['PlantBeanShareCodes' + index] = PlantBeanShareCodes[i]; 37 | } 38 | -------------------------------------------------------------------------------- /jd_health_collect.js: -------------------------------------------------------------------------------- 1 | // author: 疯疯 2 | /* 3 | 东东健康社区收集能量收集能量(不做任务,任务脚本请使用jd_health.js) 4 | 更新时间:2021-4-23 5 | 活动入口:京东APP首页搜索 "玩一玩"即可 6 | 7 | 已支持IOS多京东账号,Node.js支持N个京东账号 8 | 脚本兼容: QuantumultX, Surge, Loon, JSBox, Node.js 9 | ===================quantumultx================ 10 | [task_local] 11 | #东东健康社区收集能量 12 | 5-45/20 * * * * jd_health_collect.js, tag=东东健康社区收集能量, img-url=https://raw.githubusercontent.com/Orz-3/mini/master/Color/jd.png, enabled=true 13 | 14 | =====================Loon================ 15 | [Script] 16 | cron "5-45/20 * * * *" script-path=jd_health_collect.js, tag=东东健康社区收集能量 17 | 18 | ====================Surge================ 19 | 东东健康社区收集能量 = type=cron,cronexp="5-45/20 * * * *",wake-system=1,timeout=3600,script-path=jd_health_collect.js 20 | 21 | ============小火箭========= 22 | 东东健康社区收集能量 = type=cron,script-path=jd_health_collect.js, cronexpr="5-45/20 * * * *", timeout=3600, enable=true 23 | */ 24 | const $ = new Env("东东健康社区收集能量收集"); 25 | const jdCookieNode = $.isNode() ? require("./jdCookie.js") : ""; 26 | let cookiesArr = [], 27 | cookie = "", 28 | message; 29 | 30 | if ($.isNode()) { 31 | Object.keys(jdCookieNode).forEach((item) => { 32 | cookiesArr.push(jdCookieNode[item]); 33 | }); 34 | if (process.env.JD_DEBUG && process.env.JD_DEBUG === "false") console.log = () => {}; 35 | } else { 36 | cookiesArr = [ 37 | $.getdata("CookieJD"), 38 | $.getdata("CookieJD2"), 39 | ...$.toObj($.getdata("CookiesJD") || "[]").map((item) => item.cookie), 40 | ].filter((item) => !!item); 41 | } 42 | const JD_API_HOST = "https://api.m.jd.com/client.action"; 43 | !(async () => { 44 | if (!cookiesArr[0]) { 45 | $.msg( 46 | $.name, 47 | "【提示】请先获取京东账号一cookie\n直接使用NobyDa的京东签到获取", 48 | "https://bean.m.jd.com/", 49 | { "open-url": "https://bean.m.jd.com/" } 50 | ); 51 | return; 52 | } 53 | for (let i = 0; i < cookiesArr.length; i++) { 54 | if (cookiesArr[i]) { 55 | cookie = cookiesArr[i]; 56 | $.UserName = decodeURIComponent( 57 | cookie.match(/pt_pin=([^; ]+)(?=;?)/) && cookie.match(/pt_pin=([^; ]+)(?=;?)/)[1] 58 | ); 59 | $.index = i + 1; 60 | message = ""; 61 | console.log(`\n******开始【京东账号${$.index}】${$.UserName}*********\n`); 62 | await collectScore(); 63 | } 64 | } 65 | })() 66 | .catch((e) => { 67 | $.log("", `❌ ${$.name}, 失败! 原因: ${e}!`, ""); 68 | }) 69 | .finally(() => { 70 | $.done(); 71 | }); 72 | 73 | function collectScore() { 74 | return new Promise((resolve) => { 75 | $.get(taskUrl("jdhealth_collectProduceScore", {}), (err, resp, data) => { 76 | try { 77 | if (safeGet(data)) { 78 | data = $.toObj(data); 79 | if (data?.data?.bizCode === 0) { 80 | if (data?.data?.result?.produceScore) 81 | console.log( 82 | `任务完成成功,获得:${ 83 | data?.data?.result?.produceScore ?? "未知" 84 | }能量` 85 | ); 86 | else 87 | console.log( 88 | `任务领取结果:${data?.data?.bizMsg ?? JSON.stringify(data)}` 89 | ); 90 | } else { 91 | console.log(`任务完成失败:${data?.data?.bizMsg ?? JSON.stringify(data)}`); 92 | } 93 | } 94 | } catch (e) { 95 | console.log(e); 96 | } finally { 97 | resolve(); 98 | } 99 | }); 100 | }); 101 | } 102 | 103 | function taskUrl(function_id, body = {}) { 104 | return { 105 | url: `${JD_API_HOST}/client.action?functionId=${function_id}&body=${escape( 106 | JSON.stringify(body) 107 | )}&client=wh5&clientVersion=1.0.0`, 108 | headers: { 109 | Cookie: cookie, 110 | origin: "https://h5.m.jd.com", 111 | referer: "https://h5.m.jd.com/", 112 | "Content-Type": "application/x-www-form-urlencoded", 113 | "User-Agent": $.isNode() 114 | ? process.env.JD_USER_AGENT 115 | ? process.env.JD_USER_AGENT 116 | : require("./USER_AGENTS").USER_AGENT 117 | : $.getdata("JDUA") 118 | ? $.getdata("JDUA") 119 | : "jdapp;iPhone;9.4.4;14.3;network/4g;Mozilla/5.0 (iPhone; CPU iPhone OS 14_3 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148;supportJDSHWK/1", 120 | }, 121 | }; 122 | } 123 | 124 | function safeGet(data) { 125 | try { 126 | if (typeof JSON.parse(data) == "object") { 127 | return true; 128 | } 129 | } catch (e) { 130 | console.log(e); 131 | console.log(`京东服务器访问数据为空,请检查自身设备网络情况`); 132 | return false; 133 | } 134 | } 135 | 136 | // prettier-ignore 137 | 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)} 138 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "111", 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/Aaron-lv/sync.git" 12 | }, 13 | "keywords": [ 14 | "京东薅羊毛工具, 京东水果、宠物、种豆等等" 15 | ], 16 | "author": "111", 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 | -------------------------------------------------------------------------------- /serverless.yml: -------------------------------------------------------------------------------- 1 | # serverless.yml 2 | 3 | #组件信息 4 | component: scf # (必选) 组件名称,在该实例中为scf 5 | name: jdscript # (必选) 组件实例名称。 6 | 7 | #组件参数配置 8 | inputs: 9 | name: scf-${name} # 云函数名称,默认为 ${name}-${stage}-${app} 10 | enableRoleAuth: true # 默认会尝试创建 SCF_QcsRole 角色,如果不需要配置成 false 即可 11 | src: ./ 12 | handler: index.main_handler #入口 13 | runtime: Nodejs12.16 # 运行环境 默认 Nodejs10.15 14 | region: ap-hongkong # 函数所在区域 15 | description: This is a function in ${app} application. 16 | memorySize: 128 # 内存大小,单位MB 17 | timeout: 900 # 超时时间,单位秒 18 | events: #触发器 19 | - timer: #签到 20 | parameters: 21 | name: beansign 22 | cronExpression: "0 0 0 * * * *" 23 | enable: true 24 | argument: jd_bean_sign 25 | - timer: #东东超市兑换奖品 #摇京豆 #京东汽车兑换 26 | parameters: 27 | name: blueCoin_clublottery_carexchange 28 | cronExpression: "0 0 0 * * * *" 29 | enable: true 30 | argument: jd_blueCoin&jd_club_lottery&jd_car_exchange 31 | - timer: #东东农场 #东东萌宠 #口袋书店 #京喜农场 #京东极速版签到 #京东家庭号 #金榜创造营 #美食馆瓜分京豆 32 | parameters: 33 | name: fruit_pet_bookshop_jxnc_speedsign_family_goldcreator_foodRunning 34 | cronExpression: "0 5 6-18/6,8 * * * *" 35 | enable: true 36 | argument: jd_fruit&jd_pet&jd_bookshop&jd_jxnc&jd_speed_sign&jd_family&jd_gold_creator&jd_foodRunning 37 | - timer: #宠汪汪喂食 #宠汪汪 #摇钱树 #京东种豆得豆 #京喜工厂 #东东工厂 #东东健康社区收集能量 38 | parameters: 39 | name: feedPets_joy_moneyTree_plantBean_dreamFactory_jdfactory_healthcollect 40 | cronExpression: "0 3 */1 * * * *" 41 | enable: true 42 | argument: jd_joy_feedPets&jd_joy&jd_moneyTree&jd_plantBean&jd_dreamFactory&jd_jdfactory&jd_health_collect 43 | - timer: #宠汪汪积分兑换京豆 #签到领现金 #点点券 #东东小窝 #京喜财富岛 #京东直播 #东东健康社区 #每日抽奖 #女装魔盒 #5G超级盲盒 #东东电竞经理 44 | parameters: 45 | name: joyreward_cash_necklace_smallhome_cfd_live_health_dailylottery_nzmh_mohe_esManager 46 | cronExpression: "0 0 0-16/8,20 * * * *" 47 | enable: true 48 | argument: jd_joy_reward&jd_cash&jd_necklace&jd_small_home&jd_cfd&jd_live&jd_health&jd_daily_lottery&jd_nzmh&jd_mohe&jd_esManager 49 | - timer: #京东全民开红包 #进店领豆 #取关京东店铺商品 #京东抽奖机 #京东汽车 #京东秒秒币 50 | parameters: 51 | name: redPacket_shop_unsubscribe_lotteryMachine_car_ms 52 | cronExpression: "0 10 0 * * * *" 53 | enable: true 54 | argument: jd_redPacket&jd_shop&jd_unsubscribe&jd_lotteryMachine&jd_car&jd_ms 55 | - timer: #天天提鹅 #京喜牧场 #京东到家农场 #京东到家鲜豆庄园 #京东到家鲜豆任务 56 | parameters: 57 | name: dailyegg_jxmc_jddjfruit_jddjplantBeans_jddjdailyTask 58 | cronExpression: "0 8 */3 * * * *" 59 | enable: true 60 | argument: jd_daily_egg&jd_jxmc&jd_jddj_fruit&jd_jddj_plantBeans&jd_jddj_dailyTask 61 | - timer: #东东超市 #十元街 #京东到家收集水滴 #京东到家鲜豆庄园收水车水滴 62 | parameters: 63 | name: superMarket_syj_jddjfruitcollect_jddjplantBeanscollect 64 | cronExpression: "0 15 */1 * * * *" 65 | enable: true 66 | argument: jd_superMarket&jd_syj&jd_jddj_fruit_collect&jd_jddj_plantBeans_collect 67 | - timer: #京豆变动通知 #疯狂的joy #监控crazyJoy分红 #京东排行榜 #领京豆额外奖励 #京东保价 #闪购盲盒 68 | parameters: 69 | name: beanchange_crazyjoy_crazyjoybonus_rankingList_beanhome_price_sgmh 70 | cronExpression: "0 30 7 * * * *" 71 | enable: true 72 | argument: jd_bean_change&jd_crazy_joy&jd_crazy_joy_bonus&jd_rankingList&jd_bean_home&jd_price&jd_sgmh 73 | - timer: #金融养猪 #京东快递 #京东赚赚 #京东极速版红包 #领金贴 #京小鸽吾悦寄 #送豆得豆 74 | parameters: 75 | name: pigPet_kd_jdzz_speedredpocke_jintie_jxg_sendBeans 76 | cronExpression: "0 3 1 * * * *" 77 | enable: true 78 | argument: jd_pigPet&jd_kd&jd_jdzz&jd_speed_redpocke&jd_jin_tie&jd_jxg&jd_sendBeans 79 | environment: # 环境变量 80 | variables: # 环境变量对象 81 | AAA: BBB # 不要删除,用来格式化对齐追加的变量的 82 | -------------------------------------------------------------------------------- /tencentscf.js: -------------------------------------------------------------------------------- 1 | // Depends on tencentcloud-sdk-nodejs version 4.0.3 or higher 2 | const tencentcloud = require("tencentcloud-sdk-nodejs"); 3 | const fs = require("fs"); 4 | const yaml = require("js-yaml"); 5 | 6 | process.env.action = 0; 7 | const ScfClient = tencentcloud.scf.v20180416.Client; 8 | const clientConfig = { 9 | credential: { 10 | secretId: process.env.TENCENT_SECRET_ID, 11 | secretKey: process.env.TENCENT_SECRET_KEY 12 | }, 13 | region: process.env.TENCENT_REGION, // 区域参考,https://cloud.tencent.com/document/product/583/17299 14 | profile: { 15 | httpProfile: { 16 | endpoint: "scf.tencentcloudapi.com" 17 | } 18 | } 19 | }; 20 | const sleep = ms => new Promise(res => setTimeout(res, ms)); 21 | 22 | !(async () => { 23 | const client = new ScfClient(clientConfig); 24 | let params; 25 | await client.ListFunctions({}).then( 26 | async data => { 27 | let func = data.Functions.filter( 28 | vo => vo.FunctionName === process.env.TENCENT_FUNCTION_NAME 29 | ); 30 | const file_buffer = fs.readFileSync("./myfile.zip"); 31 | const contents_in_base64 = file_buffer.toString("base64"); 32 | if (func.length) { 33 | console.log(`更新函数`); 34 | // 更新代码,删除后重建 35 | params = { 36 | FunctionName: process.env.TENCENT_FUNCTION_NAME 37 | }; 38 | await client.DeleteFunction(params).then( 39 | data => { 40 | console.log(data); 41 | }, 42 | err => { 43 | console.error("error", err); 44 | process.env.action++; 45 | } 46 | ); 47 | await sleep(1000 * 50); // 等待50秒 48 | } 49 | 50 | console.log(`创建函数`); 51 | let inputYML = ".github/workflows/deploy_tencent_scf.yml"; 52 | let obj = yaml.load(fs.readFileSync(inputYML, { encoding: "utf-8" })); 53 | params = { 54 | Code: { 55 | ZipFile: contents_in_base64 56 | }, 57 | FunctionName: process.env.TENCENT_FUNCTION_NAME, 58 | Runtime: "Nodejs12.16", 59 | Timeout: 900, 60 | Environment: { 61 | Variables: [] 62 | } 63 | }; 64 | let vars = []; 65 | for (let key in obj.jobs.build.env) { 66 | if (process.env[key].length > 0) { 67 | vars.push(key); 68 | params.Environment.Variables.push({ 69 | Key: key, 70 | Value: process.env[key] 71 | }); 72 | } 73 | } 74 | console.log(`您一共填写了${vars.length}个环境变量`, vars); 75 | await client.CreateFunction(params).then( 76 | data => { 77 | console.log(data); 78 | }, 79 | err => { 80 | console.error("error", err); 81 | process.env.action++; 82 | } 83 | ); 84 | await sleep(1000 * 50); // 等待50秒 85 | }, 86 | err => { 87 | console.error("error", err); 88 | process.env.action++; 89 | } 90 | ); 91 | 92 | /* console.log(`更新环境变量`); 93 | // 更新环境变量 94 | let inputYML = ".github/workflows/deploy_tencent_scf.yml"; 95 | let obj = yaml.load(fs.readFileSync(inputYML, { encoding: "utf-8" })); 96 | let vars = []; 97 | for (let key in obj.jobs.build.steps[3].env) { 98 | if (key !== "PATH" && process.env.hasOwnProperty(key)) 99 | vars.push({ 100 | Key: key, 101 | Value: process.env[key] 102 | }); 103 | } 104 | console.log(`您一共填写了${vars.length}个环境变量`); 105 | params = { 106 | FunctionName: process.env.TENCENT_FUNCTION_NAME, 107 | Environment: { 108 | Variables: vars 109 | } 110 | }; 111 | await client.UpdateFunctionConfiguration(params).then( 112 | data => { 113 | console.log(data); 114 | }, 115 | err => { 116 | console.error("error", err); 117 | } 118 | ); 119 | let triggers = []; 120 | params = { 121 | FunctionName: process.env.TENCENT_FUNCTION_NAME 122 | }; 123 | await client.ListTriggers(params).then( 124 | data => { 125 | console.log(data); 126 | triggers = data.Triggers; 127 | }, 128 | err => { 129 | console.error("error", err); 130 | } 131 | ); 132 | for (let vo of triggers) { 133 | params = { 134 | FunctionName: process.env.TENCENT_FUNCTION_NAME, 135 | Type: "timer", 136 | TriggerName: vo.TriggerName 137 | }; 138 | await client.DeleteTrigger(params).then( 139 | data => { 140 | console.log(data); 141 | }, 142 | err => { 143 | console.error("error", err); 144 | } 145 | ); 146 | } */ 147 | 148 | // 更新触发器 149 | console.log(`去更新触发器`); 150 | let inputYML = "serverless.yml"; 151 | let obj = yaml.load(fs.readFileSync(inputYML, { encoding: "utf-8" })); 152 | for (let vo of obj.inputs.events) { 153 | let param = { 154 | FunctionName: process.env.TENCENT_FUNCTION_NAME, 155 | TriggerName: vo.timer.parameters.name, 156 | Type: "timer", 157 | TriggerDesc: vo.timer.parameters.cronExpression, 158 | CustomArgument: vo.timer.parameters.argument, 159 | Enable: "OPEN" 160 | }; 161 | await client.CreateTrigger(param).then( 162 | data => { 163 | console.log(data); 164 | }, 165 | err => { 166 | console.error("error", err); 167 | process.env.action++; 168 | } 169 | ); 170 | } 171 | })() 172 | .catch(e => console.log(e)) 173 | .finally(async () => { 174 | // 当环境为GitHub action时创建action.js文件判断部署是否进行失败通知 175 | if (process.env.GITHUB_ACTIONS == "true") { 176 | fs.writeFile( 177 | "action.js", 178 | `var action = ` + process.env.action + `;action > 0 ? require("./sendNotify").sendNotify("云函数部署异常!请重试","点击通知,登入后查看详情",{ url: process.env.GITHUB_SERVER_URL + "/" + process.env.GITHUB_REPOSITORY + "/actions/runs/" + process.env.GITHUB_RUN_ID + "?check_suite_focus=true" }): ""`, 179 | "utf8", 180 | function (error) { 181 | if (error) { 182 | console.log(error); 183 | return false; 184 | } 185 | console.log("写入action.js成功"); 186 | } 187 | ); 188 | } 189 | }); 190 | -------------------------------------------------------------------------------- /update_list.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | 3 | ## Author: https://github.com/nevinee 4 | ## Modified: 2021-03-18 5 | ## Version: v1.0.5 6 | 7 | ## 网址、路径、文件、标记信息以及表头 8 | WorkDir=$(cd $(dirname $0); pwd) 9 | JsList=($(cd $WorkDir; ls *.js | grep -E "j[drx]_" | perl -ne "{print unless /\.bak/}")) 10 | FileReadme=$WorkDir/README.md 11 | UrlRaw=https://gitee.com/lxk0301/jd_scripts/raw/master/ 12 | SheetHead="| 序号 | 文件 | 名称 | 活动入口 |\n| :-: | - | - | - |" 13 | 14 | ## 删除标记行的内容 15 | StartLine=$(($(grep -n "标记开始" "$FileReadme" | awk -F ":" '{print $1}') + 1)) 16 | EndLine=$(($(grep -n "标记结束" "$FileReadme" | awk -F ":" '{print $1}') - 1)) 17 | Tail=$(perl -ne "$. > $EndLine && print" "$FileReadme") 18 | perl -i -ne "{print unless $StartLine .. eof}" "$FileReadme" 19 | 20 | ## 生成新的表格并写入Readme 21 | cd $WorkDir 22 | Sheet=$SheetHead 23 | for ((i=0; i<${#JsList[*]}; i++)); do 24 | Name=$(grep "new Env" ${JsList[i]} | awk -F "'|\"" '{print $2}' | head -1) 25 | Entry=$(grep -E "^ *活动入口" ${JsList[i]} | awk -F ":|: " '{print $2}' | head -1) 26 | [[ -z $Entry ]] || [[ $Entry == 暂无 ]] && Entry=$(grep -E "^ *活动地址" ${JsList[i]} | awk -F ":|: " '{print $2}' | head -1) 27 | [[ $Entry == http* ]] && Entry="[活动地址]($Entry)" 28 | Raw="$UrlRaw${JsList[i]}" 29 | Sheet="$Sheet\n|$(($i + 1))|[${JsList[i]}]($Raw)|$Name|$Entry|" 30 | done 31 | echo -e "$Sheet\n$Tail" >> $FileReadme 32 | -------------------------------------------------------------------------------- /update_task.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | 3 | ## Author: https://github.com/nevinee 4 | ## Modified: 2021-05-22 5 | ## Version: v1.0.4 6 | 7 | ## 路径与清单 8 | WorkDir=$(cd $(dirname $0); pwd) 9 | JsList=$(cd $WorkDir; ls *.js | grep -Ei "j[drx]_" | perl -ne "{print unless /\.bak/}") 10 | JsList="$JsList backUp/xmSports.js" 11 | FileLoon=$WorkDir/Loon/lxk0301_LoonTask.conf 12 | FileQx=$WorkDir/QuantumultX/lxk0301_gallery.json 13 | FileQxRe=$WorkDir/QuantumultX/lxk0301_cookies.conf 14 | FileSurge=$WorkDir/Surge/lxk0301_Task.sgmodule.sgmodule 15 | 16 | ## task清单头尾部内容 17 | CommentsLoon="# IOS Loon Task&Cookies配置 \n# TG通知频道 (https://t.me/jdfruit)\n# 使用方法:打开APP,顶部的配置 -> 脚本 -> 订阅脚本- > 点击右上角+号 -> 添加url链接\n\nhostname = me-api.jd.com, draw.jdfcloud.com, jdjoy.jd.com, account.huami.com" 18 | CommentsQx='{\n "name": "lxk0301 task gallery",\n "description": "see you latter",\n "task": [' 19 | CommentsQxRe="hostname = draw.jdfcloud.com, jdjoy.jd.com, account.huami.com, me-api.jd.com" 20 | CommentsSurgeHead="#!name=lxk0301 iOS Tasks&Cookies Module\n#!desc=iOS Tasks&Cookies 模块配置\n\n# Task&Cookies模块配置 \n# TG讨论组 (https://t.me/JD_fruit_pet)\n\n[Script]" 21 | CommentsSurgeTail="\n[MITM]\nhostname = %APPEND% me-api.jd.com, draw.jdfcloud.com, jdjoy.jd.com, account.huami.com" 22 | 23 | ## 执行写入 24 | cd $WorkDir 25 | echo -e $CommentsLoon > $FileLoon 26 | echo -e $CommentsQx > $FileQx 27 | echo -e $CommentsQxRe > $FileQxRe 28 | echo -e $CommentsSurgeHead > $FileSurge 29 | for file in $JsList 30 | do 31 | TaskName=$(grep "new Env" $file | awk -F "'|\"" '{print $2}' | head -1) 32 | if [[ -n $TaskName ]]; then 33 | echo -e "\n# $TaskName" >> $FileLoon 34 | grep -E "cron.+script-path.+https://gitee\.com.+tag" $file >> $FileLoon 35 | grep -E "https://gitee\.com.+tag.+enabled" $file | perl -pe "{s|(.+\w)|\1\", \"addons\":\"https://gitee.com/lxk0301/jd_scripts/raw/master/QuantumultX/lxk0301_cookies.conf\"\},|; s|^| \{\"config\":\"|}" >> $FileQx 36 | grep -E "type.+cronexp.+script-path.+https://gitee\.com" $file >> $FileSurge 37 | fi 38 | grep -E "http-(request|response).+script-path.+https://gitee\.com.+tag" $file | perl -pe "s|(.+tag=)(.+)|\n# \2\n\1\2|" >> $FileLoon 39 | grep -E "script-(request|response)-.+https://gitee\.com" $file | perl -pe "s|(.+)|\n# $TaskName\n\1|" >> $FileQxRe 40 | grep -E "type=http-(request|response).+pattern.+script-path.+https://gitee\.com" $file >> $FileSurge 41 | done 42 | echo -e " ]\n}" >> $FileQx 43 | echo -e $CommentsSurgeTail >> $FileSurge 44 | perl -0777 -i -pe "s|,([\n\r]{1,2} \])|\1|" $FileQx 45 | perl -0777 -i -pe "s|(# .+\n{2}){1,}(# .+)|\2|g" $FileLoon 46 | -------------------------------------------------------------------------------- /utils/JDJRValidator.js: -------------------------------------------------------------------------------- 1 | const http = require('http'); 2 | const stream = require('stream'); 3 | const zlib = require('zlib'); 4 | const vm = require('vm'); 5 | const { createCanvas, Image } = require('canvas'); 6 | 7 | Math.avg = function average() { 8 | var sum= 0; 9 | var len = this.length; 10 | for (var i = 0; i < len; i++) { 11 | sum += this[i]; 12 | } 13 | return sum / len; 14 | }; 15 | function sleep(timeout) { 16 | return new Promise((resolve) => setTimeout(resolve, timeout)); 17 | } 18 | 19 | const canvas = createCanvas(); 20 | const PUZZLE_GAP = 8; 21 | const PUZZLE_PAD = 10; 22 | class PuzzleRecognizer { 23 | constructor(bg, patch, y) { 24 | const imgBg = new Image(); 25 | const imgPatch = new Image(); 26 | imgBg.src = bg; 27 | imgPatch.src = patch; 28 | this.bg = imgBg; 29 | this.patch = imgPatch; 30 | this.y = y; 31 | this.w = imgBg.naturalWidth; 32 | this.h = imgBg.naturalHeight; 33 | this.ctx = canvas.getContext('2d'); 34 | } 35 | 36 | run() { 37 | const { ctx, w, h } = this; 38 | canvas.width = w; 39 | canvas.height= h; 40 | ctx.clearRect(0, 0, w, h); 41 | ctx.drawImage(this.bg, 0, 0, w, h); 42 | return this.recognize(); 43 | } 44 | 45 | recognize() { 46 | const { ctx, w: width } = this; 47 | const { naturalHeight, naturalWidth } = this.patch; 48 | const posY = this.y + PUZZLE_PAD + ((naturalHeight - PUZZLE_PAD) / 2) - (PUZZLE_GAP / 2); 49 | const cData = ctx.getImageData(0, posY, width, PUZZLE_GAP).data; 50 | const lumas = []; 51 | for (let x = 0; x < width; x++) { 52 | var sum = 0; 53 | for (let y = 0; y < PUZZLE_GAP; y++) { 54 | var idx = x * 4 + y * (width * 4); 55 | var r = cData[idx]; 56 | var g = cData[idx + 1]; 57 | var b = cData[idx + 2]; 58 | var luma = 0.2126 * r + 0.7152 * g + 0.0722 * b; 59 | sum += luma; 60 | } 61 | lumas.push(sum / PUZZLE_GAP); 62 | } 63 | 64 | const n = 2; // minium macroscopic image width (px) 65 | const margin = naturalWidth - PUZZLE_PAD; 66 | const diff = 20; // macroscopic brightness difference 67 | const radius = PUZZLE_PAD; 68 | for (let i = 0, len = lumas.length - 2*4; i < len; i++) { 69 | const left = (lumas[i] + lumas[i+1]) / n; 70 | const right = (lumas[i+2] + lumas[i+3]) / n; 71 | const mi = margin + i; 72 | const mLeft = (lumas[mi] + lumas[mi+1]) / n; 73 | const mRigth = (lumas[mi+2] + lumas[mi+3]) / n; 74 | 75 | if (left - right > diff && mLeft - mRigth < -diff) { 76 | const pieces = lumas.slice(i+2,margin+i+2); 77 | const median = pieces.sort((x1,x2)=>x1-x2)[20]; 78 | const avg = Math.avg(pieces); 79 | if (median > left || median > mRigth) return; 80 | if (avg > 100) return; 81 | return i+n-radius; 82 | } 83 | } 84 | return -1; 85 | } 86 | } 87 | 88 | const DATA = { 89 | "appId": "17839d5db83", 90 | "scene": "cww", 91 | "product": "embed", 92 | "lang": "zh_CN", 93 | }; 94 | const SERVER = 'iv.jd.com'; 95 | class JDJRValidator { 96 | constructor() { 97 | this.data = {}; 98 | this.x = 0; 99 | this.t = Date.now(); 100 | this.c = {}; 101 | } 102 | 103 | async run() { 104 | const tryRecognize = async () => { 105 | const x = await this.recognize(); 106 | 107 | if (x > 0) { 108 | return x; 109 | } 110 | // retry 111 | return await tryRecognize(); 112 | }; 113 | const puzzleX = await tryRecognize(); 114 | const pos = new MousePosFaker(puzzleX).run(); 115 | const d = getCoordinate(pos); 116 | 117 | await sleep(pos[pos.length-1][2] - Date.now()); 118 | const result = await JDJRValidator.jsonp('/slide/s.html', { d, ...this.data }); 119 | 120 | if (result.message === 'success') { 121 | this.c = result; 122 | console.log(result); 123 | } else { 124 | console.count(JSON.stringify(result)); 125 | await sleep(300); 126 | await this.run(); 127 | } 128 | } 129 | 130 | async recognize() { 131 | const data = await JDJRValidator.jsonp('/slide/g.html', { e: '' }); 132 | const { bg, patch, y } = data; 133 | const uri = 'data:image/png;base64,'; 134 | const re = new PuzzleRecognizer(uri+bg, uri+patch, y); 135 | const puzzleX = re.run(); 136 | 137 | if (puzzleX > 0) { 138 | this.data = { 139 | c: data.challenge, 140 | w: re.w, 141 | e: '', 142 | s: '', 143 | o: '', 144 | }; 145 | this.x = puzzleX; 146 | } 147 | return puzzleX; 148 | } 149 | 150 | async report(n) { 151 | console.time('PuzzleRecognizer'); 152 | let count = 0; 153 | 154 | for (let i = 0; i < n; i++) { 155 | const x = await this.recognize(); 156 | 157 | if (x > 0) count ++; 158 | if (i % 50 === 0) { 159 | console.log('%f\%', (i/n)*100); 160 | } 161 | } 162 | 163 | console.log('successful: %f\%', (count/n)*100); 164 | console.timeEnd('PuzzleRecognizer'); 165 | } 166 | 167 | static jsonp(api, data = {}) { 168 | return new Promise((resolve, reject) => { 169 | const fnId = `jsonp_${String(Math.random()).replace('.', '')}`; 170 | const extraData = { callback: fnId }; 171 | const query = new URLSearchParams({ ...DATA, ...extraData, ...data }).toString(); 172 | const url = `http://${SERVER}${api}?${query}`; 173 | const headers = { 174 | 'Accept': '*/*', 175 | 'Accept-Encoding': 'gzip,deflate,br', 176 | 'Accept-Language': 'zh-CN,en-US', 177 | 'Connection': 'keep-alive', 178 | 'Host': SERVER, 179 | 'Proxy-Connection': 'keep-alive', 180 | 'Referer': 'https://h5.m.jd.com/babelDiy/Zeus/2wuqXrZrhygTQzYA7VufBEpj4amH/index.html', 181 | 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.77 Safari/537.36', 182 | }; 183 | const req = http.get(url, { headers }, (response) => { 184 | let res = response; 185 | if (res.headers['content-encoding'] === 'gzip') { 186 | const unzipStream = new stream.PassThrough(); 187 | stream.pipeline( 188 | response, 189 | zlib.createGunzip(), 190 | unzipStream, 191 | reject, 192 | ); 193 | res = unzipStream; 194 | } 195 | res.setEncoding('utf8'); 196 | 197 | let rawData = ''; 198 | 199 | res.on('data', (chunk) => rawData += chunk); 200 | res.on('end', () => { 201 | try { 202 | const ctx = { 203 | [fnId]: (data) => ctx.data = data, 204 | data: {}, 205 | }; 206 | 207 | vm.createContext(ctx); 208 | vm.runInContext(rawData, ctx); 209 | 210 | res.resume(); 211 | resolve(ctx.data); 212 | } catch (e) { 213 | reject(e); 214 | } 215 | }); 216 | }); 217 | 218 | req.on('error', reject); 219 | req.end(); 220 | }); 221 | } 222 | } 223 | function getCoordinate(c) { 224 | function string10to64(d) { 225 | var c = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ-~".split("") 226 | , b = c.length 227 | , e = +d 228 | , a = []; 229 | do { 230 | mod = e % b; 231 | e = (e - mod) / b; 232 | a.unshift(c[mod]) 233 | } while (e); 234 | return a.join("") 235 | } 236 | function prefixInteger (a, b) { 237 | return (Array(b).join(0) + a).slice(-b) 238 | } 239 | function pretreatment(d, c, b) { 240 | var e = string10to64(Math.abs(d)); 241 | var a = ""; 242 | if (!b) { 243 | a += (d > 0 ? "1" : "0") 244 | } 245 | a += prefixInteger(e, c); 246 | return a 247 | } 248 | 249 | var b = new Array(); 250 | for (var e = 0; e < c.length; e++) { 251 | if (e == 0) { 252 | b.push(pretreatment(c[e][0] < 262143 ? c[e][0] : 262143, 3, true)); 253 | b.push(pretreatment(c[e][1] < 16777215 ? c[e][1] : 16777215, 4, true)); 254 | b.push(pretreatment(c[e][2] < 4398046511103 ? c[e][2] : 4398046511103, 7, true)) 255 | } else { 256 | var a = c[e][0] - c[e - 1][0]; 257 | var f = c[e][1] - c[e - 1][1]; 258 | var d = c[e][2] - c[e - 1][2]; 259 | b.push(pretreatment(a < 4095 ? a : 4095, 2, false)); 260 | b.push(pretreatment(f < 4095 ? f : 4095, 2, false)); 261 | b.push(pretreatment(d < 16777215 ? d : 16777215, 4, true)) 262 | } 263 | } 264 | return b.join("") 265 | } 266 | 267 | const HZ = 60; 268 | class MousePosFaker { 269 | constructor(puzzleX) { 270 | this.x = parseInt(Math.random()*20+20, 10); 271 | this.y = parseInt(Math.random()*80+80, 10); 272 | this.t = Date.now(); 273 | this.pos = [[this.x, this.y, this.t]]; 274 | this.minDuration = parseInt(1000 / HZ, 10); 275 | // this.puzzleX = puzzleX; 276 | this.puzzleX = puzzleX + parseInt(Math.random()*2-1, 10); 277 | 278 | this.STEP = parseInt(Math.random()*6+5, 10); 279 | this.DURATION = parseInt(Math.random()*7+14, 10)*100; 280 | // [9,1600] [10,1400] 281 | this.STEP = 9; 282 | // this.DURATION = 2000; 283 | //console.log(this.STEP, this.DURATION); 284 | } 285 | 286 | run() { 287 | const perX = this.puzzleX / this.STEP; 288 | const perDuration = this.DURATION / this.STEP; 289 | const firstPos = [this.x-parseInt(Math.random()*6, 10), this.y+parseInt(Math.random()*11, 10), this.t]; 290 | 291 | this.pos.unshift(firstPos); 292 | this.stepPos(perX, perDuration); 293 | this.fixPos(); 294 | 295 | const reactTime = parseInt(60+Math.random()*100, 10); 296 | const lastIdx = this.pos.length - 1; 297 | const lastPos = [this.pos[lastIdx][0], this.pos[lastIdx][1], this.pos[lastIdx][2]+reactTime]; 298 | 299 | this.pos.push(lastPos); 300 | return this.pos; 301 | } 302 | 303 | stepPos(x, duration) { 304 | let n = 0; 305 | const sqrt2 = Math.sqrt(2); 306 | for (let i = 1; i <= this.STEP; i++) { 307 | n += 1/i; 308 | } 309 | for (let i = 0; i < this.STEP; i++) { 310 | x = this.puzzleX / (n*(i+1)); 311 | const currX = parseInt((Math.random()*30-15)+x, 10); 312 | const currY = parseInt(Math.random()*7-3, 10); 313 | const currDuration = parseInt((Math.random()*0.4+0.8)*duration, 10); 314 | 315 | this.moveToAndCollect({ 316 | x: currX, 317 | y: currY, 318 | duration: currDuration, 319 | }); 320 | } 321 | } 322 | 323 | fixPos() { 324 | const actualX = this.pos[this.pos.length - 1][0] - this.pos[1][0]; 325 | const deviation = this.puzzleX - actualX; 326 | 327 | if (Math.abs(deviation) > 4) { 328 | this.moveToAndCollect({ 329 | x: deviation, 330 | y: parseInt(Math.random()*8-3, 10), 331 | duration: 250, 332 | }); 333 | } 334 | } 335 | 336 | moveToAndCollect({ x, y, duration }) { 337 | let movedX = 0; 338 | let movedY = 0; 339 | let movedT = 0; 340 | const times = duration / this.minDuration; 341 | let perX = x / times; 342 | let perY = y / times; 343 | let padDuration = 0; 344 | 345 | if (Math.abs(perX) < 1) { 346 | padDuration = duration / Math.abs(x) - this.minDuration; 347 | perX = 1; 348 | perY = y / Math.abs(x); 349 | } 350 | 351 | while (Math.abs(movedX) < Math.abs(x)) { 352 | const rDuration = parseInt(padDuration + Math.random()*16-4, 10); 353 | 354 | movedX += perX + Math.random()*2-1; 355 | movedY += perY; 356 | movedT += this.minDuration + rDuration; 357 | 358 | const currX = parseInt(this.x + movedX, 10); 359 | const currY = parseInt(this.y + movedY, 10); 360 | const currT = this.t + movedT; 361 | 362 | this.pos.push([currX, currY, currT]); 363 | } 364 | 365 | this.x += x; 366 | this.y += y; 367 | this.t += Math.max(duration, movedT); 368 | } 369 | } 370 | 371 | async function getResult(){ 372 | let aaa = new JDJRValidator(); 373 | await aaa.run(); 374 | return `&validate=${aaa.c['validate']}`; 375 | } 376 | 377 | PuzzleRecognizer.getResult = getResult; 378 | module.exports = PuzzleRecognizer; 379 | 380 | // new JDJRValidator().report(1000); 381 | //console.log(getCoordinate(new MousePosFaker(100).run())+'1111'); 382 | -------------------------------------------------------------------------------- /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 = /