This commit is contained in:
Faker 2022-10-16 01:29:27 +08:00
parent cb89413e7d
commit 7f167ac322
65 changed files with 4336 additions and 6141 deletions

View File

@ -13,18 +13,18 @@ const {
DisableCk,
EnableCk,
getstatus
} = require('./ql');
} = require('./utils/ql');
const api = got.extend({
retry: {
limit: 0
},
responseType: 'json',
});
});
let ShowSuccess = "false",
CKAlwaysNotify = "false",
CKAutoEnable = "true",
NoWarnError = "false";
CKAlwaysNotify = "false",
CKAutoEnable = "true",
NoWarnError = "false";
let MessageUserGp2 = "";
let MessageUserGp3 = "";
@ -45,38 +45,38 @@ let IndexGp4 = 0;
let IndexAll = 0;
let TempErrorMessage = '',
TempSuccessMessage = '',
TempDisableMessage = '',
TempEnableMessage = '',
TempOErrorMessage = '';
TempSuccessMessage = '',
TempDisableMessage = '',
TempEnableMessage = '',
TempOErrorMessage = '';
let allMessage = '',
ErrorMessage = '',
SuccessMessage = '',
DisableMessage = '',
EnableMessage = '',
OErrorMessage = '';
ErrorMessage = '',
SuccessMessage = '',
DisableMessage = '',
EnableMessage = '',
OErrorMessage = '';
let allMessageGp2 = '',
ErrorMessageGp2 = '',
SuccessMessageGp2 = '',
DisableMessageGp2 = '',
EnableMessageGp2 = '',
OErrorMessageGp2 = '';
ErrorMessageGp2 = '',
SuccessMessageGp2 = '',
DisableMessageGp2 = '',
EnableMessageGp2 = '',
OErrorMessageGp2 = '';
let allMessageGp3 = '',
ErrorMessageGp3 = '',
SuccessMessageGp3 = '',
DisableMessageGp3 = '',
EnableMessageGp3 = '',
OErrorMessageGp3 = '';
ErrorMessageGp3 = '',
SuccessMessageGp3 = '',
DisableMessageGp3 = '',
EnableMessageGp3 = '',
OErrorMessageGp3 = '';
let allMessageGp4 = '',
ErrorMessageGp4 = '',
SuccessMessageGp4 = '',
DisableMessageGp4 = '',
EnableMessageGp4 = '',
OErrorMessageGp4 = '';
ErrorMessageGp4 = '',
SuccessMessageGp4 = '',
DisableMessageGp4 = '',
EnableMessageGp4 = '',
OErrorMessageGp4 = '';
let strAllNotify = "";
let strNotifyOneTemp = "";
@ -118,11 +118,6 @@ if ($.isNode() && process.env.CHECKCK_CKNOWARNERROR) {
if ($.isNode() && process.env.CHECKCK_ALLNOTIFY) {
strAllNotify = process.env.CHECKCK_ALLNOTIFY;
/* if (strTempNotify.length > 0) {
for (var TempNotifyl in strTempNotify) {
strAllNotify += strTempNotify[TempNotifyl] + '\n';
}
} */
console.log(`检测到设定了温馨提示,将在推送信息中置顶显示...`);
strAllNotify = `\n【✨✨✨✨温馨提示✨✨✨✨】\n` + strAllNotify;
console.log(strAllNotify);
@ -194,7 +189,11 @@ if ($.isNode() && process.env.CHECKCK_ALLNOTIFY) {
ReturnMessageTitle = `【账号${IndexAll}🆔】${$.UserName2}`;
}
try {
await TotalBean();
}catch (e) {
}
if ($.NoReturn) {
console.log(`接口1检测失败尝试使用接口2....\n`);
await isLoginByX1a0He();
@ -481,8 +480,8 @@ if ($.isNode() && process.env.CHECKCK_ALLNOTIFY) {
}
})()
.catch((e) => $.logErr(e))
.finally(() => $.done())
.catch((e) => $.logErr(e))
.finally(() => $.done())
function TotalBean() {
return new Promise(async resolve => {
@ -502,7 +501,7 @@ function TotalBean() {
$.get(options, (err, resp, data) => {
try {
if (err) {
$.logErr(err)
// $.logErr(err)
$.nickName = decodeURIComponent($.UserName);
$.NoReturn = `${$.nickName} :` + `${JSON.stringify(err)}\n`;
} else {
@ -528,7 +527,7 @@ function TotalBean() {
}
} catch (e) {
$.nickName = decodeURIComponent($.UserName);
$.logErr(e)
// $.logErr(e)
$.NoReturn = `${$.nickName} : 检测出错,不做变动\n`;
}
finally {

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -1,20 +1,24 @@
/*
美丽研究院
修复+尽量优化为同步执行,减少并发,说不定就减小黑号概率了呢?
https://raw.githubusercontent.com/aTenb/jdOpenSharePicker/master/jd_beautyStudy.js
更新时间:2021-12-03
活动入口京东app首页-美妆馆-底部中间按钮
来源 Dylan
定时自定义集中访问可能炸
活动入口京东app首页-美妆馆-底部中间按钮
#随机定时运行一次
*/
const $ = new Env('美丽研究院');
const notify = $.isNode() ? require('./sendNotify') : '';
console.log('连接服务器不稳定,能不能用随缘!!!')
const jdCookieNode = $.isNode() ? require('./jdCookie.js') : '';
const WebSocket = require('ws');
const UA = process.env.JD_USER_AGENT ? process.env.JD_USER_AGENT : (require('./USER_AGENTS').USER_AGENT)
const JD_API_HOST = 'https://api.m.jd.com/client.action';
$.accountCheck = true;
$.init = false;
let cookiesArr = [], cookie = '', message;
function oc(fn, defaultVal) {
try {
return fn()
@ -22,6 +26,7 @@ function oc(fn, defaultVal) {
return undefined
}
}
if ($.isNode()) {
Object.keys(jdCookieNode).forEach((item) => {
cookiesArr.push(jdCookieNode[item])
@ -30,7 +35,7 @@ if ($.isNode()) {
} else {
cookiesArr = [$.getdata('CookieJD'), $.getdata('CookieJD2'), ...jsonParse($.getdata('CookiesJD') || "[]").map(item => item.cookie)].filter(item => !!item);
}
const JD_API_HOST = 'https://api.m.jd.com/client.action';
!(async () => {
if (!cookiesArr[0]) {
$.msg($.name, '【提示】请先获取京东账号一cookie\n直接使用NobyDa的京东签到获取', 'https://bean.m.jd.com/', {"open-url": "https://bean.m.jd.com/"});
@ -50,7 +55,7 @@ const JD_API_HOST = 'https://api.m.jd.com/client.action';
$.nickName = '';
message = '';
$.token = '';
await TotalBean();
//await TotalBean();
console.log(`\n******开始【京东账号${$.index}${$.nickName || $.UserName}*********\n`);
if (!$.isLogin) {
$.msg($.name, `【提示】cookie已失效`, `京东账号${$.index} ${$.nickName || $.UserName}\n请重新登录获取\nhttps://bean.m.jd.com/`, {"open-url": "https://bean.m.jd.com/"});
@ -61,9 +66,7 @@ const JD_API_HOST = 'https://api.m.jd.com/client.action';
continue
}
await accountCheck();
while (!$.hasDone) {
await $.wait(3000)
}
await $.wait(10000)
if ($.accountCheck) {
await jdBeauty();
}
@ -87,7 +90,7 @@ async function accountCheck() {
await $.wait(10000)
await getIsvToken2()
await $.wait(10000)
await getToken()
await getAuth()
await $.wait(10000)
if (!$.token) {
console.log(`\n\n提示请尝试换服务器ip或者设置"xinruimz-isv.isvjcloud.com"域名直连或者自定义UA再次尝试(环境变量JD_USER_AGENT)\n\n`)
@ -102,9 +105,9 @@ async function accountCheck() {
client.onopen = async () => {
console.log(`美容研究院服务器连接成功`);
client.send('{"msg":{"type":"action","args":{"source":1},"action":"_init_"}}');
await $.wait(10000);
await $.wait(20000);
client.send(`{"msg":{"type":"action","args":{"source":1},"action":"get_user"}}`);
await $.wait(10000);
await $.wait(20000);
};
client.onmessage = async function (e) {
if (e.data !== 'pong' && e.data && safeGet(e.data)) {
@ -143,7 +146,6 @@ async function jdBeauty() {
async function mr() {
$.coins = 0
let positionList = ['b1', 'h1', 's1', 'b2', 'h2', 's2']
let positionList2 = ['b2', 'h2', 's2']
$.tokens = []
$.pos = []
$.helpInfo = []
@ -165,24 +167,18 @@ async function mr() {
await $.wait(10000);
}
console.log(`\n========生产任务相关========\n`)
for (let help of helpInfo) {
client.send(help);
}
await $.wait(3000)
client.send(`{"msg":{"type":"action","args":{},"action":"get_produce_material"}}`)
await $.wait(10000);
await $.wait(20000);
// 获得正在生产的商品信息
client.send('{"msg":{"type":"action","args":{},"action":"product_producing"}}')
await $.wait(10000);
// 获得库存
client.send(`{"msg":{"type":"action","args":{},"action":"get_package"}}`)
await $.wait(20000);
// 获得可生成的商品列表
client.send(`{"msg":{"type":"action","args":{"page":1,"num":10},"action":"product_lists"}}`)
await $.wait(10000);
await $.wait(20000);
// 获得原料生产列表
for (let pos of positionList) {
client.send(`{"msg":{"type":"action","args":{"position":"${pos}"},"action":"produce_position_info_v2"}}`)
await $.wait(10000);
await $.wait(20000);
}
console.log(`\n========日常任务相关========`)
client.send(`{"msg":{"type":"action","args":{},"action":"check_up"}}`)
@ -196,7 +192,7 @@ async function mr() {
await $.wait(50000);
//最后做时间最久的日常任务
client.send(`{"msg":{"type":"action","args":{},"action":"shop_products"}}`)
await $.wait(10000);
await $.wait(20000);
}
};
client.onclose = () => {
@ -205,10 +201,7 @@ async function mr() {
$.init = true;
$.hasDone = true;
for (let i = 0; i < $.pos.length && i < $.tokens.length; ++i) {
client.send(`{"msg":{"type":"action","args":{"inviter_id":"${$.userInfo.id}"},"action":"employee_get_user"}}`);
$.helpInfo.push(`{"msg":{"type":"action","args":{"inviter_id":"${$.userInfo.id}","position":"${$.pos[i]}","token":"${$.tokens[i]}"},"action":"employee_v2"}}`)
client.send(`{"msg":{"type":"action","args":{"inviter_id":"${$.userInfo.id}","position":"${$.pos[i]}"},"action":"employee_speed_v2"}}`);
client.send(`{"msg":{"action":"write","type":"action","args":{"action_type":3,"channel":2,"source_app":2}}}`);
$.helpInfo.push(`{"msg":{"type":"action","args":{"inviter_id":"${$.userInfo.id}","position":"${$.pos[i]}","token":"${$.tokens[i]}"},"action":"employee"}}`)
}
};
client.onmessage = async function (e) {
@ -223,9 +216,9 @@ async function mr() {
// 去签到
console.log(`去做签到任务`)
client.send(`{"msg":{"type":"action","args":{},"action":"sign_in"}}`)
await $.wait(10000);
await $.wait(20000);
client.send(`{"msg":{"action":"write","type":"action","args":{"action_type":1,"channel":2,"source_app":2}}}`)
await $.wait(10000);
await $.wait(20000);
}
break
case "get_user":
@ -235,7 +228,7 @@ async function mr() {
console.log(`去做新手任务`)
for (let i = $.userInfo.step; i < 15; ++i) {
client.send(`{"msg":{"type":"action","args":{},"action":"newcomer_update"}}`)
await $.wait(10000);
await $.wait(20000);
}
} else
$.init = true;
@ -288,12 +281,10 @@ async function mr() {
}
await $.wait(10000);
}
if ($.taskState.meetingplace_view.length <= vo.data.meetingplaces.length) {
for (let vc of vo.data.meetingplaces) {
console.log(`去做第${vc.name}浏览会场任务`)
client.send(`{"msg":{"type":"action","args":{"source":1,"meetingplace_id":${vc.id}},"action":"meetingplace_view"}}`)
await $.wait(2500)
}
for (let i = $.taskState.meetingplace_view; i < $.taskState.mettingplace_count; ++i) {
console.log(`去做第${i + 1}次浏览会场任务`)
client.send(`{"msg":{"type":"action","args":{"source":1},"action":"meetingplace_view"}}`)
await $.wait(10000);
}
if ($.taskState.today_answered === 0) {
console.log(`去做每日问答任务`)
@ -365,7 +356,7 @@ async function mr() {
client.send(`{"msg":{"type":"action","args":{"position":"${vo.data.position}","material_id":${ma.id}},"action":"material_produce_v2"}}`)
await $.wait(5000);
} else {
ma = $.material.base[1]['items'][positionList2.indexOf(vo.data.position)]
ma = $.material.base[1]['items'][positionList.indexOf(vo.data.position)]
if (ma) {
console.log(`else去生产${ma.name}`)
client.send(`{"msg":{"type":"action","args":{"position":"${vo.data.position}","material_id":${ma.id}},"action":"material_produce_v2"}}`)
@ -411,7 +402,7 @@ async function mr() {
case "product_lists":
let need_material = []
if (vo.code === '200' || vo.code === 200) {
$.products = vo.data.filter(vo=>vo.level===$.level-1)
$.products = vo.data.filter(vo=>vo.level===$.level)
console.log(`========可生产商品信息========`)
for (let product of $.products) {
let num = Infinity
@ -440,7 +431,6 @@ async function mr() {
console.log(`${product.name}】可生产份数大于0去生产`)
//product_produce 产品研发里的生产
client.send(`{"msg":{"type":"action","args":{"product_id":${product.id},"amount":${num}},"action":"product_produce"}}`)
client.send(`{"msg":{"type":"action","args":{"product_id":${product.id},"amount":${num}},"action":"once_completion"}}`)
await $.wait(10000);
} else {
console.log(msg)
@ -504,9 +494,9 @@ async function mr() {
for (let benefit of vo.data) {
if (benefit.type === 1) { //type 1 是京豆
//console.log(`benefit:${JSON.stringify(benefit)}`);
if(benefit.description === "1 京豆" && parseInt(benefit.day_exchange_count) < 5 && $.total > benefit.coins){
if(benefit.description === "1 京豆" && parseInt(benefit.day_exchange_count) < 10 && $.total > benefit.coins){
$timenum = parseInt($.total / benefit.coins);
if ($timenum > 5) $timenum = 5;
if ($timenum > 10) $timenum = 10;
console.log(`\n可兑换${$timenum}次京豆:`)
for (let i = 0; i < $timenum; i++){
client.send(`{"msg":{"type":"action","args":{"benefit_id":${benefit.id}},"action":"to_exchange"}}`);
@ -528,7 +518,7 @@ async function mr() {
break
case "to_exchange":
if(oc(() => vo.data.coins)){
console.log(`兑换${vo.data.coins/-10000}京豆成功`)
console.log(`兑换${vo.data.coins/-1000}京豆成功`)
}else{
console.log(`兑换京豆失败`)
}
@ -536,15 +526,15 @@ async function mr() {
case "get_produce_material":
$.material = vo.data
break
//case "to_employee":
// console.log(`雇佣助力码【${oc(() => vo.data.token)}】`)
// if(oc(() => vo.data.token)){
// $.tokens.push(vo.data.token)
// }else{
// console.log(`not exist:${oc(() => vo.data)}`)
// }
// break
case "employee_v2":
case "to_employee":
console.log(`雇佣助力码【${oc(() => vo.data.token)}`)
if(oc(() => vo.data.token)){
$.tokens.push(vo.data.token)
}else{
console.log(`not exist:${oc(() => vo.data)}`)
}
break
case "employee":
console.log(`${vo.msg}`)
break
}
@ -587,24 +577,18 @@ function getIsvToken() {
}
async function getIsvToken2() {
for (let i=0; i<3; i++){
var body = await getSignfromDY('isvObfuscator',{"id":"","url":"https://xinruimz-isv.isvjcloud.com"})
if(body) break;
await $.wait(5000)
}
let config = {
url: 'https://api.m.jd.com/client.action?functionId=isvObfuscator',
body: body,
body: await getSignfromDY('isvObfuscator',{"id":"","url":"https://xinruimz-isv.isvjcloud.com"}),
headers: {
'Host': 'api.m.jd.com',
'accept': '*/*',
'user-agent': UA,
//'accept-language': 'zh-Hans-JP;q=1, en-JP;q=0.9, zh-Hant-TW;q=0.8, ja-JP;q=0.7, en-US;q=0.6',
//'content-type': 'application/x-www-form-urlencoded',
'accept-language': 'zh-Hans-JP;q=1, en-JP;q=0.9, zh-Hant-TW;q=0.8, ja-JP;q=0.7, en-US;q=0.6',
'content-type': 'application/x-www-form-urlencoded',
'Cookie': cookie
}
}
return new Promise(resolve => {
$.post(config, async (err, resp, data) => {
try {
@ -627,11 +611,11 @@ async function getIsvToken2() {
})
}
function getSignfromDY(functionId, body) {
var strsign = '';
let data = `functionId=${functionId}&body=${encodeURIComponent(JSON.stringify(body))}`
var strsign = '';
let data = `functionId=${functionId}&body=${encodeURIComponent(JSON.stringify(body))}`
return new Promise((resolve) => {
let opt = {
url: "https://sign-hst-rxboogtocm.cn-hangzhou.fcapp.run/dylan/getsign",
url: "https://jd.nbplay.xyz/dylan/getsign",
body: data,
headers: {
'Content-Type': 'application/x-www-form-urlencoded',
@ -664,10 +648,10 @@ let data = `functionId=${functionId}&body=${encodeURIComponent(JSON.stringify(bo
})
})
}
function getToken() {
function getAuth() {
let config = {
url: 'https://xinruimz-isv.isvjcloud.com/api/auth',
body: JSON.stringify({"token":$.token2,"source":"01","channel":"meizhuangguandibudaohang"}),
body: JSON.stringify({"token":$.token2,"source":"01"}),
headers: {
'Host': 'xinruimz-isv.isvjcloud.com',
'Accept': 'application/x.jd-school-island.v1+json',
@ -678,7 +662,7 @@ function getToken() {
'user-agent': UA,
'Referer': 'https://xinruimz-isv.isvjcloud.com/logined_jd/',
'Authorization': 'Bearer undefined',
'Cookie': `IsvToken=${$.token2};`
'Cookie': `IsvToken=${$.isvToken};`
}
}
return new Promise(resolve => {

File diff suppressed because one or more lines are too long

15
jd_cash.js Normal file

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

169
jd_check_cookie.js Normal file

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -50,7 +50,7 @@ const JD_API_HOST = 'https://api.m.jd.com/client.action';
$.isLogin = true;
$.nickName = '';
message = ''
//await TotalBean();
////await TotalBean();
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"});

File diff suppressed because one or more lines are too long

View File

@ -1,16 +1,13 @@
/*
积分换话费
入口首页-生活·缴费-积分换话费
update20220530
cron 33 7 * * * jd_dwapp.js
cron "33 5 * * *" jd_dwapp.js
*/
const $ = new Env('积分换话费');
const notify = $.isNode() ? require('./sendNotify') : '';
//Node.js用户请在jdCookie.js处填写京东ck;
const jdCookieNode = $.isNode() ? require('./jdCookie.js') : '';
CryptoJS = $.isNode() ? require('crypto-js') : CryptoJS;
//IOS等用户直接用NobyDa的jd cookie
let cookiesArr = [], cookie = '';
if ($.isNode()) {
Object.keys(jdCookieNode).forEach((item) => { cookiesArr.push(jdCookieNode[item]) })
@ -31,7 +28,7 @@ if ($.isNode()) {
$.isLogin = true;
$.nickName = '';
message = '';
await TotalBean();
//await TotalBean();
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" });
@ -92,7 +89,6 @@ async function taskrecord(id) {
})
}
async function taskreceive(id) {
enc = await sign(id)
let body = { "id": id, ...enc }
@ -122,7 +118,6 @@ async function taskreceive(id) {
})
})
}
async function usersign() {
body = await sign()
return new Promise(resolve => {
@ -149,7 +144,6 @@ async function usersign() {
})
})
}
async function tasklist() {
body = await sign()
return new Promise(resolve => {
@ -191,7 +185,6 @@ function taskPostUrl(function_id, body) {
}
}
}
function TotalBean() {
return new Promise(async resolve => {
const options = {
@ -236,7 +229,6 @@ function TotalBean() {
})
})
}
function getUUID(format = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx', UpperCase = 0) {
return format.replace(/[xy]/g, function (c) {
var r = Math.random() * 16 | 0, v = c == 'x' ? r : (r & 0x3 | 0x8);
@ -248,7 +240,6 @@ function getUUID(format = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx', UpperCase
return uuid;
});
}
async function sign(en) {
time = new Date().getTime();
let encStr = en || '';

File diff suppressed because one or more lines are too long

589
jd_joyPark.js Normal file

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

248
jd_joy_withdraw.js Normal file

File diff suppressed because one or more lines are too long

213
jd_jr_draws.js Normal file

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

312
jd_prices.js Normal file

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

360
jd_superBrand.js Normal file

File diff suppressed because one or more lines are too long

290
jd_superBrandXZ.js Normal file

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -203,7 +203,7 @@ let args_xh = {
$.index = i + 1;
$.isLogin = true;
$.nickName = '';
//await totalBean();
//await TotalBean();
console.log(`\n开始【京东账号${$.index}${$.nickName || $.UserName}\n`);
$.except = false;
if(args_xh.except.includes($.UserName)){

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -1,799 +0,0 @@
/*
* @Author: X1a0He
* @LastEditors: X1a0He
* @Description: 批量取关京东店铺和商品
* @Fixed: 不再支持Qx仅支持Node.js
*/
const $ = new Env('批量取关店铺和商品');
//Node.js用户请在jdCookie.js处填写京东ck;
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);
}
let args_xh = {
/*
* 跳过某个指定账号默认为全部账号清空
* 填写规则例如当前Cookie1为pt_key=key; pt_pin=pin1;则环境变量填写pin1即可此时pin1的购物车将不会被清空
* 若有更多则按照pin1@pin2@pin3进行填写
* 环境变量名称XH_UNSUB_EXCEPT
*/
except: process.env.XH_UNSUB_EXCEPT && process.env.XH_UNSUB_EXCEPT.split('@') || [],
/*
* 是否执行取消关注默认true
* 可通过环境变量控制JD_UNSUB
* */
isRun: process.env.JD_UNSUB === 'true' || true,
/*
* 执行完毕是否进行通知默认false
* 可用环境变量控制JD_UNSUB_NOTIFY
* */
isNotify: process.env.JD_UNSUB_NOTIFY === 'true' || false,
/*
* 每次获取已关注的商品数
* 可设置环境变量JD_UNSUB_GPAGESIZE默认为20不建议超过20
* */
goodPageSize: process.env.JD_UNSUB_GPAGESIZE * 1 || 20,
/*
* 每次获取已关注的店铺数
* 可设置环境变量JD_UNSUB_SPAGESIZE默认为20不建议超过20
* */
shopPageSize: process.env.JD_UNSUB_SPAGESIZE * 1 || 20,
/*
* 商品类过滤关键词只要商品名内包含关键词则不会被取消关注
* 可设置环境变量JD_UNSUB_GKEYWORDS@分隔
* */
goodsKeyWords: process.env.JD_UNSUB_GKEYWORDS && process.env.JD_UNSUB_GKEYWORDS.split('@') || [],
/*
* 店铺类过滤关键词只要店铺名内包含关键词则不会被取消关注
* 可设置环境变量JD_UNSUB_SKEYWORDS@分隔
* */
shopKeyWords: process.env.JD_UNSUB_SKEYWORDS && process.env.JD_UNSUB_SKEYWORDS.split('@') || [],
/*
* 间隔防止提示操作频繁单位毫秒(1 = 1000毫秒)
* 可用环境变量控制JD_UNSUB_INTERVAL默认为3000毫秒
* */
unSubscribeInterval: process.env.JD_UNSUB_INTERVAL * 1 || 1000,
/*
* 是否打印日志
* 可用环境变量控制JD_UNSUB_PLOG默认为true
* */
printLog: process.env.JD_UNSUB_PLOG === 'true' || true,
/*
* 失败次数当取关商品或店铺时如果连续 x 次失败则结束本次取关防止死循环
* 可用环境变量控制JD_UNSUB_FAILTIMES默认为3次
* */
failTimes: process.env.JD_UNSUB_FAILTIMES || 3
}
!(async() => {
console.log('X1a0He留运行前请看好脚本内的注释日志已经很清楚了有问题带着日志来问')
if(args_xh.isRun){
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"
});
}
await requireConfig();
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 = '';
//await TotalBean();
console.log(`\n****开始【京东账号${$.index}${$.nickName || $.UserName}*****\n`);
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
}
$.shopsKeyWordsNum = 0;
$.goodsKeyWordsNum = 0;
$.unsubscribeGoodsNum = 0;
$.unsubscribeShopsNum = 0;
$.goodsTotalNum = 0 //记录当前总共关注了多少商品
$.shopsTotalNum = 0; //记录当前总共关注了多少店铺
$.commIdList = ``;
$.shopIdList = ``;
$.endGoods = $.endShops = false;
$.failTimes = 0;
// console.log(`=====京东账号${$.index} ${$.nickName || $.UserName}内部变量=====`)
// console.log(`$.unsubscribeGoodsNum: ${$.unsubscribeGoodsNum}`)
// console.log(`$.unsubscribeShopsNum: ${$.unsubscribeShopsNum}`)
// console.log(`$.goodsTotalNum: ${$.goodsTotalNum}`)
// console.log(`$.shopsTotalNum: ${$.shopsTotalNum}`)
// console.log(`$.commIdList: ${$.commIdList}`)
// console.log(`$.shopIdList: ${$.shopIdList}`)
// console.log(`$.failTimes: ${$.failTimes}`)
// console.log(`================`)
await favCommQueryFilter(); //获取商品并过滤
await $.wait(args_xh.unSubscribeInterval)
if(!$.endGoods && parseInt($.goodsTotalNum) !== parseInt($.goodsKeyWordsNum)) await favCommBatchDel();//取关商品
else console.log("不执行取消收藏商品\n")
await $.wait(args_xh.unSubscribeInterval)
await queryShopFavList(); //获取店铺并过滤
await $.wait(args_xh.unSubscribeInterval)
if(!$.endShops && parseInt($.shopsTotalNum) !== parseInt($.shopsKeyWordsNum)) await batchunfollow(); //取关店铺
else console.log("不执行取消收藏店铺\n")
do {
//如果商品总数和店铺总数都为0则已清空跳出循环
if(parseInt($.goodsTotalNum) === 0 && parseInt($.shopsTotalNum) === 0) break;
else {
//如果商品总数或店铺总数有一个不为0的话先判断是哪个不为0
if(parseInt($.goodsTotalNum) !== 0){
if(parseInt($.goodsTotalNum) === parseInt($.goodsKeyWordsNum)) break;
else {
$.commIdList = ``
await favCommQueryFilter(); //获取商品并过滤
await $.wait(args_xh.unSubscribeInterval)
if(!$.endGoods && parseInt($.goodsTotalNum) !== parseInt($.goodsKeyWordsNum)) await favCommBatchDel(); //取关商品
else console.log("不执行取消收藏商品\n")
}
} else if(parseInt($.shopsTotalNum) !== 0){
if(parseInt($.shopsTotalNum) === parseInt($.shopsKeyWordsNum)) break;
else {
$.shopIdList = ``
await queryShopFavList(); //获取店铺并过滤
await $.wait(args_xh.unSubscribeInterval)
if(!$.endShops && parseInt($.shopsTotalNum) !== parseInt($.shopsKeyWordsNum)) await batchunfollow(); //取关店铺
else console.log("不执行取消收藏店铺\n")
}
}
}
if($.failTimes >= args_xh.failTimes){
console.log('失败次数到达设定值,触发防死循环机制,该帐号已跳过');
break;
}
} while(true)
await showMsg_xh();
}
}
}
})().catch((e) => {
$.log('', `${$.name}, 失败! 原因: ${e}!`, '')
}).finally(() => {
$.done();
})
function requireConfig(){
return new Promise(resolve => {
if($.isNode() && process.env.JD_UNSUB){
console.log('=====环境变量配置如下=====')
console.log(`except: ${typeof args_xh.except}, ${args_xh.except}`)
console.log(`isNotify: ${typeof args_xh.isNotify}, ${args_xh.isNotify}`)
console.log(`goodPageSize: ${typeof args_xh.goodPageSize}, ${args_xh.goodPageSize}`)
console.log(`shopPageSize: ${typeof args_xh.shopPageSize}, ${args_xh.shopPageSize}`)
console.log(`goodsKeyWords: ${typeof args_xh.goodsKeyWords}, ${args_xh.goodsKeyWords}`)
console.log(`shopKeyWords: ${typeof args_xh.shopKeyWords}, ${args_xh.shopKeyWords}`)
console.log(`unSubscribeInterval: ${typeof args_xh.unSubscribeInterval}, ${args_xh.unSubscribeInterval}`)
console.log(`printLog: ${typeof args_xh.printLog}, ${args_xh.printLog}`)
console.log(`failTimes: ${typeof args_xh.failTimes}, ${args_xh.failTimes}`)
console.log('=======================')
}
resolve()
})
}
function showMsg_xh(){
if(args_xh.isNotify){
$.msg($.name, ``, `【京东账号${$.index}${$.nickName}\n【还剩关注店铺】${$.shopsTotalNum}\n【还剩关注商品】${$.goodsTotalNum}`);
} else {
$.log(`【京东账号${$.index}${$.nickName}\n【还剩关注店铺】${$.shopsTotalNum}\n【还剩关注商品】${$.goodsTotalNum}`);
}
}
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 favCommQueryFilter(){
return new Promise((resolve) => {
console.log('正在获取已关注的商品...')
const option = {
url: `https://wq.jd.com/fav/comm/FavCommQueryFilter?cp=1&pageSize=${args_xh.goodPageSize}&category=0&promote=0&cutPrice=0&coupon=0&stock=0&sceneval=2`,
headers: {
"Cookie": cookie,
"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"),
"Referer": "https://wqs.jd.com/"
},
}
$.get(option, async(err, resp, data) => {
try{
if(data.indexOf("Authorization") !== -1){
console.log("获取数据失败401 Authorization Required可能是User-Agent的问题")
return;
}
data = JSON.parse(getSubstr(data, "try{(", ");}catch(e){}"));
if(data.iRet === '0'){
$.goodsTotalNum = parseInt(data.totalNum);
console.log(`当前已关注商品:${$.goodsTotalNum}`)
$.goodsKeyWordsNum = 0;
for(let item of data.data){
if(args_xh.goodsKeyWords.some(keyword => item.commTitle.includes(keyword))){
args_xh.printLog ? console.log(`${item.commTitle} `) : ''
args_xh.printLog ? console.log('商品被过滤,含有关键词\n') : ''
$.goodsKeyWordsNum += 1;
} else {
$.commIdList += item.commId + ",";
$.unsubscribeGoodsNum++;
}
}
} else {
$.endGoods = true;
console.log("无商品可取消收藏\n");
}
} catch(e){
$.logErr(e, resp);
} finally{
resolve(data);
}
});
})
}
function favCommBatchDel(){
return new Promise(resolve => {
console.log("正在取消收藏商品...")
const option = {
url: `https://wq.jd.com/fav/comm/FavCommBatchDel?commId=${$.commIdList}&sceneval=2&g_login_type=1`,
headers: {
"Cookie": cookie,
"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"),
"Referer": "https://wqs.jd.com/"
},
}
$.get(option, (err, resp, data) => {
try{
if(data.indexOf("Authorization") !== -1){
console.log("获取数据失败401 Authorization Required可能是User-Agent的问题")
return;
}
data = JSON.parse(data);
if(data.iRet === "0" && data.errMsg === "success"){
console.log(`成功取消收藏商品:${$.unsubscribeGoodsNum}\n`)
$.failTimes = 0;
} else {
console.log(`批量取消收藏商品失败,失败次数:${++$.failTimes}\n`, data)
}
} catch(e){
$.logErr(e, resp);
} finally{
resolve(data);
}
});
})
}
function queryShopFavList(){
return new Promise((resolve) => {
console.log("正在获取已关注的店铺...")
const option = {
url: `https://wq.jd.com/fav/shop/QueryShopFavList?cp=1&pageSize=${args_xh.shopPageSize}&sceneval=2&g_login_type=1&callback=jsonpCBKA`,
headers: {
"Cookie": cookie,
"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"),
"Referer": "https://wqs.jd.com/"
},
}
$.get(option, (err, resp, data) => {
try{
if(data.indexOf("Authorization") !== -1){
console.log("获取数据失败401 Authorization Required可能是User-Agent的问题")
return;
}
data = JSON.parse(getSubstr(data, "try{jsonpCBKA(", ");}catch(e){}"));
if(data.iRet === '0'){
$.shopsTotalNum = parseInt(data.totalNum);
console.log(`当前已关注店铺:${$.shopsTotalNum}`)
if(data.data.length > 0){
$.shopsKeyWordsNum = 0;
for(let item of data.data){
if(args_xh.shopKeyWords.some(keyword => item.shopName.includes(keyword))){
args_xh.printLog ? console.log('店铺被过滤,含有关键词') : ''
args_xh.printLog ? console.log(`${item.shopName}\n`) : ''
$.shopsKeyWordsNum += 1;
} else {
$.shopIdList += item.shopId + ",";
$.unsubscribeShopsNum++;
}
}
} else {
$.endShops = true;
console.log("无店铺可取消关注\n");
}
} else console.log(`获取已关注店铺失败:${JSON.stringify(data)}`)
} catch(e){
$.logErr(e, resp);
} finally{
resolve(data);
}
});
})
}
function batchunfollow(){
return new Promise(resolve => {
console.log('正在执行批量取消关注店铺...')
const option = {
url: `https://wq.jd.com/fav/shop/batchunfollow?shopId=${$.shopIdList}&sceneval=2&g_login_type=1`,
headers: {
"Cookie": cookie,
"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"),
"Referer": "https://wqs.jd.com/"
},
}
$.get(option, (err, resp, data) => {
try{
if(data.indexOf("Authorization") !== -1){
console.log("获取数据失败401 Authorization Required可能是User-Agent的问题")
return;
}
data = JSON.parse(data);
if(data.iRet === "0"){
console.log(`已成功取消关注店铺:${$.unsubscribeShopsNum}\n`)
$.failTimes = 0;
} else {
console.log(`批量取消关注店铺失败,失败次数:${++$.failTimes}\n`)
}
} 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)
}

369
jd_unsubscribeShop.js Normal file

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long