diff --git a/cleancart_activity.js b/cleancart_activity.js new file mode 100644 index 0000000..2d4db3f --- /dev/null +++ b/cleancart_activity.js @@ -0,0 +1,282 @@ +/* + +*/ +let jdSignUrl = '' // 算法url +let Authorization = '' // 算法url token 有则填 +let got = ''; +try{ + got = require('got'); +}catch(e){ + console.log('请添加依赖模块"got"') +} + + +jdSignUrl = process.env.gua_cleancart_SignUrl ? process.env.gua_cleancart_SignUrl : `${jdSignUrl}` +Authorization = process.env.gua_cleancart_Authorization ? process.env.gua_cleancart_Authorization : `${Authorization}` +if(Authorization && Authorization.indexOf("Bearer ") === -1) Authorization = `Bearer ${Authorization}` +let cookie = '' +let out = false + +async function clean(ck,url,goodsArr){ + if(!got) return false + return new Promise(async resolve => { + let msg = false + try{ + if(!ck) return '' + if(!jdSignUrl) jdSignUrl = url + cookie = ck + // if(jdSignUrl.indexOf("://jd.smiek.tk/") > -1) { + // resolve(msg) + // return false + // } + let signBody = `{"homeWishListUserFlag":"1","userType":"0","updateTag":true,"showPlusEntry":"2","hitNewUIStatus":"1","cvhv":"049591","cartuuid":"hjudwgohxzVu96krv/T6Hg==","adid":""}` + let body = await jdSign('cartClearQuery', signBody) + if(out) return + if(!body){ + console.log('获取不到算法') + return + } + let data = await jdApi('cartClearQuery',body) + let res = jsonParse(data) + if(typeof res == 'object' && res){ + if(res.resultCode == 0){ + if(res.mainTitle.indexOf('购物车是空的') > -1){ + msg = [] + }else if(!res.clearCartInfo || !res.subTitle){ + console.log(res.mainTitle) + }else{ + let num = 0 + if(res.subTitle){ + num = res.subTitle.match(/共(\d+)件商品/).length > 0 && res.subTitle.match(/共(\d+)件商品/)[1] || 0 + console.log(res.subTitle) + } + // console.log(`共${num}件商品`) + if(num != 0){ + let operations = [] + let operNum = 0 + let goodsArrs = [] + let goodsArrsFlag = false + for(let a of res.clearCartInfo || {}){ + // console.log(a.groupName) + // if(a.groupName.indexOf('7天内加入购物车') > -1){ + if(typeof goodsArr !== 'object'){ + goodsArrs = [...goodsArrs,...a.groupDetails] + goodsArrsFlag = true + }else{ + for(let s of a.groupDetails || []){ + if(typeof goodsArr === 'object'){ + let XBDetail = goodsArr.filter((x) => x.skuId === s.skuId) + if(XBDetail.length == 0){ + // console.log(s.unusable,s.skuUuid,s.name) + operNum += s.clearSkus && s.clearSkus.length || 1; + operations.push({ + "itemType": s.itemType+"", + "suitType": s.suitType, + "skuUuid": s.skuUuid+"", + "itemId": s.itemId || s.skuId, + "useUuid": typeof s.useUuid !== 'undefined' && s.useUuid || false + }) + } + } + } + } + // } + } + if(goodsArrsFlag){ + msg = goodsArrs || [] + return + } + console.log(`准备清空${operNum}件商品`) + if(operations.length == 0){ + console.log(`清空${operNum}件商品|没有找到要清空的商品`) + }else{ + let clearBody = `{"homeWishListUserFlag":"1","userType":"0","updateTag":false,"showPlusEntry":"2","hitNewUIStatus":"1","cvhv":"049591","cartuuid":"hjudwgohxzVu96krv/T6Hg==","operations":${jsonStringify(operations)},"adid":"","coord_type":"0"}` + clearBody = await jdSign('cartClearRemove', clearBody) + if(out) return + if(!clearBody){ + console.log('获取不到算法') + }else{ + let clearData = await jdApi('cartClearRemove',clearBody) + let clearRes = jsonParse(clearData) + if(typeof clearRes == 'object'){ + if(clearRes.resultCode == 0) { + console.log(`清空${operNum}件商品|✅\n`) + }else if(clearRes.mainTitle){ + console.log(`清空${operNum}件商品|${clearRes.mainTitle}\n`) + }else{ + console.log(`清空${operNum}件商品|❌\n`) + console.log(clearData) + } + }else{ + console.log(`清空${operNum}件商品|❌\n`) + console.log(clearData) + } + } + } + }else if(res.mainTitle){ + if(res.mainTitle.indexOf('购物车是空的') > -1){ + msg = [] + } + console.log(res.mainTitle) + }else{ + console.log(data) + } + } + }else{ + console.log(data) + } + }else{ + console.log(data) + } + }catch(e){ + console.log(e) + } finally { + resolve(msg); + } + }) +} + +function jdApi(functionId,body) { + if(!functionId || !body) return + return new Promise(resolve => { + let opts = taskPostUrl(`/client.action?functionId=${functionId}`, body) + got.post(opts).then( + (resp) => { + const {body:data } = resp + try { + let res = jsonParse(data); + if(typeof res == 'object'){ + if(res.mainTitle) console.log(res.mainTitle) + if(res.resultCode == 0){ + resolve(res); + }else if (res.tips && res.tips.includes("正在努力加载")){ + console.log("请求太快,ip被限制了") + out = true + } + } + } catch (e) { + console.log(e) + } finally { + resolve(''); + } + }, + (err) => { + try { + const { message: error, response: resp } = err + console.log(`${jsonStringify(error)}`) + console.log(`${functionId} API请求失败,请检查网路重试`) + } catch (e) { + console.log(e) + } finally { + resolve('') + } + } + ) + }) +} + +function jdSign(fn,body) { + let sign = '' + let flag = false + try{ + const fs = require('fs'); + if (fs.existsSync('./gua_encryption_sign.js')) { + const encryptionSign = require('./gua_encryption_sign'); + sign = encryptionSign.getSign(fn, body) + }else{ + flag = true + } + sign = sign.data && sign.data.sign && sign.data.sign || '' + }catch(e){ + flag = true + } + if(!flag) return sign + if(!jdSignUrl.match(/^https?:\/\//)){ + console.log('请填写算法url') + out = true + return '' + } + return new Promise((resolve) => { + let options = { + url: jdSignUrl, + body:`{"fn":"${fn}","body":${body}}`, + headers: { + 'Accept':'*/*', + "accept-encoding": "gzip, deflate, br", + 'Content-Type': 'application/json', + }, + timeout:30000 + } + if(Authorization) options["headers"]["Authorization"] = Authorization + got.post(options).then( + (resp) => { + const {body:data } = resp + try { + let res = jsonParse(data) + if(typeof res === 'object' && res){ + if(res.code && res.code == 200 && res.data){ + if(res.data.sign) sign = res.data.sign || '' + if(sign != '') resolve(sign) + }else{ + console.log(data) + } + }else{ + console.log(data) + } + } catch (e) { + console.log(e) + } finally { + resolve('') + } + }, + (err) => { + try { + const { message: error, response: resp } = err + console.log(`${jsonStringify(error)}`) + console.log(`算法url API请求失败,请检查网路重试`) + } catch (e) { + console.log(e) + } finally { + resolve('') + } + } + + ) + }) +} + +function jsonParse(str) { + try { + return JSON.parse(str); + } catch (e) { + return str; + } +} + +function jsonStringify(arr) { + try { + return JSON.stringify(arr); + } catch (e) { + return arr; + } +} + +function taskPostUrl(url, body) { + return { + url: `https://api.m.jd.com${url}`, + body: body, + headers: { + "Accept": "*/*", + "Accept-Language": "zh-cn", + "Accept-Encoding": "gzip, deflate, br", + "Connection": "keep-alive", + "Content-Type": "application/x-www-form-urlencoded", + 'Cookie': `${cookie}`, + "User-Agent": "JD4iPhone/167853 (iPhone; iOS; Scale/2.00)" , + } + } +} + +module.exports = { + clean +} \ No newline at end of file diff --git a/gua_cleancart.js b/gua_cleancart.js new file mode 100644 index 0000000..e105a93 --- /dev/null +++ b/gua_cleancart.js @@ -0,0 +1,368 @@ +/* +清空购物车 +更新时间:2022-05-26 +因其他脚本会加入商品到购物车,故此脚本用来清空购物车 +包括预售 +需要算法支持 +默认:不执行 如需要请添加环境变量 +gua_cleancart_Run="true" +gua_cleancart_SignUrl="" # 算法url +gua_cleancart_Authorization="" # 算法url token 有则填 + +—————————————— +1.@&@ 前面加数字 指定账号pin +如果有中文请填写中文 +2.|-| 账号之间隔开 +3.英文大小写请填清楚 +4.优先匹配账号再匹配* +5.定义不清空的[商品]名称支持模糊匹配 +6.pin@&@ 👉 指定账号(后面添加商品 前面账号[pin] *表示所有账号 +7.|-| 👉 账号之间隔开 +—————————————— + +商品名称规则 +——————gua_cleancart_products———————— +pin2@&@商品1,商品2👉该pin这几个商品名不清空 +pin5@&@👉该pin全清 +pin3@&@不清空👉该pin不清空 +*@&@不清空👉所有账号不请空 +*@&@👉所有账号清空 + +优先匹配账号再匹配* +|-| 👉 账号之间隔开 +有填帐号pin则*不适配 +—————————————— +如果有不清空的一定要加上"*@&@不清空" +防止没指定的账号购物车全清空 + +*/ +let jdSignUrl = '' // 算法url +let Authorization = '' // 算法url token 有则填 +let cleancartRun = 'false' +let cleancartProducts = '' + +const $ = new Env('清空购物车'); +const jdCookieNode = $.isNode() ? require('./jdCookie.js') : ''; +const notify = $.isNode() ? require('./sendNotify') : ''; +//IOS等用户直接用NobyDa的jd cookie +let cookiesArr = [], + cookie = ''; +if ($.isNode()) { + Object.keys(jdCookieNode).forEach((item) => { + cookiesArr.push(jdCookieNode[item]) + }) + if (process.env.JD_DEBUG && process.env.JD_DEBUG === 'false') console.log = () => {}; +} else { + cookiesArr = [$.getdata('CookieJD'), $.getdata('CookieJD2'), ...jsonParse($.getdata('CookiesJD') || "[]").map(item => item.cookie)].filter(item => !!item); +} + +message = '' + +jdSignUrl = $.isNode() ? (process.env.gua_cleancart_SignUrl ? process.env.gua_cleancart_SignUrl : `${jdSignUrl}`) : ($.getdata('gua_cleancart_SignUrl') ? $.getdata('gua_cleancart_SignUrl') : `${jdSignUrl}`); + +Authorization = process.env.gua_cleancart_Authorization ? process.env.gua_cleancart_Authorization : `${Authorization}` +if(Authorization && Authorization.indexOf("Bearer ") === -1) Authorization = `Bearer ${Authorization}` + +cleancartRun = $.isNode() ? (process.env.gua_cleancart_Run ? process.env.gua_cleancart_Run : `${cleancartRun}`) : ($.getdata('gua_cleancart_Run') ? $.getdata('gua_cleancart_Run') : `${cleancartRun}`); + +cleancartProducts = $.isNode() ? (process.env.gua_cleancart_products ? process.env.gua_cleancart_products : `${cleancartProducts}`) : ($.getdata('gua_cleancart_products') ? $.getdata('gua_cleancart_products') : `${cleancartProducts}`); + +let productsArr = [] +let cleancartProductsAll = [] +for (let i of cleancartProducts && cleancartProducts.split('|-|')) { + productsArr.push(i) +} +for (let i of cleancartProducts && cleancartProducts.split('|-|')) { + productsArr.push(i) +} +for (let i in productsArr) { + if(productsArr[i].indexOf('@&@') > -1){ + let arr = productsArr[i].split('@&@') + cleancartProductsAll[arr[0]] = arr[1].split(',') + } +} +!(async () => { + if (!cookiesArr[0]) { + $.msg($.name, '【提示】请先获取cookie\n直接使用NobyDa的京东签到获取', 'https://bean.m.jd.com/', { + "open-url": "https://bean.m.jd.com/" + }); + return; + } + if(cleancartRun !== 'true'){ + console.log('脚本停止\n请添加环境变量[gua_cleancart_Run]为"true"') + return + } + if(!cleancartProducts){ + console.log('脚本停止\n请添加环境变量[gua_cleancart_products]\n清空商品\n内容规则看脚本文件') + return + } + $.out = false + for (let i = 0; i < cookiesArr.length; i++) { + cookie = cookiesArr[i]; + if (cookie) { + $.UserName = decodeURIComponent(cookie.match(/pt_pin=([^; ]+)(?=;?)/) && cookie.match(/pt_pin=([^; ]+)(?=;?)/)[1]) + $.index = i + 1; + console.log(`\n\n******开始【京东账号${$.index}】${$.nickName || $.UserName}*********\n`); + if(cleancartProductsAll[$.UserName]){ + $.cleancartProductsArr = cleancartProductsAll[$.UserName] + }else if(cleancartProductsAll["*"]){ + $.cleancartProductsArr = cleancartProductsAll["*"] + }else $.cleancartProductsArr = false + if($.cleancartProductsArr) console.log($.cleancartProductsArr) + await run(); + if($.out) break + } + } + if(message){ + $.msg($.name, ``, `${message}`); + if ($.isNode()){ + await notify.sendNotify(`${$.name}`, `${message}`); + } + } +})() + .catch((e) => $.logErr(e)) + .finally(() => $.done()) + +async function run(){ + try{ + let msg = '' + let signBody = `{"homeWishListUserFlag":"1","userType":"0","updateTag":true,"showPlusEntry":"2","hitNewUIStatus":"1","cvhv":"049591","cartuuid":"hjudwgohxzVu96krv/T6Hg==","adid":""}` + let body = await jdSign('cartClearQuery', signBody) + if($.out) return + if(!body){ + console.log('获取不到算法') + return + } + let data = await jdApi('cartClearQuery',body) + let res = $.toObj(data,data); + if(typeof res == 'object' && res){ + if(res.resultCode == 0){ + if(!res.clearCartInfo || !res.subTitle){ + msg += `${res.mainTitle}\n` + console.log(res.mainTitle) + }else{ + let num = 0 + if(res.subTitle){ + num = res.subTitle.match(/共(\d+)件商品/).length > 0 && res.subTitle.match(/共(\d+)件商品/)[1] || 0 + msg += res.subTitle + "\n" + console.log(res.subTitle) + } + // console.log(`共${num}件商品`) + if(num != 0){ + let operations = [] + let operNum = 0 + for(let a of res.clearCartInfo || {}){ + // console.log(a.groupName) + // if(a.groupName.indexOf('7天前加入购物车') > -1){ + for(let s of a.groupDetails || []){ + if(toSDS(s.name)){ + // console.log(s.unusable,s.skuUuid,s.name) + operNum += s.clearSkus && s.clearSkus.length || 1; + operations.push({ + "itemType": s.itemType+"", + "suitType": s.suitType, + "skuUuid": s.skuUuid+"", + "itemId": s.itemId || s.skuId, + "useUuid": typeof s.useUuid !== 'undefined' && s.useUuid || false + }) + } + } + // } + } + console.log(`准备清空${operNum}件商品`) + if(operations.length == 0){ + console.log(`清空${operNum}件商品|没有找到要清空的商品`) + msg += `清空${operNum}件商品|没有找到要清空的商品\n` + }else{ + let clearBody = `{"homeWishListUserFlag":"1","userType":"0","updateTag":false,"showPlusEntry":"2","hitNewUIStatus":"1","cvhv":"049591","cartuuid":"hjudwgohxzVu96krv/T6Hg==","operations":${$.toStr(operations,operations)},"adid":"","coord_type":"0"}` + clearBody = await jdSign('cartClearRemove', clearBody) + if($.out) return + if(!clearBody){ + console.log('获取不到算法') + }else{ + let clearData = await jdApi('cartClearRemove',clearBody) + let clearRes = $.toObj(clearData,clearData); + if(typeof clearRes == 'object'){ + if(clearRes.resultCode == 0) { + msg += `清空${operNum}件商品|✅\n` + console.log(`清空${operNum}件商品|✅\n`) + }else if(clearRes.mainTitle){ + msg += `清空${operNum}件商品|${clearRes.mainTitle}\n` + console.log(`清空${operNum}件商品|${clearRes.mainTitle}\n`) + }else{ + msg += `清空${operNum}件商品|❌\n` + console.log(`清空${operNum}件商品|❌\n`) + console.log(clearData) + } + }else{ + msg += `清空${operNum}件商品|❌\n` + console.log(`清空${operNum}件商品|❌\n`) + console.log(clearData) + } + } + } + }else if(res.mainTitle){ + msg += `${res.mainTitle}\n` + console.log(res.mainTitle) + }else{ + msg += `未识别到购物车有商品\n` + console.log(data) + } + } + }else{ + console.log(data) + } + }else{ + console.log(data) + } + if(msg){ + message += `【京东账号${$.index}】${$.nickName || $.UserName}\n${msg}\n` + } + if(!$.out){ + console.log('等待45秒') + await $.wait(parseInt(Math.random() * 2000 + 40000, 10)) + } + }catch(e){ + console.log(e) + } +} +function toSDS(name){ + let res = true + if($.cleancartProductsArr === false) return false + for(let t of $.cleancartProductsArr || []){ + if(t && name.indexOf(t) > -1 || t == '不清空'){ + res = false + break + } + } + return res +} +function jdApi(functionId,body) { + if(!functionId || !body) return + return new Promise(resolve => { + $.post(taskPostUrl(`/client.action?functionId=${functionId}`, body), async (err, resp, data) => { + try { + if (err) { + console.log(`${$.toStr(err)}`) + console.log(`${$.name} API请求失败,请检查网路重试`) + } else { + // console.log(data) + let res = $.toObj(data,data); + if(typeof res == 'object'){ + if(res.mainTitle) console.log(res.mainTitle) + if(res.resultCode == 0){ + resolve(res); + }else if (res.tips && res.tips.includes("正在努力加载")){ + console.log("请求太快,ip被限制了") + $.out = true + } + } + } + } catch (e) { + $.logErr(e, resp) + } finally { + resolve(''); + } + }) + }) +} + +function jdSign(fn,body) { + let sign = '' + let flag = false + try{ + const fs = require('fs'); + if (fs.existsSync('./gua_encryption_sign.js')) { + const encryptionSign = require('./gua_encryption_sign'); + sign = encryptionSign.getSign(fn, body) + }else{ + flag = true + } + sign = sign.data && sign.data.sign && sign.data.sign || '' + }catch(e){ + flag = true + } + if(!flag) return sign + if(!jdSignUrl.match(/^https?:\/\//)){ + console.log('请填写算法url') + $.out = true + return '' + } + return new Promise((resolve) => { + let options = { + url: jdSignUrl, + body:`{"fn":"${fn}","body":${body}}`, + followRedirect:false, + headers: { + 'Accept':'*/*', + "accept-encoding": "gzip, deflate, br", + 'Content-Type': 'application/json', + }, + timeout:30000 + } + if(Authorization) options["headers"]["Authorization"] = Authorization + $.post(options, async (err, resp, data) => { + try { + // console.log(data) + let res = $.toObj(data,data) + if(typeof res === 'object' && res){ + if(res.code && res.code == 200 && res.data){ + if(res.data.sign) sign = res.data.sign || '' + if(sign != '') resolve(sign) + }else{ + console.log(data) + } + }else{ + console.log(data) + } + } catch (e) { + $.logErr(e, resp); + } finally { + resolve('') + } + }) + }) +} + + +function taskPostUrl(url, body) { + return { + url: `https://api.m.jd.com${url}`, + body: body, + headers: { + "Accept": "*/*", + "Accept-Language": "zh-cn", + "Accept-Encoding": "gzip, deflate, br", + "Connection": "keep-alive", + "Content-Type": "application/x-www-form-urlencoded", + 'Cookie': `${cookie}`, + "Host": "api.m.jd.com", + "User-Agent": "JD4iPhone/167853 (iPhone; iOS; Scale/2.00)" , + } + } +} + +function randomString(e) { + e = e || 32; + let t = "abcdef0123456789", a = t.length, n = ""; + for (i = 0; i < e; i++) + n += t.charAt(Math.floor(Math.random() * a)); + return n +} + +function jsonParse(str) { + if (typeof str == "string") { + try { + return JSON.parse(str); + } catch (e) { + console.log(e); + $.msg($.name, '', '请勿随意在BoxJs输入框修改内容\n建议通过脚本去获取cookie') + return []; + } + } +} + +// prettier-ignore +function Env(t,e){"undefined"!=typeof process&&JSON.stringify(process.env).indexOf("GITHUB")>-1&&process.exit(0);class s{constructor(t){this.env=t}send(t,e="GET"){t="string"==typeof t?{url:t}:t;let s=this.get;return"POST"===e&&(s=this.post),new Promise((e,i)=>{s.call(this,t,(t,s,r)=>{t?i(t):e(s)})})}get(t){return this.send.call(this.env,t)}post(t){return this.send.call(this.env,t,"POST")}}return new class{constructor(t,e){this.name=t,this.http=new s(this),this.data=null,this.dataFile="box.dat",this.logs=[],this.isMute=!1,this.isNeedRewrite=!1,this.logSeparator="\n",this.startTime=(new Date).getTime(),Object.assign(this,e),this.log("",`🔔${this.name}, 开始!`)}isNode(){return"undefined"!=typeof module&&!!module.exports}isQuanX(){return"undefined"!=typeof $task}isSurge(){return"undefined"!=typeof $httpClient&&"undefined"==typeof $loon}isLoon(){return"undefined"!=typeof $loon}toObj(t,e=null){try{return JSON.parse(t)}catch{return e}}toStr(t,e=null){try{return JSON.stringify(t)}catch{return e}}getjson(t,e){let s=e;const i=this.getdata(t);if(i)try{s=JSON.parse(this.getdata(t))}catch{}return s}setjson(t,e){try{return this.setdata(JSON.stringify(t),e)}catch{return!1}}getScript(t){return new Promise(e=>{this.get({url:t},(t,s,i)=>e(i))})}runScript(t,e){return new Promise(s=>{let i=this.getdata("@chavy_boxjs_userCfgs.httpapi");i=i?i.replace(/\n/g,"").trim():i;let r=this.getdata("@chavy_boxjs_userCfgs.httpapi_timeout");r=r?1*r:20,r=e&&e.timeout?e.timeout:r;const[o,h]=i.split("@"),n={url:`http://${h}/v1/scripting/evaluate`,body:{script_text:t,mock_type:"cron",timeout:r},headers:{"X-Key":o,Accept:"*/*"}};this.post(n,(t,e,i)=>s(i))}).catch(t=>this.logErr(t))}loaddata(){if(!this.isNode())return{};{this.fs=this.fs?this.fs:require("fs"),this.path=this.path?this.path:require("path");const t=this.path.resolve(this.dataFile),e=this.path.resolve(process.cwd(),this.dataFile),s=this.fs.existsSync(t),i=!s&&this.fs.existsSync(e);if(!s&&!i)return{};{const i=s?t:e;try{return JSON.parse(this.fs.readFileSync(i))}catch(t){return{}}}}}writedata(){if(this.isNode()){this.fs=this.fs?this.fs:require("fs"),this.path=this.path?this.path:require("path");const t=this.path.resolve(this.dataFile),e=this.path.resolve(process.cwd(),this.dataFile),s=this.fs.existsSync(t),i=!s&&this.fs.existsSync(e),r=JSON.stringify(this.data);s?this.fs.writeFileSync(t,r):i?this.fs.writeFileSync(e,r):this.fs.writeFileSync(t,r)}}lodash_get(t,e,s){const i=e.replace(/\[(\d+)\]/g,".$1").split(".");let r=t;for(const t of i)if(r=Object(r)[t],void 0===r)return s;return r}lodash_set(t,e,s){return Object(t)!==t?t:(Array.isArray(e)||(e=e.toString().match(/[^.[\]]+/g)||[]),e.slice(0,-1).reduce((t,s,i)=>Object(t[s])===t[s]?t[s]:t[s]=Math.abs(e[i+1])>>0==+e[i+1]?[]:{},t)[e[e.length-1]]=s,t)}getdata(t){let e=this.getval(t);if(/^@/.test(t)){const[,s,i]=/^@(.*?)\.(.*?)$/.exec(t),r=s?this.getval(s):"";if(r)try{const t=JSON.parse(r);e=t?this.lodash_get(t,i,""):e}catch(t){e=""}}return e}setdata(t,e){let s=!1;if(/^@/.test(e)){const[,i,r]=/^@(.*?)\.(.*?)$/.exec(e),o=this.getval(i),h=i?"null"===o?null:o||"{}":"{}";try{const e=JSON.parse(h);this.lodash_set(e,r,t),s=this.setval(JSON.stringify(e),i)}catch(e){const o={};this.lodash_set(o,r,t),s=this.setval(JSON.stringify(o),i)}}else s=this.setval(t,e);return s}getval(t){return this.isSurge()||this.isLoon()?$persistentStore.read(t):this.isQuanX()?$prefs.valueForKey(t):this.isNode()?(this.data=this.loaddata(),this.data[t]):this.data&&this.data[t]||null}setval(t,e){return this.isSurge()||this.isLoon()?$persistentStore.write(t,e):this.isQuanX()?$prefs.setValueForKey(t,e):this.isNode()?(this.data=this.loaddata(),this.data[e]=t,this.writedata(),!0):this.data&&this.data[e]||null}initGotEnv(t){this.got=this.got?this.got:require("got"),this.cktough=this.cktough?this.cktough:require("tough-cookie"),this.ckjar=this.ckjar?this.ckjar:new this.cktough.CookieJar,t&&(t.headers=t.headers?t.headers:{},void 0===t.headers.Cookie&&void 0===t.cookieJar&&(t.cookieJar=this.ckjar))}get(t,e=(()=>{})){t.headers&&(delete t.headers["Content-Type"],delete t.headers["Content-Length"]),this.isSurge()||this.isLoon()?(this.isSurge()&&this.isNeedRewrite&&(t.headers=t.headers||{},Object.assign(t.headers,{"X-Surge-Skip-Scripting":!1})),$httpClient.get(t,(t,s,i)=>{!t&&s&&(s.body=i,s.statusCode=s.status),e(t,s,i)})):this.isQuanX()?(this.isNeedRewrite&&(t.opts=t.opts||{},Object.assign(t.opts,{hints:!1})),$task.fetch(t).then(t=>{const{statusCode:s,statusCode:i,headers:r,body:o}=t;e(null,{status:s,statusCode:i,headers:r,body:o},o)},t=>e(t))):this.isNode()&&(this.initGotEnv(t),this.got(t).on("redirect",(t,e)=>{try{if(t.headers["set-cookie"]){const s=t.headers["set-cookie"].map(this.cktough.Cookie.parse).toString();s&&this.ckjar.setCookieSync(s,null),e.cookieJar=this.ckjar}}catch(t){this.logErr(t)}}).then(t=>{const{statusCode:s,statusCode:i,headers:r,body:o}=t;e(null,{status:s,statusCode:i,headers:r,body:o},o)},t=>{const{message:s,response:i}=t;e(s,i,i&&i.body)}))}post(t,e=(()=>{})){if(t.body&&t.headers&&!t.headers["Content-Type"]&&(t.headers["Content-Type"]="application/x-www-form-urlencoded"),t.headers&&delete t.headers["Content-Length"],this.isSurge()||this.isLoon())this.isSurge()&&this.isNeedRewrite&&(t.headers=t.headers||{},Object.assign(t.headers,{"X-Surge-Skip-Scripting":!1})),$httpClient.post(t,(t,s,i)=>{!t&&s&&(s.body=i,s.statusCode=s.status),e(t,s,i)});else if(this.isQuanX())t.method="POST",this.isNeedRewrite&&(t.opts=t.opts||{},Object.assign(t.opts,{hints:!1})),$task.fetch(t).then(t=>{const{statusCode:s,statusCode:i,headers:r,body:o}=t;e(null,{status:s,statusCode:i,headers:r,body:o},o)},t=>e(t));else if(this.isNode()){this.initGotEnv(t);const{url:s,...i}=t;this.got.post(s,i).then(t=>{const{statusCode:s,statusCode:i,headers:r,body:o}=t;e(null,{status:s,statusCode:i,headers:r,body:o},o)},t=>{const{message:s,response:i}=t;e(s,i,i&&i.body)})}}time(t,e=null){const s=e?new Date(e):new Date;let i={"M+":s.getMonth()+1,"d+":s.getDate(),"H+":s.getHours(),"m+":s.getMinutes(),"s+":s.getSeconds(),"q+":Math.floor((s.getMonth()+3)/3),S:s.getMilliseconds()};/(y+)/.test(t)&&(t=t.replace(RegExp.$1,(s.getFullYear()+"").substr(4-RegExp.$1.length)));for(let e in i)new RegExp("("+e+")").test(t)&&(t=t.replace(RegExp.$1,1==RegExp.$1.length?i[e]:("00"+i[e]).substr((""+i[e]).length)));return t}msg(e=t,s="",i="",r){const o=t=>{if(!t)return t;if("string"==typeof t)return this.isLoon()?t:this.isQuanX()?{"open-url":t}:this.isSurge()?{url:t}:void 0;if("object"==typeof t){if(this.isLoon()){let e=t.openUrl||t.url||t["open-url"],s=t.mediaUrl||t["media-url"];return{openUrl:e,mediaUrl:s}}if(this.isQuanX()){let e=t["open-url"]||t.url||t.openUrl,s=t["media-url"]||t.mediaUrl;return{"open-url":e,"media-url":s}}if(this.isSurge()){let e=t.url||t.openUrl||t["open-url"];return{url:e}}}};if(this.isMute||(this.isSurge()||this.isLoon()?$notification.post(e,s,i,o(r)):this.isQuanX()&&$notify(e,s,i,o(r))),!this.isMuteLog){let t=["","==============📣系统通知📣=============="];t.push(e),s&&t.push(s),i&&t.push(i),console.log(t.join("\n")),this.logs=this.logs.concat(t)}}log(...t){t.length>0&&(this.logs=[...this.logs,...t]),console.log(t.join(this.logSeparator))}logErr(t,e){const s=!this.isSurge()&&!this.isQuanX()&&!this.isLoon();s?this.log("",`❗️${this.name}, 错误!`,t.stack):this.log("",`❗️${this.name}, 错误!`,t)}wait(t){return new Promise(e=>setTimeout(e,t))}done(t={}){const e=(new Date).getTime(),s=(e-this.startTime)/1e3;this.log("",`🔔${this.name}, 结束! 🕛 ${s} 秒`),this.log(),(this.isSurge()||this.isQuanX()||this.isLoon())&&$done(t)}}(t,e)} + + diff --git a/jd_clean_car.js b/jd_clean_car.js deleted file mode 100644 index d3e3371..0000000 --- a/jd_clean_car.js +++ /dev/null @@ -1,238 +0,0 @@ -/* -10 6,22 * * * rush_clean_car.js -*/ -const $ = new Env('清空购物车'); -const jdCookieNode = $.isNode() ? require('./jdCookie.js') : ''; -const notify = $.isNode() ? require('./sendNotify') : ''; -let cookiesArr = [], cookie = '', message = ''; -let lz_cookie = {} - -if ($.isNode()) { - Object.keys(jdCookieNode).forEach((item) => { - cookiesArr.push(jdCookieNode[item]) - }) - if (process.env.JD_DEBUG && process.env.JD_DEBUG === 'false') console.log = () => { }; -} else { - let cookiesData = $.getdata('CookiesJD') || "[]"; - cookiesData = JSON.parse(cookiesData); - cookiesArr = cookiesData.map(item => item.cookie); - cookiesArr.reverse(); - cookiesArr.push(...[$.getdata('CookieJD2'), $.getdata('CookieJD')]); - cookiesArr.reverse(); - cookiesArr = cookiesArr.filter(item => !!item); -} -let removeSize = process.env.JD_CART_REMOVESIZE || 20; // 运行一次取消多全部已关注的商品。数字0表示不取关任何商品 -let isRemoveAll = process.env.JD_CART_REMOVEALL || true; //是否清空,如果为false,则上面设置了多少就只删除多少条 -$.keywords = process.env.JD_CART_KEYWORDS || [] -$.keywordsNum = 0; -!(async () => { - if (!cookiesArr[0]) { - $.msg($.name, '【提示】请先获取京东账号一cookie\n直接使用NobyDa的京东签到获取', 'https://bean.m.jd.com/bean/signIndex.action', { "open-url": "https://bean.m.jd.com/bean/signIndex.action" }); - return; - } - for (let i = 0; i < cookiesArr.length; i++) { - if (cookiesArr[i]) { - cookie = cookiesArr[i] - originCookie = cookiesArr[i] - newCookie = '' - $.UserName = decodeURIComponent(cookie.match(/pt_pin=(.+?);/) && cookie.match(/pt_pin=(.+?);/)[1]) - $.index = i + 1; - $.isLogin = true; - $.nickName = ''; - await checkCookie(); - console.log(`\n******开始【京东账号${$.index}】${$.nickName || $.UserName}*********\n`); - if (!$.isLogin) { - $.msg($.name, `【提示】cookie已失效`, `京东账号${$.index} ${$.nickName || $.UserName}\n请重新登录获取\nhttps://bean.m.jd.com/bean/signIndex.action`, { "open-url": "https://bean.m.jd.com/bean/signIndex.action" }); - if ($.isNode()) { - await notify.sendNotify(`${$.name}cookie已失效 - ${$.UserName}`, `京东账号${$.index} ${$.UserName}\n请重新登录获取cookie`); - } - continue - } - await requireConfig(); - do { - await getCart_xh(); - $.keywordsNum = 0 - if($.beforeRemove !== "0"){ - await cartFilter_xh(venderCart); - if(parseInt($.beforeRemove) !== $.keywordsNum) await removeCart(); - else { - console.log('由于购物车内的商品均包含关键字,本次执行将不删除购物车数据') - break; - } - } else break; - } while(isRemoveAll && $.keywordsNum !== $.beforeRemove) - if ($.bean > 0) { - message += `\n【京东账号${$.index}】${$.nickName || $.UserName} \n └ 获得 ${$.bean} 京豆。` - } - } - } -})() - .catch((e) => { - $.log('', `❌ ${$.name}, 失败! 原因: ${e}!`, '') - }) - .finally(() => { - $.done(); - }) - -function requireConfig(){ - return new Promise(resolve => { - if($.isNode() && process.env.JD_CART){ - if(process.env.JD_CART_KEYWORDS){ - $.keywords = process.env.JD_CART_KEYWORDS.split('@') - } - } - resolve() - }) -} -function getCart_xh(){ - console.log('正在获取购物车数据...') - return new Promise((resolve) => { - const option = { - url: 'https://p.m.jd.com/cart/cart.action?fromnav=1&sceneval=2', - headers: { - "Cookie": cookie, - "User-Agent": "jdapp;JD4iPhone/167724 (iPhone; iOS 15.0; Scale/3.00)", - }, - } - $.get(option, async(err, resp, data) => { - try{ - data = strToJson(getSubstr(data, "window.cartData = ", "window._PFM_TIMING")); - $.areaId = data.areaId; // locationId的传值 - $.traceId = data.traceId; // traceid的传值 - venderCart = data.cart.venderCart; - postBody = 'pingouchannel=0&commlist='; - $.beforeRemove = data.cartJson.num - console.log(`获取到购物车数据 ${$.beforeRemove} 条`) - } catch(e){ - $.logErr(e, resp); - } finally{ - resolve(data); - } - }); - }) -} -function strToJson(str){ - var json = eval('(' + str + ')'); - return json; -} -function cartFilter_xh(cartData){ - console.log("正在整理数据...") - let pid; - $.pushed = 0 - for(let cartJson of cartData){ - if($.pushed === removeSize) break; - for(let sortedItem of cartJson.sortedItems){ - if($.pushed === removeSize) break; - pid = typeof (sortedItem.polyItem.promotion) !== "undefined" ? sortedItem.polyItem.promotion.pid : "" - for(let product of sortedItem.polyItem.products){ - if($.pushed === removeSize) break; - let mainSkuName = product.mainSku.name - $.isKeyword = false - $.isPush = true - for(let keyword of $.keywords){ - if(mainSkuName.indexOf(keyword) !== -1){ - $.keywordsNum += 1 - $.isPush = false - $.keyword = keyword; - break; - } else $.isPush = true - } - if($.isPush){ - let skuUuid = product.skuUuid; - let mainSkuId = product.mainSku.id - if(pid === "") postBody += `${mainSkuId},,1,${mainSkuId},1,,0,skuUuid:${skuUuid}@@useUuid:0$` - else postBody += `${mainSkuId},,1,${mainSkuId},11,${pid},0,skuUuid:${skuUuid}@@useUuid:0$` - $.pushed += 1; - } else { - console.log(`\n${mainSkuName}`) - console.log(`商品已被过滤,原因:包含关键字 ${$.keyword}`) - $.isKeyword = true - } - } - } - } - postBody += `&type=0&checked=0&locationid=${$.areaId}&templete=1®=1&scene=0&version=20190418&traceid=${$.traceId}&tabMenuType=1&sceneval=2` -} -function removeCart(){ - console.log('正在删除购物车数据...') - return new Promise((resolve) => { - const option = { - url: 'https://wq.jd.com/deal/mshopcart/rmvCmdy?sceneval=2&g_login_type=1&g_ty=ajax', - body: postBody, - headers: { - "Cookie": cookie, - "User-Agent": "jdapp;JD4iPhone/167724 (iPhone; iOS 15.0; Scale/3.00)", - "referer": "https://p.m.jd.com/", - "origin": "https://p.m.jd.com/" - }, - } - $.post(option, async(err, resp, data) => { - try{ - data = JSON.parse(data); - $.afterRemove = data.cartJson.num - if($.afterRemove < $.beforeRemove){ - console.log(`删除成功,当前购物车剩余数据 ${$.afterRemove} 条\n`) - $.beforeRemove = $.afterRemove - } else { - console.log('删除失败') - console.log(data.errMsg) - isRemoveAll = false; - } - } catch(e){ - $.logErr(e, resp); - } finally{ - resolve(data); - } - }); - }) -} -function getSubstr(str, leftStr, rightStr){ - let left = str.indexOf(leftStr); - let right = str.indexOf(rightStr, left); - if(left < 0 || right < left) return ''; - return str.substring(left + leftStr.length, right); -} -function checkCookie() { - const options = { - url: "https://me-api.jd.com/user_new/info/GetJDUserInfoUnion", - headers: { - "Host": "me-api.jd.com", - "Accept": "*/*", - "Connection": "keep-alive", - "Cookie": cookie, - "User-Agent": "Mozilla/5.0 (iPhone; CPU iPhone OS 14_3 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/14.0.2 Mobile/15E148 Safari/604.1", - "Accept-Language": "zh-cn", - "Referer": "https://home.m.jd.com/myJd/newhome.action?sceneval=2&ufc=&", - "Accept-Encoding": "gzip, deflate, br", - } - }; - return new Promise(resolve => { - $.get(options, (err, resp, data) => { - try { - if (err) { - $.logErr(err) - } else { - if (data) { - data = JSON.parse(data); - if (data.retcode === "1001") { - $.isLogin = false; //cookie过期 - return; - } - if (data.retcode === "0" && data.data.hasOwnProperty("userInfo")) { - $.nickName = data.data.userInfo.baseInfo.nickname; - } - } else { - $.log('京东返回了空数据'); - } - } - } catch (e) { - $.logErr(e) - } finally { - resolve(); - } - }) - }) -} -// prettier-ignore -!function (n) { "use strict"; function t(n, t) { var r = (65535 & n) + (65535 & t); return (n >> 16) + (t >> 16) + (r >> 16) << 16 | 65535 & r } function r(n, t) { return n << t | n >>> 32 - t } function e(n, e, o, u, c, f) { return t(r(t(t(e, n), t(u, f)), c), o) } function o(n, t, r, o, u, c, f) { return e(t & r | ~t & o, n, t, u, c, f) } function u(n, t, r, o, u, c, f) { return e(t & o | r & ~o, n, t, u, c, f) } function c(n, t, r, o, u, c, f) { return e(t ^ r ^ o, n, t, u, c, f) } function f(n, t, r, o, u, c, f) { return e(r ^ (t | ~o), n, t, u, c, f) } function i(n, r) { n[r >> 5] |= 128 << r % 32, n[14 + (r + 64 >>> 9 << 4)] = r; var e, i, a, d, h, l = 1732584193, g = -271733879, v = -1732584194, m = 271733878; for (e = 0; e < n.length; e += 16)i = l, a = g, d = v, h = m, g = f(g = f(g = f(g = f(g = c(g = c(g = c(g = c(g = u(g = u(g = u(g = u(g = o(g = o(g = o(g = o(g, v = o(v, m = o(m, l = o(l, g, v, m, n[e], 7, -680876936), g, v, n[e + 1], 12, -389564586), l, g, n[e + 2], 17, 606105819), m, l, n[e + 3], 22, -1044525330), v = o(v, m = o(m, l = o(l, g, v, m, n[e + 4], 7, -176418897), g, v, n[e + 5], 12, 1200080426), l, g, n[e + 6], 17, -1473231341), m, l, n[e + 7], 22, -45705983), v = o(v, m = o(m, l = o(l, g, v, m, n[e + 8], 7, 1770035416), g, v, n[e + 9], 12, -1958414417), l, g, n[e + 10], 17, -42063), m, l, n[e + 11], 22, -1990404162), v = o(v, m = o(m, l = o(l, g, v, m, n[e + 12], 7, 1804603682), g, v, n[e + 13], 12, -40341101), l, g, n[e + 14], 17, -1502002290), m, l, n[e + 15], 22, 1236535329), v = u(v, m = u(m, l = u(l, g, v, m, n[e + 1], 5, -165796510), g, v, n[e + 6], 9, -1069501632), l, g, n[e + 11], 14, 643717713), m, l, n[e], 20, -373897302), v = u(v, m = u(m, l = u(l, g, v, m, n[e + 5], 5, -701558691), g, v, n[e + 10], 9, 38016083), l, g, n[e + 15], 14, -660478335), m, l, n[e + 4], 20, -405537848), v = u(v, m = u(m, l = u(l, g, v, m, n[e + 9], 5, 568446438), g, v, n[e + 14], 9, -1019803690), l, g, n[e + 3], 14, -187363961), m, l, n[e + 8], 20, 1163531501), v = u(v, m = u(m, l = u(l, g, v, m, n[e + 13], 5, -1444681467), g, v, n[e + 2], 9, -51403784), l, g, n[e + 7], 14, 1735328473), m, l, n[e + 12], 20, -1926607734), v = c(v, m = c(m, l = c(l, g, v, m, n[e + 5], 4, -378558), g, v, n[e + 8], 11, -2022574463), l, g, n[e + 11], 16, 1839030562), m, l, n[e + 14], 23, -35309556), v = c(v, m = c(m, l = c(l, g, v, m, n[e + 1], 4, -1530992060), g, v, n[e + 4], 11, 1272893353), l, g, n[e + 7], 16, -155497632), m, l, n[e + 10], 23, -1094730640), v = c(v, m = c(m, l = c(l, g, v, m, n[e + 13], 4, 681279174), g, v, n[e], 11, -358537222), l, g, n[e + 3], 16, -722521979), m, l, n[e + 6], 23, 76029189), v = c(v, m = c(m, l = c(l, g, v, m, n[e + 9], 4, -640364487), g, v, n[e + 12], 11, -421815835), l, g, n[e + 15], 16, 530742520), m, l, n[e + 2], 23, -995338651), v = f(v, m = f(m, l = f(l, g, v, m, n[e], 6, -198630844), g, v, n[e + 7], 10, 1126891415), l, g, n[e + 14], 15, -1416354905), m, l, n[e + 5], 21, -57434055), v = f(v, m = f(m, l = f(l, g, v, m, n[e + 12], 6, 1700485571), g, v, n[e + 3], 10, -1894986606), l, g, n[e + 10], 15, -1051523), m, l, n[e + 1], 21, -2054922799), v = f(v, m = f(m, l = f(l, g, v, m, n[e + 8], 6, 1873313359), g, v, n[e + 15], 10, -30611744), l, g, n[e + 6], 15, -1560198380), m, l, n[e + 13], 21, 1309151649), v = f(v, m = f(m, l = f(l, g, v, m, n[e + 4], 6, -145523070), g, v, n[e + 11], 10, -1120210379), l, g, n[e + 2], 15, 718787259), m, l, n[e + 9], 21, -343485551), l = t(l, i), g = t(g, a), v = t(v, d), m = t(m, h); return [l, g, v, m] } function a(n) { var t, r = "", e = 32 * n.length; for (t = 0; t < e; t += 8)r += String.fromCharCode(n[t >> 5] >>> t % 32 & 255); return r } function d(n) { var t, r = []; for (r[(n.length >> 2) - 1] = void 0, t = 0; t < r.length; t += 1)r[t] = 0; var e = 8 * n.length; for (t = 0; t < e; t += 8)r[t >> 5] |= (255 & n.charCodeAt(t / 8)) << t % 32; return r } function h(n) { return a(i(d(n), 8 * n.length)) } function l(n, t) { var r, e, o = d(n), u = [], c = []; for (u[15] = c[15] = void 0, o.length > 16 && (o = i(o, 8 * n.length)), r = 0; r < 16; r += 1)u[r] = 909522486 ^ o[r], c[r] = 1549556828 ^ o[r]; return e = i(u.concat(d(t)), 512 + 8 * t.length), a(i(c.concat(e), 640)) } function g(n) { var t, r, e = ""; for (r = 0; r < n.length; r += 1)t = n.charCodeAt(r), e += "0123456789abcdef".charAt(t >>> 4 & 15) + "0123456789abcdef".charAt(15 & t); return e } function v(n) { return unescape(encodeURIComponent(n)) } function m(n) { return h(v(n)) } function p(n) { return g(m(n)) } function s(n, t) { return l(v(n), v(t)) } function C(n, t) { return g(s(n, t)) } function A(n, t, r) { return t ? r ? s(t, n) : C(t, n) : r ? m(n) : p(n) } $.md5 = A }(this); -function Env(t, e) { "undefined" != typeof process && JSON.stringify(process.env).indexOf("GITHUB") > -1 && process.exit(0); class s { constructor(t) { this.env = t } send(t, e = "GET") { t = "string" == typeof t ? { url: t } : t; let s = this.get; return "POST" === e && (s = this.post), new Promise((e, i) => { s.call(this, t, (t, s, r) => { t ? i(t) : e(s) }) }) } get(t) { return this.send.call(this.env, t) } post(t) { return this.send.call(this.env, t, "POST") } } return new class { constructor(t, e) { this.name = t, this.http = new s(this), this.data = null, this.dataFile = "box.dat", this.logs = [], this.isMute = !1, this.isNeedRewrite = !1, this.logSeparator = "\n", this.startTime = (new Date).getTime(), Object.assign(this, e), this.log("", `🔔${this.name}, 开始!`) } isNode() { return "undefined" != typeof module && !!module.exports } isQuanX() { return "undefined" != typeof $task } isSurge() { return "undefined" != typeof $httpClient && "undefined" == typeof $loon } isLoon() { return "undefined" != typeof $loon } toObj(t, e = null) { try { return JSON.parse(t) } catch { return e } } toStr(t, e = null) { try { return JSON.stringify(t) } catch { return e } } getjson(t, e) { let s = e; const i = this.getdata(t); if (i) try { s = JSON.parse(this.getdata(t)) } catch { } return s } setjson(t, e) { try { return this.setdata(JSON.stringify(t), e) } catch { return !1 } } getScript(t) { return new Promise(e => { this.get({ url: t }, (t, s, i) => e(i)) }) } runScript(t, e) { return new Promise(s => { let i = this.getdata("@chavy_boxjs_userCfgs.httpapi"); i = i ? i.replace(/\n/g, "").trim() : i; let r = this.getdata("@chavy_boxjs_userCfgs.httpapi_timeout"); r = r ? 1 * r : 20, r = e && e.timeout ? e.timeout : r; const [o, h] = i.split("@"), n = { url: `http://${h}/v1/scripting/evaluate`, body: { script_text: t, mock_type: "cron", timeout: r }, headers: { "X-Key": o, Accept: "*/*" } }; this.post(n, (t, e, i) => s(i)) }).catch(t => this.logErr(t)) } loaddata() { if (!this.isNode()) return {}; { this.fs = this.fs ? this.fs : require("fs"), this.path = this.path ? this.path : require("path"); const t = this.path.resolve(this.dataFile), e = this.path.resolve(process.cwd(), this.dataFile), s = this.fs.existsSync(t), i = !s && this.fs.existsSync(e); if (!s && !i) return {}; { const i = s ? t : e; try { return JSON.parse(this.fs.readFileSync(i)) } catch (t) { return {} } } } } writedata() { if (this.isNode()) { this.fs = this.fs ? this.fs : require("fs"), this.path = this.path ? this.path : require("path"); const t = this.path.resolve(this.dataFile), e = this.path.resolve(process.cwd(), this.dataFile), s = this.fs.existsSync(t), i = !s && this.fs.existsSync(e), r = JSON.stringify(this.data); s ? this.fs.writeFileSync(t, r) : i ? this.fs.writeFileSync(e, r) : this.fs.writeFileSync(t, r) } } lodash_get(t, e, s) { const i = e.replace(/\[(\d+)\]/g, ".$1").split("."); let r = t; for (const t of i) if (r = Object(r)[t], void 0 === r) return s; return r } lodash_set(t, e, s) { return Object(t) !== t ? t : (Array.isArray(e) || (e = e.toString().match(/[^.[\]]+/g) || []), e.slice(0, -1).reduce((t, s, i) => Object(t[s]) === t[s] ? t[s] : t[s] = Math.abs(e[i + 1]) >> 0 == +e[i + 1] ? [] : {}, t)[e[e.length - 1]] = s, t) } getdata(t) { let e = this.getval(t); if (/^@/.test(t)) { const [, s, i] = /^@(.*?)\.(.*?)$/.exec(t), r = s ? this.getval(s) : ""; if (r) try { const t = JSON.parse(r); e = t ? this.lodash_get(t, i, "") : e } catch (t) { e = "" } } return e } setdata(t, e) { let s = !1; if (/^@/.test(e)) { const [, i, r] = /^@(.*?)\.(.*?)$/.exec(e), o = this.getval(i), h = i ? "null" === o ? null : o || "{}" : "{}"; try { const e = JSON.parse(h); this.lodash_set(e, r, t), s = this.setval(JSON.stringify(e), i) } catch (e) { const o = {}; this.lodash_set(o, r, t), s = this.setval(JSON.stringify(o), i) } } else s = this.setval(t, e); return s } getval(t) { return this.isSurge() || this.isLoon() ? $persistentStore.read(t) : this.isQuanX() ? $prefs.valueForKey(t) : this.isNode() ? (this.data = this.loaddata(), this.data[t]) : this.data && this.data[t] || null } setval(t, e) { return this.isSurge() || this.isLoon() ? $persistentStore.write(t, e) : this.isQuanX() ? $prefs.setValueForKey(t, e) : this.isNode() ? (this.data = this.loaddata(), this.data[e] = t, this.writedata(), !0) : this.data && this.data[e] || null } initGotEnv(t) { this.got = this.got ? this.got : require("got"), this.cktough = this.cktough ? this.cktough : require("tough-cookie"), this.ckjar = this.ckjar ? this.ckjar : new this.cktough.CookieJar, t && (t.headers = t.headers ? t.headers : {}, void 0 === t.headers.Cookie && void 0 === t.cookieJar && (t.cookieJar = this.ckjar)) } get(t, e = (() => { })) { t.headers && (delete t.headers["Content-Type"], delete t.headers["Content-Length"]), this.isSurge() || this.isLoon() ? (this.isSurge() && this.isNeedRewrite && (t.headers = t.headers || {}, Object.assign(t.headers, { "X-Surge-Skip-Scripting": !1 })), $httpClient.get(t, (t, s, i) => { !t && s && (s.body = i, s.statusCode = s.status), e(t, s, i) })) : this.isQuanX() ? (this.isNeedRewrite && (t.opts = t.opts || {}, Object.assign(t.opts, { hints: !1 })), $task.fetch(t).then(t => { const { statusCode: s, statusCode: i, headers: r, body: o } = t; e(null, { status: s, statusCode: i, headers: r, body: o }, o) }, t => e(t))) : this.isNode() && (this.initGotEnv(t), this.got(t).on("redirect", (t, e) => { try { if (t.headers["set-cookie"]) { const s = t.headers["set-cookie"].map(this.cktough.Cookie.parse).toString(); s && this.ckjar.setCookieSync(s, null), e.cookieJar = this.ckjar } } catch (t) { this.logErr(t) } }).then(t => { const { statusCode: s, statusCode: i, headers: r, body: o } = t; e(null, { status: s, statusCode: i, headers: r, body: o }, o) }, t => { const { message: s, response: i } = t; e(s, i, i && i.body) })) } post(t, e = (() => { })) { if (t.body && t.headers && !t.headers["Content-Type"] && (t.headers["Content-Type"] = "application/x-www-form-urlencoded"), t.headers && delete t.headers["Content-Length"], this.isSurge() || this.isLoon()) this.isSurge() && this.isNeedRewrite && (t.headers = t.headers || {}, Object.assign(t.headers, { "X-Surge-Skip-Scripting": !1 })), $httpClient.post(t, (t, s, i) => { !t && s && (s.body = i, s.statusCode = s.status), e(t, s, i) }); else if (this.isQuanX()) t.method = "POST", this.isNeedRewrite && (t.opts = t.opts || {}, Object.assign(t.opts, { hints: !1 })), $task.fetch(t).then(t => { const { statusCode: s, statusCode: i, headers: r, body: o } = t; e(null, { status: s, statusCode: i, headers: r, body: o }, o) }, t => e(t)); else if (this.isNode()) { this.initGotEnv(t); const { url: s, ...i } = t; this.got.post(s, i).then(t => { const { statusCode: s, statusCode: i, headers: r, body: o } = t; e(null, { status: s, statusCode: i, headers: r, body: o }, o) }, t => { const { message: s, response: i } = t; e(s, i, i && i.body) }) } } time(t, e = null) { const s = e ? new Date(e) : new Date; let i = { "M+": s.getMonth() + 1, "d+": s.getDate(), "H+": s.getHours(), "m+": s.getMinutes(), "s+": s.getSeconds(), "q+": Math.floor((s.getMonth() + 3) / 3), S: s.getMilliseconds() }; /(y+)/.test(t) && (t = t.replace(RegExp.$1, (s.getFullYear() + "").substr(4 - RegExp.$1.length))); for (let e in i) new RegExp("(" + e + ")").test(t) && (t = t.replace(RegExp.$1, 1 == RegExp.$1.length ? i[e] : ("00" + i[e]).substr(("" + i[e]).length))); return t } msg(e = t, s = "", i = "", r) { const o = t => { if (!t) return t; if ("string" == typeof t) return this.isLoon() ? t : this.isQuanX() ? { "open-url": t } : this.isSurge() ? { url: t } : void 0; if ("object" == typeof t) { if (this.isLoon()) { let e = t.openUrl || t.url || t["open-url"], s = t.mediaUrl || t["media-url"]; return { openUrl: e, mediaUrl: s } } if (this.isQuanX()) { let e = t["open-url"] || t.url || t.openUrl, s = t["media-url"] || t.mediaUrl; return { "open-url": e, "media-url": s } } if (this.isSurge()) { let e = t.url || t.openUrl || t["open-url"]; return { url: e } } } }; if (this.isMute || (this.isSurge() || this.isLoon() ? $notification.post(e, s, i, o(r)) : this.isQuanX() && $notify(e, s, i, o(r))), !this.isMuteLog) { let t = ["", "==============📣系统通知📣=============="]; t.push(e), s && t.push(s), i && t.push(i), console.log(t.join("\n")), this.logs = this.logs.concat(t) } } log(...t) { t.length > 0 && (this.logs = [...this.logs, ...t]), console.log(t.join(this.logSeparator)) } logErr(t, e) { const s = !this.isSurge() && !this.isQuanX() && !this.isLoon(); s ? this.log("", `❗️${this.name}, 错误!`, t.stack) : this.log("", `❗️${this.name}, 错误!`, t) } wait(t) { return new Promise(e => setTimeout(e, t)) } done(t = {}) { const e = (new Date).getTime(), s = (e - this.startTime) / 1e3; this.log("", `🔔${this.name}, 结束! 🕛 ${s} 秒`), this.log(), (this.isSurge() || this.isQuanX() || this.isLoon()) && $done(t) } }(t, e) } diff --git a/jd_cleancart.js b/jd_cleancart.js deleted file mode 100644 index f5e692b..0000000 --- a/jd_cleancart.js +++ /dev/null @@ -1,643 +0,0 @@ -/* - * @Author: X1a0He - * @Contact: https://t.me/X1a0He - * @Github: https://github.com/X1a0He/jd_scripts_fixed - * 清空购物车,支持环境变量设置关键字,用@分隔,使用前请认真看对应注释 - * 由于不是用app来进行购物车删除,所以可能会出现部分购物车数据无法删除的问题,例如预购商品,属于正常 - */ -const $ = new Env('清空购物车'); -//Node.js用户请在jdCookie.js处填写京东ck; -const jdCookieNode = $.isNode() ? require('./jdCookie.js') : ''; -const notify = $.isNode() ? require('./sendNotify') : ''; -let cookiesArr = [], cookie = '', postBody = '', venderCart, error = false; -let args_xh = { - /* - * 跳过某个指定账号,默认为全部账号清空 - * 填写规则:例如当前Cookie1为pt_key=key; pt_pin=pin1;则环境变量填写pin1即可,此时pin1的购物车将不会被清空 - * 若有更多,则按照pin1@pin2@pin3进行填写 - * 环境变量名称:XH_CLEAN_EXCEPT - */ - except: process.env.XH_CLEAN_EXCEPT && process.env.XH_CLEAN_EXCEPT.split('@') || [], - /* - * 控制脚本是否执行,设置为true时才会执行删除购物车 - * 环境变量名称:JD_CART - */ - clean: process.env.JD_CART === 'true' || false, - /* - * 控制脚本运行一次取消多少条购物车数据,为0则不删除,默认为100 - * 环境变量名称:XH_CLEAN_REMOVESIZE - */ - removeSize: process.env.XH_CLEAN_REMOVESIZE * 1 || 100, - /* - * 关键字/关键词设置,当购物车商品标题包含关键字/关键词时,跳过该条数据,多个则用@分隔,例如 旺仔牛奶@红外线@紫光 - * 环境变量名称:XH_CLEAN_KEYWORDS - */ - keywords: process.env.XH_CLEAN_KEYWORDS && process.env.XH_CLEAN_KEYWORDS.split('@') || [], -} -console.log('使用前请确保你认真看了注释,看完注释有问题就带着你的问题来找我') -console.log('tg: https://t.me/X1a0He') -console.log('=====环境变量配置如下=====') -console.log(`except: ${typeof args_xh.except}, ${args_xh.except}`) -console.log(`clean: ${typeof args_xh.clean}, ${args_xh.clean}`) -console.log(`removeSize: ${typeof args_xh.removeSize}, ${args_xh.removeSize}`) -console.log(`keywords: ${typeof args_xh.keywords}, ${args_xh.keywords}`) -console.log('=======================') -console.log() -if ($.isNode()) { - Object.keys(jdCookieNode).forEach((item) => { - cookiesArr.push(jdCookieNode[item]) - }) - if (process.env.JD_DEBUG && process.env.JD_DEBUG === 'false') console.log = () => { }; -} else cookiesArr = [$.getdata('CookieJD'), $.getdata('CookieJD2'), ...jsonParse($.getdata('CookiesJD') || "[]").map(item => item.cookie)].filter(item => !!item); -!(async () => { - if (args_xh.clean) { - if (!cookiesArr[0]) { - $.msg('【京东账号一】移除购物车失败', '【提示】请先获取京东账号一cookie\n直接使用NobyDa的京东签到获取', 'https://bean.m.jd.com/bean/signIndex.action', { - "open-url": "https://bean.m.jd.com/bean/signIndex.action" - }); - } - for (let i = 0; i < cookiesArr.length; i++) { - if (cookiesArr[i]) { - cookie = cookiesArr[i]; - $.UserName = decodeURIComponent(cookie.match(/pt_pin=([^; ]+)(?=;?)/) && cookie.match(/pt_pin=([^; ]+)(?=;?)/)[1]) - $.index = i + 1; - $.isLogin = true; - $.nickName = ''; - $.error = false; - await TotalBean(); - console.log(`****开始【京东账号${$.index}】${$.nickName || $.UserName}****`); - if (args_xh.except.includes($.UserName)) { - console.log(`跳过账号:${$.nickName || $.UserName}`) - continue - } - if (!$.isLogin) { - $.msg($.name, `【提示】cookie已失效`, `京东账号${$.index} ${$.nickName || $.UserName}\n请重新登录获取\nhttps://bean.m.jd.com/bean/signIndex.action`, { - "open-url": "https://bean.m.jd.com/bean/signIndex.action" - }); - if ($.isNode()) { - await notify.sendNotify(`${$.name}cookie已失效 - ${$.UserName}`, `京东账号${$.index} ${$.UserName}\n请重新登录获取cookie`); - } - continue - } - if (args_xh.removeSize === 0) continue; - do { - await getCart_xh(); - $.keywordsNum = 0 - if ($.beforeRemove !== "0") { - await cartFilter_xh(venderCart); - $.retry = 0; - if (parseInt($.beforeRemove) !== $.keywordsNum) await removeCart(); - if($.retry = 2) break; - else { - console.log('\n由于购物车内的商品均包含关键字,本次执行将不删除购物车数据') - break; - } - } else break; - } while (!$.error && $.keywordsNum !== parseInt($.beforeRemove)) - } - } - } else { - console.log("你设置了不删除购物车数据,要删除请设置环境变量 JD_CART 为 true") - } -})().catch((e) => { - $.log('', `❌ ${$.name}, 失败! 原因: ${e}!`, '') -}).finally(() => { - $.done(); -}) - -function getCart_xh() { - console.log('正在获取购物车数据...') - return new Promise((resolve) => { - const option = { - url: 'https://p.m.jd.com/cart/cart.action?fromnav=1&sceneval=2', - headers: { - "Cookie": cookie, - "User-Agent": "jdapp;JD4iPhone/167724 (iPhone; iOS 15.0; Scale/3.00)", - }, - } - $.get(option, async (err, resp, data) => { - try { - data = JSON.parse(data.match(/window\.cartData = ([^;]*)/)[1]) - $.areaId = data.areaId; // locationId的传值 - $.traceId = data.traceId; // traceid的传值 - venderCart = data.cart.venderCart; - postBody = 'pingouchannel=0&commlist='; - $.beforeRemove = data.cart.currentCount ? data.cart.currentCount : 0; - console.log(`获取到购物车数据 ${$.beforeRemove} 条`) - } catch (e) { - $.logErr(e, resp); - } finally { - resolve(data); - } - }); - }) -} - -function cartFilter_xh(cartData) { - console.log("正在整理数据...") - let pid; - $.pushed = 0 - for (let cartJson of cartData) { - if ($.pushed === args_xh.removeSize) break; - for (let sortedItem of cartJson.sortedItems) { - if ($.pushed === args_xh.removeSize) break; - pid = typeof (sortedItem.polyItem.promotion) !== "undefined" ? sortedItem.polyItem.promotion.pid : "" - for (let product of sortedItem.polyItem.products) { - if ($.pushed === args_xh.removeSize) break; - let mainSkuName = product.mainSku.name - $.isKeyword = false - $.isPush = true - for (let keyword of args_xh.keywords) { - if (mainSkuName.indexOf(keyword) !== -1) { - $.keywordsNum += 1 - $.isPush = false - $.keyword = keyword; - break; - } else $.isPush = true - } - if ($.isPush) { - let skuUuid = product.skuUuid; - let mainSkuId = product.mainSku.id - if (pid === "") postBody += `${mainSkuId},,1,${mainSkuId},1,,0,skuUuid:${skuUuid}@@useUuid:0$` - else postBody += `${mainSkuId},,1,${mainSkuId},11,${pid},0,skuUuid:${skuUuid}@@useUuid:0$` - $.pushed += 1; - } else { - console.log(`\n${mainSkuName}`) - console.log(`商品已被过滤,原因:包含关键字 ${$.keyword}`) - $.isKeyword = true - } - } - } - } - postBody += `&type=0&checked=0&locationid=${$.areaId}&templete=1®=1&scene=0&version=20190418&traceid=${$.traceId}&tabMenuType=1&sceneval=2` -} - -function removeCart() { - console.log('正在删除购物车数据...') - return new Promise((resolve) => { - const option = { - url: 'https://wq.jd.com/deal/mshopcart/rmvCmdy?sceneval=2&g_login_type=1&g_ty=ajax', - body: postBody, - headers: { - "Cookie": cookie, - "User-Agent": "jdapp;JD4iPhone/167724 (iPhone; iOS 15.0; Scale/3.00)", - "referer": "https://p.m.jd.com/", - "origin": "https://p.m.jd.com/" - }, - } - $.post(option, async (err, resp, data) => { - try { - data = JSON.parse(data); - $.afterRemove = data.cartJson.num - if ($.afterRemove < $.beforeRemove) { - console.log(`删除成功,当前购物车剩余数据 ${$.afterRemove} 条\n`) - $.beforeRemove = $.afterRemove - } else { - console.log('删除失败') - console.log(data.errMsg) - $.error = true; - $.retry++; - } - } catch (e) { - $.logErr(e, resp); - } finally { - resolve(data); - } - }); - }) -} - -function TotalBean() { - return new Promise(async resolve => { - const options = { - "url": `https://wq.jd.com/user/info/QueryJDUserInfo?sceneval=2`, - "headers": { - "Accept": "application/json,text/plain, */*", - "Content-Type": "application/x-www-form-urlencoded", - "Accept-Encoding": "gzip, deflate, br", - "Accept-Language": "zh-cn", - "Connection": "keep-alive", - "Cookie": cookie, - "Referer": "https://wqs.jd.com/my/jingdou/my.shtml?sceneval=2", - "User-Agent": $.isNode() ? (process.env.JD_USER_AGENT ? process.env.JD_USER_AGENT : (require('./USER_AGENTS').USER_AGENT)) : ($.getdata('JDUA') ? $.getdata('JDUA') : "jdapp;iPhone;9.4.4;14.3;network/4g;Mozilla/5.0 (iPhone; CPU iPhone OS 14_3 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148;supportJDSHWK/1") - } - } - $.post(options, (err, resp, data) => { - try { - if (err) { - console.log(`${JSON.stringify(err)}`) - console.log(`${$.name} API请求失败,请检查网路重试`) - } else { - if (data) { - data = JSON.parse(data); - if (data['retcode'] === 13) { - $.isLogin = false; //cookie过期 - return - } - if (data['retcode'] === 0) { - $.nickName = (data['base'] && data['base'].nickname) || $.UserName; - } else { - $.nickName = $.UserName - } - } else { - console.log(`京东服务器返回空数据`) - } - } - } catch (e) { - $.logErr(e, resp) - } finally { - resolve(); - } - }) - }) -} - -function jsonParse(str) { - if (typeof str == "string") { - try { - return JSON.parse(str); - } catch (e) { - console.log(e); - $.msg($.name, '', '请勿随意在BoxJs输入框修改内容\n建议通过脚本去获取cookie') - return []; - } - } -} - -// prettier-ignore -function Env(t, e) { - "undefined" != typeof process && JSON.stringify(process.env).indexOf("GITHUB") > -1 && process.exit(0); - - class s { - constructor(t) { - this.env = t - } - - send(t, e = "GET") { - t = "string" == typeof t ? { - url: t - } : t; - let s = this.get; - return "POST" === e && (s = this.post), new Promise((e, i) => { - s.call(this, t, (t, s, r) => { - t ? i(t) : e(s) - }) - }) - } - - get(t) { - return this.send.call(this.env, t) - } - - post(t) { - return this.send.call(this.env, t, "POST") - } - } - - return new class { - constructor(t, e) { - this.name = t, this.http = new s(this), this.data = null, this.dataFile = "box.dat", this.logs = [], this.isMute = !1, this.isNeedRewrite = !1, this.logSeparator = "\n", this.startTime = (new Date).getTime(), Object.assign(this, e), this.log("", `🔔${this.name}, 开始!`) - } - - isNode() { - return "undefined" != typeof module && !!module.exports - } - - isQuanX() { - return "undefined" != typeof $task - } - - isSurge() { - return "undefined" != typeof $httpClient && "undefined" == typeof $loon - } - - isLoon() { - return "undefined" != typeof $loon - } - - toObj(t, e = null) { - try { - return JSON.parse(t) - } catch { - return e - } - } - - toStr(t, e = null) { - try { - return JSON.stringify(t) - } catch { - return e - } - } - - getjson(t, e) { - let s = e; - const i = this.getdata(t); - if (i) try { - s = JSON.parse(this.getdata(t)) - } catch { } - return s - } - - setjson(t, e) { - try { - return this.setdata(JSON.stringify(t), e) - } catch { - return !1 - } - } - - getScript(t) { - return new Promise(e => { - this.get({ - url: t - }, (t, s, i) => e(i)) - }) - } - - runScript(t, e) { - return new Promise(s => { - let i = this.getdata("@chavy_boxjs_userCfgs.httpapi"); - i = i ? i.replace(/\n/g, "").trim() : i; - let r = this.getdata("@chavy_boxjs_userCfgs.httpapi_timeout"); - r = r ? 1 * r : 20, r = e && e.timeout ? e.timeout : r; - const [o, h] = i.split("@"), n = { - url: `http://${h}/v1/scripting/evaluate`, - body: { - script_text: t, - mock_type: "cron", - timeout: r - }, - headers: { - "X-Key": o, - Accept: "*/*" - } - }; - this.post(n, (t, e, i) => s(i)) - }).catch(t => this.logErr(t)) - } - - loaddata() { - if (!this.isNode()) return {}; - { - this.fs = this.fs ? this.fs : require("fs"), this.path = this.path ? this.path : require("path"); - const t = this.path.resolve(this.dataFile), - e = this.path.resolve(process.cwd(), this.dataFile), - s = this.fs.existsSync(t), - i = !s && this.fs.existsSync(e); - if (!s && !i) return {}; - { - const i = s ? t : e; - try { - return JSON.parse(this.fs.readFileSync(i)) - } catch (t) { - return {} - } - } - } - } - - writedata() { - if (this.isNode()) { - this.fs = this.fs ? this.fs : require("fs"), this.path = this.path ? this.path : require("path"); - const t = this.path.resolve(this.dataFile), - e = this.path.resolve(process.cwd(), this.dataFile), - s = this.fs.existsSync(t), - i = !s && this.fs.existsSync(e), - r = JSON.stringify(this.data); - s ? this.fs.writeFileSync(t, r) : i ? this.fs.writeFileSync(e, r) : this.fs.writeFileSync(t, r) - } - } - - lodash_get(t, e, s) { - const i = e.replace(/\[(\d+)\]/g, ".$1").split("."); - let r = t; - for (const t of i) - if (r = Object(r)[t], void 0 === r) return s; - return r - } - - lodash_set(t, e, s) { - return Object(t) !== t ? t : (Array.isArray(e) || (e = e.toString().match(/[^.[\]]+/g) || []), e.slice(0, -1).reduce((t, s, i) => Object(t[s]) === t[s] ? t[s] : t[s] = Math.abs(e[i + 1]) >> 0 == +e[i + 1] ? [] : {}, t)[e[e.length - 1]] = s, t) - } - - getdata(t) { - let e = this.getval(t); - if (/^@/.test(t)) { - const [, s, i] = /^@(.*?)\.(.*?)$/.exec(t), r = s ? this.getval(s) : ""; - if (r) try { - const t = JSON.parse(r); - e = t ? this.lodash_get(t, i, "") : e - } catch (t) { - e = "" - } - } - return e - } - - setdata(t, e) { - let s = !1; - if (/^@/.test(e)) { - const [, i, r] = /^@(.*?)\.(.*?)$/.exec(e), o = this.getval(i), - h = i ? "null" === o ? null : o || "{}" : "{}"; - try { - const e = JSON.parse(h); - this.lodash_set(e, r, t), s = this.setval(JSON.stringify(e), i) - } catch (e) { - const o = {}; - this.lodash_set(o, r, t), s = this.setval(JSON.stringify(o), i) - } - } else s = this.setval(t, e); - return s - } - - getval(t) { - return this.isSurge() || this.isLoon() ? $persistentStore.read(t) : this.isQuanX() ? $prefs.valueForKey(t) : this.isNode() ? (this.data = this.loaddata(), this.data[t]) : this.data && this.data[t] || null - } - - setval(t, e) { - return this.isSurge() || this.isLoon() ? $persistentStore.write(t, e) : this.isQuanX() ? $prefs.setValueForKey(t, e) : this.isNode() ? (this.data = this.loaddata(), this.data[e] = t, this.writedata(), !0) : this.data && this.data[e] || null - } - - initGotEnv(t) { - this.got = this.got ? this.got : require("got"), this.cktough = this.cktough ? this.cktough : require("tough-cookie"), this.ckjar = this.ckjar ? this.ckjar : new this.cktough.CookieJar, t && (t.headers = t.headers ? t.headers : {}, void 0 === t.headers.Cookie && void 0 === t.cookieJar && (t.cookieJar = this.ckjar)) - } - - get(t, e = (() => { })) { - t.headers && (delete t.headers["Content-Type"], delete t.headers["Content-Length"]), this.isSurge() || this.isLoon() ? (this.isSurge() && this.isNeedRewrite && (t.headers = t.headers || {}, Object.assign(t.headers, { - "X-Surge-Skip-Scripting": !1 - })), $httpClient.get(t, (t, s, i) => { - !t && s && (s.body = i, s.statusCode = s.status), e(t, s, i) - })) : this.isQuanX() ? (this.isNeedRewrite && (t.opts = t.opts || {}, Object.assign(t.opts, { - hints: !1 - })), $task.fetch(t).then(t => { - const { - statusCode: s, - statusCode: i, - headers: r, - body: o - } = t; - e(null, { - status: s, - statusCode: i, - headers: r, - body: o - }, o) - }, t => e(t))) : this.isNode() && (this.initGotEnv(t), this.got(t).on("redirect", (t, e) => { - try { - if (t.headers["set-cookie"]) { - const s = t.headers["set-cookie"].map(this.cktough.Cookie.parse).toString(); - s && this.ckjar.setCookieSync(s, null), e.cookieJar = this.ckjar - } - } catch (t) { - this.logErr(t) - } - }).then(t => { - const { - statusCode: s, - statusCode: i, - headers: r, - body: o - } = t; - e(null, { - status: s, - statusCode: i, - headers: r, - body: o - }, o) - }, t => { - const { - message: s, - response: i - } = t; - e(s, i, i && i.body) - })) - } - - post(t, e = (() => { })) { - if (t.body && t.headers && !t.headers["Content-Type"] && (t.headers["Content-Type"] = "application/x-www-form-urlencoded"), t.headers && delete t.headers["Content-Length"], this.isSurge() || this.isLoon()) this.isSurge() && this.isNeedRewrite && (t.headers = t.headers || {}, Object.assign(t.headers, { - "X-Surge-Skip-Scripting": !1 - })), $httpClient.post(t, (t, s, i) => { - !t && s && (s.body = i, s.statusCode = s.status), e(t, s, i) - }); - else if (this.isQuanX()) t.method = "POST", this.isNeedRewrite && (t.opts = t.opts || {}, Object.assign(t.opts, { - hints: !1 - })), $task.fetch(t).then(t => { - const { - statusCode: s, - statusCode: i, - headers: r, - body: o - } = t; - e(null, { - status: s, - statusCode: i, - headers: r, - body: o - }, o) - }, t => e(t)); - else if (this.isNode()) { - this.initGotEnv(t); - const { - url: s, - ...i - } = t; - this.got.post(s, i).then(t => { - const { - statusCode: s, - statusCode: i, - headers: r, - body: o - } = t; - e(null, { - status: s, - statusCode: i, - headers: r, - body: o - }, o) - }, t => { - const { - message: s, - response: i - } = t; - e(s, i, i && i.body) - }) - } - } - - time(t, e = null) { - const s = e ? new Date(e) : new Date; - let i = { - "M+": s.getMonth() + 1, - "d+": s.getDate(), - "H+": s.getHours(), - "m+": s.getMinutes(), - "s+": s.getSeconds(), - "q+": Math.floor((s.getMonth() + 3) / 3), - S: s.getMilliseconds() - }; - /(y+)/.test(t) && (t = t.replace(RegExp.$1, (s.getFullYear() + "").substr(4 - RegExp.$1.length))); - for (let e in i) new RegExp("(" + e + ")").test(t) && (t = t.replace(RegExp.$1, 1 == RegExp.$1.length ? i[e] : ("00" + i[e]).substr(("" + i[e]).length))); - return t - } - - msg(e = t, s = "", i = "", r) { - const o = t => { - if (!t) return t; - if ("string" == typeof t) return this.isLoon() ? t : this.isQuanX() ? { - "open-url": t - } : this.isSurge() ? { - url: t - } : void 0; - if ("object" == typeof t) { - if (this.isLoon()) { - let e = t.openUrl || t.url || t["open-url"], - s = t.mediaUrl || t["media-url"]; - return { - openUrl: e, - mediaUrl: s - } - } - if (this.isQuanX()) { - let e = t["open-url"] || t.url || t.openUrl, - s = t["media-url"] || t.mediaUrl; - return { - "open-url": e, - "media-url": s - } - } - if (this.isSurge()) { - let e = t.url || t.openUrl || t["open-url"]; - return { - url: e - } - } - } - }; - if (this.isMute || (this.isSurge() || this.isLoon() ? $notification.post(e, s, i, o(r)) : this.isQuanX() && $notify(e, s, i, o(r))), !this.isMuteLog) { - let t = ["", "==============📣系统通知📣=============="]; - t.push(e), s && t.push(s), i && t.push(i), console.log(t.join("\n")), this.logs = this.logs.concat(t) - } - } - - log(...t) { - t.length > 0 && (this.logs = [...this.logs, ...t]), console.log(t.join(this.logSeparator)) - } - - logErr(t, e) { - const s = !this.isSurge() && !this.isQuanX() && !this.isLoon(); - s ? this.log("", `❗️${this.name}, 错误!`, t.stack) : this.log("", `❗️${this.name}, 错误!`, t) - } - - wait(t) { - return new Promise(e => setTimeout(e, t)) - } - - done(t = {}) { - const e = (new Date).getTime(), - s = (e - this.startTime) / 1e3; - this.log("", `🔔${this.name}, 结束! 🕛 ${s} 秒`), this.log(), (this.isSurge() || this.isQuanX() || this.isLoon()) && $done(t) - } - }(t, e) -}