From 01e6985893b419476b3bbae5e74115b568adae50 Mon Sep 17 00:00:00 2001 From: haptear Date: Tue, 22 Feb 2022 12:54:45 +0800 Subject: [PATCH] =?UTF-8?q?58=E5=90=8C=E5=9F=8E?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 58tc.js | 884 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 884 insertions(+) create mode 100644 58tc.js diff --git a/58tc.js b/58tc.js new file mode 100644 index 0000000..0de7b39 --- /dev/null +++ b/58tc.js @@ -0,0 +1,884 @@ +/* +58同城 + +安卓貌似需要root才能捉到包,IOS随便捉 +多账号切换账号不能退出登录 + +手动捉包把PPU=UID=xxxx&UN=yyyy&...填到wbtcCookie里,多账号@隔开 +注意前面有个PPU=,捉包只有UID=xxx的话手动加上 + +自定义UA:填到wbtcUA里,不填默认IOS15的UA + +只做普通任务一天3毛左右,跑小游戏的话一天5毛到6毛 +账号能刷到新手奖励的话每天额外8毛4,前七天还有每天额外3毛(满5提现到矿石),第一天做完新手任务就能提5块 +先登录,点我的->神奇矿->装扮我的家,过了引导剧情,然后再跑脚本 +游戏赚矿石里的三个小游戏需要投入矿石去赚更多,脚本默认不跑 +如果要跑,在wbtcCookie的对应账号后面加上#1,但是跑久了有可能触发滑块,需要自己去点一次,否则要被反撸矿石 + +定时不跑小游戏就每天7点后跑5次,跑小游戏就每小时一次 + +V2P/圈叉: +[task_local] +#58同城 +7 * * * * https://raw.githubusercontent.com/leafxcy/JavaScript/main/58tc.js, tag=58同城, enabled=true +[rewrite_local] +https://magicisland.58.com/web/sign/getIndexSignInInfo url script-request-header https://raw.githubusercontent.com/leafxcy/JavaScript/main/58tc.js +[MITM] +hostname = magicisland.58.com +*/ +const jsname = '58同城' +const $ = Env(jsname) +const logDebug = 0 + +const notifyFlag = 1; //0为关闭通知,1为打开通知,默认为1 +const notify = $.isNode() ? require('./sendNotify') : ''; +let notifyStr = '' + +let httpResult //global buffer + +//process.env.wbtcCookie='PPU=UID=85475511850040&UN=1q50eb1ei&TT=731896f4de0840460c2362a88193dec4&PBODY=HpV7LXKYtw5Yz5PN77H8xUuS5tMJ2gVrfMH6-MnRWno0QTSD4AdPgBBzB235byGvmfx14WV3bmj4YUCf7RdE8cHIONbSYfy6cDcAbljXjpHN7hgBGdQXjiIHVzL9vohqPnDKHNkKy4ksApUkb8m4YqmbCGoqnk1KB52sRXRBsVQ&VER=1&CUID=oZr_q1CkAW_ByTAzCm0nCg' +let userCookie = ($.isNode() ? process.env.wbtcCookie : $.getdata('wbtcCookie')) || ''; +let userUA = ($.isNode() ? process.env.wbtcUA : $.getdata('wbtcUA')) || 'Mozilla/5.0 (iPhone; CPU iPhone OS 15_0 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148 WUBA/10.26.5'; +let userCookieArr = [] +let userList = [] + +let userIdx = 0 +let userCount = 0 + +//let taskList = [1,2,3,4,5,6,7,9,10,13,15,16] +let taskList = [9,10,13] +let TASK_TIME = [7,24] +let attendType = {'oneDay':'一天打卡', 'multiDay':'三天打卡'} + +let curHour = (new Date()).getHours() + +let maxTaskLen = 0 +let maxRewardLen = 0 + +/////////////////////////////////////////////////////////////////// +class UserInfo { + constructor(str) { + let strArr = str.split('#') + this.index = ++userIdx + this.cookie = strArr[0] + this.cashSign = true + this.newbie = {} + this.house = {} + this.mining = {} + this.auction = {} + this.ore = {} + this.task = [] + this.reward = [] + this.runTask = strArr[1] || 0 + + let taskStr = this.runTask==1 ? '投入' : '不投入' + console.log(`账号[${this.index}]现在小游戏矿石设置为:${taskStr}`) + } + + async getTaskList(sceneId) { + let url = `https://taskframe.58.com/web/task/dolist?sceneId=${sceneId}&openpush=0&source=` + let body = `` + let urlObject = populateUrlObject(url,this.cookie,body) + await httpRequest('get',urlObject) + let result = httpResult; + if(!result) return + //console.log(result) + if(result.code == 0) { + if(!result.result.taskList) return; + //status: 0 - 未完成,1 - 已完成,2 - 已领取 + for(let task of result.result.taskList) { + let doneStr = '' + if(task.taskTotalCount) { + doneStr = ` ${task.taskDoneCount}/${task.taskTotalCount}` + } + let statusStr = (task.status==0) ? '未完成' : ((task.status==1) ? '已完成' : '已领取') + console.log(`账号[${this.index}]任务[${sceneId}-${task.itemId}]:${doneStr} +${task.rewardDisplayValue} ${statusStr}`) + if(task.status == 0) { + this.task.push({sceneId:sceneId,taskId:task.itemId}) + } else if(task.status == 1) { + this.reward.push({sceneId:sceneId,taskId:task.itemId}) + } + } + } else { + console.log(`账号[${this.index}]查询任务列表失败: ${result.message}`) + } + } + + async doTask(sceneId,taskId) { + //todo + return; + let url = `https://taskframe.58.com/web/task/dotask?timestamp=${(new Date()).getTime()}&sign=${randomString(32)}&taskId=${taskId}`//&taskData=15` + let body = `` + let urlObject = populateUrlObject(url,this.cookie,body) + await httpRequest('get',urlObject) + let result = httpResult; + if(!result) return + //console.log(result) + if(result.code == 0) { + console.log(`账号[${this.index}]完成任务[${sceneId}-${taskId}]`) + } else { + console.log(`账号[${this.index}]完成任务[${sceneId}-${taskId}]失败: ${result.message}`) + } + } + + async getReward(sceneId,taskId) { + //todo + return; + let url = `https://taskframe.58.com/web/task/reward?timestamp=${(new Date()).getTime()}&sign=${randomString(32)}&taskId=${taskId}` + let body = `` + let urlObject = populateUrlObject(url,this.cookie,body) + await httpRequest('get',urlObject) + let result = httpResult; + if(!result) return + //console.log(result) + if(result.code == 0) { + console.log(`账号[${this.index}]领取任务[${sceneId}-${taskId}]奖励成功`) + } else { + console.log(`账号[${this.index}]领取任务[${sceneId}-${taskId}]奖励失败: ${result.message}`) + } + } + + async newbieMaininfo() { + let url = `https://rightsplatform.58.com/web/motivate/maininfo` + let body = `` + let urlObject = populateUrlObject(url,this.cookie,body) + await httpRequest('get',urlObject) + let result = httpResult; + if(!result) return + //console.log(result) + if(result.code == 0) { + this.newbie.coin = parseFloat(result.result.coin) + this.newbie.isWithdraw = result.result.userWithdraw + if(result.result.todaySignDay<=7) { + this.newbie.signItem = result.result.signInfo[result.result.todaySignDay-1] + let signStr = (this.newbie.signItem.status==0) ? '未签到' : '已签到' + console.log(`账号[${this.index}]今日新手任务${signStr}`) + if(this.newbie.signItem.status == 0) { + await $.wait(500) + await this.newbieSign() + } + } + console.log(`账号[${this.index}]新手金币余额:${this.newbie.coin}`) + if(this.newbie.isWithdraw==false) { + let sortList = result.result.withdrawInfo.sort(function(a,b) {return b.cardAmount-a.cardAmount}) + for(let withItem of sortList) { + if(this.newbie.coin >= withItem.cardCoin) { + await $.wait(500) + await this.newbieWithdraw(withItem) + } + } + } + } else { + console.log(`账号[${this.index}]查询新手主页失败: ${result.message}`) + } + } + + async newbieSign() { + let url = `https://rightsplatform.58.com/web/motivate/sign` + let body = `` + let urlObject = populateUrlObject(url,this.cookie,body) + await httpRequest('post',urlObject) + let result = httpResult; + if(!result) return + //console.log(result) + if(result.code == 0) { + this.newbie.coin += parseFloat(this.newbie.signItem.signCoin) + console.log(`账号[${this.index}]新手任务第${this.newbie.signItem.number}天签到成功,获得${this.newbie.signItem.signCoin}金币`) + } else { + console.log(`账号[${this.index}]新手任务签到失败: ${result.message}`) + } + } + + async newbieWithdraw(withItem) { + let url = `https://rightsplatform.58.com/web/motivate/withdraw` + let body = `id=${withItem.id}` + let urlObject = populateUrlObject(url,this.cookie,body) + await httpRequest('post',urlObject) + let result = httpResult; + if(!result) return + //console.log(result) + if(result.code == 0) { + console.log(`账号[${this.index}]成功兑换${withItem.cardAmount}元到矿石余额`) + } else { + console.log(`账号[${this.index}]兑换${withItem.cardAmount}元到矿石余额失败: ${result.message}`) + } + } + + async houseSignStatus() { + let url = `https://lovely-house.58.com/sign/info` + let body = `` + let urlObject = populateUrlObject(url,this.cookie,body) + await httpRequest('get',urlObject) + let result = httpResult; + if(!result) return + //console.log(result) + if(result.code == 0) { + for(let item of result.result) { + if(item.today == true) { + let signStr = (item.sign==false) ? '未签到' : '已签到' + console.log(`账号[${this.index}]今日我的家${signStr}`) + if(item.sign == false) { + await $.wait(500) + await this.houseSign() + } + break; + } + } + } else { + console.log(`账号[${this.index}]查询我的家签到状态失败: ${result.message}`) + } + } + + async houseSign() { + let url = `https://lovely-house.58.com/sign/signin` + let body = `` + let urlObject = populateUrlObject(url,this.cookie,body) + await httpRequest('post',urlObject) + let result = httpResult; + if(!result) return + //console.log(result) + if(result.code == 0) { + console.log(`账号[${this.index}]我的家签到成功,获得${result.result.gold}金币`) + } else { + console.log(`账号[${this.index}]我的家签到失败: ${result.message}`) + } + } + + async houseWithdrawPage() { + let url = `https://lovely-house.58.com/web/exchange/info` + let body = `` + let urlObject = populateUrlObject(url,this.cookie,body) + await httpRequest('get',urlObject) + let result = httpResult; + if(!result) return + //console.log(result) + if(result.code == 0) { + this.house.coin = result.result.coin + console.log(`账号[${this.index}]我的家金币余额:${this.house.coin}`) + let sortList = result.result.oreList.sort(function(a,b) {return b.amount-a.amount}) + if(sortList.length>0 && sortList[0].oreStatus == 0 && this.house.coin >= sortList[0].coin) { + await $.wait(500) + await this.houseWithdraw(sortList[0]) + } + } else { + console.log(`账号[${this.index}]查询我的家兑换页失败: ${result.message}`) + } + } + + async houseWithdraw(withItem) { + let url = `https://lovely-house.58.com/web/exchange/ore` + let body = `id=${withItem.id}` + let urlObject = populateUrlObject(url,this.cookie,body) + await httpRequest('post',urlObject) + let result = httpResult; + if(!result) return + //console.log(result) + if(result.code == 0) { + console.log(`账号[${this.index}]成功兑换${withItem.amount}矿石 ≈ ${withItem.money}元`) + } else { + console.log(`账号[${this.index}]兑换${withItem.amount}矿石失败: ${result.message}`) + } + } + + async oreMainpage(dotask=true) { + let url = `https://magicisland.58.com/web/mineral/main?openSettings=0` + let body = `` + let urlObject = populateUrlObject(url,this.cookie,body) + await httpRequest('get',urlObject) + let result = httpResult; + if(!result) return + //console.log(result) + if(result.code == 0) { + this.ore.sign = result.result.tasks.sign.state + this.ore.dailyore = result.result.userInfo.dailyOre + this.ore.ore = parseFloat(result.result.userInfo.minerOre) + this.ore.money = parseFloat(result.result.userInfo.minerOreValue) + if(dotask) { + let gameStatus = result.result.games.gameProcess + let gameStr = '' + if(gameStatus.awardState==0) { + if(gameStatus.gameNum==gameStatus.joinedNum) { + this.ore.gameFlag = 1 + gameStr = '已完成' + } else { + this.ore.gameFlag = 0 + gameStr = '未完成' + } + } else { + this.ore.gameFlag = 2 + gameStr = '已领取' + } + let signStr = (this.ore.sign==0) ? '未签到' : '已签到' + let dailyStr = (this.ore.dailyore==0) ? '未采集' : '已采集' + console.log(`账号[${this.index}]今日神奇矿${dailyStr},${signStr},参加三个小游戏任务${gameStr}`) + if(this.ore.sign==0) { + await $.wait(500) + await this.oreSign() + } + if(this.ore.dailyore==0) { + await $.wait(500) + await this.getDailyore() + } + if(this.ore.gameFlag==1) { + await $.wait(500) + await this.oreGameScore() + } + console.log(`账号[${this.index}]神奇矿余额${this.ore.ore} ≈ ${this.ore.money}元`) + } + } else { + console.log(`账号[${this.index}]查询神奇矿主页失败: ${result.message}`) + } + } + + async getDailyore() { + let url = `https://magicisland.58.com/web/mineral/dailyore` + let body = `` + let urlObject = populateUrlObject(url,this.cookie,body) + await httpRequest('get',urlObject) + let result = httpResult; + if(!result) return + //console.log(result) + if(result.code == 0) { + console.log(`账号[${this.index}]采集神奇矿成功`) + } else { + console.log(`账号[${this.index}]采集神奇矿失败: ${result.message}`) + } + } + + async oreSign() { + let url = `https://magicisland.58.com/web/sign/signInV2?sessionId=&successToken=&scene=null` + let body = `` + let urlObject = populateUrlObject(url,this.cookie,body) + await httpRequest('get',urlObject) + let result = httpResult; + if(!result) return + //console.log(result) + if(result.code == 0) { + this.ore.ore += parseFloat(result.result.ore) + this.ore.money += parseFloat(result.result.amount) + console.log(`账号[${this.index}]神奇矿签到成功,获得${result.result.ore}矿石 ≈ ${result.result.amount}元`) + } else { + console.log(`账号[${this.index}]神奇矿签到失败: ${result.message}`) + } + } + + async miningUserInfo() { + let url = `https://magicisland.58.com/web/mining/userInfo` + let body = `` + let urlObject = populateUrlObject(url,this.cookie,body) + await httpRequest('get',urlObject) + let result = httpResult; + if(!result) return + //console.log(result) + if(result.code == 0) { + this.mining.enroll = result.result.status + let enrollStr = (this.mining.enroll==0) ? '未召唤小帮手' : '已召唤小帮手' + console.log(`账号[${this.index}]神奇矿山${enrollStr}`) + if(result.result.grantList && result.result.grantList.length > 0) { + for(let mines of result.result.grantList) { + await $.wait(500) + await this.miningGain(mines.id) + } + this.mining.enroll = 0 + } + if(this.runTask == 1 && this.mining.enroll==0) { + if(parseFloat(result.result.usableOre) >= result.result.threshold) { + await $.wait(500) + await this.miningEnroll() + } else { + console.log(`账号[${this.index}]可用矿石余额${result.result.usableOre}不足,不能花费${result.result.threshold}矿石召唤小帮手`) + } + } + } else { + console.log(`账号[${this.index}]查询神奇矿山主页失败: ${result.message}`) + } + } + + async miningGain(id) { + let url = `https://magicisland.58.com/web/mining/gain?id=${id}` + let body = `` + let urlObject = populateUrlObject(url,this.cookie,body) + await httpRequest('get',urlObject) + let result = httpResult; + if(!result) return + //console.log(result) + if(result.code == 0) { + console.log(`账号[${this.index}]神奇矿山成功收取${result.result.gainOre}矿石`) + } else { + console.log(`账号[${this.index}]神奇矿山收取矿石失败: ${result.message}`) + } + } + + async miningEnroll() { + let url = `https://magicisland.58.com/web/mining/enroll` + let body = `` + let urlObject = populateUrlObject(url,this.cookie,body) + await httpRequest('get',urlObject) + let result = httpResult; + if(!result) return + //console.log(result) + if(result.code == 0) { + console.log(`账号[${this.index}]神奇矿山召唤小帮手成功`) + } else { + console.log(`账号[${this.index}]神奇矿山召唤小帮手失败: ${result.message}`) + } + } + + async auctionInfo() { + let url = `https://magicisland.58.com/web/auction/second` + let body = `` + let urlObject = populateUrlObject(url,this.cookie,body) + urlObject.headers.Referer = 'https://magicisland.58.com/web/v/lowauctiondetail' + await httpRequest('get',urlObject) + let result = httpResult; + if(!result) return + //console.log(result) + if(result.code == 0) { + this.auction.status = result.result.bidInfo.bidStatus + let auctionStr = (this.auction.status==0) ? '未参与竞拍' : '已参与竞拍' + console.log(`账号[${this.index}]今天${auctionStr}`) + let maxBid = parseFloat(result.result.userInfo.usableOre) + let bidNum = 1 + if(this.runTask == 1) { + if(this.auction.status==0) { + if(maxBid >= bidNum) { + await $.wait(500) + await this.auctionBid(bidNum) + } else { + console.log(`账号[${this.index}]可用矿石余额${maxBid}不足,不能竞拍出价${bidNum}矿石`) + } + } else if(this.auction.status==1) { + let lastBid = parseInt(result.result.bidInfo.bidOre) + bidNum = (lastBid)%3 + 1 + if(maxBid >= bidNum) { + await $.wait(500) + await this.auctionModify(bidNum,result.result.bidInfo.auctionNumber) + } else { + console.log(`账号[${this.index}]可用矿石余额${maxBid}不足,不能竞拍出价${bidNum}矿石`) + } + } + } + } else { + console.log(`账号[${this.index}]查询低价竞拍主页失败: ${result.message}`) + } + } + + async auctionBid(prize) { + let url = `https://magicisland.58.com/web/auction/bid` + let body = `ore=${prize}` + let urlObject = populateUrlObject(url,this.cookie,body) + urlObject.headers.Referer = 'https://magicisland.58.com/web/v/lowauctiondetail' + await httpRequest('post',urlObject) + let result = httpResult; + if(!result) return + //console.log(result) + if(result.code == 0) { + console.log(`账号[${this.index}]竞拍出价${prize}矿石成功`) + } else { + console.log(`账号[${this.index}]竞拍出价${prize}矿石失败: ${result.message}`) + } + } + + async auctionModify(prize,number) { + let url = `https://magicisland.58.com/web/auction/modify` + let body = `ore=${prize}&number=${number}` + let urlObject = populateUrlObject(url,this.cookie,body) + urlObject.headers.Referer = 'https://magicisland.58.com/web/v/lowauctiondetail' + await httpRequest('post',urlObject) + let result = httpResult; + if(!result) return + //console.log(result) + if(result.code == 0) { + console.log(`账号[${this.index}]竞拍改价${prize}矿石成功`) + } else { + console.log(`账号[${this.index}]竞拍改价${prize}矿石失败: ${result.message}`) + } + } + + async oreGameScore() { + let url = `https://magicisland.58.com/web/mineral/gameprocessore` + let body = `` + let urlObject = populateUrlObject(url,this.cookie,body) + await httpRequest('get',urlObject) + let result = httpResult; + if(!result) return + //console.log(result) + if(result.code == 0) { + console.log(`账号[${this.index}]领取游戏完成奖励成功`) + } else { + console.log(`账号[${this.index}]领取游戏完成奖励失败: ${result.message}`) + } + } + + async attendanceDetail() { + let url = `https://magicisland.58.com/web/attendance/detail/info?productorid=3` + let body = `` + let urlObject = populateUrlObject(url,this.cookie,body) + await httpRequest('get',urlObject) + let result = httpResult; + if(!result) return + //console.log(result) + if(result.code == 0) { + let attendList = '' + console.log(`账号[${this.index}]今天打卡状态:`) + for(let item of result.result.infoList) { + let type = attendType[item.type] + let str = (item.userState==0) ? '未报名' : ((item.userState==5) ? '可打卡' :'已报名') + console.log(`账号[${this.index}]${type}${item.number}期 -- ${str}`) + if(item.userState==0) { + if(this.runTask == 1) { + if(this.ore.ore >= item.oreLimitValue) { + await $.wait(500) + await this.attendanceSignIn(item) + } else { + console.log(`账号[${this.index}]矿石余额${this.ore.ore}不足,不能花费${item.oreLimitValue}矿石报名${type}${item.number}期打卡`) + } + } + } else if (item.userState==5) { + let numType = (item.type=='multiDay') ? 'numberMany' : 'number' + attendList += `&${numType}=${item.number}` + } + } + if(attendList) { + await $.wait(500) + await this.attendanceAttend(attendList) + } + } else { + console.log(`账号[${this.index}]查询打卡状态失败: ${result.message}`) + } + } + + async attendanceSignIn(item) { + let type = attendType[item.type] + let url = `https://magicisland.58.com/web/attendance/signIn` + let body = `number=${item.number}&category=${item.type}&productorid=3` + let urlObject = populateUrlObject(url,this.cookie,body) + urlObject.headers.Referer = 'https://magicisland.58.com/web/v/client' + await httpRequest('post',urlObject) + let result = httpResult; + if(!result) return + //console.log(result) + if(result.code == 0) { + console.log(`账号[${this.index}]报名${type}${item.number}期成功,预计可获得${result.result.averageRewardOre}矿石`) + } else { + console.log(`账号[${this.index}]报名${type}${item.number}期失败: ${result.message}`) + } + } + + async attendanceAttend(attendList) { + let url = `https://magicisland.58.com/web/attendance/attend` + let body = `productorid=3${attendList}` + let urlObject = populateUrlObject(url,this.cookie,body) + urlObject.headers.Referer = 'https://magicisland.58.com/web/v/client' + await httpRequest('post',urlObject) + let result = httpResult; + if(!result) return + //console.log(result) + if(result.code == 0) { + console.log(`账号[${this.index}]打卡成功`) + } else { + console.log(`账号[${this.index}]打卡失败: ${result.message}`) + } + } + + async cashSigninlist() { + let url = `https://tzbl.58.com/tzbl/taskcenter/signinlist?requestSource=1` + let body = `` + let urlObject = populateUrlObject(url,this.cookie,body) + await httpRequest('get',urlObject) + let result = httpResult; + if(!result) return + //console.log(result) + if(result.code == 0) { + this.cashSign = result.data.signInVO.status==2 ? true : false + let cashStr = this.cashSign ? '未签到' : '已签到' + console.log(`账号[${this.index}]今日现金签到页: ${cashStr}`) + } else { + console.log(`账号[${this.index}]查询现金签到失败: ${result.message}`) + } + } + + async cashSignin() { + let url = `https://tzbl.58.com/tzbl/taskcenter/signin?requestSource=1` + let body = `` + let urlObject = populateUrlObject(url,this.cookie,body) + await httpRequest('get',urlObject) + let result = httpResult; + if(!result) return + //console.log(result) + if(result.code == 0) { + console.log(`账号[${this.index}]现金签到获得${result.data.amount}元`) + } else { + console.log(`账号[${this.index}]查询现金签到失败: ${result.message}`) + } + } +} + +!(async () => { + if (typeof $request !== "undefined") { + await GetRewrite() + }else { + if(!(await checkEnv())) return + console.log('====================\n') + console.log(`如果要自定义UA,请把UA填到wbtcUA里,现在使用的UA是:\n${userUA}`) + + console.log('\n================== 现金签到 ==================') + for(let user of userList) { + await user.cashSigninlist(); + await $.wait(200); + } + + for(let user of userList.filter(x => x.cashSign)) { + await user.cashSignin(); + await $.wait(200); + } + + console.log('\n================== 矿山小游戏 ==================') + for(let user of userList) { + await user.miningUserInfo(); + await $.wait(200); + } + + console.log('\n================== 竞拍小游戏 ==================') + for(let user of userList) { + await user.auctionInfo(); + await $.wait(200); + } + + console.log('\n================== 打卡小游戏 ==================') + for(let user of userList) { + await user.oreMainpage(false); + await $.wait(200); + } + + for(let user of userList) { + await user.attendanceDetail(); + await $.wait(200); + } + + console.log('\n================== 金币任务 ==================') + if(curHour>=TASK_TIME[0] && curHour i i $.logErr(e)) +.finally(() => $.done()) + +/////////////////////////////////////////////////////////////////// +async function checkEnv() { + if(userCookie) { + for(let userCookies of userCookie.split('@')) { + if(userCookies) userList.push(new UserInfo(userCookies)) + } + userCount = userList.length + } else { + console.log('未找到wbtcCookie') + return; + } + + console.log(`共找到${userCount}个账号`) + return true +} + +async function GetRewrite() { + if($request.url.indexOf('getIndexSignInInfo') > -1) { + let ppu = $request.headers.ppu ? $request.headers.ppu : $request.headers.PPU + if(!ppu) return; + let uid = ppu.match(/UID=(\w+)/)[1] + let ck = 'PPU=' + ppu + + if(userCookie) { + if(userCookie.indexOf('UID='+uid) == -1) { + userCookie = userCookie + '@' + ck + $.setdata(userCookie, 'wbtcCookie'); + ckList = userCookie.split('@') + $.msg(jsname+` 获取第${ckList.length}个wbtcCookie成功: ${ck}`) + } else { + console.log(jsname+` 找到重复的wbtcCookie,准备替换: ${ck}`) + ckList = userCookie.split('@') + for(let i=0; i { + $[method](url, async (err, resp, data) => { + try { + if (err) { + console.log(`${method}请求失败`); + console.log(JSON.stringify(err)); + $.logErr(err); + } else { + if (safeGet(data)) { + httpResult = JSON.parse(data); + if(logDebug) console.log(httpResult); + } + } + } catch (e) { + $.logErr(e, resp); + } finally { + resolve(); + } + }); + }); +} + +function safeGet(data) { + try { + if (typeof JSON.parse(data) == "object") { + return true; + } else { + console.log(data) + } + } catch (e) { + console.log(e); + console.log(`服务器访问数据为空,请检查自身设备网络情况`); + return false; + } +} + +function getMin(a,b){ + return ((anumStr.length) ? (length-numStr.length) : 0 + let retStr = '' + for(let i=0; i>2;o=(n&3)<<4|r>>4;u=(r&15)<<2|i>>6;a=i&63;if(isNaN(r)){u=a=64}else if(isNaN(i)){a=64}t=t+this._keyStr.charAt(s)+this._keyStr.charAt(o)+this._keyStr.charAt(u)+this._keyStr.charAt(a)}return t},decode:function(e){var t="";var n,r,i;var s,o,u,a;var f=0;e=e.replace(/[^A-Za-z0-9+/=]/g,"");while(f>4;r=(o&15)<<4|u>>2;i=(u&3)<<6|a;t=t+String.fromCharCode(n);if(u!=64){t=t+String.fromCharCode(r)}if(a!=64){t=t+String.fromCharCode(i)}}t=Base64._utf8_decode(t);return t},_utf8_encode:function(e){e=e.replace(/rn/g,"n");var t="";for(var n=0;n127&&r<2048){t+=String.fromCharCode(r>>6|192);t+=String.fromCharCode(r&63|128)}else{t+=String.fromCharCode(r>>12|224);t+=String.fromCharCode(r>>6&63|128);t+=String.fromCharCode(r&63|128)}}return t},_utf8_decode:function(e){var t="";var n=0;var r=c1=c2=0;while(n191&&r<224){c2=e.charCodeAt(n+1);t+=String.fromCharCode((r&31)<<6|c2&63);n+=2}else{c2=e.charCodeAt(n+1);c3=e.charCodeAt(n+2);t+=String.fromCharCode((r&15)<<12|(c2&63)<<6|c3&63);n+=3}}return t}} + +function MD5Encrypt(a){function b(a,b){return a<>>32-b}function c(a,b){var c,d,e,f,g;return e=2147483648&a,f=2147483648&b,c=1073741824&a,d=1073741824&b,g=(1073741823&a)+(1073741823&b),c&d?2147483648^g^e^f:c|d?1073741824&g?3221225472^g^e^f:1073741824^g^e^f:g^e^f}function d(a,b,c){return a&b|~a&c}function e(a,b,c){return a&c|b&~c}function f(a,b,c){return a^b^c}function g(a,b,c){return b^(a|~c)}function h(a,e,f,g,h,i,j){return a=c(a,c(c(d(e,f,g),h),j)),c(b(a,i),e)}function i(a,d,f,g,h,i,j){return a=c(a,c(c(e(d,f,g),h),j)),c(b(a,i),d)}function j(a,d,e,g,h,i,j){return a=c(a,c(c(f(d,e,g),h),j)),c(b(a,i),d)}function k(a,d,e,f,h,i,j){return a=c(a,c(c(g(d,e,f),h),j)),c(b(a,i),d)}function l(a){for(var b,c=a.length,d=c+8,e=(d-d%64)/64,f=16*(e+1),g=new Array(f-1),h=0,i=0;c>i;)b=(i-i%4)/4,h=i%4*8,g[b]=g[b]|a.charCodeAt(i)<>>29,g}function m(a){var b,c,d="",e="";for(c=0;3>=c;c++)b=a>>>8*c&255,e="0"+b.toString(16),d+=e.substr(e.length-2,2);return d}function n(a){a=a.replace(/\r\n/g,"\n");for(var b="",c=0;cd?b+=String.fromCharCode(d):d>127&&2048>d?(b+=String.fromCharCode(d>>6|192),b+=String.fromCharCode(63&d|128)):(b+=String.fromCharCode(d>>12|224),b+=String.fromCharCode(d>>6&63|128),b+=String.fromCharCode(63&d|128))}return b}var o,p,q,r,s,t,u,v,w,x=[],y=7,z=12,A=17,B=22,C=5,D=9,E=14,F=20,G=4,H=11,I=16,J=23,K=6,L=10,M=15,N=21;for(a=n(a),x=l(a),t=1732584193,u=4023233417,v=2562383102,w=271733878,o=0;o-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),"PUT"===e&&(s=this.put),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")}put(t){return this.send.call(this.env,t,"PUT")}}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("",`\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}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("@"),a={url:`http://${h}/v1/scripting/evaluate`,body:{script_text:t,mock_type:"cron",timeout:r},headers:{"X-Key":o,Accept:"*/*"}};this.post(a,(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();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)})}}put(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.put(t,(t,s,i)=>{!t&&s&&(s.body=i,s.statusCode=s.status),e(t,s,i)});else if(this.isQuanX())t.method="PUT",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.put(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){let e={"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 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}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}}}};this.isMute||(this.isSurge()||this.isLoon()?$notification.post(e,s,i,o(r)):this.isQuanX()&&$notify(e,s,i,o(r)));let h=["","==============\ud83d\udce3\u7cfb\u7edf\u901a\u77e5\ud83d\udce3=============="];h.push(e),s&&h.push(s),i&&h.push(i),console.log(h.join("\n")),this.logs=this.logs.concat(h)}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("",`\u2757\ufe0f${this.name}, \u9519\u8bef!`,t.stack):this.log("",`\u2757\ufe0f${this.name}, \u9519\u8bef!`,t)}wait(t){return new Promise(e=>setTimeout(e,t))}done(t={}){const e=(new Date).getTime(),s=(e-this.startTime)/1e3;this.log("",`\ud83d\udd14${this.name}, \u7ed3\u675f! \ud83d\udd5b ${s} \u79d2`),this.log(),(this.isSurge()||this.isQuanX()||this.isLoon())&&$done(t)}}(t,e)}