/* 京东快递 @Leaf */ const $ = new Env('京东快递'); const got = require('got'); const envSplitor = ['&','\n','@'] const ckNames = ['JD_COOKIE'] const MAX_THREAD = parseInt(process.env['jd_jdkd_thread']) || 5 const DEFAULT_TIMEOUT=8000, DEFAULT_RETRY=3; const default_UA = 'Mozilla/5.0 (iPhone; CPU iPhone OS 15_0 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148 MicroMessenger/8.0.31(0x18001f2f) NetType/WIFI Language/zh_CN miniProgram/wx73247c7819d61796' const Referer = 'https://jingcai-h5.jd.com/' const Origin = 'https://jingcai-h5.jd.com' const client = got.extend({ headers:{ Connection:'keep-alive', 'User-Agent': default_UA, Referer, Origin, AppParams: JSON.stringify({"appid":158,"ticket_type":"m"}), ClientInfo: JSON.stringify({"appName":"jingcai","client":"m"}), 'LOP-DN': 'jingcai.jd.com', 'X-Requested-With': 'XMLHttpRequest', }, retry: {limit:0}, timeout: DEFAULT_TIMEOUT, followRedirect: false, }) class BasicClass{constructor(){this.index=$.userIdx++;this.name='';} log(msg,opt={}){var m='',n=$.userCount.toString().length;;if(this.index)m+=`账号[${$.padStr(this.index,n)}]`;if(this.name)m+=`[${this.name}]`;$.log(m+msg,opt);} async request(opt){var resp=null,count=0;var fn=opt.fn||opt.url;opt.method=opt?.method?.toUpperCase()||'GET';while(count++{resp=t},e=>{resp=e.response});if(((resp?.statusCode/100)|0)<=4)break;}catch(e){if(e.name=='TimeoutError'){this.log(`[${fn}]请求超时,重试第${count}次`);}else{this.log(`[${fn}]请求错误(${e.message}),重试第${count}次`);}};} if(resp==null)return Promise.resolve({statusCode:-1,headers:null,result:null});let{statusCode,headers,body}=resp;if(body)try{body=JSON.parse(body);}catch{};return Promise.resolve({statusCode,headers,result:body})}} let http = new BasicClass(); class UserClass extends BasicClass { constructor(ck) { super() this.cookie = ck this.pt_pin = ck.match(/pin=([\w\-\%]+)/) ? ck.match(/pin=([\w\-\%]+)/)[1] : '' this.name = decodeURIComponent(this.pt_pin) } async queryTaskList() { try { let options = { fn: 'queryTaskList', method: 'post', url: 'https://lop-proxy.jd.com/ESGApi/queryTaskList', headers: {Cookie:this.cookie,'event-id':$.randomPattern('xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxxx')}, json: [{"pin":"$cooMrdGatewayUid$"}], } let {result} = await this.request(options) let code = result?.code if(code == 1) { //console.log(JSON.stringify(result?.content?.taskInfoList)) for(let task of (result?.content?.taskInfoList||[]).filter(x => x.taskReachNum < x.taskNeedReachNum && x.triggerType==1 && !x.taskTitle.includes('加购'))) { await this.reachTaskInfo(task); await $.wait(1000); break; } } else { let errCode = code || result?.error_response?.code let errMsg = result?.msg || result?.error_response?.zh_desc this.log(`查询任务列表出错[${errCode}]: ${errMsg}`) } } catch (e) { $.log(e) } finally { return Promise.resolve() } } async reachTaskInfo(task) { try { let options = { fn: 'reachTaskInfo', method: 'post', url: 'https://lop-proxy.jd.com/ESGApi/reachTaskInfo', headers: {Cookie:this.cookie,'event-id':$.randomPattern('xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxxx')}, json: [{ taskNo: task.taskNo, childTaskId: task.childTaskId, pin: "$cooMrdGatewayUid$", }], } let {result} = await this.request(options) let code = result?.code if(code == 1) { this.log(`完成任务[${task.taskTitle}]成功`); await $.wait(1000); await this.queryTaskList(); } else { let errCode = code || result?.error_response?.code let errMsg = result?.msg || result?.error_response?.zh_desc this.log(`完成任务[${task.taskTitle}]失败[${errCode}]: ${errMsg}`) } } catch (e) { $.log(e) } finally { return Promise.resolve() } } async queryCanGetRewardTaskList() { try { let options = { fn: 'queryCanGetRewardTaskList', method: 'post', url: 'https://lop-proxy.jd.com/ESGApi/queryCanGetRewardTaskList', headers: {Cookie:this.cookie,'event-id':$.randomPattern('xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxxx')}, json: [{"pin":"$cooMrdGatewayUid$"}], } let {result} = await this.request(options) let code = result?.code if(code == 1) { for(let item of (result?.content?.personalCarbonRewardRespDtoList||[])) { await this.operationPersonalCarbonIntegral(item) } } else { let errCode = code || result?.error_response?.code let errMsg = result?.msg || result?.error_response?.zh_desc this.log(`查询可领取奖励出错[${errCode}]: ${errMsg}`) } } catch (e) { $.log(e) } finally { return Promise.resolve() } } async operationPersonalCarbonIntegral(item) { try { let options = { fn: 'operationPersonalCarbonIntegral', method: 'post', url: 'https://lop-proxy.jd.com/ESGApi/operationPersonalCarbonIntegral', headers: {Cookie:this.cookie,'event-id':$.randomPattern('xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxxx')}, json: [{ type: 2, operationType: 1, rewardNo: item.rewardNo, taskNo: item.taskNo, pin: "$cooMrdGatewayUid$", }], } let {result} = await this.request(options) let code = result?.code if(code == 1) { this.log(`收取[${item.taskTitle}]奖励成功, 现在有${result?.content?.carbonIntegral}g能量`) } else { let errCode = code || result?.error_response?.code let errMsg = result?.msg || result?.error_response?.zh_desc this.log(`收取[${item.taskTitle}]奖励失败[${errCode}]: ${errMsg}`) } } catch (e) { $.log(e) } finally { return Promise.resolve() } } async userTask() { await this.queryTaskList(); await this.queryCanGetRewardTaskList(); } } !(async () => { $.read_env(UserClass); await $.threadTask('userTask',MAX_THREAD) })() .catch((e) => $.log(e)) .finally(() => $.exitNow()) function Env(name){return new class{constructor(name){this.name=name;this.startTime=Date.now();this.log(`[${this.name}]开始运行\n`,{time:true});this.notifyStr=[];this.notifyFlag=true;this.userIdx=0;this.userList=[];this.userCount=0;} log(msg,options={}){let opt={console:true};Object.assign(opt,options);if(opt.time){let fmt=opt.fmt||'hh:mm:ss';msg=`[${this.time(fmt)}]`+msg;} if(opt.notify)this.notifyStr.push(msg);if(opt.console)console.log(msg);} read_env(Class){let envStrList=ckNames.map(x=>process.env[x]);for(let env_str of envStrList.filter(x=>!!x)){let sp=envSplitor.filter(x=>env_str.includes(x));let splitor=sp.length>0?sp[0]:envSplitor[0];for(let ck of env_str.split(splitor).filter(x=>!!x)){this.userList.push(new Class(ck));}} this.userCount=this.userList.length;if(!this.userCount){this.log(`未找到变量,请检查变量${ckNames.map(x => '['+x+']').join('或')}`,{notify:true});return false;} this.log(`共找到${this.userCount}个账号`);return true;} async threads(taskName,conf,opt={}){while(conf.idx<$.userList.length){let user=$.userList[conf.idx++];await user[taskName](opt);}} async threadTask(taskName,thread){let taskAll=[];let taskConf={idx:0};while(thread--)taskAll.push(this.threads(taskName,taskConf));await Promise.all(taskAll);} time(t,x=null){let xt=x?new Date(x):new Date;let e={"M+":xt.getMonth()+1,"d+":xt.getDate(),"h+":xt.getHours(),"m+":xt.getMinutes(),"s+":xt.getSeconds(),"q+":Math.floor((xt.getMonth()+3)/3),S:this.padStr(xt.getMilliseconds(),3)};/(y+)/.test(t)&&(t=t.replace(RegExp.$1,(xt.getFullYear()+"").substr(4-RegExp.$1.length)));for(let s in e)new RegExp("("+s+")").test(t)&&(t=t.replace(RegExp.$1,1==RegExp.$1.length?e[s]:("00"+e[s]).substr((""+e[s]).length)));return t;} async showmsg(){if(!this.notifyFlag)return;if(!this.notifyStr.length)return;var notify=require('./sendNotify');this.log('\n============== 推送 ==============');await notify.sendNotify(this.name,this.notifyStr.join('\n'));} padStr(num,length,opt={}){let padding=opt.padding||'0';let mode=opt.mode||'l';let numStr=String(num);let numPad=(length>numStr.length)?(length-numStr.length):0;let pads='';for(let i=0;isetTimeout(e,t));} async exitNow(){await this.showmsg();let e=Date.now();let s=(e-this.startTime)/1000;this.log('');this.log(`[${this.name}]运行结束,共运行了${s}秒`,{time:true});process.exit(0);}} (name)}