From 8e1b4d2cd296236c3f493526007b9eacb709aa2d Mon Sep 17 00:00:00 2001 From: Leaf <444653703@qq.com> Date: Sat, 13 Nov 2021 09:34:18 +0800 Subject: [PATCH 01/35] =?UTF-8?q?=E5=8A=A0=E5=85=A5=E9=87=8D=E8=AF=95?= =?UTF-8?q?=E6=9C=BA=E5=88=B6=E9=98=B2=E6=AD=A2=E6=9C=8D=E5=8A=A1=E5=99=A8?= =?UTF-8?q?=E5=8D=A1=EF=BC=8C=E5=8A=A0=E5=85=A5=E8=87=AA=E5=8A=A8=E8=BD=AC?= =?UTF-8?q?=E6=8D=A2=E7=BA=A2=E5=8C=85=E4=BD=99=E9=A2=9D=E5=BC=80=E5=85=B3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- shangtuo.js | 35 ++++++++++++++++++++++++++++++----- 1 file changed, 30 insertions(+), 5 deletions(-) diff --git a/shangtuo.js b/shangtuo.js index 41664f4..0d30a36 100644 --- a/shangtuo.js +++ b/shangtuo.js @@ -19,6 +19,8 @@ https://raw.githubusercontent.com/leafxcy/JavaScript/main/shangtuo.jpg 脚本默认红包余额满0.5自动提现,可以自己新建一个环境变量 stCash 设定红包余额提现金额,export stCash=20 !!!但是不建议提现20块以下,因为手续费高,只有0.5手续费低!!! +脚本会自动把红包余额转换为消费余额来抢更高面额的券,如果不想换的自己建一个环境变量 stExchange 设为0,export stExchange=0 + CK有效期较短,可能几天后需要重新捉 只测试了IOS,测试过V2P,青龙可以跑 @@ -56,6 +58,7 @@ let userNum = 0 let userInfo = "" var packWithdrawAmount = ($.isNode() ? (process.env.stCash) : ($.getval('stCash'))) || 0.5; +var autoExchange = ($.isNode() ? (process.env.stExchange) : ($.getval('stExchange'))) || 1; let secretCode @@ -65,6 +68,9 @@ let grabCount let getBondListFlag let quanList +let retryLimit = 5 +let retryTime + let logDebug = 0 let logCaller = 0 @@ -95,8 +101,11 @@ const notify = $.isNode() ? require('./sendNotify') : ''; if(accountStatus) { //看广告得分红金 + retryTime = 0 await getAdvertPage(1); await $.wait(1000); + await getAdvertPage(2); + await $.wait(1000); //提取分红金 await changeDividendBonusToBalance(); @@ -292,6 +301,7 @@ function getUserInfoData(checkStatus,timeout = 0) { //广告列表id function getAdvertPage(pageNo,timeout = 0) { if(logCaller) console.log("call "+ printCaller()) + retryTime++ return new Promise((resolve) => { let request = { url: `https://api.shatuvip.com/advert/getAdvertPage?type=1&pageNo=${pageNo}&column_id=1`, @@ -314,6 +324,9 @@ function getAdvertPage(pageNo,timeout = 0) { if (err) { console.log("API请求失败"); console.log(err + " at function " + printCaller()); + if(retryTime < retryLimit) { + await getAdvertPage(pageNo) + } } else { if (safeGet(data)) { let result = JSON.parse(data) @@ -323,7 +336,6 @@ function getAdvertPage(pageNo,timeout = 0) { adNum = result.result.length compTaskFlag = 1 for(let i=0; i= 88) { console.log(`\n分红金余额:${result.result.balance},开始尝试提现`) + retryTime = 0 await getBalanceWithdrawalData(0,result.result.balance) } else { console.log(`\n分红金余额:${result.result.balance},不执行提现`) @@ -1096,6 +1109,7 @@ function getPopularizeBalance(timeout = 0) { await $.wait(1000); if(result.result.balance >= 1) { console.log(`\n推广余额:${result.result.balance},开始尝试提现`) + retryTime = 0 await getBalanceWithdrawalData(2,result.result.balance) } else { console.log(`\n推广余额:${result.result.balance},不执行提现`) @@ -1147,12 +1161,19 @@ function getPackBalance(move,timeout = 0) { if(result.code == 0) { await $.wait(1000); if(move == 0) { - if(result.result.balance > 0) { - console.log(``) - await balancePackChangeBalance(result.result.balance) + if(autoExchange >0) { + console.log(`\n您当前设置为自动转换消费余额`) + if(result.result.balance > 0.5) { + await balancePackChangeBalance(result.result.balance-0.5) + } else { + console.log(`\n红包余额${result.result.balance},少于0.5,不转换消费余额`) + } + } else { + console.log(`\n您当前设置为不转换消费余额`) } } else { if(result.result.balance >= packWithdrawAmount) { + retryTime = 0 console.log(`\n红包余额${result.result.balance},尝试为你提现${packWithdrawAmount}`) await getBalanceWithdrawalData(1,result.result.balance,packWithdrawAmount) } else { @@ -1341,6 +1362,7 @@ function queryWithdrawId(id,balance,timeout = 0) { //提现 function balanceWithdrawal(id,withdrawMoney,timeout = 0) { if(logCaller) console.log("call "+ printCaller()) + retryTime++ return new Promise((resolve, reject) => { let request = { url: `https://api.shatuvip.com/withdrawal/balanceWithdrawal`, @@ -1364,6 +1386,9 @@ function balanceWithdrawal(id,withdrawMoney,timeout = 0) { if (err) { console.log("API请求失败"); console.log(err + " at function " + printCaller()); + if(retryTime < retryLimit) { + await balanceWithdrawal(id,withdrawMoney) + } } else { if (safeGet(data)) { await $.wait(1000); From 210deb316e9772e576889b8d136158a83504e017 Mon Sep 17 00:00:00 2001 From: Leaf <444653703@qq.com> Date: Sat, 13 Nov 2021 20:24:25 +0800 Subject: [PATCH 02/35] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E8=BF=9C=E7=A8=8B?= =?UTF-8?q?=E5=9C=B0=E5=9D=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- jctq/jctq_task_subscribe.json | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/jctq/jctq_task_subscribe.json b/jctq/jctq_task_subscribe.json index 1e27df5..3817bc2 100644 --- a/jctq/jctq_task_subscribe.json +++ b/jctq/jctq_task_subscribe.json @@ -10,7 +10,7 @@ "time": "21 8,20 * * *", "job": { "type": "runjs", - "target": "jctqkkz.js" + "target": "https://raw.githubusercontent.com/leafxcy/JavaScript/main/jctq/jctqkkz.js" } }, { @@ -19,7 +19,7 @@ "time": "18 22 * * *", "job": { "type": "runjs", - "target": "jctq_today_score.js" + "target": "https://raw.githubusercontent.com/leafxcy/JavaScript/main/jctq/jctq_today_score.js" } }, { @@ -28,7 +28,7 @@ "time": "23 0,6 * * *", "job": { "type": "runjs", - "target": "jctqqd.js" + "target": "https://raw.githubusercontent.com/leafxcy/JavaScript/main/jctq/jctqqd.js" } }, { @@ -37,7 +37,7 @@ "time": "12 7,19 * * *", "job": { "type": "runjs", - "target": "jctqwz.js" + "target": "https://raw.githubusercontent.com/leafxcy/JavaScript/main/jctq/jctqwz.js" } }, { @@ -46,7 +46,7 @@ "time": "12 6,12,18 * * *", "job": { "type": "runjs", - "target": "jctq_share.js" + "target": "https://raw.githubusercontent.com/leafxcy/JavaScript/main/jctq/jctq_share.js" } }, { @@ -55,7 +55,7 @@ "time": "20 9,17 * * *", "job": { "type": "runjs", - "target": "jctq_Adv_video.js" + "target": "https://raw.githubusercontent.com/leafxcy/JavaScript/main/jctq/jctq_Adv_video.js" } }, { @@ -64,7 +64,7 @@ "time": "31 8,16 * * *", "job": { "type": "runjs", - "target": "jctq_Rotary.js" + "target": "https://raw.githubusercontent.com/leafxcy/JavaScript/main/jctq/jctq_Rotary.js" } }, { @@ -73,7 +73,7 @@ "time": "24 21,22 * * *", "job": { "type": "runjs", - "target": "jctqbox.js" + "target": "https://raw.githubusercontent.com/leafxcy/JavaScript/main/jctq/jctqbox.js" } }, { @@ -82,7 +82,7 @@ "time": "32 2,6,20 * * *", "job": { "type": "runjs", - "target": "jctq_friendSign.js" + "target": "https://raw.githubusercontent.com/leafxcy/JavaScript/main/jctq/jctq_friendSign.js" } }, { @@ -91,7 +91,7 @@ "time": "34 23 * * *", "job": { "type": "runjs", - "target": "jctq_withdraw.js" + "target": "https://raw.githubusercontent.com/leafxcy/JavaScript/main/jctq/jctq_withdraw.js" } } ] From 56c462f09c3cef4a9e63175353e64f2bdfd3c1ae Mon Sep 17 00:00:00 2001 From: Leaf <444653703@qq.com> Date: Sat, 13 Nov 2021 22:01:57 +0800 Subject: [PATCH 03/35] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E4=BB=BB=E5=8A=A1?= =?UTF-8?q?=E5=90=8D=E7=A7=B0=EF=BC=8C=E9=81=BF=E5=85=8D=E8=B7=9F=E7=9C=8B?= =?UTF-8?q?=E7=82=B9=E9=87=8D=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- jctq/jctq_rewrite_subscribe.json | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/jctq/jctq_rewrite_subscribe.json b/jctq/jctq_rewrite_subscribe.json index c83c209..d0888f5 100644 --- a/jctq/jctq_rewrite_subscribe.json +++ b/jctq/jctq_rewrite_subscribe.json @@ -107,7 +107,7 @@ }, }, { - "name": "晶彩抽奖", + "name": "晶彩天气抽奖", "type": "cron", "time": "31 8,16 * * *", "job": { @@ -116,7 +116,7 @@ }, }, { - "name": "晶彩每日宝箱", + "name": "晶彩天气每日宝箱", "type": "cron", "time": "24 21,22 * * *", "job": { @@ -125,7 +125,7 @@ }, }, { - "name": "晶彩好友签到红包", + "name": "晶彩天气好友红包", "type": "cron", "time": "32 2,6,20 * * *", "job": { @@ -144,4 +144,4 @@ } ] } -} \ No newline at end of file +} From 94c5f18c4c6e5b69ddd8c9c85e06fe346d0ab264 Mon Sep 17 00:00:00 2001 From: Leaf <444653703@qq.com> Date: Mon, 15 Nov 2021 01:44:35 +0800 Subject: [PATCH 04/35] Add files via upload --- blackUnique.jpg | Bin 0 -> 111976 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 blackUnique.jpg diff --git a/blackUnique.jpg b/blackUnique.jpg new file mode 100644 index 0000000000000000000000000000000000000000..cb296961d1352ad2101fbdf83579c35f672204ea GIT binary patch literal 111976 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ΞK*e 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 Date: Mon, 15 Nov 2021 09:33:54 +0800 Subject: [PATCH 05/35] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E6=B6=88=E8=B4=B9?= =?UTF-8?q?=E4=BD=99=E9=A2=9D=E8=BD=AC=E6=8D=A2=EF=BC=8C=E5=A2=9E=E5=8A=A0?= =?UTF-8?q?=E5=8F=96=E6=B6=88=E6=8E=A8=E9=80=81=E7=9A=84=E5=BC=80=E5=85=B3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- shangtuo.js | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/shangtuo.js b/shangtuo.js index 0d30a36..e19ed6a 100644 --- a/shangtuo.js +++ b/shangtuo.js @@ -3,13 +3,13 @@ 下载地址: 复制链接后,在微信里打开: -https://shatuvip.com/pages/login/register?recom_code=5290130 +https://shatuvip.com/pages/login/register?recom_code=7755074 或微信扫描二维码下载 https://raw.githubusercontent.com/leafxcy/JavaScript/main/shangtuo.jpg -推荐码: 5290130 -抢券时段为7:00到23:59,建议在8点后跑脚本,7点有可能会卡 +推荐码: 7755074 +抢券时段为7:00到23:59,建议在9点后跑脚本,7点有可能会卡 玩法:进APP后,先手动去全球分红->提取分红金,然后在个人中心->分红余额->提现一次0.03元(需要上传支付宝和微信收款码),就可以跑脚本了 脚本会自动看广告得分红金,抢券,提现 @@ -20,6 +20,7 @@ https://raw.githubusercontent.com/leafxcy/JavaScript/main/shangtuo.jpg !!!但是不建议提现20块以下,因为手续费高,只有0.5手续费低!!! 脚本会自动把红包余额转换为消费余额来抢更高面额的券,如果不想换的自己建一个环境变量 stExchange 设为0,export stExchange=0 +青龙环境下会有推送,不想要推送的建一个环境变量 stNotify 设为0,export stNotify=0 CK有效期较短,可能几天后需要重新捉 只测试了IOS,测试过V2P,青龙可以跑 @@ -59,6 +60,7 @@ let userInfo = "" var packWithdrawAmount = ($.isNode() ? (process.env.stCash) : ($.getval('stCash'))) || 0.5; var autoExchange = ($.isNode() ? (process.env.stExchange) : ($.getval('stExchange'))) || 1; +var nodeNotify = ($.isNode() ? (process.env.stNotify) : ($.getval('stNotify'))) || 1; let secretCode @@ -102,6 +104,7 @@ const notify = $.isNode() ? require('./sendNotify') : ''; //看广告得分红金 retryTime = 0 + compTaskFlag = 1 await getAdvertPage(1); await $.wait(1000); await getAdvertPage(2); @@ -155,7 +158,7 @@ const notify = $.isNode() ? require('./sendNotify') : ''; } $.msg(userInfo) - if($.isNode()) await notify.sendNotify($.name, userInfo) + if(nodeNotify == 1 && $.isNode()) await notify.sendNotify($.name, userInfo) } } @@ -334,7 +337,6 @@ function getAdvertPage(pageNo,timeout = 0) { if (result.code == 0) { console.log(`获取分红金广告任务列表成功`) adNum = result.result.length - compTaskFlag = 1 for(let i=0; i0) { - console.log(`\n您当前设置为自动转换消费余额`) + console.log(`\n您当前设置为自动转换消费余额,当前红包余额${result.result.balance}`) if(result.result.balance > 0.5) { - await balancePackChangeBalance(result.result.balance-0.5) + let exchangeAmount = Math.floor((result.result.balance-0.5)*100) / 100 + await balancePackChangeBalance(exchangeAmount) } else { console.log(`\n红包余额${result.result.balance},少于0.5,不转换消费余额`) } From a406962536eb34e5d1491f034e9aff02e9034be2 Mon Sep 17 00:00:00 2001 From: Leaf <444653703@qq.com> Date: Mon, 15 Nov 2021 09:54:32 +0800 Subject: [PATCH 06/35] Add files via upload --- blackUnique.js | 783 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 783 insertions(+) create mode 100644 blackUnique.js diff --git a/blackUnique.js b/blackUnique.js new file mode 100644 index 0000000..f2ccf2d --- /dev/null +++ b/blackUnique.js @@ -0,0 +1,783 @@ +/* +APP:全球购骑士特权 + +直接appstore搜索下载,方便的话可以微信扫下面图片二维码走邀请注册,谢谢 +https://raw.githubusercontent.com/leafxcy/JavaScript/main/blackUnique.jpg + +定时为每小时一次,务必在0分到5分之间运行,目前只写了每日领勋章和领取存钱罐的任务,大概每天3毛 +需要看视频的任务暂时搞不定,能搞定再加上 +暂不支持多账号 + +青龙: +捉https://pyp-api.chuxingyouhui.com/api/app/userCenter/v1/info的包,获得appId +捉https://market.chuxingyouhui.com/promo-bargain-api/activity/mqq/api/indexTopInfo?的包,获得header +然后填在blackJSON里面,注意按照JSON格式填写。用青龙面板的环境变量或者外面用双引号的,字符串内需要用\"转义 +export blackJSON='{"black-token":"", "token":"", "User-Agent":"", "device-value":"", "device-type":"", "phpUserId":"", "appId":""}' + +V2P,圈X:重写方法 -- 点击右下角【我的】-> 【每日签到赚现金】 +[task_local] +#全球购骑士特权 +0 * * * * https://raw.githubusercontent.com/leafxcy/JavaScript/main/blackUnique.js, tag=全球购骑士特权, enabled=true +[rewrite_local] +https://pyp-api.chuxingyouhui.com/api/app/userCenter/v1/info url script-request-header https://raw.githubusercontent.com/leafxcy/JavaScript/main/blackUnique.js +https://market.chuxingyouhui.com/promo-bargain-api/activity/mqq/api/indexTopInfo? url https://raw.githubusercontent.com/leafxcy/JavaScript/main/blackUnique.js +[MITM] +hostname = *.chuxingyouhui.com + +*/ + +const jsname = '全球购骑士特权' +const $ = Env(jsname) +//const notifyFlag = 1; //0为关闭通知,1为打开通知,默认为1 +const logDebug = 0 + +//const notify = $.isNode() ? require('./sendNotify') : ''; +//let notifyStr = '' + +let blankJSON = {"black-token":"", "token":"", "User-Agent":"", "device-value":"", "device-type":"", "phpUserId":"", "appId":""} +let blackJSONStr = ($.isNode() ? (process.env.blackJSON) : ($.getval('blackJSON'))) || '' +let blackJSON = blackJSONStr ? JSON.parse(blackJSONStr) : blankJSON + +var todayDate = formatDateTime(new Date()); +let bussinessInfo = '{}' + +let rndtime = "" //毫秒 + +/////////////////////////////////////////////////////////////////// + +!(async () => { + + if(typeof $request !== "undefined") + { + await getRewrite() + } + else + { + //检查环境变量 + if(!(await checkEnv())){ + return + } + + await querySignStatus() + await $.wait(1000) + + await listUserTask() + await $.wait(1000) + + //红包需要sign,翻倍视频也需要sign + //await listRedPacket() + + await queryPiggyInfo() + await $.wait(1000) + + //翻卡看视频需要前置条件 + //await getUserFlopRecord() + + } + + +})() +.catch((e) => $.logErr(e)) +.finally(() => $.done()) + +//通知 +async function showmsg() { + + notifyBody = jsname + "运行通知\n\n" + notifyStr + + if (notifyFlag != 1) { + console.log(notifyBody); + } + + if (notifyFlag == 1) { + $.msg(notifyBody); + if ($.isNode()){await notify.sendNotify($.name, notifyBody );} + } +} + +async function getRewrite() +{ + if($request.url.indexOf("userCenter/v1/info") > -1) { + if($request.headers['black-token']) { + blackJSON['black-token'] = $request.headers['black-token'] + console.log(`获取到black-token: ${blackJSON['black-token']}`) + } + if($request.headers['token']) { + blackJSON['token'] = $request.headers['token'] + console.log(`获取到token: ${blackJSON['token']}`) + } + if($request.headers['User-Agent']) { + blackJSON['User-Agent'] = $request.headers['User-Agent'] + console.log(`获取到User-Agent: ${blackJSON['User-Agent']}`) + } + if($request.headers['device-value']) { + blackJSON['device-value'] = $request.headers['device-value'] + console.log(`获取到device-value: ${blackJSON['device-value']}`) + } + if($request.headers['device-type']) { + blackJSON['device-type'] = $request.headers['device-type'] + console.log(`获取到device-type: ${blackJSON['device-type']}`) + } + if($request.headers['phpUserId']) { + blackJSON['phpUserId'] = $request.headers['phpUserId'] + console.log(`获取到phpUserId: ${blackJSON['phpUserId']}`) + } + $.setdata(JSON.stringify(blackJSON),'blackJSON') + } + + if($request.url.indexOf("mqq/api/indexTopInfo?appId=") > -1) { + blackJSON['appId'] = $request.url.match(/appId=([\w]+)/)[1] + console.log(`获取到appId: ${blackJSON['appId']}`) + $.setdata(JSON.stringify(blackJSON),'blackJSON') + } +} + +async function checkEnv() +{ + if(!blackJSON['black-token'] || !blackJSON['token'] || !blackJSON['User-Agent'] || !blackJSON['device-value'] || !blackJSON['device-type'] || !blackJSON['phpUserId'] || !blackJSON['appId']) + { + $.log(`捉包信息不全,请检查空白字段并重新捉包: ${JSON.stringify(blackJSON)}\n`) + return false + } + + return true +} + +//========================================================================== +//获取视频信息 +async function getBussinessInfo(adId,activityType,bussinessType,version) { + let caller = printCaller() + //rndtime = Math.round(new Date().getTime()) + reqBody = `{"adId":"${adId}","activityType":${activityType},"bussinessType":"${bussinessType}","version":"${version}"}` + encodeBody = encodeURIComponent(reqBody) + return new Promise((resolve) => { + let url = { + url: 'https://market.chuxingyouhui.com/promo-bargain-api/video/api/v1_0/getBussinessInfo', + headers: { + 'Host' : 'market.chuxingyouhui.com', + 'request-body' : encodeBody, + 'Accept' : 'application/json, text/plain, */*', + 'Accept-Language' : 'zh-CN,zh-Hans;q=0.9', + 'Accept-Encoding' : 'gzip, deflate, br', + 'token' : blackJSON['token'], + 'Content-Type' : 'application/json;charset=utf-8', + 'Origin' : 'https://m.black-unique.com', + 'User-Agent' : blackJSON['User-Agent'], + 'black-token' : blackJSON['black-token'], + 'Referer' : 'https://m.black-unique.com/', + 'Connection' : 'keep-alive', + }, + body: reqBody + }; + $.post(url, async (err, resp, data) => { + try { + if (err) { + console.log(caller + ": API请求失败"); + console.log(JSON.stringify(err)); + $.logErr(err); + } else { + if (safeGet(data)) { + let result = JSON.parse(data); + if(logDebug) console.log(result); + if(result.code == 200) { + bussinessInfo = result.data ? JSON.stringify(result.data) : '{}' + } else { + console.log(`获取视频信息失败:${result.msg}`) + } + } + } + } catch (e) { + $.logErr(e, resp); + } finally { + resolve(); + } + }); + }); +} + +//获取签到状态 +async function querySignStatus() { + let caller = printCaller() + //rndtime = Math.round(new Date().getTime()) + return new Promise((resolve) => { + let url = { + url: 'https://market.chuxingyouhui.com/promo-bargain-api/activity/weekSign/api/v1_0/calendar?appId='+blackJSON['appId'], + headers: { + 'Host' : 'market.chuxingyouhui.com', + 'Origin' : 'https://m.black-unique.com', + 'Accept-Encoding' : 'gzip, deflate, br', + 'Connection' : 'keep-alive', + 'black-token' : blackJSON['black-token'], + 'Accept' : 'application/json, text/plain, */*', + 'User-Agent' : blackJSON['User-Agent'], + 'Referer' : 'https://m.black-unique.com/', + 'token' : blackJSON['token'], + 'Accept-Language' : 'zh-CN,zh-Hans;q=0.9', + }, + }; + $.get(url, async (err, resp, data) => { + try { + if (err) { + console.log(caller + ": API请求失败"); + console.log(JSON.stringify(err)); + $.logErr(err); + } else { + if (safeGet(data)) { + let result = JSON.parse(data); + if(logDebug) console.log(result); + if(result.code == 200) { + if(result.data && result.data.calendar && Array.isArray(result.data.calendar)) { + for(let i=0; i< result.data.calendar.length; i++) { + let signItem = result.data.calendar[i] + if(signItem.isToday == true) { + if(signItem.signStyle == 0) { + await doSign() + } else { + console.log(`\n今日已签到\n`) + } + } + } + } + } else { + console.log(`\n获取签到状态失败:${result.msg}\n`) + } + } + } + } catch (e) { + $.logErr(e, resp); + } finally { + resolve(); + } + }); + }); +} + +//签到 +async function doSign() { + let caller = printCaller() + //rndtime = Math.round(new Date().getTime()) + reqBody = `{}` + encodeBody = encodeURIComponent(reqBody) + return new Promise((resolve) => { + let url = { + url: 'https://market.chuxingyouhui.com/promo-bargain-api/activity/weekSign/api/v1_0/sign?appId='+blackJSON['appId'], + headers: { + 'Host' : 'market.chuxingyouhui.com', + 'request-body' : reqBody, + 'Accept' : 'application/json, text/plain, */*', + 'Accept-Language' : 'zh-CN,zh-Hans;q=0.9', + 'Accept-Encoding' : 'gzip, deflate, br', + 'token' : blackJSON['token'], + 'Content-Type' : 'application/json;charset=utf-8', + 'Origin' : 'https://m.black-unique.com', + 'User-Agent' : blackJSON['User-Agent'], + 'black-token' : blackJSON['black-token'], + 'Referer' : 'https://m.black-unique.com/', + 'Connection' : 'keep-alive', + }, + }; + $.post(url, async (err, resp, data) => { + try { + if (err) { + console.log(caller + ": API请求失败"); + console.log(JSON.stringify(err)); + $.logErr(err); + } else { + if (safeGet(data)) { + let result = JSON.parse(data); + if(logDebug) console.log(result); + console.log(result) + if(result.code == 200) { + console.log(`\n签到成功获得:${result.data.reward}金币,已连续签到${result.data.continuouslyDay}天\n`) + } else { + console.log(`\n签到失败:${result.msg}\n`) + } + } + } + } catch (e) { + $.logErr(e, resp); + } finally { + resolve(); + } + }); + }); +} + +//日常-任务列表 +async function listUserTask() { + let caller = printCaller() + rndtime = Math.round(new Date().getTime()) + reqBody = `{"activityType":13}` + encodeBody = encodeURIComponent(reqBody) + return new Promise((resolve) => { + let url = { + url: 'https://market.chuxingyouhui.com/promo-bargain-api/activity/task/api/list_user_task', + headers: { + 'Host' : 'market.chuxingyouhui.com', + 'request-body' : encodeBody, + 'Accept' : 'application/json, text/plain, */*', + 'Accept-Language' : 'zh-CN,zh-Hans;q=0.9', + 'Accept-Encoding' : 'gzip, deflate, br', + 'token' : blackJSON['token'], + 'Content-Type' : 'application/json;charset=utf-8', + 'Origin' : 'https://m.black-unique.com', + 'User-Agent' : blackJSON['User-Agent'], + 'black-token' : blackJSON['black-token'], + 'Referer' : 'https://m.black-unique.com/', + 'Connection' : 'keep-alive', + }, + body: reqBody + }; + $.post(url, async (err, resp, data) => { + try { + if (err) { + console.log(caller + ": API请求失败"); + console.log(JSON.stringify(err)); + $.logErr(err); + } else { + if (safeGet(data)) { + let result = JSON.parse(data); + if(logDebug) console.log(result); + if(result.code == 200) { + if(result.data && Array.isArray(result.data)) { + for(let i=0; i -1 && (rndtime < taskItem.receiveStartTime || rndtime > taskItem.receiveEndTime)) { + //非整点领勋章时间 + continue + } else if(taskItem.taskType.indexOf('SHOPPING') > -1) { + //跳过购物任务 + continue + } + await $.wait(1000) + await doTask(taskItem.taskType,taskItem.userTaskId,taskItem.taskTitle) + } + + } + } + } else { + console.log(`查询任务列表失败:${result.msg}`) + } + } + } + } catch (e) { + $.logErr(e, resp); + } finally { + resolve(); + } + }); + }); +} + +//日常-完成任务 +async function doTask(taskType,userTaskId,taskTitle) { + let caller = printCaller() + //rndtime = Math.round(new Date().getTime()) + reqBody = `{"activityType":13,"taskType":"${taskType}","userTaskId":"${userTaskId}"}` + encodeBody = encodeURIComponent(reqBody) + return new Promise((resolve) => { + let url = { + url: 'https://market.chuxingyouhui.com/promo-bargain-api/activity/task/api/doTask', + headers: { + 'Host' : 'market.chuxingyouhui.com', + 'request-body' : encodeBody, + 'Accept' : 'application/json, text/plain, */*', + 'Accept-Language' : 'zh-CN,zh-Hans;q=0.9', + 'Accept-Encoding' : 'gzip, deflate, br', + 'token' : blackJSON['token'], + 'Content-Type' : 'application/json;charset=utf-8', + 'Origin' : 'https://m.black-unique.com', + 'User-Agent' : blackJSON['User-Agent'], + 'black-token' : blackJSON['black-token'], + 'Referer' : 'https://m.black-unique.com/', + 'Connection' : 'keep-alive', + }, + body: reqBody + }; + $.post(url, async (err, resp, data) => { + try { + if (err) { + console.log(caller + ": API请求失败"); + console.log(JSON.stringify(err)); + $.logErr(err); + } else { + if (safeGet(data)) { + let result = JSON.parse(data); + if(logDebug) console.log(result); + if(result.code == 200) { + console.log(`完成任务【${result.data.taskTitle}】:获得${result.data.rewardScore}勋章`) + } else { + console.log(`完成任务【${taskTitle}】失败:${result.msg}`) + } + } + } + } catch (e) { + $.logErr(e, resp); + } finally { + resolve(); + } + }); + }); +} + +//存钱罐状态 +async function queryPiggyInfo() { + let caller = printCaller() + //rndtime = Math.round(new Date().getTime()) + return new Promise((resolve) => { + let url = { + url: 'https://market.chuxingyouhui.com/promo-bargain-api/activity/golden/api/queryUserAccountInfo?appId='+blackJSON['appId'], + headers: { + 'Host' : 'market.chuxingyouhui.com', + 'Origin' : 'https://m.black-unique.com', + 'Accept-Encoding' : 'gzip, deflate, br', + 'Connection' : 'keep-alive', + 'black-token' : blackJSON['black-token'], + 'Accept' : 'application/json, text/plain, */*', + 'User-Agent' : blackJSON['User-Agent'], + 'Referer' : 'https://m.black-unique.com/', + 'token' : blackJSON['token'], + 'Accept-Language' : 'zh-CN,zh-Hans;q=0.9', + }, + }; + $.get(url, async (err, resp, data) => { + try { + if (err) { + console.log(caller + ": API请求失败"); + console.log(JSON.stringify(err)); + $.logErr(err); + } else { + if (safeGet(data)) { + let result = JSON.parse(data); + if(logDebug) console.log(result); + if(result.code == 200) { + if(parseFloat(result.data.goldenAmount) < parseFloat(result.data.dayCeil)) { + if(parseFloat(result.data.piggyAmount) >= 1) { + await clickPiggy() + } + } else { + console.log(`\n存钱罐提取已达到当天上限:${result.data.dayCeil}\n`) + } + } else { + console.log(`\n查询存钱罐状态失败:${result.msg}\n`) + } + } + } + } catch (e) { + $.logErr(e, resp); + } finally { + resolve(); + } + }); + }); +} + +//提取存钱罐金币 +async function clickPiggy() { + let caller = printCaller() + //rndtime = Math.round(new Date().getTime()) + reqBody = `{"appId":"${blackJSON['appId']}"}` + encodeBody = encodeURIComponent(reqBody) + return new Promise((resolve) => { + let url = { + url: 'https://market.chuxingyouhui.com/promo-bargain-api/activity/golden/api/v1_0/click', + headers: { + 'Host' : 'market.chuxingyouhui.com', + 'request-body' : encodeBody, + 'Accept' : 'application/json, text/plain, */*', + 'Accept-Language' : 'zh-CN,zh-Hans;q=0.9', + 'Accept-Encoding' : 'gzip, deflate, br', + 'token' : blackJSON['token'], + 'Content-Type' : 'application/json;charset=utf-8', + 'Origin' : 'https://m.black-unique.com', + 'User-Agent' : blackJSON['User-Agent'], + 'black-token' : blackJSON['black-token'], + 'Referer' : 'https://m.black-unique.com/', + 'Connection' : 'keep-alive', + }, + body: reqBody + }; + $.post(url, async (err, resp, data) => { + try { + if (err) { + console.log(caller + ": API请求失败"); + console.log(JSON.stringify(err)); + $.logErr(err); + } else { + if (safeGet(data)) { + let result = JSON.parse(data); + if(logDebug) console.log(result); + if(result.code == 200) { + console.log(`\n提取存钱罐金币成功,金币余额${result.data.goldenAmount}\n`) + } else { + console.log(`\n提取存钱罐金币失败:${result.msg}\n`) + } + } + } + } catch (e) { + $.logErr(e, resp); + } finally { + resolve(); + } + }); + }); +} + +//查询翻牌领提现额度 +async function getUserFlopRecord() { + let caller = printCaller() + //rndtime = Math.round(new Date().getTime()) + reqBody = `{"appId":"${blackJSON['appId']}","queryDay":"${todayDate}"}` + encodeBody = encodeURIComponent(reqBody) + return new Promise((resolve) => { + let url = { + url: 'https://market.chuxingyouhui.com/promo-bargain-api/activity/flop/api/getUserFlopRecord', + headers: { + 'Host' : 'market.chuxingyouhui.com', + 'request-body' : encodeBody, + 'Accept' : 'application/json, text/plain, */*', + 'Accept-Language' : 'zh-CN,zh-Hans;q=0.9', + 'Accept-Encoding' : 'gzip, deflate, br', + 'token' : blackJSON['token'], + 'Content-Type' : 'application/json;charset=utf-8', + 'Origin' : 'https://m.black-unique.com', + 'User-Agent' : blackJSON['User-Agent'], + 'black-token' : blackJSON['black-token'], + 'Referer' : 'https://m.black-unique.com/', + 'Connection' : 'keep-alive', + }, + body: reqBody + }; + $.post(url, async (err, resp, data) => { + try { + if (err) { + console.log(caller + ": API请求失败"); + console.log(JSON.stringify(err)); + $.logErr(err); + } else { + if (safeGet(data)) { + let result = JSON.parse(data); + if(logDebug) console.log(result); + if(result.code == 200) { + if(result.data && result.data.recordList && Array.isArray(result.data.recordList)) { + for (let i=0; i { + let url = { + url: 'https://market.chuxingyouhui.com/promo-bargain-api/activity/flop/api/flop', + headers: { + 'Host' : 'market.chuxingyouhui.com', + 'request-body' : encodeBody, + 'Accept' : 'application/json, text/plain, */*', + 'Accept-Language' : 'zh-CN,zh-Hans;q=0.9', + 'Accept-Encoding' : 'gzip, deflate, br', + 'token' : blackJSON['token'], + 'Content-Type' : 'application/json;charset=utf-8', + 'Origin' : 'https://m.black-unique.com', + 'User-Agent' : blackJSON['User-Agent'], + 'black-token' : blackJSON['black-token'], + 'Referer' : 'https://m.black-unique.com/', + 'Connection' : 'keep-alive', + }, + body: reqBody + }; + $.post(url, async (err, resp, data) => { + try { + if (err) { + console.log(caller + ": API请求失败"); + console.log(JSON.stringify(err)); + $.logErr(err); + } else { + if (safeGet(data)) { + let result = JSON.parse(data); + if(logDebug) console.log(result); + if(result.code == 200) { + console.log(`翻牌获得提现额度:${result.data.amount}元`) + } else { + console.log(`翻牌获得提现额度失败:${result.msg}`) + } + } + } + } catch (e) { + $.logErr(e, resp); + } finally { + resolve(); + } + }); + }); +} + +//定点红包列表 +async function listRedPacket() { + let caller = printCaller() + //rndtime = Math.round(new Date().getTime()) + return new Promise((resolve) => { + let url = { + url: 'https://fanxian-api.chuxingyouhui.com/api/redPacketIncome/v1_0/listRedPacket', + headers: { + 'Host' : 'fanxian-api.chuxingyouhui.com', + 'phpUserId' : blackJSON['phpUserId'], + 'device-value' : blackJSON['device-value'], + 'device-type' : blackJSON['device-type'], + 'Accept-Language' : 'zh-CN,zh-Hans;q=0.9', + 'newcomer' : 'true', + 'Accept-Encoding' : 'gzip, deflate, br', + 'token' : blackJSON['token'], + 'Origin' : 'https://m.black-unique.com', + 'User-Agent' : blackJSON['User-Agent'], + 'Referer' : 'https://m.black-unique.com/', + 'Content-Length' : '0', + 'Connection' : 'keep-alive', + 'Accept' : 'application/json, text/plain, */*', + }, + }; + $.post(url, async (err, resp, data) => { + try { + if (err) { + console.log(caller + ": API请求失败"); + console.log(JSON.stringify(err)); + $.logErr(err); + } else { + if (safeGet(data)) { + let result = JSON.parse(data); + if(logDebug) console.log(result); + if(result.code == 200) { + if(result.data && result.data.redPacketList && Array.isArray(result.data.redPacketList)) { + for(let i=0; i { + let url = { + url: 'https://pyp-api.chuxingyouhui.com/api/knightCard/redPacket/v1_0/openRedPacket', + headers: { + 'Host' : 'pyp-api.chuxingyouhui.com', + 'Accept' : 'application/json, text/plain, */*', + 'phpUserId' : blackJSON['phpUserId'], + 'device-value' : blackJSON['device-value'], + 'ymd' : '0', + 'device-type' : blackJSON['device-type'], + 'newcomer' : 'true', + 'token' : blackJSON['token'], + 'Accept-Language' : 'zh-CN,zh-Hans;q=0.9', + 'Origin' : 'https://m.black-unique.com', + 'User-Agent' : blackJSON['User-Agent'], + 'Referer' : 'https://m.black-unique.com/', + 'Content-Length' : '87', + 'Accept-Encoding' : 'gzip, deflate, br', + 'Connection' : 'keep-alive', + 'Content-Type' : 'application/json;charset=utf-8', + }, + body: `{"click":false,"sign":"${sign}","ts":"${rndtime}"}` + }; + $.post(url, async (err, resp, data) => { + try { + if (err) { + console.log(caller + ": API请求失败"); + console.log(JSON.stringify(err)); + $.logErr(err); + } else { + if (safeGet(data)) { + let result = JSON.parse(data); + if(logDebug) console.log(result); + console.log(result) + if(result.code == 200) { + console.log(`打开红包获得:${result.data.money}现金`) + } else { + console.log(`打开红包失败:${result.msg}`) + } + } + } + } catch (e) { + $.logErr(e, resp); + } finally { + resolve(); + } + }); + }); +} + +//////////////////////////////////////////////////////////////////// +function safeGet(data) { + try { + if (typeof JSON.parse(data) == "object") { + return true; + } + } catch (e) { + console.log(e); + console.log(`服务器访问数据为空,请检查自身设备网络情况`); + return false; + } +} + +function printCaller(){ + return (new Error()).stack.split("\n")[2].trim().split(" ")[1] +} + +function formatDateTime(inputTime) { + var date = new Date(inputTime); + var y = date.getFullYear(); + var m = date.getMonth() + 1; + m = m < 10 ? ('0' + m) : m; + var d = date.getDate(); + d = d < 10 ? ('0' + d) : d; + var h = date.getHours(); + h = h < 10 ? ('0' + h) : h; + var minute = date.getMinutes(); + var second = date.getSeconds(); + minute = minute < 10 ? ('0' + minute) : minute; + second = second < 10 ? ('0' + second) : second; + return `${y}-${m}-${d}`; +}; + +function Env(t, e) { 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("", `\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) }) } } 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) } From 45ed5b4709e8a4e1097ab90bae00eb58329d39b8 Mon Sep 17 00:00:00 2001 From: Leaf <444653703@qq.com> Date: Mon, 15 Nov 2021 10:06:04 +0800 Subject: [PATCH 07/35] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E5=9C=88X=E9=87=8D?= =?UTF-8?q?=E5=86=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- blackUnique.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/blackUnique.js b/blackUnique.js index f2ccf2d..a07d6d1 100644 --- a/blackUnique.js +++ b/blackUnique.js @@ -20,7 +20,7 @@ V2P,圈X:重写方法 -- 点击右下角【我的】-> 【每日签到赚现 0 * * * * https://raw.githubusercontent.com/leafxcy/JavaScript/main/blackUnique.js, tag=全球购骑士特权, enabled=true [rewrite_local] https://pyp-api.chuxingyouhui.com/api/app/userCenter/v1/info url script-request-header https://raw.githubusercontent.com/leafxcy/JavaScript/main/blackUnique.js -https://market.chuxingyouhui.com/promo-bargain-api/activity/mqq/api/indexTopInfo? url https://raw.githubusercontent.com/leafxcy/JavaScript/main/blackUnique.js +https://market.chuxingyouhui.com/promo-bargain-api/activity/mqq/api/indexTopInfo? url script-request-header https://raw.githubusercontent.com/leafxcy/JavaScript/main/blackUnique.js [MITM] hostname = *.chuxingyouhui.com From 3516269d1664bc85b380e31da1aef27f7f49d70c Mon Sep 17 00:00:00 2001 From: Leaf <444653703@qq.com> Date: Mon, 15 Nov 2021 11:22:52 +0800 Subject: [PATCH 08/35] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E9=87=8D=E5=86=99?= =?UTF-8?q?=E8=AF=B4=E6=98=8E?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- blackUnique.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/blackUnique.js b/blackUnique.js index a07d6d1..2eeb1d5 100644 --- a/blackUnique.js +++ b/blackUnique.js @@ -9,8 +9,8 @@ https://raw.githubusercontent.com/leafxcy/JavaScript/main/blackUnique.jpg 暂不支持多账号 青龙: -捉https://pyp-api.chuxingyouhui.com/api/app/userCenter/v1/info的包,获得appId -捉https://market.chuxingyouhui.com/promo-bargain-api/activity/mqq/api/indexTopInfo?的包,获得header +捉https://market.chuxingyouhui.com/promo-bargain-api/activity/mqq/api/indexTopInfo?的包,获得appId +捉https://pyp-api.chuxingyouhui.com/api/app/userCenter/v1/info的包,获得其他header 然后填在blackJSON里面,注意按照JSON格式填写。用青龙面板的环境变量或者外面用双引号的,字符串内需要用\"转义 export blackJSON='{"black-token":"", "token":"", "User-Agent":"", "device-value":"", "device-type":"", "phpUserId":"", "appId":""}' @@ -20,7 +20,7 @@ V2P,圈X:重写方法 -- 点击右下角【我的】-> 【每日签到赚现 0 * * * * https://raw.githubusercontent.com/leafxcy/JavaScript/main/blackUnique.js, tag=全球购骑士特权, enabled=true [rewrite_local] https://pyp-api.chuxingyouhui.com/api/app/userCenter/v1/info url script-request-header https://raw.githubusercontent.com/leafxcy/JavaScript/main/blackUnique.js -https://market.chuxingyouhui.com/promo-bargain-api/activity/mqq/api/indexTopInfo? url script-request-header https://raw.githubusercontent.com/leafxcy/JavaScript/main/blackUnique.js +https://market.chuxingyouhui.com/promo-bargain-api/activity/mqq/api/indexTopInfo? url script-request-header https://raw.githubusercontent.com/leafxcy/JavaScript/main/blackUnique.js [MITM] hostname = *.chuxingyouhui.com From 5286a7caf6b4e2388c00d3a94b17802ec276c075 Mon Sep 17 00:00:00 2001 From: Leaf <444653703@qq.com> Date: Mon, 15 Nov 2021 11:24:51 +0800 Subject: [PATCH 09/35] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E8=AF=B4=E6=98=8E?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- blackUnique.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/blackUnique.js b/blackUnique.js index 2eeb1d5..12c70ee 100644 --- a/blackUnique.js +++ b/blackUnique.js @@ -5,8 +5,9 @@ APP:全球购骑士特权 https://raw.githubusercontent.com/leafxcy/JavaScript/main/blackUnique.jpg 定时为每小时一次,务必在0分到5分之间运行,目前只写了每日领勋章和领取存钱罐的任务,大概每天3毛 +手动点一下签到页面的【收零花钱】领一次金币 需要看视频的任务暂时搞不定,能搞定再加上 -暂不支持多账号 +只测试了IOS的青龙和V2P,暂不支持多账号 青龙: 捉https://market.chuxingyouhui.com/promo-bargain-api/activity/mqq/api/indexTopInfo?的包,获得appId From 5e480965a2a6f60a33b5f7391471208e154b5e22 Mon Sep 17 00:00:00 2001 From: Leaf <444653703@qq.com> Date: Tue, 16 Nov 2021 10:01:24 +0800 Subject: [PATCH 10/35] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E6=9E=9C=E5=9B=AD?= =?UTF-8?q?=E4=BB=BB=E5=8A=A1=E5=92=8C=E9=80=9A=E7=9F=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- blackUnique.js | 957 +++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 921 insertions(+), 36 deletions(-) diff --git a/blackUnique.js b/blackUnique.js index 12c70ee..7862ff4 100644 --- a/blackUnique.js +++ b/blackUnique.js @@ -5,8 +5,8 @@ APP:全球购骑士特权 https://raw.githubusercontent.com/leafxcy/JavaScript/main/blackUnique.jpg 定时为每小时一次,务必在0分到5分之间运行,目前只写了每日领勋章和领取存钱罐的任务,大概每天3毛 -手动点一下签到页面的【收零花钱】领一次金币 -需要看视频的任务暂时搞不定,能搞定再加上 +提现需要关注微信公众号,在公众号里申请提现 +请手动点一下签到页面的【收零花钱】领一次金币,去【果园】里选择水果种子 只测试了IOS的青龙和V2P,暂不支持多账号 青龙: @@ -29,16 +29,29 @@ hostname = *.chuxingyouhui.com const jsname = '全球购骑士特权' const $ = Env(jsname) -//const notifyFlag = 1; //0为关闭通知,1为打开通知,默认为1 +const notifyFlag = 1; //0为关闭通知,1为打开通知,默认为1 const logDebug = 0 //const notify = $.isNode() ? require('./sendNotify') : ''; -//let notifyStr = '' +let notifyStr = '' let blankJSON = {"black-token":"", "token":"", "User-Agent":"", "device-value":"", "device-type":"", "phpUserId":"", "appId":""} let blackJSONStr = ($.isNode() ? (process.env.blackJSON) : ($.getval('blackJSON'))) || '' let blackJSON = blackJSONStr ? JSON.parse(blackJSONStr) : blankJSON +let reqTime = '' +let userSign = '' +let redPacketId = '' +let fruitId = '' +let userFruitId = '' +let activityId = '' +let redPacketCount = 0 +let waterCount = 0 +let fertilizerCount = 0 +let clickTreeTimes = 5 +let signRetryTimes = 3 +let signRetryCount = 0 + var todayDate = formatDateTime(new Date()); let bussinessInfo = '{}' @@ -59,21 +72,32 @@ let rndtime = "" //毫秒 return } + console.log('\n提现需要关注微信公众号,在公众号里申请提现') + await querySignStatus() - await $.wait(1000) await listUserTask() - await $.wait(1000) - //红包需要sign,翻倍视频也需要sign //await listRedPacket() await queryPiggyInfo() - await $.wait(1000) //翻卡看视频需要前置条件 //await getUserFlopRecord() + await userFruitDetail() + + await waterTaskList() + + await nutrientTaskList() + + await userFertilizerDetail() + + await getTreeCoupon() + + await userInfo() + + await showmsg() } @@ -92,7 +116,7 @@ async function showmsg() { if (notifyFlag == 1) { $.msg(notifyBody); - if ($.isNode()){await notify.sendNotify($.name, notifyBody );} + //if ($.isNode()){await notify.sendNotify($.name, notifyBody );} } } @@ -101,34 +125,41 @@ async function getRewrite() if($request.url.indexOf("userCenter/v1/info") > -1) { if($request.headers['black-token']) { blackJSON['black-token'] = $request.headers['black-token'] - console.log(`获取到black-token: ${blackJSON['black-token']}`) + $.log(`获取到black-token: ${blackJSON['black-token']}`) + $.msg(`获取到black-token: ${blackJSON['black-token']}`) } if($request.headers['token']) { blackJSON['token'] = $request.headers['token'] - console.log(`获取到token: ${blackJSON['token']}`) + $.log(`获取到token: ${blackJSON['token']}`) + $.msg(`获取到token: ${blackJSON['token']}`) } if($request.headers['User-Agent']) { blackJSON['User-Agent'] = $request.headers['User-Agent'] - console.log(`获取到User-Agent: ${blackJSON['User-Agent']}`) + $.log(`获取到User-Agent: ${blackJSON['User-Agent']}`) + $.msg(`获取到User-Agent: ${blackJSON['User-Agent']}`) } if($request.headers['device-value']) { blackJSON['device-value'] = $request.headers['device-value'] - console.log(`获取到device-value: ${blackJSON['device-value']}`) + $.log(`获取到device-value: ${blackJSON['device-value']}`) + $.msg(`获取到device-value: ${blackJSON['device-value']}`) } if($request.headers['device-type']) { blackJSON['device-type'] = $request.headers['device-type'] - console.log(`获取到device-type: ${blackJSON['device-type']}`) + $.log(`获取到device-type: ${blackJSON['device-type']}`) + $.msg(`获取到device-type: ${blackJSON['device-type']}`) } if($request.headers['phpUserId']) { blackJSON['phpUserId'] = $request.headers['phpUserId'] - console.log(`获取到phpUserId: ${blackJSON['phpUserId']}`) + $.log(`获取到phpUserId: ${blackJSON['phpUserId']}`) + $.msg(`获取到phpUserId: ${blackJSON['phpUserId']}`) } $.setdata(JSON.stringify(blackJSON),'blackJSON') } if($request.url.indexOf("mqq/api/indexTopInfo?appId=") > -1) { blackJSON['appId'] = $request.url.match(/appId=([\w]+)/)[1] - console.log(`获取到appId: ${blackJSON['appId']}`) + $.log(`获取到appId: ${blackJSON['appId']}`) + $.msg(`获取到appId: ${blackJSON['appId']}`) $.setdata(JSON.stringify(blackJSON),'blackJSON') } } @@ -138,6 +169,7 @@ async function checkEnv() if(!blackJSON['black-token'] || !blackJSON['token'] || !blackJSON['User-Agent'] || !blackJSON['device-value'] || !blackJSON['device-type'] || !blackJSON['phpUserId'] || !blackJSON['appId']) { $.log(`捉包信息不全,请检查空白字段并重新捉包: ${JSON.stringify(blackJSON)}\n`) + $.msg(`捉包信息不全,请检查空白字段并重新捉包: ${JSON.stringify(blackJSON)}\n`) return false } @@ -173,7 +205,7 @@ async function getBussinessInfo(adId,activityType,bussinessType,version) { $.post(url, async (err, resp, data) => { try { if (err) { - console.log(caller + ": API请求失败"); + console.log("Fucntion " + caller + ": API请求失败"); console.log(JSON.stringify(err)); $.logErr(err); } else { @@ -219,7 +251,7 @@ async function querySignStatus() { $.get(url, async (err, resp, data) => { try { if (err) { - console.log(caller + ": API请求失败"); + console.log("Fucntion " + caller + ": API请求失败"); console.log(JSON.stringify(err)); $.logErr(err); } else { @@ -264,7 +296,7 @@ async function doSign() { url: 'https://market.chuxingyouhui.com/promo-bargain-api/activity/weekSign/api/v1_0/sign?appId='+blackJSON['appId'], headers: { 'Host' : 'market.chuxingyouhui.com', - 'request-body' : reqBody, + 'request-body' : encodeBody, 'Accept' : 'application/json, text/plain, */*', 'Accept-Language' : 'zh-CN,zh-Hans;q=0.9', 'Accept-Encoding' : 'gzip, deflate, br', @@ -276,18 +308,18 @@ async function doSign() { 'Referer' : 'https://m.black-unique.com/', 'Connection' : 'keep-alive', }, + body: reqBody }; $.post(url, async (err, resp, data) => { try { if (err) { - console.log(caller + ": API请求失败"); + console.log("Fucntion " + caller + ": API请求失败"); console.log(JSON.stringify(err)); $.logErr(err); } else { if (safeGet(data)) { let result = JSON.parse(data); if(logDebug) console.log(result); - console.log(result) if(result.code == 200) { console.log(`\n签到成功获得:${result.data.reward}金币,已连续签到${result.data.continuouslyDay}天\n`) } else { @@ -332,7 +364,7 @@ async function listUserTask() { $.post(url, async (err, resp, data) => { try { if (err) { - console.log(caller + ": API请求失败"); + console.log("Fucntion " + caller + ": API请求失败"); console.log(JSON.stringify(err)); $.logErr(err); } else { @@ -399,7 +431,7 @@ async function doTask(taskType,userTaskId,taskTitle) { $.post(url, async (err, resp, data) => { try { if (err) { - console.log(caller + ": API请求失败"); + console.log("Fucntion " + caller + ": API请求失败"); console.log(JSON.stringify(err)); $.logErr(err); } else { @@ -445,7 +477,7 @@ async function queryPiggyInfo() { $.get(url, async (err, resp, data) => { try { if (err) { - console.log(caller + ": API请求失败"); + console.log("Fucntion " + caller + ": API请求失败"); console.log(JSON.stringify(err)); $.logErr(err); } else { @@ -502,7 +534,7 @@ async function clickPiggy() { $.post(url, async (err, resp, data) => { try { if (err) { - console.log(caller + ": API请求失败"); + console.log("Fucntion " + caller + ": API请求失败"); console.log(JSON.stringify(err)); $.logErr(err); } else { @@ -553,7 +585,7 @@ async function getUserFlopRecord() { $.post(url, async (err, resp, data) => { try { if (err) { - console.log(caller + ": API请求失败"); + console.log("Fucntion " + caller + ": API请求失败"); console.log(JSON.stringify(err)); $.logErr(err); } else { @@ -613,7 +645,7 @@ async function userFlop(serialNumber) { $.post(url, async (err, resp, data) => { try { if (err) { - console.log(caller + ": API请求失败"); + console.log("Fucntion " + caller + ": API请求失败"); console.log(JSON.stringify(err)); $.logErr(err); } else { @@ -640,6 +672,9 @@ async function userFlop(serialNumber) { async function listRedPacket() { let caller = printCaller() //rndtime = Math.round(new Date().getTime()) + curTime = new Date() + currentHour = curTime.getHours() + let isGetRedTime = ((currentHour < 23) && (currentHour > 6)) ? 1 : 0 return new Promise((resolve) => { let url = { url: 'https://fanxian-api.chuxingyouhui.com/api/redPacketIncome/v1_0/listRedPacket', @@ -663,7 +698,7 @@ async function listRedPacket() { $.post(url, async (err, resp, data) => { try { if (err) { - console.log(caller + ": API请求失败"); + console.log("Fucntion " + caller + ": API请求失败"); console.log(JSON.stringify(err)); $.logErr(err); } else { @@ -671,10 +706,17 @@ async function listRedPacket() { let result = JSON.parse(data); if(logDebug) console.log(result); if(result.code == 200) { - if(result.data && result.data.redPacketList && Array.isArray(result.data.redPacketList)) { + if(isGetRedTime == 1 && result.data && result.data.redPacketList && Array.isArray(result.data.redPacketList)) { + redPacketCount = 0 for(let i=0; i 0) { + redPacketCount++ + } + if(redItem.status == 2 && redItem.money == 0 && redPacketCount < 7) { + signRetryCount = 0 + //await getSignInfo('open') + //await $.wait(500) await openRedPacket() } } @@ -696,8 +738,7 @@ async function listRedPacket() { //开定点红包 async function openRedPacket() { let caller = printCaller() - rndtime = Math.round(new Date().getTime()/1000) - let sign = ``//todo + //rndtime = Math.round(new Date().getTime()/1000) return new Promise((resolve) => { let url = { url: 'https://pyp-api.chuxingyouhui.com/api/knightCard/redPacket/v1_0/openRedPacket', @@ -714,26 +755,28 @@ async function openRedPacket() { 'Origin' : 'https://m.black-unique.com', 'User-Agent' : blackJSON['User-Agent'], 'Referer' : 'https://m.black-unique.com/', - 'Content-Length' : '87', 'Accept-Encoding' : 'gzip, deflate, br', 'Connection' : 'keep-alive', 'Content-Type' : 'application/json;charset=utf-8', }, - body: `{"click":false,"sign":"${sign}","ts":"${rndtime}"}` + body: `{"click":false,"sign":"${userSign}","ts":"${reqTime}"}` }; $.post(url, async (err, resp, data) => { try { if (err) { - console.log(caller + ": API请求失败"); + console.log("Fucntion " + caller + ": API请求失败"); console.log(JSON.stringify(err)); $.logErr(err); } else { if (safeGet(data)) { let result = JSON.parse(data); if(logDebug) console.log(result); - console.log(result) if(result.code == 200) { console.log(`打开红包获得:${result.data.money}现金`) + signRetryCount = 0 + //await getSignInfo('boom') + //await $.wait(2000) + await boomRedPacket() } else { console.log(`打开红包失败:${result.msg}`) } @@ -748,6 +791,848 @@ async function openRedPacket() { }); } +//定点红包翻倍 +async function boomRedPacket() { + let caller = printCaller() + //rndtime = Math.round(new Date().getTime()/1000) + return new Promise((resolve) => { + let url = { + url: 'https://fanxian-api.chuxingyouhui.com/api/redPacket/increase/v1_0/boom', + headers: { + 'Host' : 'fanxian-api.chuxingyouhui.com', + 'Accept' : 'application/json, text/plain, */*', + 'phpUserId' : blackJSON['phpUserId'], + 'device-value' : blackJSON['device-value'], + 'device-type' : blackJSON['device-type'], + 'Accept-Language' : 'zh-CN,zh-Hans;q=0.9', + 'token' : blackJSON['token'], + 'Accept-Encoding' : 'gzip, deflate, br', + 'Origin' : 'https://m.black-unique.com', + 'User-Agent' : blackJSON['User-Agent'], + 'Referer' : 'https://m.black-unique.com/', + 'Connection' : 'keep-alive', + 'Content-Type' : 'application/json;charset=utf-8', + }, + body: `{"redPacketId":"${redPacketId}","sign":"${userSign}","ts":"${reqTime}"}`, + }; + $.post(url, async (err, resp, data) => { + try { + if (err) { + console.log("Fucntion " + caller + ": API请求失败"); + console.log(JSON.stringify(err)); + $.logErr(err); + } else { + if (safeGet(data)) { + let result = JSON.parse(data); + if(logDebug) console.log(result); + if(result.code == 200) { + console.log(`红包翻倍获得:${result.data.redPacketIncreaseAmount}现金`) + } else { + console.log(`红包翻倍失败:${result.msg}`) + } + } + } + } catch (e) { + $.logErr(e, resp); + } finally { + resolve(); + } + }); + }); +} + +//果园状态 +async function userFruitDetail() { + let caller = printCaller() + //rndtime = Math.round(new Date().getTime()/1000) + reqBody = `{"appId":"${blackJSON['appId']}","isMiniProgram":false}` + encodeBody = encodeURIComponent(reqBody) + return new Promise((resolve) => { + let url = { + url: 'https://market.chuxingyouhui.com/promo-bargain-api/garden/api/v1_0/userFruitDetail', + headers: { + 'Host' : 'market.chuxingyouhui.com', + 'request-body' : encodeBody, + 'Accept' : 'application/json, text/plain, */*', + 'Accept-Language' : 'zh-CN,zh-Hans;q=0.9', + 'Accept-Encoding' : 'gzip, deflate, br', + 'token' : blackJSON['token'], + 'Content-Type' : 'application/json;charset=utf-8', + 'Origin' : 'https://m.black-unique.com', + 'User-Agent' : blackJSON['User-Agent'], + 'black-token' : blackJSON['black-token'], + 'Connection' : 'keep-alive', + }, + body: reqBody, + }; + $.post(url, async (err, resp, data) => { + try { + if (err) { + console.log("Fucntion " + caller + ": API请求失败"); + console.log(JSON.stringify(err)); + $.logErr(err); + } else { + if (safeGet(data)) { + let result = JSON.parse(data); + if(logDebug) console.log(result); + if(result.code == 200) { + console.log(`你现在种的水果是 ${result.data.fruitName} ${result.data.specification},${result.data.progressWord}`) + console.log(`今天已浇水${result.data.wateredTimes}次,剩余水滴数量:${result.data.remainAmount}`) + fruitId = result.data.fruitId + userFruitId = result.data.userFruitId + activityId = result.data.activityId + if(result.data.canReceiveStatus == 1 && result.data.canReceiveAmount > 0) { + await receiveWaterDrop('TOMORROW_REWARD','null','每日水滴') + } + if(result.data.gardenStageRewardResp && result.data.gardenStageRewardResp.status == 1) { + await fruitStageReward() + } + if(result.data.remainAmount >= 10) { + waterCount = 0 + console.log(`开始浇水,请等候......`) + await wateringFruit() + console.log(`浇水结束,本次共浇水${waterCount}次`) + } + } else { + console.log(`查询果园状态失败:${result.msg}`) + } + } + } + } catch (e) { + $.logErr(e, resp); + } finally { + resolve(); + } + }); + }); +} + +//果园水果进度奖励 +async function fruitStageReward() { + let caller = printCaller() + //rndtime = Math.round(new Date().getTime()/1000) + reqBody = `{"userFruitId":"${userFruitId}","appId":"${blackJSON['appId']}"}` + encodeBody = encodeURIComponent(reqBody) + return new Promise((resolve) => { + let url = { + url: 'https://market.chuxingyouhui.com/promo-bargain-api/garden/api/v1_0/receiveStageReward', + headers: { + 'Host' : 'market.chuxingyouhui.com', + 'request-body' : encodeBody, + 'Accept' : 'application/json, text/plain, */*', + 'Accept-Language' : 'zh-CN,zh-Hans;q=0.9', + 'Accept-Encoding' : 'gzip, deflate, br', + 'token' : blackJSON['token'], + 'Content-Type' : 'application/json;charset=utf-8', + 'Origin' : 'https://m.black-unique.com', + 'User-Agent' : blackJSON['User-Agent'], + 'black-token' : blackJSON['black-token'], + 'Connection' : 'keep-alive', + }, + body: reqBody, + }; + $.post(url, async (err, resp, data) => { + try { + if (err) { + console.log("Fucntion " + caller + ": API请求失败"); + console.log(JSON.stringify(err)); + $.logErr(err); + } else { + if (safeGet(data)) { + let result = JSON.parse(data); + if(logDebug) console.log(result); + if(result.code == 200) { + console.log(`领取水果进度奖励:${result.data.rewardNum}水滴`) + } else { + console.log(`领取水果进度奖励失败:${result.msg}`) + } + } + } + } catch (e) { + $.logErr(e, resp); + } finally { + resolve(); + } + }); + }); +} + +//果园浇水 +async function wateringFruit() { + let caller = printCaller() + //rndtime = Math.round(new Date().getTime()/1000) + reqBody = `{"userFruitId":"${userFruitId}"}` + encodeBody = encodeURIComponent(reqBody) + return new Promise((resolve) => { + let url = { + url: 'https://market.chuxingyouhui.com/promo-bargain-api/garden/api/v1_0/watering', + headers: { + 'Host' : 'market.chuxingyouhui.com', + 'request-body' : encodeBody, + 'Accept' : 'application/json, text/plain, */*', + 'Accept-Language' : 'zh-CN,zh-Hans;q=0.9', + 'Accept-Encoding' : 'gzip, deflate, br', + 'token' : blackJSON['token'], + 'Content-Type' : 'application/json;charset=utf-8', + 'Origin' : 'https://m.black-unique.com', + 'User-Agent' : blackJSON['User-Agent'], + 'black-token' : blackJSON['black-token'], + 'Connection' : 'keep-alive', + }, + body: reqBody, + }; + $.post(url, async (err, resp, data) => { + try { + if (err) { + console.log("Fucntion " + caller + ": API请求失败"); + console.log(JSON.stringify(err)); + $.logErr(err); + } else { + if (safeGet(data)) { + let result = JSON.parse(data); + if(logDebug) console.log(result); + if(result.code == 200) { + if(result.data.level && !result.data.remindType) { + if(result.data.upgrade == true) { + console.log(`果树升级到 ${result.data.level} 获得:${result.data.upgradeReward}水滴`) + } + waterCount++ + await $.wait(500) + await wateringFruit() + } + } else { + console.log(`浇水失败:${result.msg}`) + } + } + } + } catch (e) { + $.logErr(e, resp); + } finally { + resolve(); + } + }); + }); +} + +//果园水滴任务 +async function waterTaskList() { + let caller = printCaller() + //rndtime = Math.round(new Date().getTime()/1000) + reqBody = `{"activityId":"${activityId}","userFruitId":"${userFruitId}","clientType":1}` + encodeBody = encodeURIComponent(reqBody) + return new Promise((resolve) => { + let url = { + url: 'https://market.chuxingyouhui.com/promo-bargain-api/garden/api/v1_0/userTaskList', + headers: { + 'Host' : 'market.chuxingyouhui.com', + 'request-body' : encodeBody, + 'Accept' : 'application/json, text/plain, */*', + 'Accept-Language' : 'zh-CN,zh-Hans;q=0.9', + 'Accept-Encoding' : 'gzip, deflate, br', + 'token' : blackJSON['token'], + 'Content-Type' : 'application/json;charset=utf-8', + 'Origin' : 'https://m.black-unique.com', + 'User-Agent' : blackJSON['User-Agent'], + 'black-token' : blackJSON['black-token'], + 'Connection' : 'keep-alive', + }, + body: reqBody, + }; + $.post(url, async (err, resp, data) => { + try { + if (err) { + console.log("Fucntion " + caller + ": API请求失败"); + console.log(JSON.stringify(err)); + $.logErr(err); + } else { + if (safeGet(data)) { + let result = JSON.parse(data); + if(logDebug) console.log(result); + if(result.code == 200) { + if(result.data && result.data.taskList && Array.isArray(result.data.taskList)) { + for(let i=0; i -1 || + taskItem.taskType.indexOf('WATCH_VIDEO') > -1 || + taskItem.taskType.indexOf('APP_LOGIN') > -1) { + if(taskItem.status == 0) { + await doWaterTask(taskItem.taskType,taskItem.taskId,taskItem.title) + } else if(taskItem.status == 1) { + await receiveWaterDrop(taskItem.taskType,taskItem.userTaskId,taskItem.title) + } + } else if(taskItem.taskType.indexOf('EVERY_DAY_WATERING_REWARD') > -1 || + taskItem.taskType.indexOf('OPEN_CHEST') > -1) { + if(taskItem.status == 1) { + await receiveWaterDrop(taskItem.taskType,taskItem.userTaskId,taskItem.title) + } + } else { + if(taskItem.status == 0) { + await receiveWaterDrop(taskItem.taskType,taskItem.userTaskId,taskItem.title) + } + } + } + } + } else { + console.log(`获取果园水滴任务失败:${result.msg}`) + } + } + } + } catch (e) { + $.logErr(e, resp); + } finally { + resolve(); + } + }); + }); +} + +//果园-完成水滴任务 +async function doWaterTask(taskType,taskId,taskTitle) { + let caller = printCaller() + //rndtime = Math.round(new Date().getTime()) + reqBody = `{"userFruitId":"${userFruitId}","taskType":"${taskType}","taskId":"${taskId}"}` + encodeBody = encodeURIComponent(reqBody) + return new Promise((resolve) => { + let url = { + url: 'https://market.chuxingyouhui.com/promo-bargain-api/garden/api/v1_0/doTask', + headers: { + 'Host' : 'market.chuxingyouhui.com', + 'request-body' : encodeBody, + 'Accept' : 'application/json, text/plain, */*', + 'Accept-Language' : 'zh-CN,zh-Hans;q=0.9', + 'Accept-Encoding' : 'gzip, deflate, br', + 'token' : blackJSON['token'], + 'Content-Type' : 'application/json;charset=utf-8', + 'Origin' : 'https://m.black-unique.com', + 'User-Agent' : blackJSON['User-Agent'], + 'black-token' : blackJSON['black-token'], + 'Referer' : 'https://m.black-unique.com/', + 'Connection' : 'keep-alive', + }, + body: reqBody + }; + $.post(url, async (err, resp, data) => { + try { + if (err) { + console.log("Fucntion " + caller + ": API请求失败"); + console.log(JSON.stringify(err)); + $.logErr(err); + } else { + if (safeGet(data)) { + let result = JSON.parse(data); + if(logDebug) console.log(result); + if(result.code == 200) { + console.log(`完成水滴任务【${taskTitle}】成功`) + } else { + console.log(`完成水滴任务【${taskTitle}】失败:${result.msg}`) + } + await $.wait(1000) + } + } + } catch (e) { + $.logErr(e, resp); + } finally { + resolve(); + } + }); + }); +} + +//果园-领取水滴 +async function receiveWaterDrop(taskType,userTaskId,taskTitle) { + let caller = printCaller() + //rndtime = Math.round(new Date().getTime()) + reqBody = `{"userFruitId":"${userFruitId}","taskType":"${taskType}","userTaskId":${userTaskId}}` + encodeBody = encodeURIComponent(reqBody) + return new Promise((resolve) => { + let url = { + url: 'https://market.chuxingyouhui.com/promo-bargain-api/garden/api/v1_0/receiveWaterDrop', + headers: { + 'Host' : 'market.chuxingyouhui.com', + 'request-body' : encodeBody, + 'Accept' : 'application/json, text/plain, */*', + 'Accept-Language' : 'zh-CN,zh-Hans;q=0.9', + 'Accept-Encoding' : 'gzip, deflate, br', + 'token' : blackJSON['token'], + 'Content-Type' : 'application/json;charset=utf-8', + 'Origin' : 'https://m.black-unique.com', + 'User-Agent' : blackJSON['User-Agent'], + 'black-token' : blackJSON['black-token'], + 'Referer' : 'https://m.black-unique.com/', + 'Connection' : 'keep-alive', + }, + body: reqBody + }; + $.post(url, async (err, resp, data) => { + try { + if (err) { + console.log("Fucntion " + caller + ": API请求失败"); + console.log(JSON.stringify(err)); + $.logErr(err); + } else { + if (safeGet(data)) { + let result = JSON.parse(data); + if(logDebug) console.log(result); + if(result.code == 200) { + console.log(`领取水滴任务【${taskTitle}】奖励:${result.data.reward}水滴`) + } else { + console.log(`领取水滴任务【${taskTitle}】奖励失败:${result.msg}`) + } + await $.wait(1000) + } + } + } catch (e) { + $.logErr(e, resp); + } finally { + resolve(); + } + }); + }); +} + +//果园肥料任务 +async function nutrientTaskList() { + let caller = printCaller() + //rndtime = Math.round(new Date().getTime()/1000) + reqBody = `{"activityId":"${activityId}","userFruitId":"${userFruitId}"}` + encodeBody = encodeURIComponent(reqBody) + return new Promise((resolve) => { + let url = { + url: 'https://market.chuxingyouhui.com/promo-bargain-api/garden/api/v1_0/getUserNutrientTaskList', + headers: { + 'Host' : 'market.chuxingyouhui.com', + 'request-body' : encodeBody, + 'Accept' : 'application/json, text/plain, */*', + 'Accept-Language' : 'zh-CN,zh-Hans;q=0.9', + 'Accept-Encoding' : 'gzip, deflate, br', + 'token' : blackJSON['token'], + 'Content-Type' : 'application/json;charset=utf-8', + 'Origin' : 'https://m.black-unique.com', + 'User-Agent' : blackJSON['User-Agent'], + 'black-token' : blackJSON['black-token'], + 'Connection' : 'keep-alive', + }, + body: reqBody, + }; + $.post(url, async (err, resp, data) => { + try { + if (err) { + console.log("Fucntion " + caller + ": API请求失败"); + console.log(JSON.stringify(err)); + $.logErr(err); + } else { + if (safeGet(data)) { + let result = JSON.parse(data); + if(logDebug) console.log(result); + if(result.code == 200) { + if(result.data && result.data.gardenFertilizerTaskDtoList && Array.isArray(result.data.gardenFertilizerTaskDtoList)) { + for(let i=0; i { + let url = { + url: 'https://market.chuxingyouhui.com/promo-bargain-api/garden/api/v1_0/doTaskForNutrient', + headers: { + 'Host' : 'market.chuxingyouhui.com', + 'request-body' : encodeBody, + 'Accept' : 'application/json, text/plain, */*', + 'Accept-Language' : 'zh-CN,zh-Hans;q=0.9', + 'Accept-Encoding' : 'gzip, deflate, br', + 'token' : blackJSON['token'], + 'Content-Type' : 'application/json;charset=utf-8', + 'Origin' : 'https://m.black-unique.com', + 'User-Agent' : blackJSON['User-Agent'], + 'black-token' : blackJSON['black-token'], + 'Referer' : 'https://m.black-unique.com/', + 'Connection' : 'keep-alive', + }, + body: reqBody + }; + $.post(url, async (err, resp, data) => { + try { + if (err) { + console.log("Fucntion " + caller + ": API请求失败"); + console.log(JSON.stringify(err)); + $.logErr(err); + } else { + if (safeGet(data)) { + let result = JSON.parse(data); + if(logDebug) console.log(result); + if(result.code == 200) { + console.log(`完成肥料任务【${taskTitle}】成功`) + } else { + console.log(`完成肥料任务【${taskTitle}】失败:${result.msg}`) + } + await $.wait(1000) + } + } + } catch (e) { + $.logErr(e, resp); + } finally { + resolve(); + } + }); + }); +} + +//果园肥料状态 +async function userFertilizerDetail(taskType,taskId,taskTitle) { + let caller = printCaller() + //rndtime = Math.round(new Date().getTime()) + reqBody = `{"activityId":"${activityId}","userFruitId":"${userFruitId}"}` + encodeBody = encodeURIComponent(reqBody) + return new Promise((resolve) => { + let url = { + url: 'https://market.chuxingyouhui.com/promo-bargain-api/garden/api/v1_0/getUserFertilizerTool', + headers: { + 'Host' : 'market.chuxingyouhui.com', + 'request-body' : encodeBody, + 'Accept' : 'application/json, text/plain, */*', + 'Accept-Language' : 'zh-CN,zh-Hans;q=0.9', + 'Accept-Encoding' : 'gzip, deflate, br', + 'token' : blackJSON['token'], + 'Content-Type' : 'application/json;charset=utf-8', + 'Origin' : 'https://m.black-unique.com', + 'User-Agent' : blackJSON['User-Agent'], + 'black-token' : blackJSON['black-token'], + 'Referer' : 'https://m.black-unique.com/', + 'Connection' : 'keep-alive', + }, + body: reqBody + }; + $.post(url, async (err, resp, data) => { + try { + if (err) { + console.log("Fucntion " + caller + ": API请求失败"); + console.log(JSON.stringify(err)); + $.logErr(err); + } else { + if (safeGet(data)) { + let result = JSON.parse(data); + if(logDebug) console.log(result); + if(result.code == 200) { + fertilizerCount = 0 + if(result.data.userSmallFertilizerTool.remainNum > 0 || result.data.userFertilizerTool.remainNum > 0) { + for(let i=0; i { + let url = { + url: 'https://market.chuxingyouhui.com/promo-bargain-api/garden/api/v1_0/useFertilizer', + headers: { + 'Host' : 'market.chuxingyouhui.com', + 'request-body' : encodeBody, + 'Accept' : 'application/json, text/plain, */*', + 'Accept-Language' : 'zh-CN,zh-Hans;q=0.9', + 'Accept-Encoding' : 'gzip, deflate, br', + 'token' : blackJSON['token'], + 'Content-Type' : 'application/json;charset=utf-8', + 'Origin' : 'https://m.black-unique.com', + 'User-Agent' : blackJSON['User-Agent'], + 'black-token' : blackJSON['black-token'], + 'Referer' : 'https://m.black-unique.com/', + 'Connection' : 'keep-alive', + }, + body: reqBody + }; + $.post(url, async (err, resp, data) => { + try { + if (err) { + console.log("Fucntion " + caller + ": API请求失败"); + console.log(JSON.stringify(err)); + $.logErr(err); + } else { + if (safeGet(data)) { + let result = JSON.parse(data); + if(logDebug) console.log(result); + if(result.code == 200) { + //施肥成功 + } else { + console.log(`施肥失败:${result.msg}`) + } + await $.wait(500) + } + } + } catch (e) { + $.logErr(e, resp); + } finally { + resolve(); + } + }); + }); +} + +//果园-摇树得优惠券 +async function getTreeCoupon() { + console.log(`\n开始摇树${clickTreeTimes}次得优惠券`) + for(let i=0; i { + let url = { + url: 'https://market.chuxingyouhui.com/promo-bargain-api/garden/api/v1_0/clickTree', + headers: { + 'Host' : 'market.chuxingyouhui.com', + 'request-body' : encodeBody, + 'Accept' : 'application/json, text/plain, */*', + 'Accept-Language' : 'zh-CN,zh-Hans;q=0.9', + 'Accept-Encoding' : 'gzip, deflate, br', + 'token' : blackJSON['token'], + 'Content-Type' : 'application/json;charset=utf-8', + 'Origin' : 'https://m.black-unique.com', + 'User-Agent' : blackJSON['User-Agent'], + 'black-token' : blackJSON['black-token'], + 'Referer' : 'https://m.black-unique.com/', + 'Connection' : 'keep-alive', + }, + body: reqBody + }; + $.post(url, async (err, resp, data) => { + try { + if (err) { + console.log("Fucntion " + caller + ": API请求失败"); + console.log(JSON.stringify(err)); + $.logErr(err); + } else { + if (safeGet(data)) { + let result = JSON.parse(data); + if(logDebug) console.log(result); + if(result.code == 200) { + await $.wait(1000) + if(result.data.hasReward == true) { + await receiveReward(result.data.rewardId,result.data.rewardName,result.data.rewardInfo) + } + } else { + console.log(`果园点击树失败:${result.msg}`) + } + await $.wait(500) + } + } + } catch (e) { + $.logErr(e, resp); + } finally { + resolve(); + } + }); + }); +} + +//果园-获得树干奖励 +async function receiveReward(rewardId,rewardName,rewardInfo) { + let caller = printCaller() + //rndtime = Math.round(new Date().getTime()) + reqBody = `{"rewardId":"${rewardId}","userFruitId":"${userFruitId}","appId":"${blackJSON['appId']}"}` + encodeBody = encodeURIComponent(reqBody) + return new Promise((resolve) => { + let url = { + url: 'https://market.chuxingyouhui.com/promo-bargain-api/garden/api/v1_0/receiveReward', + headers: { + 'Host' : 'market.chuxingyouhui.com', + 'request-body' : encodeBody, + 'Accept' : 'application/json, text/plain, */*', + 'Accept-Language' : 'zh-CN,zh-Hans;q=0.9', + 'Accept-Encoding' : 'gzip, deflate, br', + 'token' : blackJSON['token'], + 'Content-Type' : 'application/json;charset=utf-8', + 'Origin' : 'https://m.black-unique.com', + 'User-Agent' : blackJSON['User-Agent'], + 'black-token' : blackJSON['black-token'], + 'Referer' : 'https://m.black-unique.com/', + 'Connection' : 'keep-alive', + }, + body: reqBody + }; + $.post(url, async (err, resp, data) => { + try { + if (err) { + console.log("Fucntion " + caller + ": API请求失败"); + console.log(JSON.stringify(err)); + $.logErr(err); + } else { + if (safeGet(data)) { + let result = JSON.parse(data); + if(logDebug) console.log(result); + if(result.code == 200) { + console.log(`获得优惠券:${rewardName} -- ${rewardInfo}`) + } else { + console.log(`获取优惠券失败:${result.msg}`) + } + await $.wait(1000) + } + } + } catch (e) { + $.logErr(e, resp); + } finally { + resolve(); + } + }); + }); +} + +//查询账户信息 +async function userInfo() { + console.log(`\n========= 账户信息 =========`) + notifyStr += `========= 账户信息 =========\n` + await userRebateInfo() + await userTopInfo() +} + +//查询现金余额 +async function userRebateInfo() { + let caller = printCaller() + //rndtime = Math.round(new Date().getTime()) + return new Promise((resolve) => { + let url = { + url: 'https://pyp-api.chuxingyouhui.com/api/app/userCenter/v1/info', + headers: { + 'Host' : 'pyp-api.chuxingyouhui.com', + 'Accept' : '*/*', + 'phpUserId' : blackJSON['phpUserId'], + 'device-value' : blackJSON['device-value'], + 'device-type' : blackJSON['device-type'], + 'Accept-Language' : 'zh-Hans-CN;q=1', + 'token' : blackJSON['token'], + 'User-Agent' : blackJSON['User-Agent'], + 'black-token' : blackJSON['black-token'], + 'Accept-Encoding' : 'gzip, deflate, br', + 'Connection' : 'keep-alive', + }, + }; + $.get(url, async (err, resp, data) => { + try { + if (err) { + console.log("Fucntion " + caller + ": API请求失败"); + console.log(JSON.stringify(err)); + $.logErr(err); + } else { + if (safeGet(data)) { + let result = JSON.parse(data); + if(logDebug) console.log(result); + if(result.code == 200) { + console.log(`【现金余额】:${result.data.currencyBlanceResp.commission}`) + notifyStr += `【现金余额】:${result.data.currencyBlanceResp.commission}\n` + } else { + console.log(`查询现金余额失败:${result.msg}`) + notifyStr += `查询现金余额失败:${result.msg}\n` + } + await $.wait(200) + } + } + } catch (e) { + $.logErr(e, resp); + } finally { + resolve(); + } + }); + }); +} + +//查询勋章余额 +async function userTopInfo() { + let caller = printCaller() + //rndtime = Math.round(new Date().getTime()) + return new Promise((resolve) => { + let url = { + url: 'https://market.chuxingyouhui.com/promo-bargain-api/activity/mqq/api/indexTopInfo?appId='+blackJSON['appId'], + headers: { + 'Host' : 'market.chuxingyouhui.com', + 'Origin' : 'https://m.black-unique.com', + 'Accept-Encoding' : 'gzip, deflate, br', + 'Connection' : 'keep-alive', + 'black-token' : blackJSON['black-token'], + 'Accept' : 'application/json, text/plain, */*', + 'User-Agent' : blackJSON['User-Agent'], + 'Referer' : 'https://m.black-unique.com/', + 'token' : blackJSON['token'], + 'Accept-Language' : 'zh-CN,zh-Hans;q=0.9', + }, + }; + $.get(url, async (err, resp, data) => { + try { + if (err) { + console.log("Fucntion " + caller + ": API请求失败"); + console.log(JSON.stringify(err)); + $.logErr(err); + } else { + if (safeGet(data)) { + let result = JSON.parse(data); + if(logDebug) console.log(result); + if(result.code == 200) { + console.log(`【勋章余额】:${result.data.score}`) + notifyStr += `【勋章余额】:${result.data.score}\n` + } else { + console.log(`查询勋章余额失败:${result.msg}`) + notifyStr += `查询勋章余额失败:${result.msg}\n` + } + await $.wait(200) + } + } + } catch (e) { + $.logErr(e, resp); + } finally { + resolve(); + } + }); + }); +} + //////////////////////////////////////////////////////////////////// function safeGet(data) { try { From fdeb5285959564fbafa3d3ddb11764cd4d3f063d Mon Sep 17 00:00:00 2001 From: Leaf <444653703@qq.com> Date: Wed, 17 Nov 2021 15:38:55 +0800 Subject: [PATCH 11/35] =?UTF-8?q?=E6=B5=8B=E8=AF=95=E7=94=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- jctq/jctq_rewrite_subscribe_tmp.json | 106 +++++++++++++++++++++++++++ 1 file changed, 106 insertions(+) create mode 100644 jctq/jctq_rewrite_subscribe_tmp.json diff --git a/jctq/jctq_rewrite_subscribe_tmp.json b/jctq/jctq_rewrite_subscribe_tmp.json new file mode 100644 index 0000000..513ddb7 --- /dev/null +++ b/jctq/jctq_rewrite_subscribe_tmp.json @@ -0,0 +1,106 @@ +{ + "name": "晶彩天气重写订阅", + "type": "rewrite", + "note": "仅供参考", + "author": "leaf", + "resource": "jctq_rewrite_subscribe.json", + "mitmhost": [ + "tq.xunsl.com" + ], + "rewrite": [ + { + "match": "https://tq.xunsl.com/v17/NewTask/getTaskListByWeather.json", + "target": "jctq_rewrite.js", + "enable": false + }, + { + "match": "https://tq.xunsl.com/v5/CommonReward/toGetReward.json", + "target": "jctq_rewrite.js", + "enable": false + }, + { + "match": "https://tq.xunsl.com/v5/article/info.json", + "target": "jctq_rewrite.js", + "enable": false + }, + { + "match": "https://tq.xunsl.com/v5/article/detail.json", + "target": "jctq_rewrite.js", + "enable": true + }, + { + "match": "https://tq.xunsl.com/v5/user/stay.json", + "target": "jctq_rewrite.js", + "enable": false + }, + { + "match": "https://tq.xunsl.com/v5/nameless/adlickstart.json", + "target": "jctq_rewrite.js", + "enable": true + }, + { + "match": "https://tq.xunsl.com/v5/wechat/withdraw2.json", + "target": "jctq_rewrite.js", + "enable": true + }, + { + "match": "https://tq.xunsl.com/v5/Weather/giveBoxOnWeather.json", + "target": "jctq_rewrite.js", + "enable": false + }, + { + "match": "https://tq.xunsl.com/v5/weather/giveTimeInterval.json", + "target": "jctq_rewrite.js", + "enable": true + } + ], + "task": { + "type": "skip", + "list": [ + { + "id": "nlaVhTOS", + "name": "晶彩天气看看赚", + "type": "cron", + "time": "53 8,20 * * *", + "job": { + "type": "runjs", + "target": "jctq_kkz.js" + }, + "running": true + }, + { + "id": "fc9bqL6D", + "name": "晶彩天气文章视频", + "type": "cron", + "time": "45 7,19 * * *", + "job": { + "type": "runjs", + "target": "jctq_read.js" + }, + "running": true + }, + { + "id": "HXTBby7X", + "name": "晶彩天气日常任务", + "type": "cron", + "time": "12,42 * * * *", + "job": { + "type": "runjs", + "target": "jctq_daily.js" + }, + "running": true + }, + { + "id": "LiXAgyRF", + "name": "晶彩天气任务签到", + "type": "cron", + "time": "35 22 * * *", + "job": { + "type": "runjs", + "target": "jctq_reward.js" + }, + "running": true + } + ] + } +} \ No newline at end of file From f865e20ae324ccc8f7914c7fe19c0ee099d1c516 Mon Sep 17 00:00:00 2001 From: Leaf <444653703@qq.com> Date: Wed, 17 Nov 2021 16:08:58 +0800 Subject: [PATCH 12/35] =?UTF-8?q?=E5=88=A0=E9=99=A4=E6=97=A7=E6=99=B6?= =?UTF-8?q?=E5=BD=A9=E5=A4=A9=E6=B0=94=E8=84=9A=E6=9C=AC=EF=BC=8C=E6=B7=BB?= =?UTF-8?q?=E5=8A=A0=E6=96=B0=E8=84=9A=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- jctq/jctq_Adv_video.js | 91 ----- jctq/jctq_Rotary.js | 137 ------- jctq/jctq_daily.js | 581 +++++++++++++++++++++++++++ jctq/jctq_friendSign.js | 125 ------ jctq/jctq_kkz.js | 359 +++++++++++++++++ jctq/jctq_read.js | 258 ++++++++++++ jctq/jctq_reward.js | 306 ++++++++++++++ jctq/jctq_rewrite.js | 189 +++++++++ jctq/jctq_rewrite_subscribe.json | 147 ------- jctq/jctq_rewrite_subscribe_tmp.json | 106 ----- jctq/jctq_share.js | 199 --------- jctq/jctq_task_subscribe.json | 98 ----- jctq/jctq_today_score.js | 134 ------ jctq/jctq_withdraw.js | 206 ---------- jctq/jctqbox.js | 108 ----- jctq/jctqkkz.js | 271 ------------- jctq/jctqqd.js | 118 ------ jctq/jctqwz.js | 229 ----------- 18 files changed, 1693 insertions(+), 1969 deletions(-) delete mode 100644 jctq/jctq_Adv_video.js delete mode 100644 jctq/jctq_Rotary.js create mode 100644 jctq/jctq_daily.js delete mode 100644 jctq/jctq_friendSign.js create mode 100644 jctq/jctq_kkz.js create mode 100644 jctq/jctq_read.js create mode 100644 jctq/jctq_reward.js create mode 100644 jctq/jctq_rewrite.js delete mode 100644 jctq/jctq_rewrite_subscribe.json delete mode 100644 jctq/jctq_rewrite_subscribe_tmp.json delete mode 100644 jctq/jctq_share.js delete mode 100644 jctq/jctq_task_subscribe.json delete mode 100644 jctq/jctq_today_score.js delete mode 100644 jctq/jctq_withdraw.js delete mode 100644 jctq/jctqbox.js delete mode 100644 jctq/jctqkkz.js delete mode 100644 jctq/jctqqd.js delete mode 100644 jctq/jctqwz.js diff --git a/jctq/jctq_Adv_video.js b/jctq/jctq_Adv_video.js deleted file mode 100644 index 671b3fd..0000000 --- a/jctq/jctq_Adv_video.js +++ /dev/null @@ -1,91 +0,0 @@ -const $ = new Env("晶彩天气福利视频"); -const notify = $.isNode() ? require('./sendNotify') : ''; -message = "" -let jctqCookie= $.isNode() ? (process.env.jctqCookie ? process.env.jctqCookie : "") : ($.getdata('jctqCookie') ? $.getdata('jctqCookie') : "") -let jctqCookieArr = [] -let jctqCookies = "" - -if (!jctqCookie) { - $.msg($.name, '【提示】进入点击右下角"赚钱图标",再跑一次脚本', '不知道说啥好', { - "open-url": "给您劈个叉吧" - }); - $.done() - } - else if (jctqCookie.indexOf("@") == -1 && jctqCookie.indexOf("@") == -1) { - jctqCookieArr.push(jctqCookie) - } - else if (jctqCookie.indexOf("@") > -1) { - jctqCookies = jctqCookie.split("@") - } - else if (process.env.jctqCookie && process.env.jctqCookie.indexOf('@') > -1) { - jctqCookieArr = process.env.jctqCookie.split('@'); - console.log(`您选择的是用"@"隔开\n`) - } - else { - jctqCookies = [process.env.jctqCookie] - }; - Object.keys(jctqCookies).forEach((item) => { - if (jctqCookies[item]) { - jctqCookieArr.push(jctqCookies[item]) - } - }) - - - - -!(async () => { - console.log(`共${jctqCookieArr.length}个cookie`) - for (let k = 0; k < jctqCookieArr.length; k++) { - $.message = "" - bodyVal = jctqCookieArr[k] - var time1 = Date.parse( new Date() ).toString(); - time1 = time1.substr(0,10); - jctqCookie1= time1 + '&' + bodyVal - //待处理cookie - console.log(`${jctqCookie1}`) - console.log(`--------第 ${k + 1} 个账号观看福利视频中--------\n`) - for (let j =0; j<5;j++){ - console.log(`--------第 ${j + 1} 次观看福利视频中--------\n`) - await video(jctqCookie1) - console.log("等待30秒") - await $.wait(30000); - console.log("\n\n") - } - console.log("\n\n") - } - - })() - .catch((e) => $.logErr(e)) - .finally(() => $.done()) - - -function video(jctqCookie1,timeout = 0) { - return new Promise((resolve) => { - - let url = { - url : 'https://tq.xunsl.com/V17/NewTask/recordNum.json?'+ jctqCookie1, - headers : { - 'Host': 'tq.xunsl.com', - 'Connection': 'Keep-Alive', - 'Accept-Encoding': 'gzip', - 'User-Agent': 'okhttp/3.12.2' -}, - } - $.get(url, async (err, resp, data) => { - try { - const result = JSON.parse(data) - if(result.success === true){ - console.log('\n福利视频:'+result.message) - }else{ - console.log(result) - } - } catch (e) { - } finally { - resolve() - } - },timeout) - }) -} - -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("",`\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)})}}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)} - diff --git a/jctq/jctq_Rotary.js b/jctq/jctq_Rotary.js deleted file mode 100644 index c5a84ac..0000000 --- a/jctq/jctq_Rotary.js +++ /dev/null @@ -1,137 +0,0 @@ -const $ = new Env("晶彩天气大转盘抽奖"); -const notify = $.isNode() ? require('./sendNotify') : ''; -message = "" -let jctqCookie= $.isNode() ? (process.env.jctqCookie ? process.env.jctqCookie : "") : ($.getdata('jctqCookie') ? $.getdata('jctqCookie') : "") -let jctqCookieArr = [] -let jctqCookies = "" -let remain =100 -var time = Date.parse( new Date() ).toString(); -var time1 = time.substr(0,10); - -if (!jctqCookie) { - $.msg($.name, '【提示】进入点击右下角"赚钱图标",获取cookie,再跑一次脚本', '不知道说啥好', { - "open-url": "给您劈个叉吧" - }); - $.done() - } - else if (jctqCookie.indexOf("@") == -1 && jctqCookie.indexOf("@") == -1) { - jctqCookieArr.push(jctqCookie) - } - else if (jctqCookie.indexOf("@") > -1) { - jctqCookies = jctqCookie.split("@") - } - else if (process.env.jctqCookie && process.env.jctqCookie.indexOf('@') > -1) { - jctqCookieArr = process.env.jctqCookie.split('@'); - console.log(`您选择的是用"@"隔开\n`) - } - else { - jctqCookies = [process.env.jctqCookie] - }; - Object.keys(jctqCookies).forEach((item) => { - if (jctqCookies[item]) { - jctqCookieArr.push(jctqCookies[item]) - } - }) - - - -!(async () => { - console.log(`共${jctqCookieArr.length}个cookie`) - for (let k = 0; k < jctqCookieArr.length; k++) { - $.message = "" - bodyVal = jctqCookieArr[k].split('&uid=')[0]; - cookie = bodyVal.replace(/zqkey=/, "cookie=") - cookie_id = cookie.replace(/zqkey_id=/, "cookie_id=") - jctqCookie1= cookie_id + '&request_time=' + time1 + '&time=' + time1 +'&'+ bodyVal - //待处理cookie - //console.log(`${jctqCookie1}`) - console.log(`--------第 ${k + 1} 个账号转盘抽奖中--------\n`) - - console.log("\n\n") - - for(let k = 0 ; k < 100 ; k++){ - await Rotary(jctqCookie1,cookie_id,time) - await $.wait(6000); - console.log("\n\n") - } - for (let k = 1 ; k < 5 ; k++){ - id = k.toString() - await openbox(jctqCookie1,cookie_id,time,id) - await $.wait(15000) - } - console.log("\n\n") - } - })() - .catch((e) => $.logErr(e)) - .finally(() => $.done()) -//抽奖 -function Rotary(jctqCookie1,cookie_id,time) { - return new Promise((resolve, reject) => { - let url = { - url : 'https://tq.xunsl.com/WebApi/RotaryTable/turnRotary?_='+time, - headers : {'Host': 'tq.xunsl.com', - 'Referer':'https://tq.xunsl.com/html/rotaryTable/index.html?'+jctqCookie1 - }, - body:cookie_id, - } - $.post(url, async (err, resp, data) => { - try { - const result = JSON.parse(data) - if(result.status === 1 ){ - if(result.data.score !== 0){ - console.log('好家伙!你抽中了'+result.data.score + '金币') - - //console.log('剩'+remain+'次') - }else { - console.log('你抽了个寂寞') - } - - }else{ - console.log('\n抽奖失败,别问我,我也不知道为啥') - } - } catch (e) { - $.logErr(e+resp); - } finally { - resolve() - } - }) - }) -} - -function openbox(jctqCookie1,cookie_id,time,k,timeout = 0) { - return new Promise((resolve) => { - let url = { - url : 'https://tq.xunsl.com/WebApi/RotaryTable/chestReward?_='+ time, - headers : {'Host': 'tq.xunsl.com', - 'User-Agent': '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/65.0.3325.109 Mobile Safari/537.36', - 'Content-Type': 'application/x-www-form-urlencoded', - 'Accept-Language': 'zh-CN,en-US;q=0.9', - 'Accept-Encoding': 'gzip, deflate', - 'Content-Length': (cookie_id +'&num='+k).length.toString(), - 'Referer':'https://tq.xunsl.com/html/rotaryTable/index.html?'+jctqCookie1 - }, - body:cookie_id + '&num=' + k, - } - $.post(url, async (err, resp, data) => { - try { - const result = JSON.parse(data) - if(result.status === 1 ){ - if(result.data.score !== 0){ - console.log('宝箱获得:'+result.data.score + '金币') - - }else { - console.log('宝箱打开失败') - } - }else{ - console.log('\n宝箱请求失败') - - } - } catch (e) { - } finally { - resolve() - } - },timeout) - }) -} - -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("",`\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)})}}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)} diff --git a/jctq/jctq_daily.js b/jctq/jctq_daily.js new file mode 100644 index 0000000..b22a9c0 --- /dev/null +++ b/jctq/jctq_daily.js @@ -0,0 +1,581 @@ +/* +安卓:晶彩天气(v8.3.7) + +此脚本负责: +领转发页定时宝箱,领福利页定时宝箱,领首页气泡红包,时段转发,刷福利视频,抽奖5次 +*/ + +const jsname = '晶彩天气日常' +const $ = Env(jsname) +const notifyFlag = 1; //0为关闭通知,1为打开通知,默认为1 +const logDebug = 0 + +//const notify = $.isNode() ? require('./sendNotify') : ''; +let notifyStr = '' + +let rndtime = "" //毫秒 +let httpResult //global buffer + +let jctqCookie = ($.isNode() ? process.env.jctqCookie : $.getdata('jctqCookie')) || ''; +let jctqBubbleBody = ($.isNode() ? process.env.jctqBubbleBody : $.getdata('jctqBubbleBody')) || ''; +let jctqGiveBoxBody = ($.isNode() ? process.env.jctqGiveBoxBody : $.getdata('jctqGiveBoxBody')) || ''; + +let jctqBubbleBodyArr = [] +let jctqGiveBoxBodyArr = [] + +let refHotShare = 'http://tq.xunsl.com/h5/hotShare/?' +let refRotory = 'https://tq.xunsl.com/html/rotaryTable/index.html?keyword_wyq=woyaoq.com&' + + +/////////////////////////////////////////////////////////////////// + +!(async () => { + + if(typeof $request !== "undefined") + { + $.msg(jsname+': 此脚本不做重写,请检查重写设置') + } + else + { + await checkEnv() + + await queryShareStatus() + await $.wait(1000) + + await queryGiveBoxStatus() + await $.wait(1000) + + await queryBubbleStatus() + await $.wait(1000) + + await getTaskListByWeather() + await $.wait(1000) + + await queryRotaryTable() + await $.wait(1000) + } + + +})() +.catch((e) => $.logErr(e)) +.finally(() => $.done()) + +//通知 +async function showmsg() { + + notifyBody = jsname + "运行通知\n\n" + notifyStr + + if (notifyFlag != 1) { + console.log(notifyBody); + } + + if (notifyFlag == 1) { + $.msg(notifyBody); + //if ($.isNode()){await notify.sendNotify($.name, notifyBody );} + } +} + +async function checkEnv() { + + if(jctqCookie) { + if(jctqCookie.indexOf('@') > -1) { + jctqCookies = jctqCookie.split('@') + jctqCookie = jctqCookies[0] + console.log('检测到多于一个jctqCookie,开始跑第一个账户。请注意本脚本只支持单账户,如需多账户请自行修改。') + } + if(jctqCookie.indexOf('cookie=') == -1 && jctqCookie.indexOf('zqkey=') > -1) { + jctqCookie = jctqCookie.replace(/zqkey=/, "cookie=") + } + if(jctqCookie.indexOf('cookie_id=') == -1 && jctqCookie.indexOf('zqkey_id=') > -1) { + jctqCookie = jctqCookie.replace(/zqkey_id=/, "cookie_id=") + } + if(jctqCookie.indexOf('app_version=') == -1) { + jctqCookie = 'app_version=8.3.7&' + jctqCookie + } + } + + if(jctqBubbleBody) { + if(jctqBubbleBody.indexOf('&') > -1) { + let jctqBubbleBodyArrs = jctqBubbleBody.split('&') + for(let i=0; i -1) { + let jctqGiveBoxBodyArrs = jctqGiveBoxBody.split('&') + for(let i=0; i=5 && currentHour<10) { + action = 'beread_extra_reward_one' + } else if(currentHour>=11 && currentHour<16) { + action = 'beread_extra_reward_two' + } else if(currentHour>=17 && currentHour<22) { + action = 'beread_extra_reward_three' + } + + if(result.code == 200) { + if(result.data && result.data.taskList && Array.isArray(result.data.taskList)) { + let taskList = result.data.taskList + for(let i=0; i -1) { + if(taskItem.status == 1) { + console.log(`\n转发页面定时宝箱可领取`) + await $.wait(1000) + await getRewardShareBox() + } else { + let cdTime = taskItem.total_time - taskItem.countdown + console.log(`\n转发页面定时宝箱冷却时间:${cdTime}秒`) + if(cdTime < 90) { + let waitTime = cdTime+1 + console.log(`\n等待${waitTime}秒后尝试领取`) + await $.wait(waitTime*1000) + await queryShareStatus() + } + } + } + if(action && taskItem.action.indexOf(action) > -1) { + if(taskItem.status == 0) { + console.log(`\n开始做${taskItem.name}转发任务`) + await $.wait(1000) + await listsNewTag() + await $.wait(1000) + await execExtractTask(taskItem.action,taskItem.name) + } else { + console.log(`\n${taskItem.name}转发已完成`) + } + } + } + } + } else { + console.log(`\n转发页面查询失败:${result.msg}`) + } +} + +//转发页面红包领取 -- 30分钟一次 +async function getRewardShareBox() { + let caller = printCaller() + let url = 'http://tq.xunsl.com/WebApi/TimePacket/getReward' + let urlObject = populatePostUrl(url,refHotShare,jctqCookie) + await httpPost(urlObject,caller) + let result = httpResult; + if(!result) return + + if(result.code == 1) { + console.log(`领取转发页面定时宝箱成功:获得${result.data.score}金币`) + } else { + console.log(`领取转发页面定时宝箱失败:${result.msg}`) + } +} + +//转发页面列表 +async function listsNewTag() { + let caller = printCaller() + let url = 'http://tq.xunsl.com/WebApi/ArticleTop/listsNewTag' + let urlObject = populatePostUrl(url,refHotShare,jctqCookie) + await httpPost(urlObject,caller) + let result = httpResult; + if(!result) return + + if(result.status == 1) { + if(result.data && result.data.items && Array.isArray(result.data.items)) { + let shareIdx = Math.floor(Math.random()*result.data.items.length) + let newsItem = result.data.items[shareIdx] + await $.wait(1000) + await getShareArticleReward(newsItem.id) + } + } else { + console.log(`查询转发页面列表失败:${result.msg}`) + } +} + +//转发文章 +async function getShareArticleReward(articleId) { + let caller = printCaller() + let url = 'http://tq.xunsl.com/WebApi/ShareNew/getShareArticleReward' + let reqBody = jctqCookie + '&article_id=' + articleId + let urlObject = populatePostUrl(url,refHotShare,reqBody) + await httpPost(urlObject,caller) + let result = httpResult; + if(!result) return + + if(result.status == 1) { + if(result.data.share == 1) { + console.log(`转发文章成功`) + } + } else { + console.log(`转发文章失败:${result.msg}`) + } +} + +//转发时段奖励 +async function execExtractTask(action,name) { + let caller = printCaller() + let url = 'http://tq.xunsl.com/WebApi/ShareNew/execExtractTask' + let reqBody = jctqCookie + '&action=' + action + let urlObject = populatePostUrl(url,refHotShare,reqBody) + await httpPost(urlObject,caller) + let result = httpResult; + if(!result) return + + if(result.code == 200) { + console.log(`领取${name}转发奖励成功`) + } else { + console.log(`领取${name}转发奖励失败:${result.msg}`) + } +} + +//首页气泡红包查询 +async function queryBubbleStatus() { + let caller = printCaller() + let url = 'https://tq.xunsl.com/v17/weather/index.json?' + jctqCookie + let urlObject = populateGetUrl(url,refHotShare) + await httpGet(urlObject,caller) + let result = httpResult; + if(!result) return + + if(result.success == true) { + let numBody = jctqBubbleBodyArr.length + if(numBody > 0) { + if(result.items && result.items.bubble && Array.isArray(result.items.bubble)) { + let bubbleList = result.items.bubble + let numBubble = bubbleList.length + console.log(`\n共有${numBubble}个气泡红包可以领取,找到${numBody}个气泡和翻倍body,开始尝试领取`) + for(let i=0; i 1) { + if(result.items.status == 1) { + console.log(`\n福利页面定时宝箱可领取,找到${numBody}个宝箱body,开始尝试领取`) + for(let i=0; i 5 ? 5 : result.data.remainTurn + if(numTurn > 0) { + for(let i=0; i= boxItem.times) { + randomTime = Math.floor(Math.random()*5000)+30000 + console.log(`随机延迟 ${randomTime}ms 看视频开抽奖宝箱`) + await $.wait(randomTime) + await chestReward(i+1) + } + } + } + } else { + console.log(`抽奖次数查询失败:${result.msg}`) + } +} + +//抽奖宝箱 +async function chestReward(idx) { + rndtime = Math.floor(new Date().getTime()) + let caller = printCaller() + let url = 'https://tq.xunsl.com/WebApi/RotaryTable/chestReward?_='+rndtime + let reqBody = jctqCookie + '&num=' + idx + let urlObject = populatePostUrl(url,refRotory,reqBody) + await httpPost(urlObject,caller) + let result = httpResult; + if(!result) return + + if(result.status == 1) { + console.log(`开抽奖第${idx}个宝箱获得${result.data.score}金币`) + } else { + console.log(`开抽奖宝箱失败:${result.msg}`) + } +} + +//抽奖 +async function turnRotary() { + rndtime = Math.floor(new Date().getTime()) + let caller = printCaller() + let url = 'https://tq.xunsl.com/WebApi/RotaryTable/turnRotary?_='+rndtime + let urlObject = populatePostUrl(url,refRotory,jctqCookie) + await httpPost(urlObject,caller) + let result = httpResult; + if(!result) return + + if(result.status == 1) { + console.log(`抽奖获得${result.data.score}金币,剩余抽奖次数${result.data.remainTurn}`) + } else { + console.log(`抽奖失败:${result.msg}`) + } +} + +//查询日常任务进度 +async function getTaskListByWeather() { + let caller = printCaller() + let url = 'https://tq.xunsl.com/v17/NewTask/getTaskListByWeather.json?' + jctqCookie + let urlObject = populateGetUrl(url,refHotShare) + await httpGet(urlObject,caller) + let result = httpResult; + if(!result) return + + if(result.success == true) { + if(Array.isArray(result.items.daily)) { + for(let i=0; i { + $.post(url, async (err, resp, data) => { + try { + if (err) { + console.log(caller + ": post请求失败"); + console.log(JSON.stringify(err)); + $.logErr(err); + } else { + if (safeGet(data)) { + httpResult = JSON.parse(data,caller); + if(logDebug) console.log(httpResult); + } + } + } catch (e) { + $.logErr(e, resp); + } finally { + resolve(); + } + }); + }); +} + +async function httpGet(url,caller) { + httpResult = null + return new Promise((resolve) => { + $.get(url, async (err, resp, data) => { + try { + if (err) { + console.log(caller + ": get请求失败"); + console.log(JSON.stringify(err)); + $.logErr(err); + } else { + if (safeGet(data,caller)) { + httpResult = JSON.parse(data); + if(logDebug) console.log(httpResult); + } + } + } catch (e) { + $.logErr(e, resp); + } finally { + resolve(); + } + }); + }); +} + +function safeGet(data,caller) { + try { + if (typeof JSON.parse(data) == "object") { + return true; + } else { + console.log(`Function ${caller}: 未知错误`); + console.log(data) + } + } catch (e) { + console.log(e); + console.log(`Function ${caller}: 服务器访问数据为空,请检查自身设备网络情况`); + return false; + } +} + +function printCaller(){ + return (new Error()).stack.split("\n")[2].trim().split(" ")[1] +} + +function Env(t, e) { 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("", `\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) }) } } 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) } diff --git a/jctq/jctq_friendSign.js b/jctq/jctq_friendSign.js deleted file mode 100644 index 598ddcf..0000000 --- a/jctq/jctq_friendSign.js +++ /dev/null @@ -1,125 +0,0 @@ -const $ = new Env("晶彩天气好友签到红包"); -const notify = $.isNode() ? require('./sendNotify') : ''; -message = "" -let jctqCookie= $.isNode() ? (process.env.jctqCookie ? process.env.jctqCookie : "") : ($.getdata('jctqCookie') ? $.getdata('jctqCookie') : "") -let jctqCookieArr = [] -let jctqCookies = "" - - if (typeof $request !== "undefined") { - getjctqCookie() - $.done() - } - - -if (!jctqCookie) { - $.msg($.name, '【提示】进入点击右下角"赚钱图标",再跑一次脚本', '不知道说啥好', { - "open-url": "给您劈个叉吧" - }); - $.done() - } - else if (jctqCookie.indexOf("@") == -1 && jctqCookie.indexOf("@") == -1) { - jctqCookieArr.push(jctqCookie) - } - else if (jctqCookie.indexOf("@") > -1) { - jctqCookies = jctqCookie.split("@") - } - else if (process.env.jctqCookie && process.env.jctqCookie.indexOf('@') > -1) { - jctqCookieArr = process.env.jctqCookie.split('@'); - console.log(`您选择的是用"@"隔开\n`) - } - else { - jctqCookies = [process.env.jctqCookie] - }; - Object.keys(jctqCookies).forEach((item) => { - if (jctqCookies[item]) { - jctqCookieArr.push(jctqCookies[item]) - } - }) - -!(async () => { - console.log(`共${jctqCookieArr.length}个cookie`) - for (let k = 0; k < jctqCookieArr.length; k++) { - $.message = "" - bodyVal = jctqCookieArr[k].split('&uid=')[0]; - cookie = bodyVal.replace(/zqkey=/, "cookie=") - cookie_id = cookie.replace(/zqkey_id=/, "cookie_id=") - var time1 = Date.parse( new Date() ).toString(); - time1 = time1.substr(0,10); - jctqCookie1= cookie_id + '&request_time=' + time1 + '&time=' + time1 +'&'+ bodyVal - //待处理cookie - //console.log(`${jctqCookie1}`) - console.log(`--------第 ${k + 1} 个账号好友查询中--------\n`) - await friendlist(jctqCookie1) - //await $.wait(4000); - console.log("\n\n") - } - - - })() - .catch((e) => $.logErr(e)) - .finally(() => $.done()) -//查询好友列表 -function friendlist(jctqCookie1,timeout = 0) { - return new Promise((resolve) => { - let url = { - url : 'https://tq.xunsl.com/WebApi/ShareSignNew/getFriendFinalList?'+jctqCookie1, - headers : {'Host': 'tq.xunsl.com', - 'Referer':'https://tq.xunsl.com/h5/20201020missionSign/?'+jctqCookie1 - }, - } - $.get(url, async (err, resp, data) => { - try { - - const result = JSON.parse(data) - if(result.success === true ){ - - for (let k=0;k { - let url = { - url : 'https://tq.xunsl.com/WebApi/ShareSignNew/sendScoreV2?friend_uid='+uid+'&'+jctqCookie1, - headers : {'Host': 'tq.xunsl.com', - 'Referer':'https://tq.xunsl.com/h5/20201020missionSign/?'+jctqCookie1 - }, - } - $.get(url, async (err, resp, data) => { - try { - - const result = JSON.parse(data) - if(result.success === true ){ - long=result.data.length - console.log('领取好友红包成功,获得:'+result.data[long-1].score + '金币') - - await $.wait(2000); - // await share(wzid) - - }else{ - console.log('\n该好友未签到或红包已完') - } - } catch (e) { - } finally { - resolve() - } - },timeout) - }) -} - -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("",`\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)})}}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)} diff --git a/jctq/jctq_kkz.js b/jctq/jctq_kkz.js new file mode 100644 index 0000000..b3acc30 --- /dev/null +++ b/jctq/jctq_kkz.js @@ -0,0 +1,359 @@ +/* +安卓:晶彩天气(v8.3.7) + +此脚本负责: +完成看看赚任务,删除重复和失效的body +*/ + +const jsname = '晶彩天气看看赚' +const $ = Env(jsname) +const notifyFlag = 1; //0为关闭通知,1为打开通知,默认为1 +const logDebug = 0 + +//const notify = $.isNode() ? require('./sendNotify') : ''; +let notifyStr = '' + +let rndtime = "" //毫秒 +let httpResult //global buffer + +let jctqCookie = ($.isNode() ? process.env.jctqCookie : $.getdata('jctqCookie')) || ''; +let jctqLookStartbody = ($.isNode() ? process.env.jctqLookStartbody : $.getdata('jctqLookStartbody')) || ''; +let jctqLookStartbodyArr = [] + +let bannerIdList = [] +let duplicatedCount = 0 +let invalidCount = 0 +let finishCount = 0 +let rewardAmount = 0 + + +/////////////////////////////////////////////////////////////////// + +!(async () => { + + if(typeof $request !== "undefined") + { + $.msg(jsname+': 此脚本不做重写,请检查重写设置') + } + else + { + if(!(await checkEnv())) { + return + } + + /*for(let i=0; i $.logErr(e)) +.finally(() => $.done()) + +//通知 +async function showmsg() { + + notifyBody = jsname + "运行通知\n\n" + notifyStr + + if (notifyFlag != 1) { + console.log(notifyBody); + } + + if (notifyFlag == 1) { + $.msg(notifyBody); + //if ($.isNode()){await notify.sendNotify($.name, notifyBody );} + } +} + +async function checkEnv() { + + if(!jctqLookStartbody) { + console.log(`未获取到看看赚body`) + return false + } + + if(jctqLookStartbody.indexOf('&') > -1) { + jctqLookStartbodyArr = jctqLookStartbody.split('&') + } else { + jctqLookStartbodyArr.push(jctqLookStartbody) + } + + let numBody = jctqLookStartbodyArr.length + console.log(`找到${numBody}个看看赚body`) + + if(jctqCookie) { + if(jctqCookie.indexOf('@') > -1) { + jctqCookies = jctqCookie.split('@') + jctqCookie = jctqCookies[0] + console.log('检测到多于一个jctqCookie,开始跑第一个账户。请注意本脚本只支持单账户,如需多账户请自行修改。') + } + if(jctqCookie.indexOf('cookie=') == -1 && jctqCookie.indexOf('zqkey=') > -1) { + jctqCookie = jctqCookie.replace(/zqkey=/, "cookie=") + } + if(jctqCookie.indexOf('cookie_id=') == -1 && jctqCookie.indexOf('zqkey_id=') > -1) { + jctqCookie = jctqCookie.replace(/zqkey_id=/, "cookie_id=") + } + if(jctqCookie.indexOf('app_version=') == -1) { + jctqCookie = 'app_version=8.3.7&' + jctqCookie + } + } + + return true +} + +/////////////////////////////////////////////////////////////////// + +//看看赚任务 +async function adlickstart(lookStartBody,idx) { + let caller = printCaller() + let url = 'https://tq.xunsl.com/v5/nameless/adlickstart.json' + let urlObject = populatePostUrl(url,lookStartBody) + await httpPost(urlObject,caller) + let result = httpResult; + if(!result) return + + if(result.success == true) { + let bannerId = result.items.banner_id + if(await checkDuplicated(lookStartBody,bannerId)) { + if(result.items.comtele_state == 1) { + console.log(`第${idx+1}个看看赚[id:${bannerId}]已完成`) + } else { + let readNum = result.items.see_num - result.items.read_num + if(readNum == 0) readNum++ + console.log(`开始做第${idx+1}个看看赚[id:${bannerId}]任务,还需要阅读${readNum}次,开始阅读...`) + for(let i=0; i 0) notifyStr += `删除了${duplicatedCount}个重复的body\n` + if(invalidCount > 0) notifyStr += `删除了${invalidCount}个无效的body\n` +} + +//////////////////////////////////////////////////////////////////// +function populatePostUrl(url,reqBody){ + let rndtime = Math.floor(new Date().getTime()/1000) + let urlObject = { + url: url, + headers: { + 'request_time' : rndtime, + 'Host' : 'tq.xunsl.com', + 'device-model' : 'VOG-AL10', + 'device-platform' : 'android', + 'Connection' : 'keep-alive', + 'app-type' : 'jcweather', + }, + body: reqBody + } + return urlObject; +} + +function populateGetUrl(url){ + let rndtime = Math.floor(new Date().getTime()/1000) + let urlObject = { + url: url, + headers: { + 'request_time' : rndtime, + 'Host' : 'tq.xunsl.com', + 'device-model' : 'VOG-AL10', + 'device-platform' : 'android', + 'Connection' : 'keep-alive', + 'app-type' : 'jcweather', + } + } + return urlObject; +} + +async function httpPost(url,caller) { + httpResult = null + return new Promise((resolve) => { + $.post(url, async (err, resp, data) => { + try { + if (err) { + console.log(caller + ": post请求失败"); + console.log(JSON.stringify(err)); + $.logErr(err); + } else { + if (safeGet(data)) { + httpResult = JSON.parse(data,caller); + if(logDebug) console.log(httpResult); + } + } + } catch (e) { + $.logErr(e, resp); + } finally { + resolve(); + } + }); + }); +} + +async function httpGet(url,caller) { + httpResult = null + return new Promise((resolve) => { + $.get(url, async (err, resp, data) => { + try { + if (err) { + console.log(caller + ": get请求失败"); + console.log(JSON.stringify(err)); + $.logErr(err); + } else { + if (safeGet(data,caller)) { + httpResult = JSON.parse(data); + if(logDebug) console.log(httpResult); + } + } + } catch (e) { + $.logErr(e, resp); + } finally { + resolve(); + } + }); + }); +} + +function safeGet(data,caller) { + try { + if (typeof JSON.parse(data) == "object") { + return true; + } else { + console.log(`Function ${caller}: 未知错误`); + console.log(data) + } + } catch (e) { + console.log(e); + console.log(`Function ${caller}: 服务器访问数据为空,请检查自身设备网络情况`); + return false; + } +} + +function printCaller(){ + return (new Error()).stack.split("\n")[2].trim().split(" ")[1] +} + +function Env(t, e) { 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("", `\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) }) } } 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) } diff --git a/jctq/jctq_read.js b/jctq/jctq_read.js new file mode 100644 index 0000000..aa27f08 --- /dev/null +++ b/jctq/jctq_read.js @@ -0,0 +1,258 @@ +/* +安卓:晶彩天气(v8.3.7) + +此脚本负责: +阅读文章,浏览视频 +*/ + +const jsname = '晶彩天气文章视频' +const $ = Env(jsname) +const notifyFlag = 1; //0为关闭通知,1为打开通知,默认为1 +const logDebug = 0 + +//const notify = $.isNode() ? require('./sendNotify') : ''; +let notifyStr = '' + +let rndtime = "" //毫秒 +let httpResult //global buffer + +let jctqTimeBody = ($.isNode() ? process.env.jctqTimeBody : $.getdata('jctqTimeBody')) || ''; +let jctqWzBody = ($.isNode() ? process.env.jctqWzBody : $.getdata('jctqWzBody')) || ''; +let jctqWzBodyArr = [] + +let bannerIdList = [] +let totalTime = 0 +let invalidCount = 0 +let finishCount = 0 +let rewardAmount = 0 + +/////////////////////////////////////////////////////////////////// + +!(async () => { + + if(typeof $request !== "undefined") + { + $.msg(jsname+': 此脚本不做重写,请检查重写设置') + } + else + { + if(!(await checkEnv())) { + return + } + + for(let i=0; i $.logErr(e)) +.finally(() => $.done()) + +//通知 +async function showmsg() { + + notifyBody = jsname + "运行通知\n\n" + notifyStr + + if (notifyFlag != 1) { + console.log(notifyBody); + } + + if (notifyFlag == 1) { + $.msg(notifyBody); + //if ($.isNode()){await notify.sendNotify($.name, notifyBody );} + } +} + +async function checkEnv() { + + if(!jctqWzBody) { + console.log(`未获取到文章视频body`) + return false + } + + if(jctqWzBody.indexOf('&') > -1) { + jctqWzBodyArr = jctqWzBody.split('&') + } else { + jctqWzBodyArr.push(jctqWzBody) + } + + if(jctqTimeBody && jctqTimeBody.indexOf('&') > -1) { + jctqTimeBodys = jctqTimeBody.split('&') + jctqTimeBody = jctqTimeBodys[0] + } + + let numWzBody = jctqWzBodyArr.length + console.log(`找到${numWzBody}个文章视频body`) + + return true +} + +/////////////////////////////////////////////////////////////////// + +//浏览文章 +async function readArticle(wzBody,idx) { + let caller = printCaller() + let url = 'https://tq.xunsl.com/v5/article/complete.json' + let urlObject = populatePostUrl(url,wzBody) + await httpPost(urlObject,caller) + let result = httpResult; + if(!result) return + + if(result.success == true) { + finishCount++ + let randomTime = Math.floor(Math.random()*10000)+60000 + let score = result.items.read_score || 0 + rewardAmount += parseInt(score) + console.log(`浏览第${idx+1}篇文章获得${score}金币,随机延迟${randomTime}ms后刷阅读时长`) + await $.wait(randomTime) + if(jctqTimeBody) { + await updateStayTime(jctqTimeBody) + } else { + console.log(`----没有找到时长body,不刷时长,请小心黑号`) + } + } else { + //invalidCount++ + //await removeBody(wzBody) + console.log(`浏览第${idx+1}篇文章失败:${result.message}`) + } +} + +//更新阅读时长 +async function updateStayTime(timeBody) { + let caller = printCaller() + let url = 'https://tq.xunsl.com/v5/user/stay.json' + let urlObject = populatePostUrl(url,timeBody) + await httpPost(urlObject,caller) + let result = httpResult; + if(!result) return + + if(result.success == true) { + totalTime = result.time + console.log(`----更新阅读时长成功,今天总阅读时长${result.time}秒`) + } else { + console.log(`----更新阅读时长失败:${result.message}`) + } +} + +//删除失效body +async function removeBody(wzBody) { + newBody = $.getdata('jctqWzBody').replace(wzBody,""); + newBody = newBody.replace("&&","&"); + $.setdata(newBody,'jctqWzBody'); +} + +//统计运行情况 +async function getStatus() { + notifyStr += `本次运行情况:\n` + notifyStr += `共阅读了${finishCount}篇文章/视频,获得${rewardAmount}金币,总阅读时长${totalTime}\n` + //if(invalidCount > 0) notifyStr += `删除了${invalidCount}个无效的body\n` +} + +//////////////////////////////////////////////////////////////////// +function populatePostUrl(url,reqBody){ + let rndtime = Math.floor(new Date().getTime()/1000) + let urlObject = { + url: url, + headers: { + 'request_time' : rndtime, + 'Host' : 'tq.xunsl.com', + 'device-model' : 'VOG-AL10', + 'device-platform' : 'android', + 'Connection' : 'keep-alive', + 'app-type' : 'jcweather', + }, + body: reqBody + } + return urlObject; +} + +function populateGetUrl(url){ + let rndtime = Math.floor(new Date().getTime()/1000) + let urlObject = { + url: url, + headers: { + 'request_time' : rndtime, + 'Host' : 'tq.xunsl.com', + 'device-model' : 'VOG-AL10', + 'device-platform' : 'android', + 'Connection' : 'keep-alive', + 'app-type' : 'jcweather', + } + } + return urlObject; +} + +async function httpPost(url,caller) { + httpResult = null + return new Promise((resolve) => { + $.post(url, async (err, resp, data) => { + try { + if (err) { + console.log(caller + ": post请求失败"); + console.log(JSON.stringify(err)); + $.logErr(err); + } else { + if (safeGet(data)) { + httpResult = JSON.parse(data,caller); + if(logDebug) console.log(httpResult); + } + } + } catch (e) { + $.logErr(e, resp); + } finally { + resolve(); + } + }); + }); +} + +async function httpGet(url,caller) { + httpResult = null + return new Promise((resolve) => { + $.get(url, async (err, resp, data) => { + try { + if (err) { + console.log(caller + ": get请求失败"); + console.log(JSON.stringify(err)); + $.logErr(err); + } else { + if (safeGet(data,caller)) { + httpResult = JSON.parse(data); + if(logDebug) console.log(httpResult); + } + } + } catch (e) { + $.logErr(e, resp); + } finally { + resolve(); + } + }); + }); +} + +function safeGet(data,caller) { + try { + if (typeof JSON.parse(data) == "object") { + return true; + } else { + console.log(`Function ${caller}: 未知错误`); + console.log(data) + } + } catch (e) { + console.log(e); + console.log(`Function ${caller}: 服务器访问数据为空,请检查自身设备网络情况`); + return false; + } +} + +function printCaller(){ + return (new Error()).stack.split("\n")[2].trim().split(" ")[1] +} + +function Env(t, e) { 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("", `\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) }) } } 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) } diff --git a/jctq/jctq_reward.js b/jctq/jctq_reward.js new file mode 100644 index 0000000..94812ed --- /dev/null +++ b/jctq/jctq_reward.js @@ -0,0 +1,306 @@ +/* +安卓:晶彩天气(v8.3.7) + +此脚本负责: +签到和翻倍,任务奖励领取,统计今日收益,自动提现 + +请将定时放在看看赚和阅读任务后面 +如果不想自动提现的,请不要捉提现body,或者新建环境变量jctqWithdrawFlag,写成0 +*/ + +const jsname = '晶彩天气任务签到' +const $ = Env(jsname) +const notifyFlag = 1; //0为关闭通知,1为打开通知,默认为1 +const logDebug = 0 + +//const notify = $.isNode() ? require('./sendNotify') : ''; +let notifyStr = '' + +let rndtime = "" //毫秒 +let httpResult //global buffer + +let jctqWithdrawFlag = ($.isNode() ? process.env.jctqWithdrawFlag : $.getdata('jctqWithdrawFlag')) || 1; +let jctqBoxbody = ($.isNode() ? process.env.jctqBoxbody : $.getdata('jctqBoxbody')) || ''; +let jctqQdBody = ($.isNode() ? process.env.jctqQdBody : $.getdata('jctqQdBody')) || ''; +let jctqWithdraw = ($.isNode() ? process.env.jctqWithdraw : $.getdata('jctqWithdraw')) || ''; +let jctqCookie = ($.isNode() ? process.env.jctqCookie : $.getdata('jctqCookie')) || ''; + +let jctqRewardBodyArr = [] + +let withdrawSuccess = 0 + +/////////////////////////////////////////////////////////////////// + +!(async () => { + + if(typeof $request !== "undefined") + { + $.msg(jsname+': 此脚本不做重写,请检查重写设置') + } + else + { + await checkEnv() + + let numBoxbody = jctqRewardBodyArr.length + console.log(`找到${numBoxbody}个签到/奖励body`) + + for(let i=0; i 0 && jctqWithdraw) { + await withdraw() + await $.wait(1000) + } else if(jctqWithdraw == 0) { + console.log(`你设置了不自动提现`) + } else if(!jctqWithdraw) { + console.log(`没有找到提现body`) + } + + if(jctqCookie) { + await getBalance() + await showmsg() + } else { + console.log(`没有找到用户CK,无法统计今日收益`) + } + + } + + +})() +.catch((e) => $.logErr(e)) +.finally(() => $.done()) + +//通知 +async function showmsg() { + + notifyBody = jsname + "运行通知\n\n" + notifyStr + + if (notifyFlag != 1) { + console.log(notifyBody); + } + + if (notifyFlag == 1) { + $.msg(notifyBody); + //if ($.isNode()){await notify.sendNotify($.name, notifyBody );} + } +} + +async function checkEnv() { + + if(jctqCookie) { + if(jctqCookie.indexOf('@') > -1) { + jctqCookies = jctqCookie.split('@') + jctqCookie = jctqCookies[0] + console.log('检测到多于一个jctqCookie,开始跑第一个账户。请注意本脚本只支持单账户,如需多账户请自行修改。') + } + if(jctqCookie.indexOf('cookie=') == -1 && jctqCookie.indexOf('zqkey=') > -1) { + jctqCookie = jctqCookie.replace(/zqkey=/, "cookie=") + } + if(jctqCookie.indexOf('cookie_id=') == -1 && jctqCookie.indexOf('zqkey_id=') > -1) { + jctqCookie = jctqCookie.replace(/zqkey_id=/, "cookie_id=") + } + if(jctqCookie.indexOf('app_version=') == -1) { + jctqCookie = 'app_version=8.3.7&' + jctqCookie + } + } + + if(jctqWithdraw && jctqWithdraw.indexOf('@') > -1) { + jctqWithdraws = jctqWithdraw.split('@') + jctqWithdraw = jctqWithdraws[0] + console.log('检测到多于一个提现body,使用第一个body') + } + + if(jctqQdBody) { + if(jctqQdBody.indexOf('&') > -1) { + let jctqQdBodyArr = jctqQdBody.split('&') + for(let i=0; i -1) { + let jctqBoxbodyArr = jctqBoxbody.split('&') + for(let i=0; i -1) signStr = '签到' + console.log(`领取第${idx+1}个奖励成功,${signStr}获得${result.items.score}金币`) + } + } else { + console.log(`领取第${idx+1}个奖励失败:${result.message}`) + } +} + +//今日收益 +async function getBalance() { + let caller = printCaller() + let url = 'https://tq.xunsl.com/wap/user/balance?keyword_wyq=woyaoq.com&' + jctqCookie + let urlObject = populateGetUrl(url) + await httpGet(urlObject,caller) + let result = httpResult; + if(!result) return + + if(result.status == 0) { + notifyStr += `【金币总数】:${result.user.score}\n` + notifyStr += `【今日收益】:${result.user.today_score}\n` + for(let i=0; i -1) { + for(let j=0; j { + $.post(url, async (err, resp, data) => { + try { + if (err) { + console.log(caller + ": post请求失败"); + console.log(JSON.stringify(err)); + $.logErr(err); + } else { + if (safeGet(data)) { + httpResult = JSON.parse(data,caller); + if(logDebug) console.log(httpResult); + } + } + } catch (e) { + $.logErr(e, resp); + } finally { + resolve(); + } + }); + }); +} + +async function httpGet(url,caller) { + httpResult = null + return new Promise((resolve) => { + $.get(url, async (err, resp, data) => { + try { + if (err) { + console.log(caller + ": get请求失败"); + console.log(JSON.stringify(err)); + $.logErr(err); + } else { + if (safeGet(data,caller)) { + httpResult = JSON.parse(data); + if(logDebug) console.log(httpResult); + } + } + } catch (e) { + $.logErr(e, resp); + } finally { + resolve(); + } + }); + }); +} + +function safeGet(data,caller) { + try { + if (typeof JSON.parse(data) == "object") { + return true; + } else { + console.log(`Function ${caller}: 未知错误`); + console.log(data) + } + } catch (e) { + console.log(e); + console.log(`Function ${caller}: 服务器访问数据为空,请检查自身设备网络情况`); + return false; + } +} + +function printCaller(){ + return (new Error()).stack.split("\n")[2].trim().split(" ")[1] +} + +function Env(t, e) { 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("", `\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) }) } } 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) } diff --git a/jctq/jctq_rewrite.js b/jctq/jctq_rewrite.js new file mode 100644 index 0000000..d7e076d --- /dev/null +++ b/jctq/jctq_rewrite.js @@ -0,0 +1,189 @@ +/* +安卓:晶彩天气(v8.3.7) + +此脚本负责:捉包重写 + + +注意单脚本不支持多账户,建议多容器跑。如果需要多账户在同一个脚本跑,请自行修改 +脚本会自动提现,如果不想自动提现的,请不要捉提现body,或者新建环境变量jctqWithdrawFlag,写成0 + +重写: +https://tq.xunsl.com/v17/NewTask/getTaskListByWeather.json -- 点开福利页即可获取jctqCookie,注意只支持单账户,新ck会覆盖旧ck +https://tq.xunsl.com/v5/CommonReward/toGetReward.json -- 签到,观看签到翻倍视频,和福利页任务奖励(目前应该只有激励视频和20篇文章的奖励),获取完建议关掉重写 +https://tq.xunsl.com/v5/article/info.json -- 点开文章获取文章body,获取完建议关掉重写 +https://tq.xunsl.com/v5/article/detail.json -- 点开视频获取视频body,获取完建议关掉重写 +https://tq.xunsl.com/v5/user/stay.json -- 阅读文章或者看视频一段时间后可以获取到时长body,获取完务必关掉重写 +https://tq.xunsl.com/v5/nameless/adlickstart.json -- 点开看看赚获取body,可以一直开着,脚本会自动删除重复和失效body +https://tq.xunsl.com/v5/Weather/giveBoxOnWeather.json -- 点开福利页浮窗宝箱和观看翻倍视频获取body,获取完建议关掉重写 +https://tq.xunsl.com/v5/weather/giveTimeInterval.json -- 点开首页气泡红包和观看翻倍视频获取body,获取完建议关掉重写 +https://tq.xunsl.com/v5/wechat/withdraw2.json -- 提现一次对应金额获取body,新获取的提现body会覆盖旧的 + +任务: +jctq_daily.js -- 领转发页定时宝箱,领福利页定时宝箱,领首页气泡红包,时段转发,刷福利视频,抽奖5次 +jctq_reward.js -- 签到和翻倍,任务奖励领取,统计今日收益,自动提现 +jctq_kkz.js -- 完成看看赚任务,删除重复和失效的body +jctq_read.js -- 阅读文章,浏览视频 + +*/ + +const jsname = '晶彩天气捉包重写' +const $ = Env(jsname) +const notifyFlag = 1; //0为关闭通知,1为打开通知,默认为1 +const logDebug = 0 + +let jctqCookie = ($.isNode() ? process.env.jctqCookie : $.getdata('jctqCookie')) || ''; +let jctqBoxbody = ($.isNode() ? process.env.jctqBoxbody : $.getdata('jctqBoxbody')) || ''; +let jctqTimeBody = ($.isNode() ? process.env.jctqTimeBody : $.getdata('jctqTimeBody')) || ''; +let jctqWzBody = ($.isNode() ? process.env.jctqWzBody : $.getdata('jctqWzBody')) || ''; +let jctqLookStartbody = ($.isNode() ? process.env.jctqLookStartbody : $.getdata('jctqLookStartbody')) || ''; +let jctqWithdraw = ($.isNode() ? process.env.jctqWithdraw : $.getdata('jctqWithdraw')) || ''; +let jctqBubbleBody = ($.isNode() ? process.env.jctqBubbleBody : $.getdata('jctqBubbleBody')) || ''; +let jctqGiveBoxBody = ($.isNode() ? process.env.jctqGiveBoxBody : $.getdata('jctqGiveBoxBody')) || ''; + +/////////////////////////////////////////////////////////////////// + +!(async () => { + + if(typeof $request !== "undefined") + { + await getRewrite() + } else { + $.msg(jsname+': 此脚本只负责重写,请检查任务设置') + } + +})() +.catch((e) => $.logErr(e)) +.finally(() => $.done()) + +async function getRewrite() { + + if($request.url.indexOf('v17/NewTask/getTaskListByWeather.json') > -1) { + rUrl = $request.url + app_version = rUrl.match(/app_version=([\w\.]+)/)[1] + zqkey = rUrl.match(/zqkey=([\w-]+)/)[1] + zqkey_id = rUrl.match(/zqkey_id=([\w-]+)/)[1] + uid = rUrl.match(/uid=([\w]+)/)[1] + uidStr = 'uid=' + uid + if(jctqCookie.indexOf(uidStr) > -1) { + $.msg(jsname+` 已获取过此用户的jctqCookie`) + } else { + jctqCookie = `app_version=${app_version}&cookie=${zqkey}&cookie_id=${zqkey_id}&uid=${uid}` + $.setdata(jctqCookie, 'jctqCookie'); + $.msg(jsname+` 获取jctqCookie成功`) + } + } + + if($request.url.indexOf('v5/CommonReward/toGetReward.json') > -1) { + rBody = $request.body + if(jctqBoxbody) { + if(jctqBoxbody.indexOf(rBody) > -1) { + $.msg(jsname+` 此签到/奖励body已存在,本次跳过`) + } else { + jctqBoxbody = jctqBoxbody + '&' + rBody + $.setdata(jctqBoxbody, 'jctqBoxbody'); + bodyList = jctqBoxbody.split('&') + $.msg(jsname+` 获取第${bodyList.length}个签到/奖励body成功`) + } + } else { + $.setdata(rBody, 'jctqBoxbody'); + $.msg(jsname+` 获取第1个签到/奖励body成功`) + } + } + + if($request.url.indexOf('v5/article/info.json') > -1 || + $request.url.indexOf('v5/article/detail.json') > -1) { + rUrl = $request.url + bodys = rUrl.split('?p=') + rBody = 'p=' + bodys[1] + if(jctqWzBody) { + if(jctqWzBody.indexOf(rBody) > -1) { + $.msg(jsname+` 此文章/视频body已存在,本次跳过`) + } else { + jctqWzBody = jctqWzBody + '&' + rBody + $.setdata(jctqWzBody, 'jctqWzBody'); + bodyList = jctqWzBody.split('&') + $.msg(jsname+` 获取第${bodyList.length}个文章/视频body成功`) + } + } else { + $.setdata(rBody, 'jctqWzBody'); + $.msg(jsname+` 获取第1个文章/视频body成功`) + } + } + + if($request.url.indexOf('v5/user/stay.json') > -1) { + rBody = $request.body + if(jctqTimeBody) { + if(jctqTimeBody.indexOf(rBody) > -1) { + $.msg(jsname+` 此时长body已存在,本次跳过`) + } else { + jctqTimeBody = jctqTimeBody + '&' + rBody + $.setdata(jctqTimeBody, 'jctqTimeBody'); + bodyList = jctqTimeBody.split('&') + $.msg(jsname+` 获取第${bodyList.length}个时长body成功`) + } + } else { + $.setdata(rBody, 'jctqTimeBody'); + $.msg(jsname+` 获取第1个时长body成功`) + } + } + + if($request.url.indexOf('v5/nameless/adlickstart.json') > -1) { + rBody = $request.body + if(jctqLookStartbody) { + if(jctqLookStartbody.indexOf(rBody) > -1) { + $.msg(jsname+` 此看看赚body已存在,本次跳过`) + } else { + jctqLookStartbody = jctqLookStartbody + '&' + rBody + $.setdata(jctqLookStartbody, 'jctqLookStartbody'); + bodyList = jctqLookStartbody.split('&') + $.msg(jsname+` 获取第${bodyList.length}个看看赚body成功`) + } + } else { + $.setdata(rBody, 'jctqLookStartbody'); + $.msg(jsname+` 获取第1个看看赚body成功`) + } + } + + if($request.url.indexOf('v5/wechat/withdraw2.json') > -1) { + rBody = $request.body + $.setdata(rBody, 'jctqWithdraw'); + $.msg(jsname+` 获取提现body成功`) + } + + if($request.url.indexOf('v5/Weather/giveBoxOnWeather.json') > -1) { + rBody = $request.body + if(jctqGiveBoxBody) { + if(jctqGiveBoxBody.indexOf(rBody) > -1) { + $.msg(jsname+` 此福利页宝箱/翻倍body已存在,本次跳过`) + } else { + jctqGiveBoxBody = jctqGiveBoxBody + '&' + rBody + $.setdata(jctqGiveBoxBody, 'jctqGiveBoxBody'); + bodyList = jctqGiveBoxBody.split('&') + $.msg(jsname+` 获取第${bodyList.length}个福利页宝箱/翻倍body成功`) + } + } else { + $.setdata(rBody, 'jctqGiveBoxBody'); + $.msg(jsname+` 获取第1个福利页宝箱/翻倍body成功`) + } + } + + if($request.url.indexOf('v5/weather/giveTimeInterval.json') > -1) { + rBody = $request.body + if(jctqBubbleBody) { + if(jctqBubbleBody.indexOf(rBody) > -1) { + $.msg(jsname+` 此首页气泡/翻倍body已存在,本次跳过`) + } else { + jctqBubbleBody = jctqBubbleBody + '&' + rBody + $.setdata(jctqBubbleBody, 'jctqBubbleBody'); + bodyList = jctqBubbleBody.split('&') + $.msg(jsname+` 获取第${bodyList.length}个首页气泡/翻倍body成功`) + } + } else { + $.setdata(rBody, 'jctqBubbleBody'); + $.msg(jsname+` 获取第1个首页气泡/翻倍body成功`) + } + } +} + +//////////////////////////////////////////////////////////////////// +function Env(t, e) { 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("", `\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) }) } } 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) } diff --git a/jctq/jctq_rewrite_subscribe.json b/jctq/jctq_rewrite_subscribe.json deleted file mode 100644 index d0888f5..0000000 --- a/jctq/jctq_rewrite_subscribe.json +++ /dev/null @@ -1,147 +0,0 @@ -{ - "name": "晶彩天气重写订阅", - "type": "rewrite", - "note": "仅供参考", - "author": "leaf", - "resource": "https://raw.githubusercontent.com/leafxcy/JavaScript/main/jctq/jctq_rewrite_subscribe.json", - "mitmhost": [ - "tq.xunsl.com" - ], - "rewrite": [ - { - "match": "https://tq.xunsl.com/v5/nameless/adlickstart.json", - "target": "https://raw.githubusercontent.com/leafxcy/JavaScript/main/jctq/jctqkkz.js", - "enable": true - }, - { - "match": "https://tq.xunsl.com/v17/NewTask/getTaskListByWeather.json", - "target": "https://raw.githubusercontent.com/leafxcy/JavaScript/main/jctq/jctq_today_score.js", - "enable": true - }, - { - "match": "https://tq.xunsl.com/v5/article/info.json", - "target": "https://raw.githubusercontent.com/leafxcy/JavaScript/main/jctq/jctqwz.js", - "enable": true - }, - { - "match": "https://tq.xunsl.com/v5/article/detail.json", - "target": "https://raw.githubusercontent.com/leafxcy/JavaScript/main/jctq/jctqwz.js", - "enable": true - }, - { - "match": "https://tq.xunsl.com/v5/user/stay.json", - "target": "https://raw.githubusercontent.com/leafxcy/JavaScript/main/jctq/jctqwz.js", - "enable": true - }, - { - "match": "https://tq.xunsl.com/v5/CommonReward/toGetReward.json", - "target": "https://raw.githubusercontent.com/leafxcy/JavaScript/main/jctq/jctqqd.js", - "enable": true - }, - { - "match": "https://tq.xunsl.com/v5/CommonReward/toGetReward.json", - "target": "https://raw.githubusercontent.com/leafxcy/JavaScript/main/jctq/jctqbox.js", - "enable": true - }, - { - "match": "https://tq.xunsl.com/v5/wechat/withdraw2.json", - "target": "https://raw.githubusercontent.com/leafxcy/JavaScript/main/jctq/jctq_withdraw.js", - "enable": true - } - ], - "task": { - "type": "skip", - "list": [ - { - "name": "晶彩天气看看赚", - "type": "cron", - "time": "21 8,20 * * *", - "job": { - "type": "runjs", - "target": "https://raw.githubusercontent.com/leafxcy/JavaScript/main/jctq/jctqkkz.js" - }, - }, - { - "name": "晶彩天气每日收益", - "type": "cron", - "time": "18 22 * * *", - "job": { - "type": "runjs", - "target": "https://raw.githubusercontent.com/leafxcy/JavaScript/main/jctq/jctq_today_score.js" - }, - }, - { - "name": "晶彩天气签到", - "type": "cron", - "time": "23 0,6 * * *", - "job": { - "type": "runjs", - "target": "https://raw.githubusercontent.com/leafxcy/JavaScript/main/jctq/jctqqd.js" - }, - }, - { - "name": "晶彩天气文章", - "type": "cron", - "time": "12 7,19 * * *", - "job": { - "type": "runjs", - "target": "https://raw.githubusercontent.com/leafxcy/JavaScript/main/jctq/jctqwz.js" - }, - }, - { - "name": "晶彩天气火爆转发", - "type": "cron", - "time": "12 6,12,18 * * *", - "job": { - "type": "runjs", - "target": "https://raw.githubusercontent.com/leafxcy/JavaScript/main/jctq/jctq_share.js" - }, - }, - { - "name": "晶彩天气福利视频", - "type": "cron", - "time": "20 9,17 * * *", - "job": { - "type": "runjs", - "target": "https://raw.githubusercontent.com/leafxcy/JavaScript/main/jctq/jctq_Adv_video.js" - }, - }, - { - "name": "晶彩天气抽奖", - "type": "cron", - "time": "31 8,16 * * *", - "job": { - "type": "runjs", - "target": "https://raw.githubusercontent.com/leafxcy/JavaScript/main/jctq/jctq_Rotary.js" - }, - }, - { - "name": "晶彩天气每日宝箱", - "type": "cron", - "time": "24 21,22 * * *", - "job": { - "type": "runjs", - "target": "https://raw.githubusercontent.com/leafxcy/JavaScript/main/jctq/jctqbox.js" - }, - }, - { - "name": "晶彩天气好友红包", - "type": "cron", - "time": "32 2,6,20 * * *", - "job": { - "type": "runjs", - "target": "https://raw.githubusercontent.com/leafxcy/JavaScript/main/jctq/jctq_friendSign.js" - }, - }, - { - "name": "晶彩天气提现", - "type": "cron", - "time": "34 23 * * *", - "job": { - "type": "runjs", - "target": "https://raw.githubusercontent.com/leafxcy/JavaScript/main/jctq/jctq_withdraw.js" - }, - } - ] - } -} diff --git a/jctq/jctq_rewrite_subscribe_tmp.json b/jctq/jctq_rewrite_subscribe_tmp.json deleted file mode 100644 index 513ddb7..0000000 --- a/jctq/jctq_rewrite_subscribe_tmp.json +++ /dev/null @@ -1,106 +0,0 @@ -{ - "name": "晶彩天气重写订阅", - "type": "rewrite", - "note": "仅供参考", - "author": "leaf", - "resource": "jctq_rewrite_subscribe.json", - "mitmhost": [ - "tq.xunsl.com" - ], - "rewrite": [ - { - "match": "https://tq.xunsl.com/v17/NewTask/getTaskListByWeather.json", - "target": "jctq_rewrite.js", - "enable": false - }, - { - "match": "https://tq.xunsl.com/v5/CommonReward/toGetReward.json", - "target": "jctq_rewrite.js", - "enable": false - }, - { - "match": "https://tq.xunsl.com/v5/article/info.json", - "target": "jctq_rewrite.js", - "enable": false - }, - { - "match": "https://tq.xunsl.com/v5/article/detail.json", - "target": "jctq_rewrite.js", - "enable": true - }, - { - "match": "https://tq.xunsl.com/v5/user/stay.json", - "target": "jctq_rewrite.js", - "enable": false - }, - { - "match": "https://tq.xunsl.com/v5/nameless/adlickstart.json", - "target": "jctq_rewrite.js", - "enable": true - }, - { - "match": "https://tq.xunsl.com/v5/wechat/withdraw2.json", - "target": "jctq_rewrite.js", - "enable": true - }, - { - "match": "https://tq.xunsl.com/v5/Weather/giveBoxOnWeather.json", - "target": "jctq_rewrite.js", - "enable": false - }, - { - "match": "https://tq.xunsl.com/v5/weather/giveTimeInterval.json", - "target": "jctq_rewrite.js", - "enable": true - } - ], - "task": { - "type": "skip", - "list": [ - { - "id": "nlaVhTOS", - "name": "晶彩天气看看赚", - "type": "cron", - "time": "53 8,20 * * *", - "job": { - "type": "runjs", - "target": "jctq_kkz.js" - }, - "running": true - }, - { - "id": "fc9bqL6D", - "name": "晶彩天气文章视频", - "type": "cron", - "time": "45 7,19 * * *", - "job": { - "type": "runjs", - "target": "jctq_read.js" - }, - "running": true - }, - { - "id": "HXTBby7X", - "name": "晶彩天气日常任务", - "type": "cron", - "time": "12,42 * * * *", - "job": { - "type": "runjs", - "target": "jctq_daily.js" - }, - "running": true - }, - { - "id": "LiXAgyRF", - "name": "晶彩天气任务签到", - "type": "cron", - "time": "35 22 * * *", - "job": { - "type": "runjs", - "target": "jctq_reward.js" - }, - "running": true - } - ] - } -} \ No newline at end of file diff --git a/jctq/jctq_share.js b/jctq/jctq_share.js deleted file mode 100644 index 0bc38f4..0000000 --- a/jctq/jctq_share.js +++ /dev/null @@ -1,199 +0,0 @@ -const $ = new Env("晶彩天气火爆转发"); -const notify = $.isNode() ? require('./sendNotify') : ''; -message = "" -let jctqCookie= $.isNode() ? (process.env.jctqCookie ? process.env.jctqCookie : "") : ($.getdata('jctqCookie') ? $.getdata('jctqCookie') : "") -let jctqCookieArr = [] -let jctqCookies = "" - -var myDate = new Date(); -var hour=myDate.getHours(); -console.log(hour) - - - - - if (!jctqCookie) { - $.msg($.name, '【提示】进入点击右下角"赚钱图标",再跑一次脚本', '不知道说啥好', { - "open-url": "给您劈个叉吧" - }); - $.done() - } - else if (jctqCookie.indexOf("@") == -1 && jctqCookie.indexOf("@") == -1) { - jctqCookieArr.push(jctqCookie) - } - else if (jctqCookie.indexOf("@") > -1) { - jctqCookies = jctqCookie.split("@") - } - else if (process.env.jctqCookie && process.env.jctqCookie.indexOf('@') > -1) { - jctqCookieArr = process.env.jctqCookie.split('@'); - console.log(`您选择的是用"@"隔开\n`) - } - else { - jctqCookies = [process.env.jctqCookie] - }; - Object.keys(jctqCookies).forEach((item) => { - if (jctqCookies[item]) { - jctqCookieArr.push(jctqCookies[item]) - } - }) - -!(async () => { - if (typeof $request !== "undefined") { - await getjctqCookie() - $.done()}else { - console.log(`共${jctqCookieArr.length}个cookie`) - for (let k = 0; k < jctqCookieArr.length; k++) { - // $.message = "" - //bodyVal2 =jctqCookie2.split('&token=')[0] - //console.log(`${bodyVal2}`) - - - if (hour > 4 && hour !== 10 && hour !== 16 && hour !== 22) { - var time1 = Date.parse(new Date()).toString(); - time1 = time1.substr(0, 10); - bodyVal = jctqCookieArr[k].split('&uid=')[0]; - cookie = bodyVal.replace(/zqkey=/, "cookie=") - cookie_id = cookie.replace(/zqkey_id=/, "cookie_id=") - jctqCookie1 = cookie_id + '&device_brand=xfdg&device_id=cc7dgdsgfsz83e&device_model=1gx&device_platform=android&device_type=android&inner_version=202107261526&mi=0&openudid=cc7dgdsgfsz83e&os_api=27&os_version=bdftgsdfga&phone_network=WIFI&phone_sim=1' + '&request_time=' + time1 + '&time=' + time1 + '&' + bodyVal - - //待处理cookie - - //console.log(`${jctqCookie1}`) - console.log(`--------第 ${k + 1} 次转发奖励执行中--------\n`) - - await wzlist() - await $.wait(4000); - await sharejl() - //console.log(typeof(jctqCookie1)); - //console.log(jctqCookie1.length.toString()); - await $.wait(4000); - console.log("\n\n") - } else { - console.log('\n现在不是转发时段!') - } - } - } - })() - .catch((e) => $.logErr(e)) - .finally(() => $.done()) - -function wzlist(timeout = 5000) { - return new Promise((resolve) => { - let url = { - url : 'https://tq.xunsl.com/WebApi/ArticleTop/listsNewTag', - headers : {'Host': 'tq.xunsl.com'}, - //body : wzbody1, - }//xsgbody,} - $.post(url, async (err, resp, data) => { - try { - - const result = JSON.parse(data) - if(result.data.items !== "undefined" ){ - wzid = result.data.items[0].id - console.log(result.data.items[0].id) - await $.wait(3000); - await share(wzid) - - }else{ - console.log(result) - } - } catch (e) { - } finally { - resolve() - } - },timeout) - }) -} - -function share(wzid,timeout=0) { - return new Promise((resolve) => { - let url = { - url : 'https://tq.xunsl.com/WebApi/ShareNew/getShareArticleReward', - headers : { - 'Content-Type': 'application/x-www-form-urlencoded', - 'Content-Length': (jctqCookie1+ '&article_id='+wzid).length.toString(), - 'Host': 'tq.xunsl.com', - 'Referer': 'https://tq.xunsl.com/h5/hotShare/?' +jctqCookie1 -}, - body : jctqCookie1 + '&article_id='+wzid,} - $.post(url, async (err, resp, data) => { - try { - - const result = JSON.parse(data) - if(result.status == 1){ - console.log(result.data) - }else{ - console.log(result) - } - } catch (e) { - } finally { - resolve() - } - },timeout) - }) -} - -function sharejl(timeout=0) { - return new Promise((resolve) => { - if(hour >= 5 && hour <=10 ){ - reward = 'one' - }else if(hour >= 11 && hour <=16){ - reward = 'two' - }else if(hour >= 17 && hour <=22){ - reward = 'three' - } - let url = { - url : 'https://tq.xunsl.com/WebApi/ShareNew/execExtractTask', - headers : { - 'Content-Type': 'application/x-www-form-urlencoded', - 'Content-Length': (jctqCookie1+ '&action=beread_extra_reward_'+ reward).length.toString(), - 'Host': 'tq.xunsl.com', - 'Referer': 'https://tq.xunsl.com/h5/20200612makeMoney/?' +jctqCookie1 -}, - body : jctqCookie1 + '&action=beread_extra_reward_'+ reward,} - $.post(url, async (err, resp, data) => { - try { - - const result = JSON.parse(data) - if(result.status == 1){ - console.log(result.data) - }else{ - console.log(result) - } - } catch (e) { - } finally { - resolve() - } - },timeout) - }) -} - - -async function getjctqCookie() { - if ($request.url.match(/\/tq.xunsl.com\/v17\/NewTask\/getTaskList/)) { - bodyVal1 = $request.url.split('?')[1] - bodyVal2 = bodyVal1.split('&token')[0] - bodyVal3 = bodyVal2.split('&zqkey=')[1] - bodyVal4 = bodyVal2.split('&uid=')[1] - bodyVal5 = bodyVal4.split('&version_code=')[0] - bodyVal = 'zqkey='+ bodyVal3 + '&uid='+ bodyVal5 - if (jctqCookie) { - if (jctqCookie.indexOf(bodyVal5) > -1) { - $.log("此cookie已存在,本次跳过") - } else if (jctqCookie.indexOf(bodyVal5) === -1) { - jctqCookies = jctqCookie + "@" + bodyVal; - $.setdata(jctqCookies, 'jctqCookie'); - $.log(`${$.name}获取cookie: 成功, jctqCookies: ${bodyVal}`); - bodys = jctqCookies.split("@") - // $.msg($.name, "获取第" + bodys.length + "个阅读请求: 成功🎉", ``) - } - } else { - $.setdata(bodyVal, 'jctqCookie'); - $.log(`${$.name}获取cookie: 成功, jctqCookies: ${bodyVal}`); - $.msg($.name, `获取第一个cookie: 成功🎉`, ``) - } - } - - } - -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("",`\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)})}}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)} \ No newline at end of file diff --git a/jctq/jctq_task_subscribe.json b/jctq/jctq_task_subscribe.json deleted file mode 100644 index 3817bc2..0000000 --- a/jctq/jctq_task_subscribe.json +++ /dev/null @@ -1,98 +0,0 @@ -{ - "name": "晶彩天气任务订阅", - "author": "leaf", - "note": "请自行修改运行时间", - "date": "2021-11-12 00:08:11", - "list": [ - { - "name": "晶彩天气看看赚", - "type": "cron", - "time": "21 8,20 * * *", - "job": { - "type": "runjs", - "target": "https://raw.githubusercontent.com/leafxcy/JavaScript/main/jctq/jctqkkz.js" - } - }, - { - "name": "晶彩天气每日收益", - "type": "cron", - "time": "18 22 * * *", - "job": { - "type": "runjs", - "target": "https://raw.githubusercontent.com/leafxcy/JavaScript/main/jctq/jctq_today_score.js" - } - }, - { - "name": "晶彩天气签到", - "type": "cron", - "time": "23 0,6 * * *", - "job": { - "type": "runjs", - "target": "https://raw.githubusercontent.com/leafxcy/JavaScript/main/jctq/jctqqd.js" - } - }, - { - "name": "晶彩天气文章", - "type": "cron", - "time": "12 7,19 * * *", - "job": { - "type": "runjs", - "target": "https://raw.githubusercontent.com/leafxcy/JavaScript/main/jctq/jctqwz.js" - } - }, - { - "name": "晶彩天气火爆转发", - "type": "cron", - "time": "12 6,12,18 * * *", - "job": { - "type": "runjs", - "target": "https://raw.githubusercontent.com/leafxcy/JavaScript/main/jctq/jctq_share.js" - } - }, - { - "name": "晶彩天气福利视频", - "type": "cron", - "time": "20 9,17 * * *", - "job": { - "type": "runjs", - "target": "https://raw.githubusercontent.com/leafxcy/JavaScript/main/jctq/jctq_Adv_video.js" - } - }, - { - "name": "晶彩天气抽奖", - "type": "cron", - "time": "31 8,16 * * *", - "job": { - "type": "runjs", - "target": "https://raw.githubusercontent.com/leafxcy/JavaScript/main/jctq/jctq_Rotary.js" - } - }, - { - "name": "晶彩天气每日宝箱", - "type": "cron", - "time": "24 21,22 * * *", - "job": { - "type": "runjs", - "target": "https://raw.githubusercontent.com/leafxcy/JavaScript/main/jctq/jctqbox.js" - } - }, - { - "name": "晶彩天气好友红包", - "type": "cron", - "time": "32 2,6,20 * * *", - "job": { - "type": "runjs", - "target": "https://raw.githubusercontent.com/leafxcy/JavaScript/main/jctq/jctq_friendSign.js" - } - }, - { - "name": "晶彩天气提现", - "type": "cron", - "time": "34 23 * * *", - "job": { - "type": "runjs", - "target": "https://raw.githubusercontent.com/leafxcy/JavaScript/main/jctq/jctq_withdraw.js" - } - } - ] -} diff --git a/jctq/jctq_today_score.js b/jctq/jctq_today_score.js deleted file mode 100644 index 4b760e6..0000000 --- a/jctq/jctq_today_score.js +++ /dev/null @@ -1,134 +0,0 @@ -const $ = new Env("晶彩天气收益统计"); -const notify = $.isNode() ? require('./sendNotify') : ''; -message = "" -let jctqCookie= $.isNode() ? (process.env.jctqCookie ? process.env.jctqCookie : "") : ($.getdata('jctqCookie') ? $.getdata('jctqCookie') : "") -let jctqCookieArr = [] -let jctqCookies = "" - - - - - -if (!jctqCookie) { - $.msg($.name, '【提示】进入点击右下角"赚钱图标",再跑一次脚本', '不知道说啥好', { - "open-url": "给您劈个叉吧" - }); - $.done() - } - else if (jctqCookie.indexOf("@") == -1 && jctqCookie.indexOf("@") == -1) { - jctqCookieArr.push(jctqCookie) - } - else if (jctqCookie.indexOf("@") > -1) { - jctqCookies = jctqCookie.split("@") - } - else if (process.env.jctqCookie && process.env.jctqCookie.indexOf('@') > -1) { - jctqCookieArr = process.env.jctqCookie.split('@'); - console.log(`您选择的是用"@"隔开\n`) - } - else { - jctqCookies = [process.env.jctqCookie] - }; - Object.keys(jctqCookies).forEach((item) => { - if (jctqCookies[item]) { - jctqCookieArr.push(jctqCookies[item]) - } - }) - -!(async () => { - if (typeof $request !== "undefined") { - getjctqCookie() - $.done() - }else { - console.log(`共${jctqCookieArr.length}个cookie`) - for (let k = 0; k < jctqCookieArr.length; k++) { - $.message = "" - bodyVal = jctqCookieArr[k].split('&uid=')[0]; - cookie = bodyVal.replace(/zqkey=/, "cookie=") - cookie_id = cookie.replace(/zqkey_id=/, "cookie_id=") - jctqCookie1 = cookie_id + '&' + bodyVal - //待处理cookie - console.log(`${jctqCookie1}`) - console.log(`--------第 ${k + 1} 个账号收益查询中--------\n`) - await today_score(jctqCookie1) - if ($.message.length != 0) { - message += "账号" + (k + 1) + ": " + $.message + " \n" - } - await $.wait(4000); - console.log("\n\n") - } - - - if (message.length != 0) { - await notify ? notify.sendNotify("晶彩天气收益查询", `${message}\n\n shaolin-kongfu`) : - $.msg($.name, "晶彩天气收益查询", `${message}`); - } else if ($.isNode()) { - await notify.sendNotify("晶彩天气收益查询", `${message}\n\nshaolin-kongfu`); - } - } - })() - .catch((e) => $.logErr(e)) - .finally(() => $.done()) - - -function today_score(jctqCookie1,timeout = 0) { - return new Promise((resolve) => { - let url = { - url : 'https://tq.xunsl.com/wap/user/balance?'+ jctqCookie1, - headers : { - 'Host': 'tq.xunsl.com' -}, - } - $.get(url, async (err, resp, data) => { - try { - - const result = JSON.parse(data) - if(result.status == 0){ - console.log('\n今日收益总计:'+result.user.today_score) - console.log('\n当前金币总数:'+result.user.score) - console.log('\n折合人民币总数:'+result.user.money) - $.message = `今日收益总计:${result.user.today_score}金币\n 当前金币总数:${result.user.score} \n 折合人民币总数:${result.user.money}元` - $.msg($.name, "", `今日收益总计:${result.user.today_score}金币\n 当前金币总数:${result.user.score} \n 折合人民币总数:${result.user.money}元`); - }else{ - console.log(result) - } - } catch (e) { - } finally { - resolve() - } - },timeout) - }) -} - - - -async function getjctqCookie() { - if ($request.url.match(/\/tq.xunsl.com\/v17\/NewTask\/getTaskList/)) { - bodyVal1 = $request.url.split('?')[1] - bodyVal2 = bodyVal1.split('&token')[0] - bodyVal3 = bodyVal2.split('&zqkey=')[1] - bodyVal4 = bodyVal2.split('&uid=')[1] - bodyVal5 = bodyVal4.split('&version_code=')[0] - bodyVal = 'zqkey='+ bodyVal3 + '&uid='+ bodyVal5 - if (jctqCookie) { - if (jctqCookie.indexOf(bodyVal5) > -1) { - $.log("此cookie已存在,本次跳过") - } else if (jctqCookie.indexOf(bodyVal5) === -1) { - jctqCookies = jctqCookie + "@" + bodyVal; - $.setdata(jctqCookies, 'jctqCookie'); - $.log(`${$.name}获取cookie: 成功, jctqCookies: ${bodyVal}`); - bodys = jctqCookies.split("@") - $.msg($.name, "获取第" + bodys.length + "个cookie: 成功🎉", ``) - } - } else { - $.setdata(bodyVal, 'jctqCookie'); - $.log(`${$.name}获取cookie: 成功, jctqCookies: ${bodyVal}`); - $.msg($.name, `获取第一个cookie: 成功🎉`, ``) - } - } - - } - -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("",`\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)})}}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)} - - - diff --git a/jctq/jctq_withdraw.js b/jctq/jctq_withdraw.js deleted file mode 100644 index 636e5be..0000000 --- a/jctq/jctq_withdraw.js +++ /dev/null @@ -1,206 +0,0 @@ -const $ = new Env("晶彩天气提现"); -const notify = $.isNode() ? require('./sendNotify') : ''; -message = "" -let jctqWithdraw= $.isNode() ? (process.env.jctqWithdraw ? process.env.jctqWithdraw : "") : ($.getdata('jctqWithdraw') ? $.getdata('jctqWithdraw') : "") -let jctqWithdrawArr = [] -let jctqWithdraws = "" -let jc_cash = $.getdata('jc_cash') || 0.3; -let jctqCookie= $.isNode() ? (process.env.jctqCookie ? process.env.jctqCookie : "") : ($.getdata('jctqCookie') ? $.getdata('jctqCookie') : "") -let jctqCookieArr = [] -let jctqCookies = "" -let nowmoney; - - - -var time1 = Date.parse( new Date() ).toString(); - time1 = time1.substr(0,10); -if (!jctqWithdraw) { - $.msg($.name, '【提示】请先完成一次提现,明天再跑一次脚本', '不知道说啥好', { - "open-url": "给您劈个叉吧" - }); - - $.done() - } - else if (jctqWithdraw.indexOf("@") == -1 && jctqWithdraw.indexOf("@") == -1) { - jctqWithdrawArr.push(jctqWithdraw) - } - else if (jctqWithdraw.indexOf("@") > -1) { - jctqWithdraws = jctqWithdraw.split("@") - } - else if (process.env.jctqWithdraw && process.env.jctqWithdraw.indexOf('@') > -1) { - jctqWithdrawArr = process.env.jctqWithdraw.split('@'); - console.log(`您选择的是用"@"隔开\n`) - } - else { - jctqWithdraws = [process.env.jctqWithdraw] - }; - Object.keys(jctqWithdraws).forEach((item) => { - if (jctqWithdraws[item]) { - jctqWithdrawArr.push(jctqWithdraws[item]) - } - }) - - -if (!jctqCookie) { - $.msg($.name, '【提示】进入点击右下角"赚钱图标",再跑一次脚本', '不知道说啥好', { - "open-url": "给您劈个叉吧" - }); - $.done() - } - else if (jctqCookie.indexOf("@") == -1 && jctqCookie.indexOf("@") == -1) { - jctqCookieArr.push(jctqCookie) - } - else if (jctqCookie.indexOf("@") > -1) { - jctqCookies = jctqCookie.split("@") - } - else if (process.env.jctqCookie && process.env.jctqCookie.indexOf('@') > -1) { - jctqCookieArr = process.env.jctqCookie.split('@'); - console.log(`您选择的是用"@"隔开\n`) - } - else { - jctqCookies = [process.env.jctqCookie] - }; - Object.keys(jctqCookies).forEach((item) => { - if (jctqCookies[item]) { - jctqCookieArr.push(jctqCookies[item]) - } - }) - -!(async () => { - if (typeof $request !== "undefined") { - getbody() - $.done() - }else { - console.log(`共${jctqCookieArr.length}个cookie`) - for (let k = 0; k < jctqCookieArr.length; k++) { - $.message = "" - bodyVal = jctqCookieArr[k].split('&uid=')[0]; - cookie = bodyVal.replace(/zqkey=/, "cookie=") - cookie_id = cookie.replace(/zqkey_id=/, "cookie_id=") - jctqCookie1 = cookie_id + '&' + bodyVal - //待处理cookie - console.log(`--------第 ${k + 1} 个账号收益查询中--------\n`) - jctqWithdraw1 = jctqWithdrawArr[k] - await today_score(jctqCookie1) - - - if ($.message.length != 0) { - message += "账号" + (k + 1) + ": " + $.message + " \n" - } - await $.wait(4000); - console.log("\n\n") - } - - - if (message.length != 0) { - await notify ? notify.sendNotify("晶彩天气提现", `${message}\n\n shaolin-kongfu`) : - $.msg($.name, "晶彩天气提现", `${message}\n\n shaolin-kongfu`); - } else if ($.isNode()) { - await notify.sendNotify("晶彩天气提现", `${message}\n\nshaolin-kongfu`); - } - } - })() - .catch((e) => $.logErr(e)) - .finally(() => $.done()) - - - -function withdraw(jctqWithdraw1,timeout = 0) { - return new Promise((resolve) => { - let url = { - url : 'https://tq.xunsl.com/v5/wechat/withdraw2.json', - headers : { - 'request_time' : time1, - 'access' : 'WIFI', - 'os-api' : '29', - 'app-type' : 'jcweather', - 'device-platform' : 'android', - 'app-version' : '8.3.7', - 'Content-Type' : 'application/x-www-form-urlencoded', - 'Host' : 'tq.xunsl.com', - 'Connection' : 'Keep-Alive', - 'Accept-Encoding' : 'gzip', - 'User-Agent' : 'okhttp/3.12.2', - }, - body : jctqWithdraw1,} - $.post(url, async (err, resp, data) => { - try { - - const result = JSON.parse(data) - if (result.error_code == 0) { - console.log(result) - console.log(`【自动提现】提现${jc_cash}元成功\n`) - $.message = `【自动提现】提现${jc_cash}元成功\n` - //$.msg($.name,$.sub,$.desc) - } else { - console.log(result) - } - } catch (e) { - } finally { - resolve() - } - },timeout) - }) -} - - -function getbody() { - if ($request.url.match(/\/tq.xunsl.com\/v5\/wechat\/withdraw2.json/)) { - bodyVal=$request.body - console.log(bodyVal) - if (jctqWithdraw) { - if (jctqWithdraw.indexOf(bodyVal) > -1) { - $.log("此提现请求已存在,本次跳过") - } else if (jctqWithdraw.indexOf(bodyVal) == -1) { - jctqWithdraws = jctqWithdraw + "@" + bodyVal; - $.setdata(jctqWithdraws,'jctqWithdraw'); - $.log(`${$.name}获取提现: 成功, jctqWithdraws: ${bodyVal}`); - bodys = jctqWithdraws.split("@") - $.msg($.name, "获取第" + bodys.length + "个提现请求: 成功🎉", ``) - } - } else { - $.setdata($request.body,'jctqWithdraw'); - $.log(`${$.name}获取提现: 成功, jctqWithdraws: ${bodyVal}`); - $.msg($.name, `获取第一个提现请求: 成功🎉`, ``) - } - } -} - - -function today_score(jctqCookie1,timeout = 0) { - return new Promise((resolve) => { - let url = { - url : 'https://tq.xunsl.com/wap/user/balance?'+ jctqCookie1, - headers : { - 'Host': 'tq.xunsl.com' -}, - } - $.get(url, async (err, resp, data) => { - try { - - const result = JSON.parse(data) - if(result.status == 0){ - - console.log('\n当前金币总数:'+result.user.score) - console.log('\n折合人民币总数:'+result.user.money) - nowmoney = result.user.money - if(nowmoney >= jc_cash){ - await $.wait(3000); - await withdraw(jctqWithdraw1) - } - $.message = `当前金币总数:${result.user.score} \n 折合人民币总数:${result.user.money}元` - //$.msg($.name, "", `当前金币总数:${result.user.score} \n 折合人民币总数:${result.user.money}元`); - }else{ - console.log(result) - } - } catch (e) { - } finally { - resolve() - } - },timeout) - }) -} - -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("",`\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)})}}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)} - - diff --git a/jctq/jctqbox.js b/jctq/jctqbox.js deleted file mode 100644 index 4645d9d..0000000 --- a/jctq/jctqbox.js +++ /dev/null @@ -1,108 +0,0 @@ -const $ = new Env('晶彩天气任务宝箱领取'); -let jctqBoxbody= $.isNode() ? (process.env.jctqBoxbody ? process.env.jctqBoxbody : "") : ($.getdata('jctqBoxbody') ? $.getdata('jctqBoxbody') : "") -let jctqBoxbodyArr = [] -let jctqBoxbodys = "" - - - -if (!jctqBoxbody) { - $.msg($.name, '【提示】请在app下方点击赚钱图标,在每日任务中点击所有可领取的奖励,获取body,明天再跑一次脚本', '不知道说啥好', { - "open-url": "给您劈个叉吧" - }); - $.done() - } - else if (jctqBoxbody.indexOf("&") == -1) { - jctqBoxbodyArr.push(jctqBoxbody) - } - else if (jctqBoxbody.indexOf("&") > -1) { - jctqBoxbodys = jctqBoxbody.split("&") - } - else if (process.env.jctqBoxbody && process.env.jctqBoxbody.indexOf('&') > -1) { - jctqBoxbodyArr = process.env.jctqBoxbody.split('&'); - console.log(`您选择的是用"&"隔开\n`) - } - else { - jctqBoxbodys = [process.env.jctqBoxbody] - }; - Object.keys(jctqBoxbodys).forEach((item) => { - if (jctqBoxbodys[item]) { - jctqBoxbodyArr.push(jctqBoxbodys[item]) - } - }) - -!(async () => { -if (typeof $request !== "undefined") { - getjctqBoxbody() - $.done() - }else { - console.log(`共${jctqBoxbodyArr.length}个宝箱奖励body`) - for (let k = 0; k < jctqBoxbodyArr.length; k++) { - // $.message = "" - jctqBoxbody1 = jctqBoxbodyArr[k]; - console.log(`${jctqBoxbody1}`) - console.log(`--------第 ${k + 1} 次宝箱奖励执行中--------\n`) - let jctqBoxheader = { - 'device-platform': 'android', - 'Content-Type': 'application/x-www-form-urlencoded', - 'Content-Length': jctqBoxbody1.length.toString(), - 'Host': 'tq.xunsl.com', - } - await jctqBoxreward(jctqBoxheader) - console.log(typeof (jctqBoxbody1)); - console.log(jctqBoxbody1.length.toString()); - await $.wait(4000); - console.log("\n\n") - } -} - })() - .catch((e) => $.logErr(e)) - .finally(() => $.done()) - -function getjctqBoxbody() { - if ($request.url.match(/\/tq.xunsl.com\/v5\/CommonReward\/toGetReward/)) { - bodyVal = $request.body - if (jctqBoxbody) { - if (jctqBoxbody.indexOf(bodyVal) > -1) { - $.log("此宝箱请求已存在,本次跳过") - } else if (jctqBoxbody.indexOf(bodyVal) == -1) { - jctqBoxbodys = jctqBoxbody + "&" + bodyVal; - $.setdata(jctqBoxbodys, 'jctqBoxbody'); - $.log(`${$.name}获取宝箱: 成功, jctqBoxbodys: ${bodyVal}`); - bodys = jctqBoxbodys.split("&") - $.msg($.name, "获取第" + bodys.length + "个宝箱请求: 成功🎉", ``) - } - } else { - $.setdata(bodyVal, 'jctqBoxbody'); - $.log(`${$.name}获取宝箱: 成功, jctqBoxbodys: ${bodyVal}`); - $.msg($.name, `获取第一个宝箱请求: 成功🎉`, ``) - } - } - - } -//宝箱 -function jctqBoxreward(jctqBoxheader,timeout=0) { - return new Promise((resolve) => { - let url = { - url : 'https://tq.xunsl.com/v5/CommonReward/toGetReward.json', - headers : jctqBoxheader, - body : jctqBoxbody1,} - $.post(url, async (err, resp, data) => { - try { - - const result = JSON.parse(data) - if(result.success !== false ){ - console.log('\n领取宝箱奖励成功,获得:'+result.items.score + '金币') - }else{ - console.log('\n领取宝箱奖励失败,'+result.error_code) - console.log(result) - } - } catch (e) { - } finally { - resolve() - } - },timeout) - }) -} - -function Env(t,e){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("",`\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)})}}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)} - diff --git a/jctq/jctqkkz.js b/jctq/jctqkkz.js deleted file mode 100644 index 46e93f0..0000000 --- a/jctq/jctqkkz.js +++ /dev/null @@ -1,271 +0,0 @@ -const $ = new Env("晶彩天气看看赚"); -const notify = $.isNode() ? require('./sendNotify') : ''; -message = "" - -let jctqLookStartbody= $.isNode() ? (process.env.jctqLookStartbody ? process.env.jctqLookStartbody : "") : ($.getdata('jctqLookStartbody') ? $.getdata('jctqLookStartbody') : "") -let jctqLookStartbodyArr = [] -let jctqLookStartbodys = "" - -let jctqCookie= $.isNode() ? (process.env.jctqCookie ? process.env.jctqCookie : "") : ($.getdata('jctqCookie') ? $.getdata('jctqCookie') : "") -let jctqCookieArr = [] -let jctqCookies = "" - - -const jctqLookheader = { - 'device-platform': 'android', - 'Content-Type': 'application/x-www-form-urlencoded', - 'Host': 'tq.xunsl.com', - 'app-type' : 'jcweather', -} - -const jctqRewardheader={ - 'device-platform': 'android', - 'Content-Type': 'application/x-www-form-urlencoded', - 'Host': 'tq.xunsl.com', - 'app-type' : 'jcweather', -} - -const jctqLookStartheader={ - 'device-platform': 'android', - 'Content-Type': 'application/x-www-form-urlencoded', - 'Host': 'tq.xunsl.com', - 'app-type' : 'jcweather', -} - - - -if (!jctqCookie) { - $.msg($.name, '【提示】进入点击右下角"赚钱图标",再跑一次脚本', '不知道说啥好', { - "open-url": "给您劈个叉吧" - }); - $.done() - } - else if (jctqCookie.indexOf("@") == -1 && jctqCookie.indexOf("@") == -1) { - jctqCookieArr.push(jctqCookie) - } - else if (jctqCookie.indexOf("@") > -1) { - jctqCookies = jctqCookie.split("@") - } - else if (process.env.jctqCookie && process.env.jctqCookie.indexOf('@') > -1) { - jctqCookieArr = process.env.jctqCookie.split('@'); - console.log(`您选择的是用"@"隔开\n`) - } - else { - jctqCookies = [process.env.jctqCookie] - }; - Object.keys(jctqCookies).forEach((item) => { - if (jctqCookies[item]) { - jctqCookieArr.push(jctqCookies[item]) - } - }) -if (!jctqLookStartbody) { - $.msg($.name, '【提示】请点击看看赚某一任务获取body', '不知道说啥好', { - "open-url": "给您劈个叉吧" - }); - $.done() - } - else if (jctqLookStartbody.indexOf("&") == -1) { - jctqLookStartbodyArr.push(jctqLookStartbody) - } - else if (jctqLookStartbody.indexOf("&") > -1) { - jctqLookStartbodys = jctqLookStartbody.split("&") - } - else if (process.env.jctqLookStartbody && process.env.jctqLookStartbody.indexOf('&') > -1) { - jctqLookStartbodyArr = process.env.jctqLookStartbody.split('&'); - console.log(`您选择的是用"&"隔开\n`) - } - else { - jctqLookStartbodys = [process.env.jctqLookStartbody] - }; - Object.keys(jctqLookStartbodys).forEach((item) => { - if (jctqLookStartbodys[item]) { - jctqLookStartbodyArr.push(jctqLookStartbodys[item]) - } - }) - -!(async () => { - if (typeof $request !== "undefined") { - await getjctqLookStartbody() - $.done() - }else{ - console.log(`共${jctqLookStartbodyArr.length}个看看赚body`) - for (let k = 0; k < jctqLookStartbodyArr.length; k++) { - - jctqLookStartbody1 = jctqLookStartbodyArr[k]; - console.log(`--------第 ${k + 1} 次看看赚激活执行中--------\n`) - await lookStart() - await $.wait(1000); - console.log("\n\n") - } - console.log(`共${jctqCookieArr.length}个cookie`) - for (let k = 0; k < jctqCookieArr.length; k++) { - bodyVal = jctqCookieArr[k].split('&uid=')[0]; - var time1 = Date.parse( new Date() ).toString(); - time1 = time1.substr(0,10); - - cookie = bodyVal.replace(/zqkey=/, "cookie=") - cookie_id = cookie.replace(/zqkey_id=/, "cookie_id=") - jctqCookie1= cookie_id +'&device_brand=xfdg&device_id=cc7dgdsgfsz83e&device_model=1gx&device_platform=android&device_type=android&inner_version=202107261526&mi=0&openudid=cc7dgdsgfsz83e&os_api=27&os_version=bdftgsdfga&phone_network=WIFI&phone_sim=1'+'&request_time=' + time1 +'&time=' + time1 +'&'+ bodyVal - //console.log(`${jctqCookie1}`) - console.log(`--------第 ${k + 1} 个账号看看赚上方宝箱奖励执行中--------\n`) - for(let k = 0; k < 3; k++){ - id = k.toString() - await openbox(id,jctqCookie1) - await $.wait(30000); - - } - - console.log("\n\n") - - } - - -function openbox(id,jctqCookie1,timeout=0) { - return new Promise((resolve) => { - let url = { - url : 'https://tq.xunsl.com/WebApi/Nameless/getBoxReward?id='+ id + '&' + jctqCookie1, - headers : { - 'Host': 'tq.xunsl.com', - //'Referer': 'https://tq.xunsl.com/h5/20190527watchMoney/?' +jctqCookie1 - 'Referer':'https://tq.xunsl.com/h5/20190527watchMoney/?keyword_wyq=woyaoq.com&access=WIFI&app-version=8.1.2&app_version=8.1.2&carrier=%E4%B8%AD%E5%9B%BD%E7%A7%BB%E5%8A%A8&channel=c1005&'+jctqCookie1}, - } - $.get(url, async (err, resp, data) => { - try { - - const result = JSON.parse(data) - if(result.status == 1){ - console.log(result.data) - }else{ - console.log(result) - } - } catch (e) { - } finally { - resolve() - } - },timeout) - }) -}} - })() - .catch((e) => $.logErr(e)) - .finally(() => $.done()) - - - - - - - - -//获取看看赚激活body -async function getjctqLookStartbody() { -if ($request.url.match(/\/tq.xunsl.com\/v5\/nameless\/adlickstart/)) { - bodyVal=$request.body - await $.wait(1100); - if (jctqLookStartbody) { - if (jctqLookStartbody.indexOf(bodyVal) > -1) { - $.log("此看看赚任务请求已存在,本次跳过") - } else if (jctqLookStartbody.indexOf(bodyVal) == -1) { - jctqLookStartbodys = jctqLookStartbody + "&" + bodyVal; - $.setdata(jctqLookStartbodys, 'jctqLookStartbody'); - $.log(`${$.name}获取看看赚任务: 成功, jctqLookStartbodys: ${bodyVal}`); - bodys = jctqLookStartbodys.split("&") - $.msg($.name, "获取第" + bodys.length + "个看看赚任务请求: 成功🎉", ``) - } - } else { - $.setdata(bodyVal, 'jctqLookStartbody'); - $.log(`${$.name}获取看看赚任务: 成功, jctqLookStartbodys: ${bodyVal}`); - $.msg($.name, `获取第一个看看赚任务请求: 成功🎉`, ``) - } - } - - } -//看看赚激活 -function lookStart(timeout = 0) { - return new Promise((resolve) => { - let url = { - url : 'https://tq.xunsl.com/v5/nameless/adlickstart.json', - headers : jctqLookStartheader, - body : jctqLookStartbody1,}//xsgbody,} - $.post(url, async (err, resp, data) => { - try { - - const result = JSON.parse(data) - if(result.success === true ){ - console.log('\n激活看看赚任务成功') - comstate = result.items.comtele_state - if(comstate === 1){ - console.log('\n任务: '+ result.items.banner_id+'已完成,跳过') - }else { - $.log("任务开始," + result.items.banner_id + result.message); - for (let j = 0; j < result.items.see_num - result.items.read_num; j++) { - $.log("任务执行第" + parseInt(j + 1) + "次") - await $.wait(8000); - await lookstart() - } - await $.wait(10000); - await reward() - } - - }else{ - console.log('\n激活看看赚任务失败') - smbody = $.getdata('jctqLookStartbody').replace(jctqLookStartbody1 + "&", ""); - $.setdata(smbody, 'jctqLookStartbody'); - console.log("该看看赚任务已自动删除") - } - } catch (e) { - } finally { - resolve() - } - },timeout) - }) -} -//看看赚阅读 -function lookstart(timeout = 0) { - return new Promise((resolve) => { - let url = { - url : 'https://tq.xunsl.com/v5/nameless/bannerstatus.json', - headers : jctqLookheader, - body : jctqLookStartbody1,}//xsgbody,} - $.post(url, async (err, resp, data) => { - try { - - const result = JSON.parse(data) - if(result.success === true ){ - console.log('\n浏览看看赚文章成功') - }else { - console.log('\n浏览看看赚文章失败') - } - - } catch (e) { - } finally { - resolve() - } - },timeout) - }) -} -//看看赚奖励 -function reward(timeout = 0) { - return new Promise((resolve) => { - let url = { - url : 'https://tq.xunsl.com/v5/nameless/adlickend.json', - headers : jctqRewardheader, - body : jctqLookStartbody1,}//xsgbody,} - $.post(url, async (err, resp, data) => { - try { - - const result = JSON.parse(data) - if(result.items.score !== "undefined" ){ - console.log('\n看看赚获得:'+result.items.score + '金币') - }else{ - console.log('\n领取奖励失败') - } - } catch (e) { - } finally { - resolve() - } - },timeout) - }) -} - - -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("",`\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)})}}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)} diff --git a/jctq/jctqqd.js b/jctq/jctqqd.js deleted file mode 100644 index 0b97485..0000000 --- a/jctq/jctqqd.js +++ /dev/null @@ -1,118 +0,0 @@ -const $ = new Env("晶彩天气签到"); -const notify = $.isNode() ? require('./sendNotify') : ''; -message = "" -let jctqQdBody= $.isNode() ? (process.env.jctqQdBody ? process.env.jctqQdBody : "") : ($.getdata('jctqQdBody') ? $.getdata('jctqQdBody') : "") -let jctqQdBodyArr = [] -let jctqQdBodys = "" -const jctqQdHeader={ - 'device-platform': 'android', - 'Content-Type': 'application/x-www-form-urlencoded', - 'Content-Length': '1247', - 'Host': 'tq.xunsl.com' -}; - - if (typeof $request !== "undefined") { - getjctqQdBody() - $.done() - } - if (!jctqQdBody) { - $.msg($.name, '【提示】请签到以获取body,明天再跑一次脚本测试', '不知道说啥好', { - "open-url": "给您劈个叉吧" - }); - $.done() - } - else if (jctqQdBody.indexOf("&") == -1) { - jctqQdBodyArr.push(jctqQdBody) - } - else if (jctqQdBody.indexOf("&") > -1) { - jctqQdBodys = jctqQdBody.split("&") - } - else if (process.env.jctqQdBody && process.env.jctqQdBody.indexOf('&') > -1) { - jctqQdBodyArr = process.env.jctqQdBody.split('&'); - console.log(`您选择的是用"&"隔开\n`) - } - else { - jctqQdBodys = [process.env.jctqQdBody] - }; - Object.keys(jctqQdBodys).forEach((item) => { - if (jctqQdBodys[item]) { - jctqQdBodyArr.push(jctqQdBodys[item]) - } - }) - -!(async () => { - - - console.log(`共${jctqQdBodyArr.length}个账号`) - for (let k = 0; k < jctqQdBodyArr.length; k++) { - $.message = "" - jctqQdBody1 = jctqQdBodyArr[k]; - console.log(`${jctqQdBody1}`) - console.log(`--------账号 ${k+1} 签到任务执行中--------\n`) - await jcqd() - await $.wait(1000); - console.log("\n\n") - } - - date = new Date() - if ($.isNode() &&date.getHours() == 11 && date.getMinutes()<10) { - if (message.length != 0) { - await notify.sendNotify("晶彩天气签到", `${message}\n\n shaolin-kongfu`); - } - } else { - $.msg($.name, "", message) - } - - })() - .catch((e) => $.logErr(e)) - .finally(() => $.done()) - - -//获取签到body -function getjctqQdBody() { - if ($request.url.match(/\/tq.xunsl.com\/v5\/CommonReward\/toGetReward/)) { - bodyVal = $request.body - if (jctqQdBody) { - if (jctqQdBody.indexOf(bodyVal) > -1) { - $.log("此签到请求已存在,本次跳过") - } else if (jctqQdBody.indexOf(bodyVal) == -1) { - jctqQdBodys = jctqQdBody + "&" + bodyVal; - $.setdata(jctqQdBodys, 'jctqQdBody'); - $.log(`${$.name}获取签到: 成功, jctqQdBodys: ${bodyVal}`); - bodys = jctqQdBodys.split("&") - $.msg($.name, "获取第" + bodys.length + "个签到请求: 成功🎉", ``) - } - } else { - $.setdata(bodyVal, 'jctqQdBody'); - $.log(`${$.name}获取签到: 成功, jctqQdBodys: ${bodyVal}`); - $.msg($.name, `获取第一个签到请求: 成功🎉`, ``) - } - } - - } - -//签到 -function jcqd(timeout = 0) { - return new Promise((resolve) => { - let url = { - url : 'https://tq.xunsl.com/v5/CommonReward/toGetReward.json', - headers : jctqQdHeader, - body : jctqQdBody1,} - $.post(url, async (err, resp, data) => { - try { - - const result = JSON.parse(data) - if(result.success == true){ - console.log('\n签到成功,获得:'+result.items.score +'金币') - }else{ - console.log('\n今日已签到,明天再来吧^_^') - } - } catch (e) { - } finally { - resolve() - } - },timeout) - }) -} -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("",`\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)})}}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)} - diff --git a/jctq/jctqwz.js b/jctq/jctqwz.js deleted file mode 100644 index c0088f5..0000000 --- a/jctq/jctqwz.js +++ /dev/null @@ -1,229 +0,0 @@ -const $ = new Env("晶彩天气阅读文章"); -const notify = $.isNode() ? require('./sendNotify') : ''; -message = "" - - -let jctqWzBody= $.isNode() ? (process.env.jctqWzBody ? process.env.jctqWzBody : "") : ($.getdata('jctqWzBody') ? $.getdata('jctqWzBody') : "") -let jctqWzBodyArr = [] -let jctqWzBodys = "" - -let jctqTimeBody= $.isNode() ? (process.env.jctqTimeBody ? process.env.jctqTimeBody : "") : ($.getdata('jctqTimeBody') ? $.getdata('jctqTimeBody') : "") -let jctqTimeBodyArr = [] -let jctqTimeBodys = "" - -let skipFlag = 0; - -const jctqTimeHeader={ - 'device-platform': 'android', - 'Content-Type': 'application/x-www-form-urlencoded', - 'Content-Length': '1198', - 'Host': 'tq.xunsl.com', - 'app-type' : 'jcweather', -} -const jctqWzHeader = { - 'device-platform': 'android', - 'Content-Type': 'application/x-www-form-urlencoded', - 'Content-Length': '1201', - 'Host': 'tq.xunsl.com', - 'app-type' : 'jcweather', -} - - if (!jctqTimeBody) { - $.msg($.name, '【提示】请点击文章获取body,再跑一次脚本', '不知道说啥好', { - "open-url": "给您劈个叉吧" - }); - $.done() - } - else if (jctqTimeBody.indexOf("&") == -1) { - jctqTimeBodyArr.push(jctqTimeBody) - } - else if (jctqTimeBody.indexOf("&") > -1) { - jctqTimeBodys = jctqTimeBody.split("&") - } - else if (process.env.jctqTimeBody && process.env.jctqTimeBody.indexOf('&') > -1) { - jctqTimeBodyArr = process.env.jctqTimeBody.split('&'); - console.log(`您选择的是用"&"隔开\n`) - } - else { - jctqTimeBodys = [process.env.jctqTimeBody] - }; - Object.keys(jctqTimeBodys).forEach((item) => { - if (jctqTimeBodys[item]) { - jctqTimeBodyArr.push(jctqTimeBodys[item]) - } - }) - - if (!jctqWzBody) { - $.msg($.name, '【提示】请点击文章获取body,再跑一次脚本', '不知道说啥好', { - "open-url": "给您劈个叉吧" - }); - $.done() - } - else if (jctqWzBody.indexOf("&") == -1) { - jctqWzBodyArr.push(jctqWzBody) - } - else if (jctqWzBody.indexOf("&") > -1) { - jctqWzBodys = jctqWzBody.split("&") - } - else if (process.env.jctqWzBody && process.env.jctqWzBody.indexOf('&') > -1) { - jctqWzBodyArr = process.env.jctqWzBody.split('&'); - console.log(`您选择的是用"&"隔开\n`) - } - else { - jctqWzBodys = [process.env.jctqWzBody] - }; - Object.keys(jctqWzBodys).forEach((item) => { - if (jctqWzBodys[item]) { - jctqWzBodyArr.push(jctqWzBodys[item]) - } - }) - -!(async () => { - if (typeof $request !== "undefined") { - getjctqWzBody() - getjctqTimeBody() - $.done() - }else { - - console.log(`共${jctqWzBodyArr.length}个阅读body`) - for (let k = 0; k < jctqWzBodyArr.length; k++) { - // $.message = "" - jctqWzBody1 = jctqWzBodyArr[k]; - // console.log(`${jctqWzBody1}`) - console.log(`--------第 ${k + 1} 次阅读任务执行中--------\n`) - $.skipFlag = 1 - await wzjl() - if($.skipFlag == 0) - { - await $.wait(60000); - for (let k = 0; k < jctqTimeBodyArr.length; k++) { - jctqTimeBody1 = jctqTimeBodyArr[k]; - await timejl() - } - }else{ - await $.wait(400); - } - console.log("\n\n") - } - } - - - - // date = new Date() - // if ($.isNode() &&date.getHours() == 11 && date.getMinutes()<10) { - // if (message.length != 0) { - // await notify.sendNotify("晶彩天气文章阅读", `${message}\n\n shaolin-kongfu`); - // } - // } else { - // $.msg($.name, "", message) - // } - - })() - .catch((e) => $.logErr(e)) - .finally(() => $.done()) - - -function getjctqWzBody() { - if ($request.url.match(/\/tq.xunsl.com\/v5\/article\/info.json/)||$request.url.match(/\/tq.xunsl.com\/v5\/article\/detail.json/)) { - bodyVal1 = $request.url.split('p=')[1] - console.log(encodeURIComponent(bodyVal1)) - bodyVal = 'p='+encodeURIComponent(bodyVal1) - console.log(bodyVal) - - - if (jctqWzBody) { - if (jctqWzBody.indexOf(bodyVal) > -1) { - $.log("此阅读请求已存在,本次跳过") - } else if (jctqWzBody.indexOf(bodyVal) == -1) { - jctqWzBodys = jctqWzBody + "&" + bodyVal; - $.setdata(jctqWzBodys, 'jctqWzBody'); - $.log(`${$.name}获取阅读: 成功, jctqWzBodys: ${bodyVal}`); - bodys = jctqWzBodys.split("&") - $.msg($.name, "获取第" + bodys.length + "个阅读请求: 成功🎉", ``) - } - } else { - $.setdata(bodyVal, 'jctqWzBody'); - $.log(`${$.name}获取阅读: 成功, jctqWzBodys: ${bodyVal}`); - $.msg($.name, `获取第一个阅读请求: 成功🎉`, ``) - } - } - - } -//阅读文章奖励 -function wzjl(timeout = 0) { - return new Promise((resolve) => { - let url = { - url : 'https://tq.xunsl.com/v5/article/complete.json', - headers : jctqWzHeader, - body : jctqWzBody1,}//xsgbody,} - $.post(url, async (err, resp, data) => { - try { - - const result = JSON.parse(data) - if(result.items.read_score){ - if(result.items.read_score == 0){ - console.log('\n获得0金币,下一篇') - $.skipFlag = 1 - }else{ - console.log('\n浏览文章成功,获得:'+result.items.read_score + '金币') - $.skipFlag = 0 - } - }else{ - console.log('\n看太久了,换一篇试试') - $.skipFlag = 1 - } - } catch (e) { - } finally { - resolve() - } - },timeout) - }) -} - - -function getjctqTimeBody() { - if ($request.url.match(/\/tq.xunsl.com\/v5\/user\/stay.json/)) { - bodyVal=$request.body - console.log(bodyVal) - if (jctqTimeBody) { - if (jctqTimeBody.indexOf(bodyVal) > -1) { - $.log("此阅读时长请求已存在,本次跳过") - } else if (jctqTimeBody.indexOf(bodyVal) == -1) { - jctqTimeBodys = jctqTimeBody + "&" + bodyVal; - $.setdata(jctqTimeBodys,'jctqTimeBody'); - $.log(`${$.name}获取阅读: 成功, jctqTimeBodys: ${bodyVal}`); - bodys = jctqTimeBodys.split("&") - $.msg($.name, "获取第" + bodys.length + "个阅读时长请求: 成功🎉", ``) - } - } else { - $.setdata($request.body,'jctqTimeBody'); - $.log(`${$.name}获取阅读: 成功, jctqTimeBodys: ${bodyVal}`); - $.msg($.name, `获取第一个阅读时长请求: 成功🎉`, ``) - } - } -} - -function timejl(timeout = 0) { - return new Promise((resolve) => { - let url = { - url : 'https://tq.xunsl.com/v5/user/stay.json', - headers : jctqTimeHeader, - body : jctqTimeBody1,}//xsgbody,} - $.post(url, async (err, resp, data) => { - try { - - const result = JSON.parse(data) - if(result.success === true ){ - console.log('\n阅读时长:'+result.time + '秒') - }else{ - console.log('\n更新阅读时长失败') - } - } catch (e) { - } finally { - resolve() - } - },timeout) - }) -} - -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("",`\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)})}}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)} From edc02ef8dd10e9c9558cada00dc20ed2152310ef Mon Sep 17 00:00:00 2001 From: Leaf <444653703@qq.com> Date: Wed, 17 Nov 2021 16:12:33 +0800 Subject: [PATCH 13/35] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E6=96=B0=E8=AE=A2?= =?UTF-8?q?=E9=98=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- jctq/jctq_rewrite_subscribe.json | 102 +++++++++++++++++++++++++++++++ 1 file changed, 102 insertions(+) create mode 100644 jctq/jctq_rewrite_subscribe.json diff --git a/jctq/jctq_rewrite_subscribe.json b/jctq/jctq_rewrite_subscribe.json new file mode 100644 index 0000000..c38e922 --- /dev/null +++ b/jctq/jctq_rewrite_subscribe.json @@ -0,0 +1,102 @@ +{ + "name": "晶彩天气重写订阅", + "type": "rewrite", + "note": "仅供参考", + "author": "leaf", + "resource": "jctq_rewrite_subscribe.json", + "mitmhost": [ + "tq.xunsl.com" + ], + "rewrite": [ + { + "match": "https://tq.xunsl.com/v17/NewTask/getTaskListByWeather.json", + "target": "https://raw.githubusercontent.com/leafxcy/JavaScript/main/jctq/jctq_rewrite.js", + "enable": true + }, + { + "match": "https://tq.xunsl.com/v5/CommonReward/toGetReward.json", + "target": "https://raw.githubusercontent.com/leafxcy/JavaScript/main/jctq/jctq_rewrite.js", + "enable": true + }, + { + "match": "https://tq.xunsl.com/v5/article/info.json", + "target": "https://raw.githubusercontent.com/leafxcy/JavaScript/main/jctq/jctq_rewrite.js", + "enable": true + }, + { + "match": "https://tq.xunsl.com/v5/article/detail.json", + "target": "https://raw.githubusercontent.com/leafxcy/JavaScript/main/jctq/jctq_rewrite.js", + "enable": true + }, + { + "match": "https://tq.xunsl.com/v5/user/stay.json", + "target": "https://raw.githubusercontent.com/leafxcy/JavaScript/main/jctq/jctq_rewrite.js", + "enable": true + }, + { + "match": "https://tq.xunsl.com/v5/nameless/adlickstart.json", + "target": "https://raw.githubusercontent.com/leafxcy/JavaScript/main/jctq/jctq_rewrite.js", + "enable": true + }, + { + "match": "https://tq.xunsl.com/v5/wechat/withdraw2.json", + "target": "https://raw.githubusercontent.com/leafxcy/JavaScript/main/jctq/jctq_rewrite.js", + "enable": true + }, + { + "match": "https://tq.xunsl.com/v5/Weather/giveBoxOnWeather.json", + "target": "https://raw.githubusercontent.com/leafxcy/JavaScript/main/jctq/jctq_rewrite.js", + "enable": true + }, + { + "match": "https://tq.xunsl.com/v5/weather/giveTimeInterval.json", + "target": "https://raw.githubusercontent.com/leafxcy/JavaScript/main/jctq/jctq_rewrite.js", + "enable": true + } + ], + "task": { + "type": "skip", + "list": [ + { + "name": "晶彩天气看看赚", + "type": "cron", + "time": "30 9,20 * * *", + "job": { + "type": "runjs", + "target": "https://raw.githubusercontent.com/leafxcy/JavaScript/main/jctq/jctq_kkz.js" + }, + "running": true + }, + { + "name": "晶彩天气文章视频", + "type": "cron", + "time": "20 7,18 * * *", + "job": { + "type": "runjs", + "target": "https://raw.githubusercontent.com/leafxcy/JavaScript/main/jctq/jctq_read.js" + }, + "running": true + }, + { + "name": "晶彩天气日常任务", + "type": "cron", + "time": "15,45 * * * *", + "job": { + "type": "runjs", + "target": "https://raw.githubusercontent.com/leafxcy/JavaScript/main/jctq/jctq_daily.js" + }, + "running": true + }, + { + "name": "晶彩天气任务签到", + "type": "cron", + "time": "30 22 * * *", + "job": { + "type": "runjs", + "target": "https://raw.githubusercontent.com/leafxcy/JavaScript/main/jctq/jctq_reward.js" + }, + "running": true + } + ] + } +} \ No newline at end of file From 5d23364ebcd38045f625cdf2f2c4c189a0d58f7a Mon Sep 17 00:00:00 2001 From: Leaf <444653703@qq.com> Date: Wed, 17 Nov 2021 16:17:40 +0800 Subject: [PATCH 14/35] =?UTF-8?q?=E6=89=93=E5=BC=80=E7=9C=8B=E7=9C=8B?= =?UTF-8?q?=E8=B5=9A=E5=BC=80=E5=85=B3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- jctq/jctq_kkz.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/jctq/jctq_kkz.js b/jctq/jctq_kkz.js index b3acc30..1201419 100644 --- a/jctq/jctq_kkz.js +++ b/jctq/jctq_kkz.js @@ -41,11 +41,11 @@ let rewardAmount = 0 return } - /*for(let i=0; i Date: Wed, 17 Nov 2021 16:51:25 +0800 Subject: [PATCH 15/35] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E4=BB=BB=E5=8A=A1?= =?UTF-8?q?=E8=AE=A2=E9=98=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- jctq/jctq_task_subscribe.json | 48 +++++++++++++++++++++++++++++++++++ 1 file changed, 48 insertions(+) create mode 100644 jctq/jctq_task_subscribe.json diff --git a/jctq/jctq_task_subscribe.json b/jctq/jctq_task_subscribe.json new file mode 100644 index 0000000..4064c76 --- /dev/null +++ b/jctq/jctq_task_subscribe.json @@ -0,0 +1,48 @@ +{ + "name": "晶彩天气重写订阅", + "type": "rewrite", + "note": "仅供参考", + "author": "leaf", + "list": [ + { + "name": "晶彩天气看看赚", + "type": "cron", + "time": "30 9,20 * * *", + "job": { + "type": "runjs", + "target": "https://raw.githubusercontent.com/leafxcy/JavaScript/main/jctq/jctq_kkz.js" + }, + "running": true + }, + { + "name": "晶彩天气文章视频", + "type": "cron", + "time": "20 7,18 * * *", + "job": { + "type": "runjs", + "target": "https://raw.githubusercontent.com/leafxcy/JavaScript/main/jctq/jctq_read.js" + }, + "running": true + }, + { + "name": "晶彩天气日常任务", + "type": "cron", + "time": "15,45 * * * *", + "job": { + "type": "runjs", + "target": "https://raw.githubusercontent.com/leafxcy/JavaScript/main/jctq/jctq_daily.js" + }, + "running": true + }, + { + "name": "晶彩天气任务签到", + "type": "cron", + "time": "30 22 * * *", + "job": { + "type": "runjs", + "target": "https://raw.githubusercontent.com/leafxcy/JavaScript/main/jctq/jctq_reward.js" + }, + "running": true + } + ] +} \ No newline at end of file From f675af9344c5054af2f2ea011a137271c88c9839 Mon Sep 17 00:00:00 2001 From: Leaf <444653703@qq.com> Date: Wed, 17 Nov 2021 17:08:39 +0800 Subject: [PATCH 16/35] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E8=AE=A2=E9=98=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- jctq/jctq_rewrite_subscribe.json | 21 +++++++++++++-------- 1 file changed, 13 insertions(+), 8 deletions(-) diff --git a/jctq/jctq_rewrite_subscribe.json b/jctq/jctq_rewrite_subscribe.json index c38e922..d09930d 100644 --- a/jctq/jctq_rewrite_subscribe.json +++ b/jctq/jctq_rewrite_subscribe.json @@ -10,46 +10,55 @@ "rewrite": [ { "match": "https://tq.xunsl.com/v17/NewTask/getTaskListByWeather.json", + "stage": "req", "target": "https://raw.githubusercontent.com/leafxcy/JavaScript/main/jctq/jctq_rewrite.js", "enable": true }, { "match": "https://tq.xunsl.com/v5/CommonReward/toGetReward.json", + "stage": "req", "target": "https://raw.githubusercontent.com/leafxcy/JavaScript/main/jctq/jctq_rewrite.js", "enable": true }, { "match": "https://tq.xunsl.com/v5/article/info.json", + "stage": "req", "target": "https://raw.githubusercontent.com/leafxcy/JavaScript/main/jctq/jctq_rewrite.js", "enable": true }, { "match": "https://tq.xunsl.com/v5/article/detail.json", + "stage": "req", "target": "https://raw.githubusercontent.com/leafxcy/JavaScript/main/jctq/jctq_rewrite.js", "enable": true }, { "match": "https://tq.xunsl.com/v5/user/stay.json", + "stage": "req", "target": "https://raw.githubusercontent.com/leafxcy/JavaScript/main/jctq/jctq_rewrite.js", "enable": true }, { "match": "https://tq.xunsl.com/v5/nameless/adlickstart.json", + "stage": "req", "target": "https://raw.githubusercontent.com/leafxcy/JavaScript/main/jctq/jctq_rewrite.js", "enable": true }, { "match": "https://tq.xunsl.com/v5/wechat/withdraw2.json", + "stage": "req", "target": "https://raw.githubusercontent.com/leafxcy/JavaScript/main/jctq/jctq_rewrite.js", "enable": true }, { "match": "https://tq.xunsl.com/v5/Weather/giveBoxOnWeather.json", + "stage": "req", "target": "https://raw.githubusercontent.com/leafxcy/JavaScript/main/jctq/jctq_rewrite.js", "enable": true }, { "match": "https://tq.xunsl.com/v5/weather/giveTimeInterval.json", + "stage": "req", "target": "https://raw.githubusercontent.com/leafxcy/JavaScript/main/jctq/jctq_rewrite.js", "enable": true } @@ -64,8 +73,7 @@ "job": { "type": "runjs", "target": "https://raw.githubusercontent.com/leafxcy/JavaScript/main/jctq/jctq_kkz.js" - }, - "running": true + } }, { "name": "晶彩天气文章视频", @@ -74,8 +82,7 @@ "job": { "type": "runjs", "target": "https://raw.githubusercontent.com/leafxcy/JavaScript/main/jctq/jctq_read.js" - }, - "running": true + } }, { "name": "晶彩天气日常任务", @@ -84,8 +91,7 @@ "job": { "type": "runjs", "target": "https://raw.githubusercontent.com/leafxcy/JavaScript/main/jctq/jctq_daily.js" - }, - "running": true + } }, { "name": "晶彩天气任务签到", @@ -94,8 +100,7 @@ "job": { "type": "runjs", "target": "https://raw.githubusercontent.com/leafxcy/JavaScript/main/jctq/jctq_reward.js" - }, - "running": true + } } ] } From c5b34a02370988f5085bcdec8a79bc3f956e8cc5 Mon Sep 17 00:00:00 2001 From: Leaf <444653703@qq.com> Date: Thu, 18 Nov 2021 10:36:30 +0800 Subject: [PATCH 17/35] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E6=99=B6=E5=BD=A9?= =?UTF-8?q?=E5=A4=A9=E6=B0=94=E5=88=86=E4=BA=AB=E9=98=85=E8=AF=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- shangtuo.jpg => bak/shangtuo.jpg | Bin shangtuo.js => bak/shangtuo.js | 0 jctq/jctq_shareRead.js | 329 +++++++++++++++++++++++++++++++ 3 files changed, 329 insertions(+) rename shangtuo.jpg => bak/shangtuo.jpg (100%) rename shangtuo.js => bak/shangtuo.js (100%) create mode 100644 jctq/jctq_shareRead.js diff --git a/shangtuo.jpg b/bak/shangtuo.jpg similarity index 100% rename from shangtuo.jpg rename to bak/shangtuo.jpg diff --git a/shangtuo.js b/bak/shangtuo.js similarity index 100% rename from shangtuo.js rename to bak/shangtuo.js diff --git a/jctq/jctq_shareRead.js b/jctq/jctq_shareRead.js new file mode 100644 index 0000000..a9bd90a --- /dev/null +++ b/jctq/jctq_shareRead.js @@ -0,0 +1,329 @@ +/* +安卓:晶彩天气(v8.3.7) + +转发和分享阅读,请勿贪心,小心黑号 +*/ + +const jsname = '晶彩天气分享阅读' +const $ = Env(jsname) +const notifyFlag = 1; //0为关闭通知,1为打开通知,默认为1 +const logDebug = 0 + +//const notify = $.isNode() ? require('./sendNotify') : ''; +let notifyStr = '' + +let rndtime = "" //毫秒 +let httpResult //global buffer + +let jctqCookie = ($.isNode() ? process.env.jctqCookie : $.getdata('jctqCookie')) || ''; +let jctqCookieArr = [] + +let userCk = '' +let readCount = 0 + +let jctqShareNum = ($.isNode() ? process.env.jctqShareNum : $.getdata('jctqShareNum')) || 0; + +let newsItem = '' +let UserAgent = '' +let si = '' +let iosVer = ['13_4_5', '13_4_1', '13_4', '13_3_1', '13_3', '13_2_3', '13_2_2', '13_2', '13_1_3', '13_1_2', '13_1_1', '13_1', '13_0', '12_4_1', '12_4', '12_3_1', '12_3', '12_2', '12_1_4', '12_1_3', '12_1_2', '12_1_1', '12_1', '12_0_1', '12_0', '11_4_1', '11_4', '11_3_1', '11_3', '11_2_6', '11_2_5', '11_2_2', '11_2_1', '11_2', '11_1_2', '11_1_1', '11_1', '11_0_3', '11_0_2', '11_0_1', '11_0', '10_3_3', '10_3_2', '10_3_1', '10_3', '10_2_1', '10_2', '10_1_1', '10_1', '10_0_2', '10_0_1', '9_3_5', '9_3_4', '9_3_3', '9_3_2', '9_3_1', '9_3', '9_2_1', '9_2', '9_1', '9_0_2', '9_0_1'] + +/////////////////////////////////////////////////////////////////// + +!(async () => { + + if(typeof $request !== "undefined") + { + $.msg(jsname+': 此脚本不做重写,请检查重写设置') + } + else + { + if(!(await checkEnv())){ + return + } + + for(let j=0; j maxWaitTime ? maxWaitTime : seedFactor + let randomTime = Math.floor(Math.random()*seedFactor) + 1000 + let second = Math.floor(randomTime/1000) + let idx = Math.floor(Math.random()*iosVer.length) + UserAgent = `'Mozilla/5.0 (iPhone; CPU iPhone OS ${iosVer[idx]} like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148 MicroMessenger/8.0.16(0x1800102c) NetType/WIFI Language/zh_CN'` + si = randomString(32) + console.log(`--随机延迟${second}秒后开始模拟第${readCount}次分享阅读`) + await $.wait(randomTime) + console.log(`----模拟第${readCount}次阅读,使用si=${si}`) + await shareReadStep1() + await $.wait(Math.floor(Math.random()*500)+500) + await shareReadStep2() + await $.wait(Math.floor(Math.random()*1000)+2000) + await shareReadStep3() + await $.wait(Math.floor(Math.random()*1000)+2000) + await shareReadStep4() + console.log(`----模拟第${readCount}次阅读完成`) + } + + } + } + } + + +})() +.catch((e) => $.logErr(e)) +.finally(() => $.done()) + +//通知 +async function showmsg() { + + notifyBody = jsname + "运行通知\n\n" + notifyStr + + if (notifyFlag != 1) { + console.log(notifyBody); + } + + if (notifyFlag == 1) { + $.msg(notifyBody); + //if ($.isNode()){await notify.sendNotify($.name, notifyBody );} + } +} + +async function checkEnv() { + + if(jctqShareNum == 0) { + console.log('当前分享次数设置为0。如果需要开启分享阅读,请设置环境变量jctqShareNum为要被阅读的次数。') + return false + } + + if(jctqCookie) { + if(jctqCookie.indexOf('@') > -1) { + let jctqCookies = jctqCookie.split('@') + for(let i=0; i { + $.post(url, async (err, resp, data) => { + try { + if (err) { + console.log(caller + ": post请求失败"); + console.log(JSON.stringify(err)); + $.logErr(err); + } else { + if (safeGet(data)) { + httpResult = JSON.parse(data,caller); + if(logDebug) console.log(httpResult); + } + } + } catch (e) { + $.logErr(e, resp); + } finally { + resolve(); + } + }); + }); +} + +async function httpGet(url,caller) { + httpResult = null + return new Promise((resolve) => { + $.get(url, async (err, resp, data) => { + try { + if (err) { + console.log(caller + ": get请求失败"); + console.log(JSON.stringify(err)); + $.logErr(err); + } else { + // + } + } catch (e) { + $.logErr(e, resp); + } finally { + resolve(); + } + }); + }); +} + +function safeGet(data,caller) { + try { + if (typeof JSON.parse(data) == "object") { + return true; + } else { + console.log(`Function ${caller}: 未知错误`); + console.log(data) + } + } catch (e) { + console.log(e); + console.log(`Function ${caller}: 服务器访问数据为空,请检查自身设备网络情况`); + return false; + } +} + +function printCaller(){ + return (new Error()).stack.split("\n")[2].trim().split(" ")[1] +} + +function Env(t, e) { 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("", `\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) }) } } 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) } From 3827faa3a7556f1a48f8cc711b3985c80ad2cdd9 Mon Sep 17 00:00:00 2001 From: Leaf <444653703@qq.com> Date: Thu, 18 Nov 2021 11:38:37 +0800 Subject: [PATCH 18/35] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E9=9A=8F=E6=9C=BA?= =?UTF-8?q?=E5=BB=B6=E8=BF=9F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- jctq/jctq_shareRead.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/jctq/jctq_shareRead.js b/jctq/jctq_shareRead.js index a9bd90a..dc44aaf 100644 --- a/jctq/jctq_shareRead.js +++ b/jctq/jctq_shareRead.js @@ -60,7 +60,7 @@ let iosVer = ['13_4_5', '13_4_1', '13_4', '13_3_1', '13_3', '13_2_3', '13_2_2', let minWaitTime = 30000 let seedFactor = minWaitTime + 10000*(i+1) let factor = seedFactor > maxWaitTime ? maxWaitTime : seedFactor - let randomTime = Math.floor(Math.random()*seedFactor) + 1000 + let randomTime = Math.floor(Math.random()*factor) + 1000 let second = Math.floor(randomTime/1000) let idx = Math.floor(Math.random()*iosVer.length) UserAgent = `'Mozilla/5.0 (iPhone; CPU iPhone OS ${iosVer[idx]} like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148 MicroMessenger/8.0.16(0x1800102c) NetType/WIFI Language/zh_CN'` From f69bb69eee7004f44a32fac1f573bc10b64d1600 Mon Sep 17 00:00:00 2001 From: Leaf <444653703@qq.com> Date: Thu, 18 Nov 2021 12:56:14 +0800 Subject: [PATCH 19/35] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E5=A4=9A=E7=94=A8?= =?UTF-8?q?=E6=88=B7=EF=BC=8C=E4=BF=AE=E5=A4=8D=E7=AD=BE=E5=88=B0=E7=BF=BB?= =?UTF-8?q?=E5=80=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- jctq/jctq_daily.js | 99 +++++++++++++--------- jctq/jctq_reward.js | 139 +++++++++++++++++++++++-------- jctq/jctq_rewrite.js | 59 ++++++++++--- jctq/jctq_rewrite_subscribe.json | 6 ++ 4 files changed, 215 insertions(+), 88 deletions(-) diff --git a/jctq/jctq_daily.js b/jctq/jctq_daily.js index b22a9c0..76308f1 100644 --- a/jctq/jctq_daily.js +++ b/jctq/jctq_daily.js @@ -16,10 +16,13 @@ let notifyStr = '' let rndtime = "" //毫秒 let httpResult //global buffer +let userCookie = '' + let jctqCookie = ($.isNode() ? process.env.jctqCookie : $.getdata('jctqCookie')) || ''; let jctqBubbleBody = ($.isNode() ? process.env.jctqBubbleBody : $.getdata('jctqBubbleBody')) || ''; let jctqGiveBoxBody = ($.isNode() ? process.env.jctqGiveBoxBody : $.getdata('jctqGiveBoxBody')) || ''; +let jctqCookieArr = [] let jctqBubbleBodyArr = [] let jctqGiveBoxBodyArr = [] @@ -39,20 +42,28 @@ let refRotory = 'https://tq.xunsl.com/html/rotaryTable/index.html?keyword_wyq=wo { await checkEnv() - await queryShareStatus() - await $.wait(1000) - - await queryGiveBoxStatus() - await $.wait(1000) - - await queryBubbleStatus() - await $.wait(1000) + numBoxbody = jctqCookieArr.length + console.log(`找到${numBoxbody}个cookie`) - await getTaskListByWeather() - await $.wait(1000) - - await queryRotaryTable() - await $.wait(1000) + for(let i=0; i -1) { - jctqCookies = jctqCookie.split('@') - jctqCookie = jctqCookies[0] - console.log('检测到多于一个jctqCookie,开始跑第一个账户。请注意本脚本只支持单账户,如需多账户请自行修改。') - } - if(jctqCookie.indexOf('cookie=') == -1 && jctqCookie.indexOf('zqkey=') > -1) { - jctqCookie = jctqCookie.replace(/zqkey=/, "cookie=") - } - if(jctqCookie.indexOf('cookie_id=') == -1 && jctqCookie.indexOf('zqkey_id=') > -1) { - jctqCookie = jctqCookie.replace(/zqkey_id=/, "cookie_id=") - } - if(jctqCookie.indexOf('app_version=') == -1) { - jctqCookie = 'app_version=8.3.7&' + jctqCookie + if(jctqCookie.indexOf('&') > -1) { + let jctqCookies = jctqCookie.split('@') + for(let i=0; i 0 && jctqWithdraw) { - await withdraw() - await $.wait(1000) + numBoxbody = jctqSignDoubleBodyArr.length + console.log(`找到${numBoxbody}个签到翻倍body`) + + for(let i=0; i 0 && jctqWithdrawArr.length > 0) { + numBoxbody = jctqWithdrawArr.length + console.log(`找到${numBoxbody}个提现body`) + + for(let i=0; i -1) { - jctqCookies = jctqCookie.split('@') - jctqCookie = jctqCookies[0] - console.log('检测到多于一个jctqCookie,开始跑第一个账户。请注意本脚本只支持单账户,如需多账户请自行修改。') - } - if(jctqCookie.indexOf('cookie=') == -1 && jctqCookie.indexOf('zqkey=') > -1) { - jctqCookie = jctqCookie.replace(/zqkey=/, "cookie=") - } - if(jctqCookie.indexOf('cookie_id=') == -1 && jctqCookie.indexOf('zqkey_id=') > -1) { - jctqCookie = jctqCookie.replace(/zqkey_id=/, "cookie_id=") - } - if(jctqCookie.indexOf('app_version=') == -1) { - jctqCookie = 'app_version=8.3.7&' + jctqCookie + if(jctqCookie.indexOf('&') > -1) { + let jctqCookies = jctqCookie.split('@') + for(let i=0; i -1) { - jctqWithdraws = jctqWithdraw.split('@') - jctqWithdraw = jctqWithdraws[0] - console.log('检测到多于一个提现body,使用第一个body') + if(jctqWithdraw) { + if(jctqWithdraw.indexOf('&') > -1) { + let jctqWithdraws = jctqWithdraw.split('&') + for(let i=0; i -1) { + let jctqSignDoubleBodys = jctqSignDoubleBody.split('&') + for(let i=0; i -1) { - $.msg(jsname+` 已获取过此用户的jctqCookie`) + + if(jctqCookie) { + if(jctqCookie.indexOf(uidStr) > -1) { + $.msg(jsname+` 此jctqCookie已存在,本次跳过`) + } else { + jctqCookie = jctqCookie + '&' + newCookie + $.setdata(jctqCookie, 'jctqCookie'); + bodyList = jctqCookie.split('&') + $.msg(jsname+` 获取第${bodyList.length}个jctqCookie成功`) + } } else { - jctqCookie = `app_version=${app_version}&cookie=${zqkey}&cookie_id=${zqkey_id}&uid=${uid}` - $.setdata(jctqCookie, 'jctqCookie'); - $.msg(jsname+` 获取jctqCookie成功`) + $.setdata(newCookie, 'jctqCookie'); + $.msg(jsname+` 获取第1个jctqCookie成功`) } } @@ -146,8 +153,19 @@ async function getRewrite() { if($request.url.indexOf('v5/wechat/withdraw2.json') > -1) { rBody = $request.body - $.setdata(rBody, 'jctqWithdraw'); - $.msg(jsname+` 获取提现body成功`) + if(jctqWithdraw) { + if(jctqWithdraw.indexOf(rBody) > -1) { + $.msg(jsname+` 此提现body已存在,本次跳过`) + } else { + jctqWithdraw = jctqWithdraw + '&' + rBody + $.setdata(jctqWithdraw, 'jctqWithdraw'); + bodyList = jctqWithdraw.split('&') + $.msg(jsname+` 获取第${bodyList.length}个提现body成功`) + } + } else { + $.setdata(rBody, 'jctqWithdraw'); + $.msg(jsname+` 获取第1个提现body成功`) + } } if($request.url.indexOf('v5/Weather/giveBoxOnWeather.json') > -1) { @@ -183,6 +201,23 @@ async function getRewrite() { $.msg(jsname+` 获取第1个首页气泡/翻倍body成功`) } } + + if($request.url.indexOf('v5/CommonReward/toDouble.json') > -1) { + rBody = $request.body + if(jctqSignDoubleBody) { + if(jctqSignDoubleBody.indexOf(rBody) > -1) { + $.msg(jsname+` 此签到翻倍body已存在,本次跳过`) + } else { + jctqSignDoubleBody = jctqSignDoubleBody + '&' + rBody + $.setdata(jctqSignDoubleBody, 'jctqSignDoubleBody'); + bodyList = jctqSignDoubleBody.split('&') + $.msg(jsname+` 获取第${bodyList.length}个签到翻倍body成功`) + } + } else { + $.setdata(rBody, 'jctqSignDoubleBody'); + $.msg(jsname+` 获取第1个签到翻倍body成功`) + } + } } //////////////////////////////////////////////////////////////////// diff --git a/jctq/jctq_rewrite_subscribe.json b/jctq/jctq_rewrite_subscribe.json index d09930d..03d415b 100644 --- a/jctq/jctq_rewrite_subscribe.json +++ b/jctq/jctq_rewrite_subscribe.json @@ -61,6 +61,12 @@ "stage": "req", "target": "https://raw.githubusercontent.com/leafxcy/JavaScript/main/jctq/jctq_rewrite.js", "enable": true + }, + { + "match": "https://tq.xunsl.com/v5/CommonReward/toDouble.json", + "stage": "req", + "target": "https://raw.githubusercontent.com/leafxcy/JavaScript/main/jctq/jctq_rewrite.js", + "enable": true } ], "task": { From 42cc1fabff3f8d84b0254d645d3cfdecec50a61d Mon Sep 17 00:00:00 2001 From: Leaf <444653703@qq.com> Date: Thu, 18 Nov 2021 15:28:00 +0800 Subject: [PATCH 20/35] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E5=A4=9A=E8=B4=A6?= =?UTF-8?q?=E5=8F=B7=E9=97=AE=E9=A2=98=EF=BC=8C=E4=BF=AE=E5=A4=8D=E6=8F=90?= =?UTF-8?q?=E7=8E=B0bug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- jctq/jctq_kkz.js | 46 +++++++++++++++++++++++++++++--------------- jctq/jctq_reward.js | 8 ++++---- jctq/jctq_rewrite.js | 5 +++-- 3 files changed, 38 insertions(+), 21 deletions(-) diff --git a/jctq/jctq_kkz.js b/jctq/jctq_kkz.js index 1201419..9f51720 100644 --- a/jctq/jctq_kkz.js +++ b/jctq/jctq_kkz.js @@ -18,8 +18,12 @@ let httpResult //global buffer let jctqCookie = ($.isNode() ? process.env.jctqCookie : $.getdata('jctqCookie')) || ''; let jctqLookStartbody = ($.isNode() ? process.env.jctqLookStartbody : $.getdata('jctqLookStartbody')) || ''; + +let jctqCookieArr = [] let jctqLookStartbodyArr = [] +let userCookie = '' + let bannerIdList = [] let duplicatedCount = 0 let invalidCount = 0 @@ -47,7 +51,11 @@ let rewardAmount = 0 await $.wait(200) } - await getBoxRewardConf() + for(let i=0; i -1) { - jctqCookies = jctqCookie.split('@') - jctqCookie = jctqCookies[0] - console.log('检测到多于一个jctqCookie,开始跑第一个账户。请注意本脚本只支持单账户,如需多账户请自行修改。') - } - if(jctqCookie.indexOf('cookie=') == -1 && jctqCookie.indexOf('zqkey=') > -1) { - jctqCookie = jctqCookie.replace(/zqkey=/, "cookie=") - } - if(jctqCookie.indexOf('cookie_id=') == -1 && jctqCookie.indexOf('zqkey_id=') > -1) { - jctqCookie = jctqCookie.replace(/zqkey_id=/, "cookie_id=") - } - if(jctqCookie.indexOf('app_version=') == -1) { - jctqCookie = 'app_version=8.3.7&' + jctqCookie + let jctqCookies = jctqCookie.split('@') + for(let i=0; i 0 && jctqWithdrawArr.length > 0) { + if(jctqWithdrawFlag > 0 && jctqWithdrawArr.length > 0) { numBoxbody = jctqWithdrawArr.length console.log(`找到${numBoxbody}个提现body`) @@ -74,7 +74,7 @@ let withdrawSuccess = 0 await withdraw(withBody) await $.wait(1000) } - } else if(jctqWithdraw == 0) { + } else if(jctqWithdrawFlag == 0) { console.log(`你设置了不自动提现`) } else if(jctqWithdrawArr.length == 0) { console.log(`没有找到提现body`) @@ -116,7 +116,7 @@ async function showmsg() { async function checkEnv() { if(jctqCookie) { - if(jctqCookie.indexOf('&') > -1) { + if(jctqCookie.indexOf('@') > -1) { let jctqCookies = jctqCookie.split('@') for(let i=0; i -1) { $.msg(jsname+` 此jctqCookie已存在,本次跳过`) } else { - jctqCookie = jctqCookie + '&' + newCookie + jctqCookie = jctqCookie + '@' + newCookie $.setdata(jctqCookie, 'jctqCookie'); - bodyList = jctqCookie.split('&') + bodyList = jctqCookie.split('@') $.msg(jsname+` 获取第${bodyList.length}个jctqCookie成功`) } } else { From ddb2096e1436e1da49c18eb68c53829778bc1af8 Mon Sep 17 00:00:00 2001 From: Leaf <444653703@qq.com> Date: Thu, 18 Nov 2021 15:41:43 +0800 Subject: [PATCH 21/35] Create README.md --- jctq/README.md | 1 + 1 file changed, 1 insertion(+) create mode 100644 jctq/README.md diff --git a/jctq/README.md b/jctq/README.md new file mode 100644 index 0000000..9daeafb --- /dev/null +++ b/jctq/README.md @@ -0,0 +1 @@ +test From 70a3448ae5be57e238fdf16924c34346f92bc4b8 Mon Sep 17 00:00:00 2001 From: Leaf <444653703@qq.com> Date: Thu, 18 Nov 2021 15:49:23 +0800 Subject: [PATCH 22/35] Update README.md --- jctq/README.md | 23 ++++++++++++++++++++++- 1 file changed, 22 insertions(+), 1 deletion(-) diff --git a/jctq/README.md b/jctq/README.md index 9daeafb..fd71e30 100644 --- a/jctq/README.md +++ b/jctq/README.md @@ -1 +1,22 @@ -test +# 晶彩天气(v8.3.7) + +## 重写: +https://tq.xunsl.com/v17/NewTask/getTaskListByWeather.json -- 点开福利页即可获取jctqCookie +https://tq.xunsl.com/v5/CommonReward/toGetReward.json -- 签到,和福利页任务奖励 +https://tq.xunsl.com/v5/article/info.json -- 点开文章获取文章body +https://tq.xunsl.com/v5/article/detail.json -- 点开视频获取视频body +https://tq.xunsl.com/v5/user/stay.json -- 阅读文章或者看视频一段时间后可以获取到时长body +https://tq.xunsl.com/v5/nameless/adlickstart.json -- 点开看看赚获取body,可以一直开着,脚本会自动删除重复和失效body +https://tq.xunsl.com/v5/Weather/giveBoxOnWeather.json -- 点开福利页浮窗宝箱和观看翻倍视频获取body +https://tq.xunsl.com/v5/weather/giveTimeInterval.json -- 点开首页气泡红包和观看翻倍视频获取body +https://tq.xunsl.com/v5/wechat/withdraw2.json -- 提现一次对应金额获取body +https://tq.xunsl.com/v5/CommonReward/toDouble.json -- 领取签到翻倍奖励后可获取 + +## 任务: +jctq_daily.js -- 领转发页定时宝箱,领福利页定时宝箱,领首页气泡红包,时段转发,刷福利视频,抽奖5次 +jctq_reward.js -- 签到和翻倍,任务奖励领取,统计今日收益,自动提现 +jctq_kkz.js -- 完成看看赚任务,删除重复和失效的body +jctq_read.js -- 阅读文章,浏览视频 + +## 分享阅读: +jctq_shareRead.js -- 分享和助力阅读,需要在环境变量jctqShareNum里设置要被阅读的次数,不设置默认不跑 From 20f33d0a2fae059f584b85d5170b7e5ad55376e2 Mon Sep 17 00:00:00 2001 From: Leaf <444653703@qq.com> Date: Thu, 18 Nov 2021 16:25:16 +0800 Subject: [PATCH 23/35] =?UTF-8?q?=E4=B8=8D=E5=86=8D=E5=88=A0=E9=99=A4?= =?UTF-8?q?=E5=A4=B1=E6=95=88=E7=9A=84=E7=9C=8B=E7=9C=8B=E8=B5=9Abody?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- jctq/README.md | 2 +- jctq/jctq_kkz.js | 4 ---- 2 files changed, 1 insertion(+), 5 deletions(-) diff --git a/jctq/README.md b/jctq/README.md index fd71e30..2e15bfb 100644 --- a/jctq/README.md +++ b/jctq/README.md @@ -6,7 +6,7 @@ https://tq.xunsl.com/v5/CommonReward/toGetReward.json -- 签到,和福 https://tq.xunsl.com/v5/article/info.json -- 点开文章获取文章body https://tq.xunsl.com/v5/article/detail.json -- 点开视频获取视频body https://tq.xunsl.com/v5/user/stay.json -- 阅读文章或者看视频一段时间后可以获取到时长body -https://tq.xunsl.com/v5/nameless/adlickstart.json -- 点开看看赚获取body,可以一直开着,脚本会自动删除重复和失效body +https://tq.xunsl.com/v5/nameless/adlickstart.json -- 点开看看赚获取body,可以一直开着,脚本会自动删除重复body https://tq.xunsl.com/v5/Weather/giveBoxOnWeather.json -- 点开福利页浮窗宝箱和观看翻倍视频获取body https://tq.xunsl.com/v5/weather/giveTimeInterval.json -- 点开首页气泡红包和观看翻倍视频获取body https://tq.xunsl.com/v5/wechat/withdraw2.json -- 提现一次对应金额获取body diff --git a/jctq/jctq_kkz.js b/jctq/jctq_kkz.js index 9f51720..9efcb3c 100644 --- a/jctq/jctq_kkz.js +++ b/jctq/jctq_kkz.js @@ -26,7 +26,6 @@ let userCookie = '' let bannerIdList = [] let duplicatedCount = 0 -let invalidCount = 0 let finishCount = 0 let rewardAmount = 0 @@ -157,8 +156,6 @@ async function adlickstart(lookStartBody,idx) { console.log(`第${idx+1}次看看赚任务[id:${bannerId}]重复`) } } else { - invalidCount++ - await removeBody(lookStartBody) console.log(`激活第${idx+1}个看看赚失败:${result.message}`) } } @@ -268,7 +265,6 @@ async function getStatus() { notifyStr += `本次运行情况:\n` notifyStr += `共完成了${finishCount}个看看赚任务,获得${rewardAmount}金币\n` if(duplicatedCount > 0) notifyStr += `删除了${duplicatedCount}个重复的body\n` - if(invalidCount > 0) notifyStr += `删除了${invalidCount}个无效的body\n` } //////////////////////////////////////////////////////////////////// From 0289f091e120c935301d4c06414d3b1bb81ea0ba Mon Sep 17 00:00:00 2001 From: Leaf <444653703@qq.com> Date: Fri, 19 Nov 2021 22:26:57 +0800 Subject: [PATCH 24/35] =?UTF-8?q?=E5=8E=BB=E6=8E=89=E5=8E=BB=E9=87=8D?= =?UTF-8?q?=E5=8A=9F=E8=83=BD=EF=BC=8C=E4=BF=AE=E5=A4=8D=E5=A4=9A=E8=B4=A6?= =?UTF-8?q?=E6=88=B7=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- jctq/jctq_kkz.js | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/jctq/jctq_kkz.js b/jctq/jctq_kkz.js index 9efcb3c..8f4d5a7 100644 --- a/jctq/jctq_kkz.js +++ b/jctq/jctq_kkz.js @@ -25,7 +25,7 @@ let jctqLookStartbodyArr = [] let userCookie = '' let bannerIdList = [] -let duplicatedCount = 0 +//let duplicatedCount = 0 let finishCount = 0 let rewardAmount = 0 @@ -137,7 +137,7 @@ async function adlickstart(lookStartBody,idx) { if(result.success == true) { let bannerId = result.items.banner_id - if(await checkDuplicated(lookStartBody,bannerId)) { + //if(await checkDuplicated(lookStartBody,bannerId)) { if(result.items.comtele_state == 1) { console.log(`第${idx+1}个看看赚[id:${bannerId}]已完成`) } else { @@ -152,9 +152,9 @@ async function adlickstart(lookStartBody,idx) { await $.wait(1000) await adlickend(lookStartBody,idx) } - } else { - console.log(`第${idx+1}次看看赚任务[id:${bannerId}]重复`) - } + //} else { + // console.log(`第${idx+1}次看看赚任务[id:${bannerId}]重复`) + //} } else { console.log(`激活第${idx+1}个看看赚失败:${result.message}`) } @@ -240,6 +240,7 @@ async function getBoxReward(id) { } //看看赚去重 +/* async function checkDuplicated(lookStartBody,bannerId) { for(let i=0; i 0) notifyStr += `删除了${duplicatedCount}个重复的body\n` } //////////////////////////////////////////////////////////////////// From e65056a7391538b042c373bc100c55d47aed4f0b Mon Sep 17 00:00:00 2001 From: Leaf <444653703@qq.com> Date: Sat, 20 Nov 2021 22:22:58 +0800 Subject: [PATCH 25/35] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E5=88=86=E4=BA=AB?= =?UTF-8?q?=E9=98=85=E8=AF=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- jckd/jckd_shareRead.js | 324 +++++++++++++++++++++++++++ jctq/jctq_rewrite_subscribe.json.bak | 102 +++++++++ jctq/jctq_shareRead.js | 4 +- zqkd/zqkd_shareRead.js | 324 +++++++++++++++++++++++++++ 4 files changed, 751 insertions(+), 3 deletions(-) create mode 100644 jckd/jckd_shareRead.js create mode 100644 jctq/jctq_rewrite_subscribe.json.bak create mode 100644 zqkd/zqkd_shareRead.js diff --git a/jckd/jckd_shareRead.js b/jckd/jckd_shareRead.js new file mode 100644 index 0000000..b41c330 --- /dev/null +++ b/jckd/jckd_shareRead.js @@ -0,0 +1,324 @@ +/* +安卓:晶彩看点 + +转发和分享阅读,请勿贪心,小心黑号 +*/ + +const jsname = '晶彩看点分享阅读' +const $ = Env(jsname) +const notifyFlag = 1; //0为关闭通知,1为打开通知,默认为1 +const logDebug = 0 + +//const notify = $.isNode() ? require('./sendNotify') : ''; +let notifyStr = '' + +let rndtime = "" //毫秒 +let httpResult //global buffer + +let jckdCookie = ($.isNode() ? process.env.jc_cookie : $.getdata('jc_cookie')) || ''; +let jckdCookieArr = [] + +let userCk = '' +let readCount = 0 + +let jckdShareNum = ($.isNode() ? process.env.jckdShareNum : $.getdata('jckdShareNum')) || 0; + +let newsItem = '' +let UserAgent = '' +let si = '' + +/////////////////////////////////////////////////////////////////// + +!(async () => { + + if(typeof $request !== "undefined") + { + $.msg(jsname+': 此脚本不做重写,请检查重写设置') + } + else + { + if(!(await checkEnv())){ + return + } + + for(let j=0; j maxWaitTime ? maxWaitTime : seedFactor + let randomTime = Math.floor(Math.random()*factor) + 1000 + let second = Math.floor(randomTime/1000) + UserAgent = '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.16(0x1800102c) NetType/WIFI Language/zh_CN' + si = randomString(32) + console.log(`--随机延迟${second}秒后开始模拟第${readCount}次分享阅读`) + await $.wait(randomTime) + console.log(`----模拟第${readCount}次阅读,使用si=${si}`) + await shareReadStep1() + await $.wait(Math.floor(Math.random()*500)+500) + await shareReadStep2() + await $.wait(Math.floor(Math.random()*1000)+2000) + await shareReadStep3() + await $.wait(Math.floor(Math.random()*1000)+2000) + await shareReadStep4() + console.log(`----模拟第${readCount}次阅读完成`) + } + + } + } + } + + +})() +.catch((e) => $.logErr(e)) +.finally(() => $.done()) + +//通知 +async function showmsg() { + + notifyBody = jsname + "运行通知\n\n" + notifyStr + + if (notifyFlag != 1) { + console.log(notifyBody); + } + + if (notifyFlag == 1) { + $.msg(notifyBody); + //if ($.isNode()){await notify.sendNotify($.name, notifyBody );} + } +} + +async function checkEnv() { + + if(jckdShareNum == 0) { + console.log('当前分享次数设置为0。如果需要开启分享阅读,请设置环境变量jckdShareNum为要被阅读的次数。') + return false + } + + if(jckdCookie) { + if(jckdCookie.indexOf('@') > -1) { + let jckdCookies = jckdCookie.split('@') + for(let i=0; i { + $.post(url, async (err, resp, data) => { + try { + if (err) { + console.log(caller + ": post请求失败"); + console.log(JSON.stringify(err)); + $.logErr(err); + } else { + if (safeGet(data)) { + httpResult = JSON.parse(data,caller); + if(logDebug) console.log(httpResult); + } + } + } catch (e) { + $.logErr(e, resp); + } finally { + resolve(); + } + }); + }); +} + +async function httpGet(url,caller) { + httpResult = null + return new Promise((resolve) => { + $.get(url, async (err, resp, data) => { + try { + if (err) { + console.log(caller + ": get请求失败"); + console.log(JSON.stringify(err)); + $.logErr(err); + } else { + // + } + } catch (e) { + $.logErr(e, resp); + } finally { + resolve(); + } + }); + }); +} + +function safeGet(data,caller) { + try { + if (typeof JSON.parse(data) == "object") { + return true; + } else { + console.log(`Function ${caller}: 未知错误`); + console.log(data) + } + } catch (e) { + console.log(e); + console.log(`Function ${caller}: 服务器访问数据为空,请检查自身设备网络情况`); + return false; + } +} + +function printCaller(){ + return (new Error()).stack.split("\n")[2].trim().split(" ")[1] +} + +function Env(t, e) { 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("", `\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) }) } } 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) } diff --git a/jctq/jctq_rewrite_subscribe.json.bak b/jctq/jctq_rewrite_subscribe.json.bak new file mode 100644 index 0000000..c38e922 --- /dev/null +++ b/jctq/jctq_rewrite_subscribe.json.bak @@ -0,0 +1,102 @@ +{ + "name": "晶彩天气重写订阅", + "type": "rewrite", + "note": "仅供参考", + "author": "leaf", + "resource": "jctq_rewrite_subscribe.json", + "mitmhost": [ + "tq.xunsl.com" + ], + "rewrite": [ + { + "match": "https://tq.xunsl.com/v17/NewTask/getTaskListByWeather.json", + "target": "https://raw.githubusercontent.com/leafxcy/JavaScript/main/jctq/jctq_rewrite.js", + "enable": true + }, + { + "match": "https://tq.xunsl.com/v5/CommonReward/toGetReward.json", + "target": "https://raw.githubusercontent.com/leafxcy/JavaScript/main/jctq/jctq_rewrite.js", + "enable": true + }, + { + "match": "https://tq.xunsl.com/v5/article/info.json", + "target": "https://raw.githubusercontent.com/leafxcy/JavaScript/main/jctq/jctq_rewrite.js", + "enable": true + }, + { + "match": "https://tq.xunsl.com/v5/article/detail.json", + "target": "https://raw.githubusercontent.com/leafxcy/JavaScript/main/jctq/jctq_rewrite.js", + "enable": true + }, + { + "match": "https://tq.xunsl.com/v5/user/stay.json", + "target": "https://raw.githubusercontent.com/leafxcy/JavaScript/main/jctq/jctq_rewrite.js", + "enable": true + }, + { + "match": "https://tq.xunsl.com/v5/nameless/adlickstart.json", + "target": "https://raw.githubusercontent.com/leafxcy/JavaScript/main/jctq/jctq_rewrite.js", + "enable": true + }, + { + "match": "https://tq.xunsl.com/v5/wechat/withdraw2.json", + "target": "https://raw.githubusercontent.com/leafxcy/JavaScript/main/jctq/jctq_rewrite.js", + "enable": true + }, + { + "match": "https://tq.xunsl.com/v5/Weather/giveBoxOnWeather.json", + "target": "https://raw.githubusercontent.com/leafxcy/JavaScript/main/jctq/jctq_rewrite.js", + "enable": true + }, + { + "match": "https://tq.xunsl.com/v5/weather/giveTimeInterval.json", + "target": "https://raw.githubusercontent.com/leafxcy/JavaScript/main/jctq/jctq_rewrite.js", + "enable": true + } + ], + "task": { + "type": "skip", + "list": [ + { + "name": "晶彩天气看看赚", + "type": "cron", + "time": "30 9,20 * * *", + "job": { + "type": "runjs", + "target": "https://raw.githubusercontent.com/leafxcy/JavaScript/main/jctq/jctq_kkz.js" + }, + "running": true + }, + { + "name": "晶彩天气文章视频", + "type": "cron", + "time": "20 7,18 * * *", + "job": { + "type": "runjs", + "target": "https://raw.githubusercontent.com/leafxcy/JavaScript/main/jctq/jctq_read.js" + }, + "running": true + }, + { + "name": "晶彩天气日常任务", + "type": "cron", + "time": "15,45 * * * *", + "job": { + "type": "runjs", + "target": "https://raw.githubusercontent.com/leafxcy/JavaScript/main/jctq/jctq_daily.js" + }, + "running": true + }, + { + "name": "晶彩天气任务签到", + "type": "cron", + "time": "30 22 * * *", + "job": { + "type": "runjs", + "target": "https://raw.githubusercontent.com/leafxcy/JavaScript/main/jctq/jctq_reward.js" + }, + "running": true + } + ] + } +} \ No newline at end of file diff --git a/jctq/jctq_shareRead.js b/jctq/jctq_shareRead.js index dc44aaf..36e9af6 100644 --- a/jctq/jctq_shareRead.js +++ b/jctq/jctq_shareRead.js @@ -26,7 +26,6 @@ let jctqShareNum = ($.isNode() ? process.env.jctqShareNum : $.getdata('jctqShare let newsItem = '' let UserAgent = '' let si = '' -let iosVer = ['13_4_5', '13_4_1', '13_4', '13_3_1', '13_3', '13_2_3', '13_2_2', '13_2', '13_1_3', '13_1_2', '13_1_1', '13_1', '13_0', '12_4_1', '12_4', '12_3_1', '12_3', '12_2', '12_1_4', '12_1_3', '12_1_2', '12_1_1', '12_1', '12_0_1', '12_0', '11_4_1', '11_4', '11_3_1', '11_3', '11_2_6', '11_2_5', '11_2_2', '11_2_1', '11_2', '11_1_2', '11_1_1', '11_1', '11_0_3', '11_0_2', '11_0_1', '11_0', '10_3_3', '10_3_2', '10_3_1', '10_3', '10_2_1', '10_2', '10_1_1', '10_1', '10_0_2', '10_0_1', '9_3_5', '9_3_4', '9_3_3', '9_3_2', '9_3_1', '9_3', '9_2_1', '9_2', '9_1', '9_0_2', '9_0_1'] /////////////////////////////////////////////////////////////////// @@ -62,8 +61,7 @@ let iosVer = ['13_4_5', '13_4_1', '13_4', '13_3_1', '13_3', '13_2_3', '13_2_2', let factor = seedFactor > maxWaitTime ? maxWaitTime : seedFactor let randomTime = Math.floor(Math.random()*factor) + 1000 let second = Math.floor(randomTime/1000) - let idx = Math.floor(Math.random()*iosVer.length) - UserAgent = `'Mozilla/5.0 (iPhone; CPU iPhone OS ${iosVer[idx]} like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148 MicroMessenger/8.0.16(0x1800102c) NetType/WIFI Language/zh_CN'` + UserAgent = '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.16(0x1800102c) NetType/WIFI Language/zh_CN' si = randomString(32) console.log(`--随机延迟${second}秒后开始模拟第${readCount}次分享阅读`) await $.wait(randomTime) diff --git a/zqkd/zqkd_shareRead.js b/zqkd/zqkd_shareRead.js new file mode 100644 index 0000000..9c3181b --- /dev/null +++ b/zqkd/zqkd_shareRead.js @@ -0,0 +1,324 @@ +/* +安卓:中青看点 + +转发和分享阅读,请勿贪心,小心黑号 +*/ + +const jsname = '中青看点分享阅读' +const $ = Env(jsname) +const notifyFlag = 1; //0为关闭通知,1为打开通知,默认为1 +const logDebug = 0 + +//const notify = $.isNode() ? require('./sendNotify') : ''; +let notifyStr = '' + +let rndtime = "" //毫秒 +let httpResult //global buffer + +let zqkdCookie = ($.isNode() ? process.env.zq_cookie : $.getdata('zq_cookie')) || ''; +let zqkdCookieArr = [] + +let userCk = '' +let readCount = 0 + +let zqkdShareNum = ($.isNode() ? process.env.zqkdShareNum : $.getdata('zqkdShareNum')) || 0; + +let newsItem = '' +let UserAgent = '' +let si = '' + +/////////////////////////////////////////////////////////////////// + +!(async () => { + + if(typeof $request !== "undefined") + { + $.msg(jsname+': 此脚本不做重写,请检查重写设置') + } + else + { + if(!(await checkEnv())){ + return + } + + for(let j=0; j maxWaitTime ? maxWaitTime : seedFactor + let randomTime = Math.floor(Math.random()*factor) + 1000 + let second = Math.floor(randomTime/1000) + UserAgent = `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.16(0x1800102c) NetType/WIFI Language/zh_CN` + si = randomString(32) + console.log(`--随机延迟${second}秒后开始模拟第${readCount}次分享阅读`) + await $.wait(randomTime) + console.log(`----模拟第${readCount}次阅读,使用si=${si}`) + await shareReadStep1() + await $.wait(Math.floor(Math.random()*500)+500) + await shareReadStep2() + await $.wait(Math.floor(Math.random()*1000)+2000) + await shareReadStep3() + await $.wait(Math.floor(Math.random()*1000)+2000) + await shareReadStep4() + console.log(`----模拟第${readCount}次阅读完成`) + } + + } + } + } + + +})() +.catch((e) => $.logErr(e)) +.finally(() => $.done()) + +//通知 +async function showmsg() { + + notifyBody = jsname + "运行通知\n\n" + notifyStr + + if (notifyFlag != 1) { + console.log(notifyBody); + } + + if (notifyFlag == 1) { + $.msg(notifyBody); + //if ($.isNode()){await notify.sendNotify($.name, notifyBody );} + } +} + +async function checkEnv() { + + if(zqkdShareNum == 0) { + console.log('当前分享次数设置为0。如果需要开启分享阅读,请设置环境变量zqkdShareNum为要被阅读的次数。') + return false + } + + if(zqkdCookie) { + if(zqkdCookie.indexOf('@') > -1) { + let zqkdCookies = zqkdCookie.split('@') + for(let i=0; i { + $.post(url, async (err, resp, data) => { + try { + if (err) { + console.log(caller + ": post请求失败"); + console.log(JSON.stringify(err)); + $.logErr(err); + } else { + if (safeGet(data)) { + httpResult = JSON.parse(data,caller); + if(logDebug) console.log(httpResult); + } + } + } catch (e) { + $.logErr(e, resp); + } finally { + resolve(); + } + }); + }); +} + +async function httpGet(url,caller) { + httpResult = null + return new Promise((resolve) => { + $.get(url, async (err, resp, data) => { + try { + if (err) { + console.log(caller + ": get请求失败"); + console.log(JSON.stringify(err)); + $.logErr(err); + } else { + // + } + } catch (e) { + $.logErr(e, resp); + } finally { + resolve(); + } + }); + }); +} + +function safeGet(data,caller) { + try { + if (typeof JSON.parse(data) == "object") { + return true; + } else { + console.log(`Function ${caller}: 未知错误`); + console.log(data) + } + } catch (e) { + console.log(e); + console.log(`Function ${caller}: 服务器访问数据为空,请检查自身设备网络情况`); + return false; + } +} + +function printCaller(){ + return (new Error()).stack.split("\n")[2].trim().split(" ")[1] +} + +function Env(t, e) { 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("", `\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) }) } } 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) } From 6be8464528664737e196287810b5a92957bd26ee Mon Sep 17 00:00:00 2001 From: Leaf <444653703@qq.com> Date: Sun, 21 Nov 2021 03:50:29 +0800 Subject: [PATCH 26/35] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E9=83=BD=E7=88=B1?= =?UTF-8?q?=E7=8E=A9=E8=84=9A=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- daw.js | 854 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 854 insertions(+) create mode 100644 daw.js diff --git a/daw.js b/daw.js new file mode 100644 index 0000000..86a509b --- /dev/null +++ b/daw.js @@ -0,0 +1,854 @@ +/* +IOS/安卓:都爱玩 +下载注册地址,微信打开: +https://open.weixin.qq.com/connect/oauth2/authorize?appid=wx592b7bf2a9f7f003&redirect_uri=https://v3.sdk.haowusong.com/api/auth/wechat/sharelogin&response_type=code&scope=snsapi_userinfo&state=AAABQKAW,dawbox-android#wechat_redirect + +炒个冷饭,之前有几位大佬已经写过了 +现在支持了苹果和安卓双端的任务,两边账户分红币独立,理论上收益可以翻倍,每天2块多到3块的样子,不过提现次数似乎两边共用 +支持多账户,可以并发看视频广告,减少运行时间,V2P跑有时会有code=400错误信息,忽略就好 +重写捉包只需要捉其中一端的账号即可,ck通用 +脚本内置了自动提现,默认提现到微信 +在【我的】页面可以花0.1购买普通会员,马上返1元可提现。会员每日可以积分兑换0.1-0.2的红包,聊胜于无吧,建议购买 +建议每天多跑几次,池子有额度就能投进去分红 + +青龙: +捉取https://v3.sdk.haowusong.com/api/box/wallet/info的包里的token,写到环境变量dawToken里,多账户用@隔开 +export dawToken='account1@account2@account3' + +V2P重写:打开APP即可获取CK,没有的话点一下下面分红币页面,可以直接捉多账号 +[task_local] +#都爱玩 +15 0,1,8,15,20 * * * https://raw.githubusercontent.com/leafxcy/JavaScript/main/daw.js, tag=都爱玩, enabled=true +[rewrite_local] +https://v3.sdk.haowusong.com/api/box/wallet/info url script-request-header https://raw.githubusercontent.com/leafxcy/JavaScript/main/daw.js +[MITM] +hostname = v3.sdk.haowusong.com +*/ + +const jsname = '都爱玩 by leaf ' +const $ = Env(jsname) + +const logDebug = 0 + +//0为关闭通知,1为打开通知,默认为1,可以在环境变量设置 +let notifyFlag = ($.isNode() ? process.env.dawNotify : $.getdata('dawNotify')) || 1; +let notifyStr = '' +const notify = $.isNode() ? require('./sendNotify') : ''; + +let rndtime = "" //毫秒 +let httpResult //global buffer + +let userToken = '' +let userIdx = 0 +let numBoxbody = 0 + +let maxTryNum = 12 +let waitTime = 0 +let allCompFlag = 0 + +let channelIdx = 0 +let channel = ['dawbox','dawbox-android'] +let channelStr = ['苹果端','安卓端'] + +let dawToken = ($.isNode() ? process.env.dawToken : $.getdata('dawToken')) || ''; +let dawTokenArr = [] + +let userName = '' +let isVip = 0 +let vipLevel = 0 + +/////////////////////////////////////////////////////////////////// + +!(async () => { + + if(typeof $request !== "undefined") + { + await GetRewrite() + } + else + { + await CheckEnv() + + numBoxbody = dawTokenArr.length + console.log(`找到${numBoxbody}个账户,脚本会同时做IOS和安卓端任务\n`) + + for(channelIdx=0; channelIdx 0) { + console.log(`等待${waitTime}ms 进行下一轮看视频抽奖\n`) + await $.wait(waitTime) + } + } + } + + console.log(`\n开始签到,领取任务奖励,兑换红包和提现`) + for(channelIdx=0; channelIdx $.logErr(e)) +.finally(() => $.done()) + +//通知 +async function Showmsg() { + + notifyBody = jsname + "运行通知\n\n" + notifyStr + + if (notifyFlag != 1) { + console.log(notifyBody); + } + + if (notifyFlag == 1) { + $.msg(notifyBody); + if ($.isNode()){await notify.sendNotify($.name, notifyBody );} + } +} + +async function GetRewrite() { + + if($request.url.indexOf('api/box/wallet/info') > -1) { + let headers = $request.headers + let token = headers['token'] ? headers['token'] : '' + + if(!token) return; + + if(dawToken) { + if(dawToken.indexOf(token) > -1) { + $.msg(jsname+` 此dawToken已存在`) + } else { + dawToken = dawToken + '@' + token + $.setdata(dawToken, 'dawToken'); + ckList = dawToken.split('@') + $.msg(jsname+` 获取第${ckList.length}个dawToken成功`) + } + } else { + $.setdata(token, 'dawToken'); + $.msg(jsname+` 获取第1个dawToken成功`) + } + } +} + +async function CheckEnv() { + if(dawToken) { + if(dawToken.indexOf('@') > -1) { + let dawTokens = dawToken.split('@') + for(let i=0; i 0) { + if(integral_num >= integral_min_put_num && can_put_num >= integral_min_put_num) { + let putNum = (integral_num>can_put_num) ? can_put_num : integral_num + await $.wait(100) + await PutInPool(putNum,1) + } + } + } else if(type == 1) { + if(result.data.tasks.vedio_task && Array.isArray(result.data.tasks.vedio_task)) { + for(let i=0; i -1) { + if(taskItem.complete_num < taskItem.contribution_num) { + allCompFlag = 0 + await $.wait(100) + waitTime -= 100 + await ReceiveCoin(taskItem) + } + } + } + } + if(result.data.tasks.game_task && Array.isArray(result.data.tasks.game_task)) { + for(let i=0; i -1) { + if(taskItem.complete_num < taskItem.contribution_num) { + allCompFlag = 0 + await $.wait(100) + waitTime -= 100 + await QueryTurntable(taskItem) + } + } + } + } + } else if(type == 2) { + let integral_num = result.data.player.integral_num ? result.data.player.integral_num : 0 + let use_integral_num = result.data.player.use_integral_num ? result.data.player.use_integral_num : 0 + let money = result.data.player.money ? result.data.player.money : 0 + console.log(`【DAB币】:${integral_num}`) + console.log(`【今日已投】:${use_integral_num}`) + console.log(`【分红余额】:${money}`) + notifyStr += `【DAB币】:${integral_num}\n` + notifyStr += `【今日已投】:${use_integral_num}\n` + notifyStr += `【分红余额】:${money}\n` + } + } else { + console.log(`\n查询信息失败:${result.error}`) + } +} + +//领币任务奖励 +async function ReceiveCoin(taskItem) { + let caller = PrintCaller() + let url = `https://v3.sdk.haowusong.com/api/channel/integral/task/receive` + let reqBody = `{"task_id":${taskItem.task_id},"channel":"${channel[channelIdx]}"}` + let urlObject = PopulatePostUrl(url,reqBody) + await HttpPost(urlObject,caller) + let result = httpResult; + if(!result) return + + if(result.code == 200) { + console.log(`完成任务【${taskItem.title}】,领取DAB币成功`) + } else { + console.log(`完成任务【${taskItem.title}】失败:${result.error}`) + } +} + +//转盘次数查询 +async function QueryTurntable(taskItem) { + let caller = PrintCaller() + let url = `https://v3.sdk.haowusong.com/api/channel/integral/turntable/config?channel=${channel[channelIdx]}&task_id=${taskItem.task_id}` + let urlObject = PopulateGetUrl(url) + await HttpGet(urlObject,caller) + let result = httpResult; + if(!result) return false + + if(result.code == 200) { + let can_video_num = result.data.lottery_num.can_video_num ? result.data.lottery_num.can_video_num : 0 + let max_video_num = result.data.lottery_num.max_video_num ? result.data.lottery_num.max_video_num : 0 + let can_lottery_num = result.data.lottery_num.can_lottery_num ? result.data.lottery_num.can_lottery_num : 0 + let max_lottery_num = result.data.lottery_num.max_lottery_num ? result.data.lottery_num.max_lottery_num : 0 + if(can_video_num < max_video_num) { + //先看视频领次数 + await $.wait(100) + waitTime -= 100 + await ReceiveVideoReward(taskItem) + } else if(can_lottery_num < max_lottery_num) { + //已看完视频,直接抽奖 + await $.wait(100) + waitTime -= 100 + await Turntable(taskItem) + } + } else { + console.log(`\n获取转盘次数失败:${result.error}`) + return false + } + + return true +} + +//看视频领抽奖次数 +async function ReceiveVideoReward(taskItem) { + let caller = PrintCaller() + let url = `https://v3.sdk.haowusong.com/api/channel/integral/turntable/video/receive` + let reqBody = `{"channel":"${channel[channelIdx]}","task_id":"${taskItem.task_id}"}` + let urlObject = PopulatePostUrl(url,reqBody) + await HttpPost(urlObject,caller) + let result = httpResult; + if(!result) return + + if(result.code == 200) { + console.log(`看视频获得了一次抽奖机会`) + await $.wait(100) + waitTime -= 100 + await Turntable(taskItem) + } else { + console.log(`看视频得抽奖机会失败:${result.error}`) + } +} + +//转盘抽奖 +async function Turntable(taskItem) { + let caller = PrintCaller() + let url = `https://v3.sdk.haowusong.com/api/channel/integral/turntable/result` + let reqBody = `{"channel":"${channel[channelIdx]}","task_id":"${taskItem.task_id}"}` + let urlObject = PopulatePostUrl(url,reqBody) + await HttpPost(urlObject,caller) + let result = httpResult; + if(!result) return + + if(result.code == 200) { + let reward = result.data.title ? result.data.title : '【?】' + console.log(`抽奖成功,获得了${reward}`) + await $.wait(100) + waitTime -= 100 + await ReceiveTurntable(taskItem) + } else { + console.log(`抽奖失败:${result.error}`) + } +} + +//转盘抽奖奖励翻倍领取 +async function ReceiveTurntable(taskItem) { + let caller = PrintCaller() + let url = `https://v3.sdk.haowusong.com/api/channel/integral/turntable/receive` + let reqBody = `{"channel":"${channel[channelIdx]}","task_id":"${taskItem.task_id}","type":1}` + let urlObject = PopulatePostUrl(url,reqBody) + await HttpPost(urlObject,caller) + let result = httpResult; + if(!result) return + + if(result.code == 200) { + console.log(`看视频获得抽奖翻倍奖励成功`) + } else { + console.log(`看视频获得抽奖翻倍奖励失败:${result.error}`) + } +} + +//瓜分池投入 +async function PutInPool(num,pool_lv) { + let caller = PrintCaller() + let url = `https://v3.sdk.haowusong.com/api/channel/integral/put?channel=${channel[channelIdx]}&num=${num}&pool_lv=${pool_lv}` + let urlObject = PopulateGetUrl(url) + await HttpPost(urlObject,caller) + let result = httpResult; + if(!result) return false + + if(result.code == 200) { + console.log(`投入瓜分池${num}币成功`) + notifyStr += `投入瓜分池${num}币成功\n` + } else { + console.log(`投入瓜分池${num}币失败:${result.error}`) + } +} + +//签到信息查询 +async function QuerySignList() { + let caller = PrintCaller() + let url = `https://v3.sdk.haowusong.com/api/box/sign/list` + let urlObject = PopulateGetUrl(url) + await HttpGet(urlObject,caller) + let result = httpResult; + if(!result) return + + if(result.code == 200) { + if(result.data.today_sign_status == 0) { + await $.wait(100) + await SignToday() + } else { + console.log(`\n今日已签到`) + } + } else { + console.log(`\n获取签到信息失败:${result.error}`) + } +} + +//签到 +async function SignToday() { + let caller = PrintCaller() + let url = `https://v3.sdk.haowusong.com/api/box/sign/post` + let urlObject = PopulateGetUrl(url) + await HttpPost(urlObject,caller) + let result = httpResult; + if(!result) return + + if(result.code == 200) { + console.log(`\n签到成功,获得${result.data.total_credit_num}积分`) + } else { + console.log(`\n签到失败:${result.error}`) + } +} + +//积分任务列表查询 +async function QueryTaskList() { + let caller = PrintCaller() + let url = `https://v3.sdk.haowusong.com/api/box/task/list` + let urlObject = PopulateGetUrl(url) + await HttpGet(urlObject,caller) + let result = httpResult; + if(!result) return false + + if(result.code == 200) { + if(result.data && Array.isArray(result.data)) { + for(let i=0; i 0 && vipLevel >= exchangeItem.vip_level) { + await $.wait(100) + await MallExchange(exchangeItem,exchangeItem.today_ex_num) + } + } + } + } else { + console.log(`\n获取积分红包兑换列表失败:${result.error}`) + } +} + +//积分红包兑换 +async function MallExchange(exchangeItem,num) { + let caller = PrintCaller() + let url = `https://v3.sdk.haowusong.com/api/box/mall/exchange` + let reqBody = `{"mall_id":${exchangeItem.id},"num":${num}}` + let urlObject = PopulatePostUrl(url,reqBody) + await HttpPost(urlObject,caller) + let result = httpResult; + if(!result) return + + if(result.code == 200) { + console.log(`兑换【${exchangeItem.title}】成功`) + } else { + console.log(`兑换【${exchangeItem.title}】失败:${result.error}`) + } +} + +//积分红包提现列表查询 +async function QueryWithdrawBox(page) { + let caller = PrintCaller() + let url = `https://v3.sdk.haowusong.com/api/box/withdraw/platform/config?channel=${channel[channelIdx]}&page=${page}&page_count=10` + let urlObject = PopulateGetUrl(url) + await HttpGet(urlObject,caller) + let result = httpResult; + if(!result) return + + if(result.code == 200) { + let money = result.data.money ? result.data.money : 0 + let is_bind_alipay = result.data.is_bind_alipay ? result.data.is_bind_alipay : 0 + let is_bind_wechat = result.data.is_bind_wechat ? result.data.is_bind_wechat : 0 + let payType = '' + if(is_bind_alipay==1) payType += ' 支付宝' + if(is_bind_wechat==1) payType += ' 微信' + if(!payType) payType += '无' + console.log(`\n积分红包余额:${result.data.money},已绑定支付方式:${payType}`) + let withList = [] + if(result.data.withdraw_config && Array.isArray(result.data.withdraw_config)) { + for(let i=0; i= withItem.money) { + withList.push(withItem) + } + } + if(withList.length == 0) { + console.log(`积分红包余额不足,暂时无法提现`) + return + } + let sortList = withList.sort(function(a,b){return b["money"]-a["money"]}); + for(let i=0; i -1) { + return true + } + } + return false +} + +//分红提现列表查询 +async function QueryWithdrawIntegral(page) { + let caller = PrintCaller() + let url = `https://v3.sdk.haowusong.com/api/channel/integral/withdraw/config?channel=${channel[channelIdx]}&page=${page}&page_count=10` + let urlObject = PopulateGetUrl(url) + await HttpGet(urlObject,caller) + let result = httpResult; + if(!result) return + + if(result.code == 200) { + let money = result.data.money ? result.data.money : 0 + let is_bind_alipay = result.data.is_bind_alipay ? result.data.is_bind_alipay : 0 + let is_bind_wechat = result.data.is_bind_wechat ? result.data.is_bind_wechat : 0 + let payType = '' + if(is_bind_alipay==1) payType += ' 支付宝' + if(is_bind_wechat==1) payType += ' 微信' + if(!payType) payType += '无' + console.log(`\n分红余额:${result.data.money},已绑定支付方式:${payType}`) + let withList = [] + if(result.data.withdraw_config && Array.isArray(result.data.withdraw_config)) { + for(let i=0; i= withItem.money) { + withList.push(withItem) + } + } + if(withList.length == 0) { + console.log(`分红余额不足,暂时无法提现`) + return + } + let sortList = withList.sort(function(a,b){return b["money"]-a["money"]}); + for(let i=0; i -1) { + return true + } + } + return false +} + +//////////////////////////////////////////////////////////////////// +function PopulatePostUrl(url,reqBody){ + let urlObject = { + url: url, + headers: { + 'Host' : 'v3.sdk.haowusong.com', + 'Origin' : 'https://v3.h5.haowusong.com', + 'Content-Type' : 'application/json', + 'Accept-Encoding' : 'gzip, deflate, br', + 'Connection' : 'keep-alive', + 'Accept' : 'application/json, text/plain, */*', + 'User-Agent' : 'Mozilla/5.0 (iPhone; CPU iPhone OS 15_0 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148', + 'Accept-Language' : 'zh-CN,zh-Hans;q=0.9', + 'Referer' : 'https://v3.h5.haowusong.com/', + 'token' : dawTokenArr[userIdx], + }, + body: reqBody, + } + return urlObject; +} + +function PopulateGetUrl(url){ + let urlObject = { + url: url, + headers: { + 'Host' : 'v3.sdk.haowusong.com', + 'Origin' : 'https://v3.h5.haowusong.com', + 'Content-Type' : 'application/json', + 'Accept-Encoding' : 'gzip, deflate, br', + 'Connection' : 'keep-alive', + 'Accept' : 'application/json, text/plain, */*', + 'User-Agent' : 'Mozilla/5.0 (iPhone; CPU iPhone OS 15_0 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148', + 'Accept-Language' : 'zh-CN,zh-Hans;q=0.9', + 'Referer' : 'https://v3.h5.haowusong.com/', + 'token' : dawTokenArr[userIdx], + } + } + return urlObject; +} + +async function HttpPost(url,caller) { + httpResult = null + return new Promise((resolve) => { + $.post(url, async (err, resp, data) => { + try { + if (SafeGet(data,caller)) { + httpResult = JSON.parse(data); + if(logDebug) console.log(httpResult); + } + } catch (e) { + $.logErr(e, resp); + } finally { + resolve(); + } + }); + }); +} + +async function HttpGet(url,caller) { + httpResult = null + return new Promise((resolve) => { + $.get(url, async (err, resp, data) => { + try { + if (SafeGet(data,caller)) { + httpResult = JSON.parse(data); + if(logDebug) console.log(httpResult); + } + } catch (e) { + $.logErr(e, resp); + } finally { + resolve(); + } + }); + }); +} + +function SafeGet(data,caller) { + try { + if (typeof JSON.parse(data) == "object") { + return true; + } else { + console.log(`Function ${caller}: 未知错误`); + console.log(data) + } + } catch (e) { + console.log(e); + console.log(data) + console.log(`Function ${caller}: 服务器访问数据为空,请检查自身设备网络情况`); + return false; + } +} + +function PrintCaller(){ + return (new Error()).stack.split("\n")[2].trim().split(" ")[1] +} + +function Env(t, e) { 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("", `\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) }) } } 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) } From 6f801acb9ea3c31151a0536e59c01b3fbf352bac Mon Sep 17 00:00:00 2001 From: Leaf <444653703@qq.com> Date: Sun, 21 Nov 2021 09:28:05 +0800 Subject: [PATCH 27/35] =?UTF-8?q?=E4=BF=AE=E5=A4=8DIOS=E5=92=8C=E5=AE=89?= =?UTF-8?q?=E5=8D=93=E7=AB=AF=E7=9C=8B=E5=B9=BF=E5=91=8A=E5=86=B7=E5=8D=B4?= =?UTF-8?q?=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- daw.js | 31 ++++++++++++++++--------------- 1 file changed, 16 insertions(+), 15 deletions(-) diff --git a/daw.js b/daw.js index 86a509b..4104757 100644 --- a/daw.js +++ b/daw.js @@ -81,27 +81,28 @@ let vipLevel = 0 } } - console.log(`\n先每个账号并发看广告和抽奖`) - for(let i=0; i 0) { - console.log(`等待${waitTime}ms 进行下一轮看视频抽奖\n`) - await $.wait(waitTime) + + if(allCompFlag) { + console.log(`所有账号已完成看广告和抽奖任务`) + break + } else if (i < maxTryNum-1){ + if(waitTime > 0) { + console.log(`等待${waitTime}ms 进行下一轮看视频抽奖\n`) + await $.wait(waitTime) + } } } } From 64b3b8f376f75ebf8cbd24072289fef846811713 Mon Sep 17 00:00:00 2001 From: Leaf <444653703@qq.com> Date: Mon, 22 Nov 2021 09:52:07 +0800 Subject: [PATCH 28/35] =?UTF-8?q?=E4=BB=93=E5=BA=93=E6=BB=A1=E6=97=B6?= =?UTF-8?q?=E5=B0=9D=E8=AF=95=E6=8A=95=E5=85=A5=E6=B1=A0=E5=AD=90=EF=BC=8C?= =?UTF-8?q?=E6=9A=82=E5=81=9C=E5=81=9A=E8=AF=A5=E8=B4=A6=E6=88=B7=E4=BB=BB?= =?UTF-8?q?=E5=8A=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- daw.js | 39 ++++++++++++++++++++++++++++++++++----- 1 file changed, 34 insertions(+), 5 deletions(-) diff --git a/daw.js b/daw.js index 4104757..129892e 100644 --- a/daw.js +++ b/daw.js @@ -41,6 +41,7 @@ let httpResult //global buffer let userToken = '' let userIdx = 0 let numBoxbody = 0 +let coinStatus = [] let maxTryNum = 12 let waitTime = 0 @@ -75,6 +76,7 @@ let vipLevel = 0 for(channelIdx=0; channelIdx -1) { + let idx = channelIdx*numBoxbody+userIdx + if(coinStatus[idx] == 1) { + console.log(`仓库已存满,尝试先投入分红池`) + coinStatus[idx] = 2 + await $.wait(100) + await QueryCoinInfo(0) + } else if(coinStatus[idx] == 2) { + console.log(`仓库已存满,且无法投入分红池,此用户暂时不再做任务`) + } + } } } @@ -464,6 +481,17 @@ async function ReceiveTurntable(taskItem) { console.log(`看视频获得抽奖翻倍奖励成功`) } else { console.log(`看视频获得抽奖翻倍奖励失败:${result.error}`) + if(result.error.indexOf('当前仓库已存满') > -1) { + let idx = channelIdx*numBoxbody+userIdx + if(coinStatus[idx] == 1) { + console.log(`仓库已存满,尝试先投入分红池`) + coinStatus[idx] = 2 + await $.wait(100) + await QueryCoinInfo(0) + } else if(coinStatus[idx] == 2) { + console.log(`仓库已存满,且无法投入分红池,此用户暂时不再做任务`) + } + } } } @@ -479,6 +507,7 @@ async function PutInPool(num,pool_lv) { if(result.code == 200) { console.log(`投入瓜分池${num}币成功`) notifyStr += `投入瓜分池${num}币成功\n` + coinStatus[idx] = 1 } else { console.log(`投入瓜分池${num}币失败:${result.error}`) } @@ -641,10 +670,10 @@ async function QueryWithdrawBox(page) { let sortList = withList.sort(function(a,b){return b["money"]-a["money"]}); for(let i=0; i 0.5 && is_bind_wechat == 1 && withItem.is_wechat == 1) { await $.wait(100) if(await WithdrawBox(withItem,1)) break; - } else if(is_bind_alipay == 1 && withItem.is_alipay == 1) { + } else if(withItem.money > 0.5 && is_bind_alipay == 1 && withItem.is_alipay == 1) { await $.wait(100) if(await WithdrawBox(withItem,0)) break; } From e7a827b332eceef1a7ec61a9fb5007dd072fcc68 Mon Sep 17 00:00:00 2001 From: Leaf <444653703@qq.com> Date: Mon, 22 Nov 2021 12:18:48 +0800 Subject: [PATCH 29/35] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E7=8C=9C=E4=B8=AA?= =?UTF-8?q?=E8=82=A1=E6=B6=A8=E8=B7=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- txstock.js | 217 ++++++++++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 198 insertions(+), 19 deletions(-) diff --git a/txstock.js b/txstock.js index bb4da46..16c8591 100644 --- a/txstock.js +++ b/txstock.js @@ -4,7 +4,8 @@ 只适配了IOS,测试了青龙和V2P,其他平台请自行测试,安卓请自行测试 多用户用#隔开 -脚本只会在10点到13点之间进行猜涨跌,请务必在这段时间内跑一次脚本,猜涨跌开奖时间为15:15 +脚本只会在10点到13点之间进行猜涨跌,请务必在这段时间内跑一次脚本 +上证和个股猜涨跌开奖时间为15:15和16:30,建议16:30后再跑一次领奖 有些任务会提示任务完成发奖失败 -- 可以忽略 或者任务完成前置条件不符合 -- 一般为需要分享,会在完成日常任务后尝试做互助 @@ -37,7 +38,7 @@ MITM: wzq.tenpay.com 圈X: [task_local] #腾讯自选股 -16 12,15 * * * txstock.js, tag=腾讯自选股, enabled=true +35 11,16 * * * txstock.js, tag=腾讯自选股, enabled=true [rewrite_local] #获取APP和微信微证券的URL和header https://wzq.tenpay.com/cgi-bin/activity_task_daily.fcgi? url script-request-header https://raw.githubusercontent.com/leafxcy/JavaScript/main/txstock.js @@ -84,6 +85,12 @@ let scanList = [] let nickname = [] let bullStatusFlag = 0 +let guessOption = 0 +let guessStockFlag = 0 +let stockName = '' +let stockList = [] +let marketCode = {'sz':0, 'sh':1, 'hk':2, } + let appShareFlag = 1 let wxShareFlag = 1 let appTaskFlag = 1 @@ -374,13 +381,17 @@ async function getEnvParam(userNum) app_UA = "" Object.keys(appHeaderArrVal).forEach((item) => { if(item.toLowerCase() == "cookie") { - app_ck = appHeaderArrVal[item] + //app_ck = appHeaderArrVal[item] + cookie = appHeaderArrVal[item] + pgv_info_ssid = cookie.match(/pgv_info=ssid=([\w]+)/)[1] + pgv_pvid = cookie.match(/pgv_pvid=([\w]+)/)[1] + ts_sid = cookie.match(/ts_sid=([\w]+)/)[1] + ts_uid = cookie.match(/ts_uid=([\w]+)/)[1] } else if(item.toLowerCase() == "user-agent") { app_UA = appHeaderArrVal[item] } }) - app_ck = appHeaderArrVal["Cookie"] - app_UA = appHeaderArrVal["User-Agent"] + app_ck = `pgv_info=ssid=${pgv_info_ssid}; pgv_pvid=${pgv_pvid}; ts_sid=${ts_sid}; ts_uid=${ts_uid}` wx_ck_tmp = "" wx_UA = "" @@ -1977,10 +1988,11 @@ async function appGuessStatus() { curTime = new Date() rndtime = Math.round(curTime.getTime()) currentHour = curTime.getHours() - let isGuessTime = ((currentHour < 13) && (currentHour > 9)) ? 1 : 0 + currentDay = curTime.getDay() + let isGuessTime = ((currentHour < 13) && (currentHour > 9) && (currentDay < 6)) ? 1 : 0 return new Promise((resolve) => { let url = { - url: `https://zqact.tenpay.com/cgi-bin/guess_home.fcgi?channel=1&source=2&new_version=2&_=${rndtime}&openid=${app_openid}&fskey=${app_fskey}&access_token=${app_token}&_appName=${app_appName}&_appver=${app_appver}&_osVer=${app_osVer}&_devId=${app_devId}`, + url: `https://zqact.tenpay.com/cgi-bin/guess_home.fcgi?channel=1&source=2&new_version=3&_=${rndtime}&openid=${app_openid}&fskey=${app_fskey}&access_token=${app_token}&_appName=${app_appName}&_appver=${app_appver}&_osVer=${app_osVer}&_devId=${app_devId}`, headers: { 'Cookie': app_ck, 'Accept': `application/json, text/plain, */*`, @@ -2017,24 +2029,34 @@ async function appGuessStatus() { if(isGuessTime) { if((result.T_info && result.T_info[0] && result.T_info[0].user_answer == 0) || (result.T1_info && result.T1_info[0] && result.T1_info[0].user_answer == 0)) { - let guessOption = 1 - if(result.stockinfo && result.stockinfo[0]) { - guessOption = (result.stockinfo[0].zdf.indexOf('-') > -1) ? 2 : 1 - let guessStr = (guessOption == 2) ? "跌" : "涨" - $.log(`当前上证指数涨幅为${result.stockinfo[0].zdf}%,为你猜${guessStr}\n`); - } else { - $.log(`未获取到上证指数状态,默认为你猜涨\n`); - } if(result.date_list) { for(let i=0; i 0) { + await $.wait(100) + await appGuessRiseFall(guessOption,guessItem.date) + } else { + $.log(`获取猜涨跌错误:guessOption=${guessOption}\n`); + } } } } } else { - $.log(`已竞猜当期涨跌\n`); + $.log(`已竞猜当期上证指数涨跌\n`); + } + if(result.recommend && Array.isArray(result.recommend)) { + recList = result.recommend + stockList = recList.sort(function(a,b){return Math.abs(b["zdf"])-Math.abs(a["zdf"])}); + guessStockFlag = 1 + for(let k=0; k { + let url = { + url: `https://zqact.tenpay.com/cgi-bin/open_stockinfo.fcgi?scode=${scode}&markets=${markets}&needfive=0&needquote=1&needfollow=0&type=0&channel=1&_=${rndtime}&openid=${app_openid}&fskey=${app_fskey}&access_token=${app_token}&_appName=${app_appName}&_appver=${app_appver}&_osVer=${app_osVer}&_devId=${app_devId}`, + headers: { + 'Cookie': app_ck, + 'Accept': `*/*`, + 'Connection': `keep-alive`, + 'Referer': `https://zqact.tenpay.com/activity/page/guessRiseFall/`, + 'Accept-Encoding': `gzip, deflate, br`, + 'Host': `zqact.tenpay.com`, + 'User-Agent': app_UA, + 'Accept-Language': `zh-cn`, + }, + }; + + $.get(url, async (err, resp, data) => { + try { + data = data.replace(/\\x/g,'') + if (err) { + console.log("腾讯自选股: API查询请求失败 ‼️‼️"); + console.log(JSON.stringify(err)); + $.logErr(err); + } else { + if (safeGet(data)) { + let result = JSON.parse(data); + if(logDebug) console.log(result) + if(result.retcode == 0) { + stockName = result.secu_info.secu_name || '' + if(stockName) { + let dqj = result.secu_quote.dqj || 0 + let zsj = result.secu_quote.zsj || 0 + let raise = dqj - zsj + let ratio = raise/zsj*100 + let guessStr = (raise < 0) ? '跌' : '涨' + $.log(`${stockName}:当前价格${dqj},前天收市价${zsj},涨幅${Math.floor(ratio*100)/100}% (${Math.floor(raise*100)/100}),猜${guessStr}`); + } + } else { + $.log(`获取个股信息失败:${result.retmsg}`); + } + } + } + } catch (e) { + $.logErr(e, resp); + } finally { + resolve(); + } + }); + }); +} + //猜涨跌奖励 async function appGuessAward(guessDate) { rndtime = Math.round(curTime.getTime()) @@ -2138,9 +2214,111 @@ async function appGuessRiseFall(answer,guessDate) { if(logDebug) console.log(result) guessStr = (answer==1) ? "猜涨" : "猜跌" if(result.retcode == 0) { - $.log(`用户 ${nickname[numUser]} 猜涨跌成功:${guessStr}\n`); + $.log(`上证指数 猜涨跌成功:${guessStr}\n`); + } else { + $.log(`上证指数 ${guessStr}失败:${result.retmsg}\n`); + } + } + } + } catch (e) { + $.logErr(e, resp); + } finally { + resolve(); + } + }); + }); +} + +//猜个股涨跌次数 +async function appGuessStockStatus(stockItem) { + rndtime = Math.round(new Date().getTime()) + return new Promise((resolve) => { + let url = { + url: `https://wzq.tenpay.com/cgi-bin/guess_home.fcgi?access_token=${app_token}&openid=${app_openid}&fskey=${app_fskey}&check=11&_dev=iPhone13,2&_devId=${app_devId}&_appver=${app_appver}&_osVer=${app_osVer}&_appName=${app_appName}&source=3&channel=1&symbol=${stockItem.symbol}&new_version=3`, + headers: { + 'Cookie': app_ck, + 'Accept': `application/json, text/plain, */*`, + 'Connection': `keep-alive`, + 'Referer': `https://zqact.tenpay.com/activity/page/guessRiseFall/`, + 'Accept-Encoding': `gzip, deflate, br`, + 'Host': `zqact.tenpay.com`, + 'User-Agent': app_UA, + 'Accept-Language': `zh-cn` + }, + }; + $.get(url, async (err, resp, data) => { + try { + if (err) { + console.log("腾讯自选股: API查询请求失败 ‼️‼️"); + console.log(JSON.stringify(err)); + $.logErr(err); + } else { + if (safeGet(data)) { + let result = JSON.parse(data); + if(logDebug) console.log(result) + if(result.retcode == 0) { + $.log(`剩余猜个股涨跌次数:${result.guess_times_left}`); + if(result.guess_times_left > 0) { + if(result.T_info.user_answer > 0) { + $.log(`已竞猜:${stockItem.stockname}\n`); + } else { + let guessStr = (stockItem.zdf < 0) ? '跌' : '涨' + let answer = (stockItem.zdf < 0) ? 2 : 1 + console.log(`${stockItem.stockname}今天涨幅为${stockItem.zdf}%,猜${guessStr}`) + await $.wait(1000) + await appGuessStock(stockItem,answer) + } + } else { + $.log(`竞猜个股次数已用完\n`); + guessStockFlag = 0 + } + } else { + $.log(`获取猜个股涨跌次数失败:${result.retmsg}\n`); + } + } + } + } catch (e) { + $.logErr(e, resp); + } finally { + resolve(); + } + }); + }); +} + +//猜个股涨跌 +async function appGuessStock(stockItem,answer) { + rndtime = Math.round(curTime.getTime()) + return new Promise((resolve) => { + let url = { + url: `https://wzq.tenpay.com/cgi-bin/guess_op.fcgi?access_token=${app_token}&openid=${app_openid}&fskey=${app_fskey}&check=11&_dev=iPhone13,2&_devId=${app_devId}&_appver=${app_appver}&_osVer=${app_osVer}&_appName=${app_appName}&`, + headers: { + 'Cookie': app_ck, + 'Accept': `application/json, text/plain, */*`, + 'Connection': `keep-alive`, + 'Referer': `https://zqact.tenpay.com/activity/page/guessRiseFall/`, + 'Accept-Encoding': `gzip, deflate, br`, + 'Host': `zqact.tenpay.com`, + 'User-Agent': app_UA, + 'Accept-Language': `zh-cn` + }, + body: `source=3&channel=1&outer_src=0&new_version=3&symbol=${stockItem.symbol}&date=${todayDate}&action=2&user_answer=${answer}&access_token=${app_token}&openid=${app_openid}&fskey=${app_fskey}&check=11&`, + }; + $.post(url, async (err, resp, data) => { + try { + if (err) { + console.log("腾讯自选股: API查询请求失败 ‼️‼️"); + console.log(JSON.stringify(err)); + $.logErr(err); + } else { + if (safeGet(data)) { + let result = JSON.parse(data); + if(logDebug) console.log(result) + let guessStr = (answer==1) ? "猜涨" : "猜跌" + if(result.retcode == 0) { + $.log(`${stockItem.stockname} 猜涨跌成功:${guessStr}\n`); } else { - $.log(`用户 ${nickname[numUser]} ${guessStr}失败:${result.retmsg}\n`); + $.log(`${stockItem.stockname} ${guessStr}失败:${result.retmsg}\n`); } } } @@ -2152,6 +2330,7 @@ async function appGuessRiseFall(answer,guessDate) { }); }); } + //////////////////////////////////////////////////////////////////// function time(time) { From 151eb8f0dff14549617de7c7ad0dfeb7b40b229a Mon Sep 17 00:00:00 2001 From: Leaf <444653703@qq.com> Date: Mon, 22 Nov 2021 18:01:27 +0800 Subject: [PATCH 30/35] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E9=A2=86=E4=B8=AA?= =?UTF-8?q?=E8=82=A1=E7=AB=9E=E7=8C=9C=E5=A5=96=E5=8A=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- txstock.js | 81 ++++++++++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 72 insertions(+), 9 deletions(-) diff --git a/txstock.js b/txstock.js index 16c8591..36d5a21 100644 --- a/txstock.js +++ b/txstock.js @@ -1,6 +1,6 @@ /* 腾讯自选股APP & 微信微证券公众号 -改自@CenBoMin大佬的脚本 + 只适配了IOS,测试了青龙和V2P,其他平台请自行测试,安卓请自行测试 多用户用#隔开 @@ -253,12 +253,15 @@ async function getRewrite() if($request.url.indexOf("openid=") > -1) { //APP包 + let msgStr = '' $.setdata($request.url,'TxStockAppUrl') $.log(`获取TxStockAppUrl成功: ${$request.url}\n`) - $.msg(`获取TxStockAppUrl成功: ${$request.url}\n`) + msgStr += `获取TxStockAppUrl成功: ${$request.url}\n` $.setdata(JSON.stringify($request.headers),'TxStockAppHeader') $.log(`获取TxStockAppHeader成功: ${JSON.stringify($request.headers)}\n`) - $.msg(`获取TxStockAppHeader成功: ${JSON.stringify($request.headers)}\n`) + msgStr += `获取TxStockAppHeader成功: ${JSON.stringify($request.headers)}\n` + + $.msg(msgStr) } else { @@ -1989,7 +1992,7 @@ async function appGuessStatus() { rndtime = Math.round(curTime.getTime()) currentHour = curTime.getHours() currentDay = curTime.getDay() - let isGuessTime = ((currentHour < 13) && (currentHour > 9) && (currentDay < 6)) ? 1 : 0 + let isGuessTime = ((currentHour < 13) && (currentHour > 9) && (currentDay < 6) && (currentDay > 0)) ? 1 : 0 return new Promise((resolve) => { let url = { url: `https://zqact.tenpay.com/cgi-bin/guess_home.fcgi?channel=1&source=2&new_version=3&_=${rndtime}&openid=${app_openid}&fskey=${app_fskey}&access_token=${app_token}&_appName=${app_appName}&_appver=${app_appver}&_osVer=${app_osVer}&_devId=${app_devId}`, @@ -2019,10 +2022,20 @@ async function appGuessStatus() { if(result.notice_info && result.notice_info[0]) { if(logDebug) console.log(result) if(result.notice_info[0].answer_status == 1) { - $.log(`上期猜涨跌回答正确,正在取得奖励\n`); + $.log(`上期猜上证指数涨跌回答正确,正在取得奖励\n`); await appGuessAward(result.notice_info[0].date) } else { - $.log(`上期猜涨跌回答错误\n`); + $.log(`上期猜上证指数涨跌回答错误\n`); + } + await $.wait(1000) + } + if(result.stock_notice_info && result.stock_notice_info[0]) { + if(logDebug) console.log(result) + if(result.stock_notice_info[0].guess_correct == 1) { + $.log(`上期猜个股涨跌回答正确,正在取得奖励\n`); + await appGuessStockAward(result.stock_notice_info[0].date) + } else { + $.log(`上期猜个股涨跌回答错误\n`); } await $.wait(1000) } @@ -2142,7 +2155,7 @@ async function appGetStockInfo(scode,markets) { }); } -//猜涨跌奖励 +//猜上证指数涨跌奖励 async function appGuessAward(guessDate) { rndtime = Math.round(curTime.getTime()) return new Promise((resolve) => { @@ -2170,9 +2183,59 @@ async function appGuessAward(guessDate) { let result = JSON.parse(data); if(logDebug) console.log(result) if(result.retcode == 0) { - $.log(`获得猜涨跌奖励:${result.reward_memo} ${result.reward_value}金币\n`); + $.log(`获得上证指数猜涨跌奖励:${result.reward_memo} ${result.reward_value}金币\n`); + } else { + $.log(`获得上证指数猜涨跌奖励失败:${result.retmsg}\n`); + } + } + } + } catch (e) { + $.logErr(e, resp); + } finally { + resolve(); + } + }); + }); +} + +//猜个股涨跌奖励 +async function appGuessStockAward(guessDate) { + rndtime = Math.round(curTime.getTime()) + return new Promise((resolve) => { + let url = { + url: `https://zqact.tenpay.com/cgi-bin/activity/activity.fcgi?activity=guess_new&action=guess_stock_reward&guess_date=${guessDate}&channel=1&_=${rndtime}&openid=${app_openid}&fskey=${app_fskey}&access_token=${app_token}&_appName=${app_appName}&_appver=${app_appver}&_osVer=${app_osVer}&_devId=${app_devId}`, + headers: { + 'Cookie': app_ck, + 'Accept': `application/json, text/plain, */*`, + 'Connection': `keep-alive`, + 'Referer': `https://zqact.tenpay.com/activity/page/guessRiseFall/`, + 'Accept-Encoding': `gzip, deflate, br`, + 'Host': `zqact.tenpay.com`, + 'User-Agent': app_UA, + 'Accept-Language': `zh-cn` + }, + }; + $.get(url, async (err, resp, data) => { + try { + if (err) { + console.log("腾讯自选股: API查询请求失败 ‼️‼️"); + console.log(JSON.stringify(err)); + $.logErr(err); + } else { + if (safeGet(data)) { + let result = JSON.parse(data); + if(logDebug) console.log(result) + if(result.retcode == 0) { + if(result.stock_rewards && Array.isArray(result.stock_rewards)) { + for(let i=0; i Date: Mon, 22 Nov 2021 18:11:26 +0800 Subject: [PATCH 31/35] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E9=A2=86=E7=AB=9E?= =?UTF-8?q?=E7=8C=9C=E4=B8=AA=E8=82=A1=E5=A5=96=E5=8A=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- txstock.js | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/txstock.js b/txstock.js index 36d5a21..96bb6db 100644 --- a/txstock.js +++ b/txstock.js @@ -2229,11 +2229,13 @@ async function appGuessStockAward(guessDate) { if(result.stock_rewards && Array.isArray(result.stock_rewards)) { for(let i=0; i Date: Mon, 22 Nov 2021 18:42:50 +0800 Subject: [PATCH 32/35] =?UTF-8?q?=E5=87=8F=E5=B0=91ck=E5=8F=98=E9=87=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- txstock.js | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/txstock.js b/txstock.js index 96bb6db..fb2f617 100644 --- a/txstock.js +++ b/txstock.js @@ -408,14 +408,14 @@ async function getEnvParam(userNum) pgv_info = wx_ck_tmp.match(/pgv_info=([\w=]+)/)[1] pgv_pvid = wx_ck_tmp.match(/pgv_pvid=([\w]+)/)[1] - ts_last = wx_ck_tmp.match(/ts_last=([\w\/]+)/)[1] - ts_refer = wx_ck_tmp.match(/ts_refer=([\w\/\.]+)/)[1] + //ts_last = wx_ck_tmp.match(/ts_last=([\w\/]+)/)[1] + //ts_refer = wx_ck_tmp.match(/ts_refer=([\w\/\.]+)/)[1] ts_sid = wx_ck_tmp.match(/ts_sid=([\w]+)/)[1] ts_uid = wx_ck_tmp.match(/ts_uid=([\w]+)/)[1] qlappid = wx_ck_tmp.match(/qlappid=([\w]+)/)[1] qlskey = wx_ck_tmp.match(/qlskey=([\w]+)/)[1] qluin = wx_ck_tmp.match(/qluin=([\w@\.]+)/)[1] - qq_logtype = wx_ck_tmp.match(/qq_logtype=([\w]+)/)[1] + //qq_logtype = wx_ck_tmp.match(/qq_logtype=([\w]+)/)[1] wzq_qlappid = wx_ck_tmp.match(/wzq_qlappid=([\w]+)/)[1] wzq_qlskey = wx_ck_tmp.match(/wzq_qlskey=([\w]+)/)[1] wzq_qluin = wx_ck_tmp.match(/wzq_qluin=([\w-]+)/)[1] @@ -423,7 +423,7 @@ async function getEnvParam(userNum) //wx_ck = `pgv_info=${pgv_info}; pgv_pvid=${pgv_pvid}; ts_last=${ts_last}; ts_refer=${ts_refer}; ts_sid=${ts_sid}; ts_uid=${ts_uid}; qlappid=${qlappid}; qlskey=${qlskey}; qluin=${qluin}; qq_logtype=${qq_logtype}; wx_session_time=${sessionTime}; wzq_qlappid=${wzq_qlappid}; wzq_qlskey=${wzq_qlskey}; wzq_qluin=${wzq_qluin}; zxg_openid=${zxg_openid}` - wx_ck = `pgv_info=${pgv_info}; pgv_pvid=${pgv_pvid}; ts_last=${ts_last}; ts_refer=${ts_refer}; ts_sid=${ts_sid}; ts_uid=${ts_uid}; qlappid=${qlappid}; qlskey=${qlskey}; qluin=${qluin}; qq_logtype=${qq_logtype}; wzq_qlappid=${wzq_qlappid}; wzq_qlskey=${wzq_qlskey}; wzq_qluin=${wzq_qluin}; zxg_openid=${zxg_openid}` + wx_ck = `pgv_info=${pgv_info}; pgv_pvid=${pgv_pvid}; ts_sid=${ts_sid}; ts_uid=${ts_uid}; qlappid=${qlappid}; qlskey=${qlskey}; qluin=${qluin}; wzq_qlappid=${wzq_qlappid}; wzq_qlskey=${wzq_qlskey}; wzq_qluin=${wzq_qluin}; zxg_openid=${zxg_openid}` } async function initAccountInfo() From 94bbb2b0148f55bd2d9c09dada9e7c4b40e9dca1 Mon Sep 17 00:00:00 2001 From: Leaf <444653703@qq.com> Date: Mon, 22 Nov 2021 23:42:22 +0800 Subject: [PATCH 33/35] =?UTF-8?q?=E6=9B=B4=E6=AD=A3=E5=9C=88X=E8=84=9A?= =?UTF-8?q?=E6=9C=AC=E5=9C=B0=E5=9D=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- txstock.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/txstock.js b/txstock.js index fb2f617..04258cc 100644 --- a/txstock.js +++ b/txstock.js @@ -38,7 +38,7 @@ MITM: wzq.tenpay.com 圈X: [task_local] #腾讯自选股 -35 11,16 * * * txstock.js, tag=腾讯自选股, enabled=true +35 11,16 * * * https://raw.githubusercontent.com/leafxcy/JavaScript/main/txstock.js, tag=腾讯自选股, enabled=true [rewrite_local] #获取APP和微信微证券的URL和header https://wzq.tenpay.com/cgi-bin/activity_task_daily.fcgi? url script-request-header https://raw.githubusercontent.com/leafxcy/JavaScript/main/txstock.js From 84c32679fd4f041dac5e254ad83a5d9a798effda Mon Sep 17 00:00:00 2001 From: Leaf <444653703@qq.com> Date: Tue, 23 Nov 2021 09:25:16 +0800 Subject: [PATCH 34/35] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E6=8A=95=E6=B1=A0?= =?UTF-8?q?=E5=AD=90bug=EF=BC=8C=E7=BC=A9=E7=9F=AD=E9=80=9A=E7=9F=A5?= =?UTF-8?q?=E5=8D=95=E8=A1=8C=E9=95=BF=E5=BA=A6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- daw.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/daw.js b/daw.js index 129892e..1647ce7 100644 --- a/daw.js +++ b/daw.js @@ -118,7 +118,7 @@ let vipLevel = 0 for(userIdx=0; userIdx Date: Wed, 24 Nov 2021 23:49:56 +0800 Subject: [PATCH 35/35] =?UTF-8?q?=E4=BC=98=E5=8C=96=E6=8F=90=E7=8E=B0?= =?UTF-8?q?=E9=80=BB=E8=BE=91=EF=BC=8C=E4=BC=98=E5=85=88=E6=8F=90=E7=8E=B0?= =?UTF-8?q?=E5=8F=8C=E7=AB=AF=E9=87=8C=E6=9C=80=E5=A4=A7=E9=87=91=E9=A2=9D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- daw.js | 236 +++++++++++++++++++++++++++++++-------------------------- 1 file changed, 127 insertions(+), 109 deletions(-) diff --git a/daw.js b/daw.js index 1647ce7..c2160ff 100644 --- a/daw.js +++ b/daw.js @@ -50,6 +50,8 @@ let allCompFlag = 0 let channelIdx = 0 let channel = ['dawbox','dawbox-android'] let channelStr = ['苹果端','安卓端'] +let withdrawList = [] +let withdrawMethod = [] let dawToken = ($.isNode() ? process.env.dawToken : $.getdata('dawToken')) || ''; let dawTokenArr = [] @@ -78,7 +80,7 @@ let vipLevel = 0 if(await QueryVipInfo()) { if(!coinStatus[channelIdx*numBoxbody+userIdx]) coinStatus.push(1) await $.wait(100) - await QueryWarehouse() + await QueryWarehouse() //查询现有币和仓库容量 } } } @@ -86,7 +88,7 @@ let vipLevel = 0 for(channelIdx=0; channelIdx 0) { if(integral_num >= integral_min_put_num && can_put_num >= integral_min_put_num) { let putNum = (integral_num>can_put_num) ? can_put_num : integral_num @@ -419,7 +440,7 @@ async function QueryTurntable(taskItem) { await Turntable(taskItem) } } else { - console.log(`\n获取转盘次数失败:${result.error}`) + console.log(`获取转盘次数失败:${result.error}`) return false } @@ -527,10 +548,10 @@ async function QuerySignList() { await $.wait(100) await SignToday() } else { - console.log(`\n今日已签到`) + console.log(`今日已签到`) } } else { - console.log(`\n获取签到信息失败:${result.error}`) + console.log(`获取签到信息失败:${result.error}`) } } @@ -544,9 +565,9 @@ async function SignToday() { if(!result) return if(result.code == 200) { - console.log(`\n签到成功,获得${result.data.total_credit_num}积分`) + console.log(`签到成功,获得${result.data.total_credit_num}积分`) } else { - console.log(`\n签到失败:${result.error}`) + console.log(`签到失败:${result.error}`) } } @@ -570,7 +591,7 @@ async function QueryTaskList() { } } } else { - console.log(`\n获取积分任务列表失败:${result.error}`) + console.log(`获取积分任务列表失败:${result.error}`) return false } @@ -616,7 +637,7 @@ async function QueryMallExchange(page) { } } } else { - console.log(`\n获取积分红包兑换列表失败:${result.error}`) + console.log(`获取积分红包兑换列表失败:${result.error}`) } } @@ -648,67 +669,27 @@ async function QueryWithdrawBox(page) { if(result.code == 200) { let money = result.data.money ? result.data.money : 0 - let is_bind_alipay = result.data.is_bind_alipay ? result.data.is_bind_alipay : 0 - let is_bind_wechat = result.data.is_bind_wechat ? result.data.is_bind_wechat : 0 + withdrawMethod[userIdx].alipay = result.data.is_bind_alipay ? result.data.is_bind_alipay : 0 + withdrawMethod[userIdx].wechat = result.data.is_bind_wechat ? result.data.is_bind_wechat : 0 let payType = '' - if(is_bind_alipay==1) payType += ' 支付宝' - if(is_bind_wechat==1) payType += ' 微信' + if(result.data.is_bind_wechat==1) payType += ' 微信' + if(result.data.is_bind_alipay==1) payType += ' 支付宝' if(!payType) payType += '无' - console.log(`\n积分红包余额:${result.data.money},已绑定支付方式:${payType}`) - let withList = [] + console.log(`积分红包余额:${result.data.money}`) + console.log(`已绑定支付方式:${payType}`) if(result.data.withdraw_config && Array.isArray(result.data.withdraw_config)) { for(let i=0; i= withItem.money) { - withList.push(withItem) - } - } - if(withList.length == 0) { - console.log(`积分红包余额不足,暂时无法提现`) - return - } - let sortList = withList.sort(function(a,b){return b["money"]-a["money"]}); - for(let i=0; i 0.5 && is_bind_wechat == 1 && withItem.is_wechat == 1) { - await $.wait(100) - if(await WithdrawBox(withItem,1)) break; - } else if(withItem.money > 0.5 && is_bind_alipay == 1 && withItem.is_alipay == 1) { - await $.wait(100) - if(await WithdrawBox(withItem,0)) break; + withdrawList[userIdx].push({type:'box',channel:channelIdx,item:withItem}) } } } else { - console.log(`获取积分红包提现列表失败`) + console.log(`账号${userIdx+1}${channelStr[channelIdx]}获取积分红包提现列表失败`) } } else { - console.log(`\n获取积分红包提现列表失败:${result.error}`) - } -} - -//积分红包提现 -async function WithdrawBox(withItem,pay_type) { - let caller = PrintCaller() - let url = `https://v3.sdk.haowusong.com/api/box/withdraw/platform/apply?config_id=${withItem.id}&channel=${channel[channelIdx]}&pay_type=${pay_type}` - let urlObject = PopulateGetUrl(url) - await HttpPost(urlObject,caller) - let result = httpResult; - if(!result) { - console.log(`提现积分红包${withItem.money}元失败:服务器无响应`) - return false - } - - if(result.code == 200) { - console.log(`提现积分红包${withItem.money}元成功`) - notifyStr += `提现积分红包${withItem.money}元成功\n` - return true - } else { - console.log(`提现积分红包${withItem.money}元失败:${result.error}`) - if(result.error.indexOf('今日提现次数超出限制') > -1) { - return true - } + console.log(`账号${userIdx+1}${channelStr[channelIdx]}获取积分红包提现列表失败:${result.error}`) } - return false } //分红提现列表查询 @@ -722,62 +703,99 @@ async function QueryWithdrawIntegral(page) { if(result.code == 200) { let money = result.data.money ? result.data.money : 0 - let is_bind_alipay = result.data.is_bind_alipay ? result.data.is_bind_alipay : 0 - let is_bind_wechat = result.data.is_bind_wechat ? result.data.is_bind_wechat : 0 - let payType = '' - if(is_bind_alipay==1) payType += ' 支付宝' - if(is_bind_wechat==1) payType += ' 微信' - if(!payType) payType += '无' - console.log(`\n分红余额:${result.data.money},已绑定支付方式:${payType}`) - let withList = [] + console.log(`\n账号${userIdx+1}${channelStr[channelIdx]}:`) + console.log(`分红余额:${result.data.money}`) if(result.data.withdraw_config && Array.isArray(result.data.withdraw_config)) { for(let i=0; i= withItem.money) { - withList.push(withItem) - } - } - if(withList.length == 0) { - console.log(`分红余额不足,暂时无法提现`) - return - } - let sortList = withList.sort(function(a,b){return b["money"]-a["money"]}); - for(let i=0; i 0) { + console.log(`\n账号${userIdx+1}开始尝试提现:`) + let sortList = withdrawList[userIdx].sort(function(a,b){return b['item']['money']-a['item']['money']}); + for(let i=0; i -1) { + return true + } + } + return false } //分红提现 -async function WithdrawIntegral(withItem,pay_type) { +async function WithdrawIntegral(withItem,withMethod) { let caller = PrintCaller() - let url = `https://v3.sdk.haowusong.com/api/channel/integral/withdraw/apply?config_id=${withItem.id}&channel=${channel[channelIdx]}&pay_type=${pay_type}` + let pay_type = 0 + if(withMethod.wechat == 1 && withItem.item.is_wechat == 1) { + pay_type = 1 + } else if(withMethod.alipay == 1 && withItem.item.is_alipay == 1) { + pay_type = 2 + } else { + return false + } + let url = `https://v3.sdk.haowusong.com/api/channel/integral/withdraw/apply?config_id=${withItem.item.id}&channel=${channel[withItem.channel]}&pay_type=${pay_type}` let urlObject = PopulateGetUrl(url) await HttpPost(urlObject,caller) let result = httpResult; if(!result) { - console.log(`提现分红${withItem.money}元失败:服务器无响应`) + console.log(`--账号${userIdx+1}${channelStr[withItem.channel]}提现分红${withItem.item.money}元失败:服务器无响应`) return false } if(result.code == 200) { - console.log(`提现分红${withItem.money}元成功`) - notifyStr += `提现分红${withItem.money}元成功\n` + console.log(`--账号${userIdx+1}${channelStr[withItem.channel]}提现分红${withItem.item.money}元成功`) + notifyStr += `--账号${userIdx+1}${channelStr[withItem.channel]}提现分红${withItem.item.money}元成功\n` return true } else { - console.log(`提现分红${withItem.money}元失败:${result.error}`) + console.log(`--账号${userIdx+1}${channelStr[withItem.channel]}提现分红${withItem.item.money}元失败:${result.error}`) if(result.error.indexOf('今日提现次数超出限制') > -1) { return true } @@ -881,4 +899,4 @@ function PrintCaller(){ return (new Error()).stack.split("\n")[2].trim().split(" ")[1] } -function Env(t, e) { 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("", `\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) }) } } 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) } +function Env(t, e) { 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("", `\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) }) } } 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) }