This commit is contained in:
Faker 2023-06-16 10:31:05 +08:00
parent f901d380c4
commit 916dd7f485
37 changed files with 2 additions and 5640 deletions

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,857 +0,0 @@
/*
cron "40 8,10,12,14 * * *" ZY_big_winner_Mod.js
省钱大赢家之翻翻乐分组版本,兼容资产通知查询的变量标题为 省钱大赢家之翻翻乐#2 省钱大赢家之翻翻乐#3 省钱大赢家之翻翻乐#4 省钱大赢家之翻翻乐
*/
//详细说明参考 https://github.com/ccwav/QLScript2.
const $ = new Env('省钱大赢家之翻翻乐');
const notify = $.isNode() ? require('./sendNotify') : '';
//Node.js用户请在jdCookie.js处填写京东ck;
const jdCookieNode = $.isNode() ? require('./jdCookie.js') : '';
//IOS等用户直接用NobyDa的jd cookie
let cookiesArr = [], cookie = '', message = '', linkId = 'WMDf1PTHmh8MYBpD97sieQ', fflLinkId = 'WMDf1PTHmh8MYBpD97sieQ';
const money = $.isNode() ? (process.env.BIGWINNER_MONEY ? process.env.BIGWINNER_MONEY * 1 : 0.3) : ($.getdata("BIGWINNER_MONEY") ? $.getdata("BIGWINNER_MONEY") * 1 : 0.3)
const JD_API_HOST = 'https://api.m.jd.com/api';
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"),
...$.toObj($.getdata("CookiesJD") || "[]").map((item) => item.cookie)].filter((item) => !!item);
}
const len = cookiesArr.length;
let MessageUserGp2 = "";
let MessageUserGp3 = "";
let MessageUserGp4 = "";
let MessageGp2 = "";
let MessageGp3 = "";
let MessageGp4 = "";
let MessageAll = "";
let userIndex2 = -1;
let userIndex3 = -1;
let userIndex4 = -1;
let IndexGp2 = 0;
let IndexGp3 = 0;
let IndexGp4 = 0;
let IndexAll = 0;
let allMessageGp2 = '';
let allMessageGp3 = '';
let allMessageGp4 = '';
let allMessage = '';
let ReturnMessage = "";
let ReturnMessageTitle = "";
if ($.isNode() && process.env.BEANCHANGE_USERGP2) {
MessageUserGp2 = process.env.BEANCHANGE_USERGP2 ? process.env.BEANCHANGE_USERGP2.split('&') : [];
console.log(`检测到设定了分组推送2`);
}
if ($.isNode() && process.env.BEANCHANGE_USERGP3) {
MessageUserGp3 = process.env.BEANCHANGE_USERGP3 ? process.env.BEANCHANGE_USERGP3.split('&') : [];
console.log(`检测到设定了分组推送3`);
}
if ($.isNode() && process.env.BEANCHANGE_USERGP4) {
MessageUserGp4 = process.env.BEANCHANGE_USERGP4 ? process.env.BEANCHANGE_USERGP4.split('&') : [];
console.log(`检测到设定了分组推送4`);
}
let strNoRunPin = "";
let NoRunIndex3=-1;
if ($.isNode() && process.env.BIGNORUNPIN) {
strNoRunPin = process.env.BIGNORUNPIN ? process.env.BIGNORUNPIN.split('&') : [];
console.log(`检测到账号跳过的设定`);
}
let WP_APP_TOKEN_ONE = "";
if ($.isNode() && process.env.WP_APP_TOKEN_ONE) {
WP_APP_TOKEN_ONE = process.env.WP_APP_TOKEN_ONE;
}
!(async() => {
$.redPacketId = []
if (!cookiesArr[0]) {
$.msg($.name, '【提示】请先获取京东账号一cookie\n直接使用NobyDa的京东签到获取', 'https://bean.m.jd.com/', {
"open-url": "https://bean.m.jd.com/"
});
return;
}
for (let i = 0; i < len; i++) {
if (cookiesArr[i]) {
cookie = cookiesArr[i];
$.pt_pin = (cookie.match(/pt_pin=([^; ]+)(?=;?)/) && cookie.match(/pt_pin=([^; ]+)(?=;?)/)[1]);
$.UserName = decodeURIComponent(cookie.match(/pt_pin=(.+?);/) && cookie.match(/pt_pin=(.+?);/)[1]);
$.index = i + 1;
$.isLogin = true;
$.nickName = '';
if (strNoRunPin) {
NoRunIndex3 = strNoRunPin.findIndex((item) => item === $.pt_pin);
if (NoRunIndex3 != -1) {
console.log(`账号跳过:`+$.UserName);
continue;
}
NoRunIndex3 = strNoRunPin.findIndex((item) => item === $.UserName);
if (NoRunIndex3 != -1) {
console.log(`账号跳过:`+$.UserName);
continue;
}
}
if (MessageUserGp4) {
userIndex4 = MessageUserGp4.findIndex((item) => item === $.pt_pin);
}
if (MessageUserGp2) {
userIndex2 = MessageUserGp2.findIndex((item) => item === $.pt_pin);
}
if (MessageUserGp3) {
userIndex3 = MessageUserGp3.findIndex((item) => item === $.pt_pin);
}
if (userIndex4 != -1) {
IndexGp4 += 1;
ReturnMessageTitle = `【账号${IndexGp4}🆔】${$.nickName || $.UserName}\n`;
}
if (userIndex2 != -1) {
IndexGp2 += 1;
ReturnMessageTitle = `【账号${IndexGp2}🆔】${$.nickName || $.UserName}\n`;
}
if (userIndex3 != -1) {
IndexGp3 += 1;
ReturnMessageTitle = `【账号${IndexGp3}🆔】${$.nickName || $.UserName}\n`;
}
if (userIndex4 == -1 && userIndex2 == -1 && userIndex3 == -1) {
IndexAll += 1;
ReturnMessageTitle = `【账号${IndexAll}🆔】${$.nickName || $.UserName}\n`;
}
ReturnMessage = "";
console.log(`\n******开始【京东账号${$.index}${$.nickName || $.UserName}*********\n`);
await main()
if (ReturnMessage) {
if ($.isNode() && WP_APP_TOKEN_ONE) {
await notify.sendNotifybyWxPucher(`${$.name}`,`【账号名称】${$.nickName || $.UserName}\n`+`${ReturnMessage}`,`${$.UserName}`);
}
ReturnMessage = ReturnMessageTitle + ReturnMessage;
if (userIndex4 != -1) {
allMessageGp4 += ReturnMessage;
}
if (userIndex2 != -1) {
allMessageGp2 += ReturnMessage;
}
if (userIndex3 != -1) {
allMessageGp3 += ReturnMessage;
}
if (userIndex4 == -1 && userIndex2 == -1 && userIndex3 == -1) {
allMessage += ReturnMessage;
}
}
}
}
if ($.isNode() && allMessageGp2) {
console.log("分组2:" + `\n` + allMessageGp2);
await notify.sendNotify(`${$.name}#2`, `${allMessageGp2}`, {
url: `https://bean.m.jd.com/beanDetail/index.action?resourceValue=bean`
})
await $.wait(5000);
}
if ($.isNode() && allMessageGp3) {
console.log("分组3:" + `\n` + allMessageGp3);
await notify.sendNotify(`${$.name}#3`, `${allMessageGp3}`, {
url: `https://bean.m.jd.com/beanDetail/index.action?resourceValue=bean`
})
await $.wait(5000);
}
if ($.isNode() && allMessageGp4) {
console.log("分组4:" + `\n` + allMessageGp4);
await notify.sendNotify(`${$.name}#4`, `${allMessageGp4}`, {
url: `https://bean.m.jd.com/beanDetail/index.action?resourceValue=bean`
})
await $.wait(5000);
}
if ($.isNode() && allMessage) {
console.log("其他组:" + `\n` + allMessage);
await notify.sendNotify(`${$.name}`, `${allMessage}`, {
url: `https://bean.m.jd.com/beanDetail/index.action?resourceValue=bean`
})
await $.wait(5000);
}
})()
.catch((e) => {
$.log('', `${$.name}, 失败! 原因: ${e}!`, '')
})
.finally(() => {
$.done();
})
async function main() {
try {
$.canApCashWithDraw = false;
$.changeReward = true;
$.canOpenRed = true;
await gambleHomePage();
if (!$.time) {
console.log(`开始进行翻翻乐拿红包\n`)
await gambleOpenReward(); //打开红包
if ($.canOpenRed) {
while (!$.canApCashWithDraw && $.changeReward) {
await openRedReward();
await $.wait(1000);
}
if ($.canApCashWithDraw) {
//提现
await openRedReward('gambleObtainReward', $.rewardData.rewardType);
await apCashWithDraw($.rewardData.id, $.rewardData.poolBaseId, $.rewardData.prizeGroupId, $.rewardData.prizeBaseId, $.rewardData.prizeType);
}
}
}
} catch (e) {
$.logErr(e)
}
}
//查询剩余多长时间可进行翻翻乐
function gambleHomePage() {
const headers = {
'Host': 'api.m.jd.com',
'Origin': 'https://openredpacket-jdlite.jd.com',
'Accept': 'application/json, text/plain, */*',
'User-Agent': 'jdltapp;iPhone;3.3.2;14.4.1;network/wifi;Mozilla/5.0 (iPhone; CPU iPhone OS 14_4_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148;supportJDSHWK/1',
'Referer': `https://618redpacket.jd.com/withdraw?activityId=${linkId}&channel=wjicon&lng=&lat=&sid=&un_area=`,
'Accept-Language': 'zh-cn',
'Cookie': cookie
}
const body = {
'linkId': fflLinkId
};
const options = {
url: `https://api.m.jd.com/?functionId=gambleHomePage&body=${encodeURIComponent(JSON.stringify(body))}&appid=activities_platform&clientVersion=3.5.0`,
headers,
}
return new Promise(resolve => {
$.get(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['code'] === 0) {
if (data.data.leftTime === 0) {
$.time = data.data.leftTime;
} else {
$.time = (data.data.leftTime / (60 * 1000)).toFixed(2);
}
console.log(`\n查询下次翻翻乐剩余时间成功:\n京东账号【${$.UserName}】距开始剩 ${$.time} 分钟`);
} else {
console.log(`查询下次翻翻乐剩余时间失败:${JSON.stringify(data)}\n`);
}
}
}
} catch (e) {
$.logErr(e, resp)
}
finally {
resolve()
}
})
})
}
//打开翻翻乐红包
function gambleOpenReward() {
const headers = {
'Host': 'api.m.jd.com',
'Origin': 'https://openredpacket-jdlite.jd.com',
'Accept': 'application/json, text/plain, */*',
'User-Agent': 'jdltapp;iPhone;3.3.2;14.4.1;network/wifi;Mozilla/5.0 (iPhone; CPU iPhone OS 14_4_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148;supportJDSHWK/1',
'Referer': `https://618redpacket.jd.com/withdraw?activityId=${linkId}&channel=wjicon&lng=&lat=&sid=&un_area=`,
'Accept-Language': 'zh-cn',
"Content-Type": "application/x-www-form-urlencoded",
'Cookie': cookie
}
const body = {
'linkId': fflLinkId
};
const options = {
url: `https://api.m.jd.com/`,
headers,
body: `functionId=gambleOpenReward&body=${encodeURIComponent(JSON.stringify(body))}&t=${+new Date()}&appid=activities_platform&clientVersion=3.5.0`
}
return new Promise(resolve => {
$.post(options, (err, resp, data) => {
try {
if (err) {
console.log(`${JSON.stringify(err)}`)
console.log(`${$.name} API请求失败请检查网路重试`)
} else {
if (data) {
data = JSON.parse(data);
$.rewardData = data.data;
if (data['code'] === 0) {
console.log(`翻翻乐打开红包 成功,获得:${data.data.rewardValue}元红包\n`);
} else {
console.log(`翻翻乐打开红包 失败:${JSON.stringify(data)}\n`);
if (data.code === 20007) {
$.canOpenRed = false;
console.log(`翻翻乐打开红包 失败,今日活动参与次数已达上限`)
}
}
}
}
} catch (e) {
$.logErr(e, resp)
}
finally {
resolve()
}
})
})
}
//翻倍红包
function openRedReward(functionId = 'gambleChangeReward', type) {
const headers = {
'Host': 'api.m.jd.com',
'Origin': 'https://openredpacket-jdlite.jd.com',
'Accept': 'application/json, text/plain, */*',
'User-Agent': 'jdltapp;iPhone;3.3.2;14.4.1;network/wifi;Mozilla/5.0 (iPhone; CPU iPhone OS 14_4_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148;supportJDSHWK/1',
'Referer': `https://618redpacket.jd.com/withdraw?activityId=${linkId}&channel=wjicon&lng=&lat=&sid=&un_area=`,
'Accept-Language': 'zh-cn',
"Content-Type": "application/x-www-form-urlencoded",
'Cookie': cookie
}
const body = {
'linkId': fflLinkId
};
if (type)
body['rewardType'] = type;
const options = {
url: `https://api.m.jd.com/`,
headers,
body: `functionId=${functionId}&body=${encodeURIComponent(JSON.stringify(body))}&t=${+new Date()}&appid=activities_platform&clientVersion=3.5.0`
}
return new Promise(resolve => {
$.post(options, (err, resp, data) => {
try {
if (err) {
console.log(`${JSON.stringify(err)}`)
console.log(`${$.name} API请求失败请检查网路重试`)
$.changeReward = false;
} else {
if (data) {
console.log(`翻翻乐结果:${data}\n`);
data = JSON.parse(data);
if (data['code'] === 0) {
$.rewardData = data.data;
if (data.data.rewardState === 1) {
if (data.data.rewardValue >= money) {
//已翻倍到0.3元,可以提现了
$.canApCashWithDraw = true;
$.changeReward = false;
// message += `${data.data.rewardValue}元现金\n`
}
if (data.data.rewardType === 1) {
console.log(`翻翻乐 第${data.data.changeTimes}次翻倍 成功,获得:${data.data.rewardValue}元红包\n`);
} else if (data.data.rewardType === 2) {
console.log(`翻翻乐 第${data.data.changeTimes}次翻倍 成功,获得:${data.data.rewardValue}元现金\n`);
// $.canApCashWithDraw = true;
} else {
console.log(`翻翻乐 第${data.data.changeTimes}次翻倍 成功,获得:${JSON.stringify(data)}\n`);
}
} else if (data.data.rewardState === 3) {
console.log(`翻翻乐 第${data.data.changeTimes}次翻倍 失败,奖品溜走了/(ㄒoㄒ)/~~\n`);
$.changeReward = false;
} else {
if (type) {
console.log(`翻翻乐领取成功:${data.data.amount}现金\n`)
ReturnMessage += `${new Date().getHours()}点:${data.data.amount}现金\n`;
} else {
console.log(`翻翻乐 翻倍 成功,获得:${JSON.stringify(data)}\n`);
}
}
} else {
$.canApCashWithDraw = true;
$.changeReward = false;
console.log(`翻翻乐 翻倍 失败:${JSON.stringify(data)}\n`);
}
}
}
} catch (e) {
$.logErr(e, resp)
}
finally {
resolve()
}
})
})
}
//翻翻乐提现
function apCashWithDraw(id, poolBaseId, prizeGroupId, prizeBaseId, prizeType) {
const headers = {
'Host': 'api.m.jd.com',
'Origin': 'https://openredpacket-jdlite.jd.com',
'Accept': 'application/json, text/plain, */*',
'User-Agent': 'jdltapp;iPhone;3.3.2;14.4.1;network/wifi;Mozilla/5.0 (iPhone; CPU iPhone OS 14_4_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148;supportJDSHWK/1',
'Referer': `https://618redpacket.jd.com/withdraw?activityId=${linkId}&channel=wjicon&lng=&lat=&sid=&un_area=`,
'Accept-Language': 'zh-cn',
"Content-Type": "application/x-www-form-urlencoded",
'Cookie': cookie
}
const body = {
"businessSource": "GAMBLE",
"base": {
id,
"business": "redEnvelopeDouble",
poolBaseId,
prizeGroupId,
prizeBaseId,
prizeType
},
"linkId": fflLinkId
};
const options = {
url: `https://api.m.jd.com/`,
headers,
body: `functionId=apCashWithDraw&body=${encodeURIComponent(JSON.stringify(body))}&t=${+new Date()}&appid=activities_platform&clientVersion=3.5.0`
}
return new Promise(resolve => {
$.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['code'] === 0) {
if (data['data']['status'] === '310') {
console.log(`翻翻乐提现 成功🎉,详情:${JSON.stringify(data)}\n`);
ReturnMessage += `提现至微信钱包成功🎉\n\n`;
} else {
console.log(`翻翻乐提现 失败,详情:${JSON.stringify(data)}\n`);
ReturnMessage += `提现至微信钱包失败\n详情:${JSON.stringify(data)}\n`;
ReturnMessage +="温馨提示: 如果是没有绑定,请至微信搜索京东小程序登录即可.\n"
}
} else {
console.log(`翻翻乐提现 失败:${JSON.stringify(data)}\n`);
ReturnMessage += `提现至微信钱包失败\n详情:${JSON.stringify(data)}\n\n`;
}
}
}
} catch (e) {
$.logErr(e, resp)
}
finally {
resolve()
}
})
})
}
// prettier-ignore
function Env(t, e) {
class s {
constructor(t) {
this.env = t
}
send(t, e = "GET") {
t = "string" == typeof t ? {
url: t
}
: t;
let s = this.get;
return "POST" === e && (s = this.post),
new Promise((e, i) => {
s.call(this, t, (t, s, r) => {
t ? i(t) : e(s)
})
})
}
get(t) {
return this.send.call(this.env, t)
}
post(t) {
return this.send.call(this.env, t, "POST")
}
}
return new class {
constructor(t, e) {
this.name = t,
this.http = new s(this),
this.data = null,
this.dataFile = "box.dat",
this.logs = [],
this.isMute = !1,
this.isNeedRewrite = !1,
this.logSeparator = "\n",
this.startTime = (new Date).getTime(),
Object.assign(this, e),
this.log("", `\ud83d\udd14${this.name}, \u5f00\u59cb!`)
}
isNode() {
return "undefined" != typeof module && !!module.exports
}
isQuanX() {
return "undefined" != typeof $task
}
isSurge() {
return "undefined" != typeof $httpClient && "undefined" == typeof $loon
}
isLoon() {
return "undefined" != typeof $loon
}
toObj(t, e = null) {
try {
return JSON.parse(t)
} catch {
return e
}
}
toStr(t, e = null) {
try {
return JSON.stringify(t)
} catch {
return e
}
}
getjson(t, e) {
let s = e;
const i = this.getdata(t);
if (i)
try {
s = JSON.parse(this.getdata(t))
} catch {}
return s
}
setjson(t, e) {
try {
return this.setdata(JSON.stringify(t), e)
} catch {
return !1
}
}
getScript(t) {
return new Promise(e => {
this.get({
url: t
}, (t, s, i) => e(i))
})
}
runScript(t, e) {
return new Promise(s => {
let i = this.getdata("@chavy_boxjs_userCfgs.httpapi");
i = i ? i.replace(/\n/g, "").trim() : i;
let r = this.getdata("@chavy_boxjs_userCfgs.httpapi_timeout");
r = r ? 1 * r : 20,
r = e && e.timeout ? e.timeout : r;
const[o, h] = i.split("@"),
a = {
url: `http://${h}/v1/scripting/evaluate`,
body: {
script_text: t,
mock_type: "cron",
timeout: r
},
headers: {
"X-Key": o,
Accept: "*/*"
}
};
this.post(a, (t, e, i) => s(i))
}).catch(t => this.logErr(t))
}
loaddata() {
if (!this.isNode())
return {}; {
this.fs = this.fs ? this.fs : require("fs"),
this.path = this.path ? this.path : require("path");
const t = this.path.resolve(this.dataFile),
e = this.path.resolve(process.cwd(), this.dataFile),
s = this.fs.existsSync(t),
i = !s && this.fs.existsSync(e);
if (!s && !i)
return {}; {
const i = s ? t : e;
try {
return JSON.parse(this.fs.readFileSync(i))
} catch (t) {
return {}
}
}
}
}
writedata() {
if (this.isNode()) {
this.fs = this.fs ? this.fs : require("fs"),
this.path = this.path ? this.path : require("path");
const t = this.path.resolve(this.dataFile),
e = this.path.resolve(process.cwd(), this.dataFile),
s = this.fs.existsSync(t),
i = !s && this.fs.existsSync(e),
r = JSON.stringify(this.data);
s ? this.fs.writeFileSync(t, r) : i ? this.fs.writeFileSync(e, r) : this.fs.writeFileSync(t, r)
}
}
lodash_get(t, e, s) {
const i = e.replace(/\[(\d+)\]/g, ".$1").split(".");
let r = t;
for (const t of i)
if (r = Object(r)[t], void 0 === r)
return s;
return r
}
lodash_set(t, e, s) {
return Object(t) !== t ? t : (Array.isArray(e) || (e = e.toString().match(/[^.[\]]+/g) || []), e.slice(0, -1).reduce((t, s, i) => Object(t[s]) === t[s] ? t[s] : t[s] = Math.abs(e[i + 1]) >> 0 == +e[i + 1] ? [] : {}, t)[e[e.length - 1]] = s, t)
}
getdata(t) {
let e = this.getval(t);
if (/^@/.test(t)) {
const[, s, i] = /^@(.*?)\.(.*?)$/.exec(t),
r = s ? this.getval(s) : "";
if (r)
try {
const t = JSON.parse(r);
e = t ? this.lodash_get(t, i, "") : e
} catch (t) {
e = ""
}
}
return e
}
setdata(t, e) {
let s = !1;
if (/^@/.test(e)) {
const[, i, r] = /^@(.*?)\.(.*?)$/.exec(e),
o = this.getval(i),
h = i ? "null" === o ? null : o || "{}" : "{}";
try {
const e = JSON.parse(h);
this.lodash_set(e, r, t),
s = this.setval(JSON.stringify(e), i)
} catch (e) {
const o = {};
this.lodash_set(o, r, t),
s = this.setval(JSON.stringify(o), i)
}
} else
s = this.setval(t, e);
return s
}
getval(t) {
return this.isSurge() || this.isLoon() ? $persistentStore.read(t) : this.isQuanX() ? $prefs.valueForKey(t) : this.isNode() ? (this.data = this.loaddata(), this.data[t]) : this.data && this.data[t] || null
}
setval(t, e) {
return this.isSurge() || this.isLoon() ? $persistentStore.write(t, e) : this.isQuanX() ? $prefs.setValueForKey(t, e) : this.isNode() ? (this.data = this.loaddata(), this.data[e] = t, this.writedata(), !0) : this.data && this.data[e] || null
}
initGotEnv(t) {
this.got = this.got ? this.got : require("got"),
this.cktough = this.cktough ? this.cktough : require("tough-cookie"),
this.ckjar = this.ckjar ? this.ckjar : new this.cktough.CookieJar,
t && (t.headers = t.headers ? t.headers : {}, void 0 === t.headers.Cookie && void 0 === t.cookieJar && (t.cookieJar = this.ckjar))
}
get(t, e = (() => {})) {
t.headers && (delete t.headers["Content-Type"], delete t.headers["Content-Length"]),
this.isSurge() || this.isLoon() ? (this.isSurge() && this.isNeedRewrite && (t.headers = t.headers || {}, Object.assign(t.headers, {
"X-Surge-Skip-Scripting": !1
})), $httpClient.get(t, (t, s, i) => {
!t && s && (s.body = i, s.statusCode = s.status),
e(t, s, i)
})) : this.isQuanX() ? (this.isNeedRewrite && (t.opts = t.opts || {}, Object.assign(t.opts, {
hints: !1
})), $task.fetch(t).then(t => {
const {
statusCode: s,
statusCode: i,
headers: r,
body: o
} = t;
e(null, {
status: s,
statusCode: i,
headers: r,
body: o
}, o)
}, t => e(t))) : this.isNode() && (this.initGotEnv(t), this.got(t).on("redirect", (t, e) => {
try {
if (t.headers["set-cookie"]) {
const s = t.headers["set-cookie"].map(this.cktough.Cookie.parse).toString();
this.ckjar.setCookieSync(s, null),
e.cookieJar = this.ckjar
}
} catch (t) {
this.logErr(t)
}
}).then(t => {
const {
statusCode: s,
statusCode: i,
headers: r,
body: o
} = t;
e(null, {
status: s,
statusCode: i,
headers: r,
body: o
}, o)
}, t => {
const {
message: s,
response: i
} = t;
e(s, i, i && i.body)
}))
}
post(t, e = (() => {})) {
if (t.body && t.headers && !t.headers["Content-Type"] && (t.headers["Content-Type"] = "application/x-www-form-urlencoded"), t.headers && delete t.headers["Content-Length"], this.isSurge() || this.isLoon())
this.isSurge() && this.isNeedRewrite && (t.headers = t.headers || {}, Object.assign(t.headers, {
"X-Surge-Skip-Scripting": !1
})), $httpClient.post(t, (t, s, i) => {
!t && s && (s.body = i, s.statusCode = s.status),
e(t, s, i)
});
else if (this.isQuanX())
t.method = "POST", this.isNeedRewrite && (t.opts = t.opts || {}, Object.assign(t.opts, {
hints: !1
})), $task.fetch(t).then(t => {
const {
statusCode: s,
statusCode: i,
headers: r,
body: o
} = t;
e(null, {
status: s,
statusCode: i,
headers: r,
body: o
}, o)
}, t => e(t));
else if (this.isNode()) {
this.initGotEnv(t);
const {
url: s,
...i
} = t;
this.got.post(s, i).then(t => {
const {
statusCode: s,
statusCode: i,
headers: r,
body: o
} = t;
e(null, {
status: s,
statusCode: i,
headers: r,
body: o
}, o)
}, t => {
const {
message: s,
response: i
} = t;
e(s, i, i && i.body)
})
}
}
time(t) {
let e = {
"M+": (new Date).getMonth() + 1,
"d+": (new Date).getDate(),
"H+": (new Date).getHours(),
"m+": (new Date).getMinutes(),
"s+": (new Date).getSeconds(),
"q+": Math.floor(((new Date).getMonth() + 3) / 3),
S: (new Date).getMilliseconds()
};
/(y+)/.test(t) && (t = t.replace(RegExp.$1, ((new Date).getFullYear() + "").substr(4 - RegExp.$1.length)));
for (let s in e)
new RegExp("(" + s + ")").test(t) && (t = t.replace(RegExp.$1, 1 == RegExp.$1.length ? e[s] : ("00" + e[s]).substr(("" + e[s]).length)));
return t
}
msg(e = t, s = "", i = "", r) {
const o = t => {
if (!t)
return t;
if ("string" == typeof t)
return this.isLoon() ? t : this.isQuanX() ? {
"open-url": t
}
: this.isSurge() ? {
url: t
}
: void 0;
if ("object" == typeof t) {
if (this.isLoon()) {
let e = t.openUrl || t.url || t["open-url"],
s = t.mediaUrl || t["media-url"];
return {
openUrl: e,
mediaUrl: s
}
}
if (this.isQuanX()) {
let e = t["open-url"] || t.url || t.openUrl,
s = t["media-url"] || t.mediaUrl;
return {
"open-url": e,
"media-url": s
}
}
if (this.isSurge()) {
let e = t.url || t.openUrl || t["open-url"];
return {
url: e
}
}
}
};
this.isMute || (this.isSurge() || this.isLoon() ? $notification.post(e, s, i, o(r)) : this.isQuanX() && $notify(e, s, i, o(r)));
let h = ["", "==============\ud83d\udce3\u7cfb\u7edf\u901a\u77e5\ud83d\udce3=============="];
h.push(e),
s && h.push(s),
i && h.push(i),
console.log(h.join("\n")),
this.logs = this.logs.concat(h)
}
log(...t) {
t.length > 0 && (this.logs = [...this.logs, ...t]),
console.log(t.join(this.logSeparator))
}
logErr(t, e) {
const s = !this.isSurge() && !this.isQuanX() && !this.isLoon();
s ? this.log("", `\u2757\ufe0f${this.name}, \u9519\u8bef!`, t.stack) : this.log("", `\u2757\ufe0f${this.name}, \u9519\u8bef!`, t)
}
wait(t) {
return new Promise(e => setTimeout(e, t))
}
done(t = {}) {
const e = (new Date).getTime(),
s = (e - this.startTime) / 1e3;
this.log("", `\ud83d\udd14${this.name}, \u7ed3\u675f! \ud83d\udd5b ${s} \u79d2`),
this.log(),
(this.isSurge() || this.isQuanX() || this.isLoon()) && $done(t)
}
}
(t, e)
}

View File

@ -1,281 +0,0 @@
# -*- coding:utf-8 -*-
"""
Python 3.9.7
作者doubi
日期2022年10月30日
脚本运行后会生成一个black.txt,之后如果出现车头pin找不到的情况下请在black.txt搜索然后删除
注意事项 pin 为助力pin 必须保证ck在里面
作者要求 注释不能删除 否则后续不再更新
作者授权发布KR库搬运请完整保留注释
环境变量说明
export dyjpin="需要助力的pin值"
cron: 6 6 6 6 *
new Env('赚钱大赢家');
"""
import os
import re
import sys
import time
import uuid
import json
import random
import logging
import requests
import traceback
from hashlib import sha1
from urllib.parse import quote_plus, unquote_plus, quote
activity_name = "京东极速版-赚钱大赢家"
logging.basicConfig(
level=logging.INFO,
format="%(asctime)s %(levelname)s %(lineno)d %(message)s",
datefmt="%H:%M:%S"
)
logger = logging.getLogger(activity_name)
index = 0
h5st_appid = 'd06f1'
appCode = 'msc588d6d5'
activeId = '63526d8f5fe613a6adb48f03'
task_fn = ['打扫店铺']
invite_taskId = None
need_invite = 0
not_tx = [0.3, 1, 3]
black_user_file = 'black'
class Userinfo:
cookie_obj = []
index = 0
def __init__(self, cookie):
global index
index += 1
self.user_index = index
self.cookie = cookie
try:
self.pt_pin = re.findall(r'pt_pin=(.*?);', self.cookie)[0]
except Exception:
logger.info(f"取值错误['pt_pin']{traceback.format_exc()}")
return
self.name = unquote_plus(self.pt_pin)
self.UA = 'jdltapp;iPhone;4.2.0;;;M/5.0;hasUPPay/0;pushNoticeIsOpen/1;lang/zh_CN;hasOCPay/0;appBuild/1217;supportBestPay/0;jdSupportDarkMode/0;ef/1;ep/%7B%22ciphertype%22%3A5%2C%22cipher%22%3A%7B%22ud%22%3A%22DtCzCNvwDzc4CwG0CWY2ZWTvENVwCJS3EJDvEWDsDNHuCNU2YJqnYm%3D%3D%22%2C%22sv%22%3A%22CJSkDy42%22%2C%22iad%22%3A%22C0DOGzumHNSjDJvMCy0nCUVOBJvLEOYjG0PNGzCmHOZNEJO2%22%7D%2C%22ts%22%3A1667286187%2C%22hdid%22%3A%22JM9F1ywUPwflvMIpYPok0tt5k9kW4ArJEU3lfLhxBqw%3D%22%2C%22version%22%3A%221.0.3%22%2C%22appname%22%3A%22com.360buy.jdmobile%22%2C%22ridx%22%3A-1%7D;Mozilla/5.0 (iPhone; CPU iPhone OS 12_7_6 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E126;supportJDSHWK/1'
self.account_hot = False
self.help_status = False
Userinfo.cookie_obj.append(self)
self.sha = sha1(str(self.pt_pin).encode('utf-8')).hexdigest()
self.headers = {
"Host": "wq.jd.com",
"Cookie": self.cookie + f"sid={self.sha}",
"User-Agent": self.UA,
"Referer": f"https://wqs.jd.com/sns/202210/20/make-money-shop/guest.html?activeId={activeId}&type=sign&shareId=&__navVer=1",
}
self.shareUuid = ""
self.invite_success = 0
self.task_list = []
self.need_help = False
def getData(self, task_name, shareId):
url = f'https://wq.jd.com/makemoneyshop/{task_name}?g_ty=h5&g_tk=&appCode={appCode}&activeId={activeId}&shareId={shareId}&_stk=activeId,shareId&_ste=1&sceneval=2'
res = requests.get(url=url, headers=self.headers, timeout=10).json()
return res
def UserTask(self):
home_res = self.getData('home', '')
if home_res['code'] != 0:
logger.info(f"车头账户[{self.name}]{home_res['msg']}")
return
else:
self.shareUuid = home_res['data']['shareId']
logger.info(f"车头账户[{self.name}]:已获取助力码[{self.shareUuid}]")
logger.info(f"车头账户[{self.name}]:当前营业币约[{home_res['data']['canUseCoinAmount']}]元")
self.GetUserTaskStatusList()
if self.need_help:
logger.info(f"当前从{Userinfo.index}继续")
for cookie in Userinfo.cookie_obj[Userinfo.index:]:
if cookie.pt_pin == self.pt_pin:
continue
if cookie.account_hot:
continue
res = cookie.getData('guesthelp', self.shareUuid)
if res['code'] == 147: # 火爆
cookie.account_hot = True
logger.info(f"工具人账户[{cookie.user_index}][{cookie.name}]{res['msg']}")
if res['code'] == 1007:
logger.info(f"工具人账户[{cookie.user_index}][{cookie.name}]{res['msg']}")
if res['code'] == 1008:
logger.info(f"工具人账户[{cookie.user_index}][{cookie.name}]{res['msg']}")
if str(res).find("助力任务已完成") > -1:
self.reward(invite_taskId)
if res['code'] == 0:
self.reward(invite_taskId)
self.invite_success += 1
logger.info(f"工具人账户[{cookie.user_index}][{cookie.name}]:助力成功,当前助力成功{self.invite_success}")
if self.invite_success >= need_invite:
logger.info(f"车头账户[{self.name}]:助力已满")
return self.exchange_query()
Userinfo.index += 1
# time.sleep(round(random.uniform(0.7, 1.3), 2))
else:
return self.exchange_query()
def exchange_query(self):
url = f'https://wq.jd.com/makemoneyshop/exchangequery?g_ty=h5&g_tk=&appCode={appCode}&activeId={activeId}&sceneval=2'
res = requests.get(url=url, headers=self.headers).json()
if res['code'] == 0:
logger.info(f"车头账户[{self.name}]:获取微信提现信息成功")
canUseCoinAmount = float(res['data']['canUseCoinAmount'])
logger.info(f"车头账户[{self.name}]:当前余额[{canUseCoinAmount}]元")
for data in res['data']['cashExchangeRuleList'][::-1]:
if float(data['cashoutAmount']) not in not_tx:
if canUseCoinAmount >= float(data['cashoutAmount']):
logger.info(f"车头账户[{self.name}]:当前余额[{canUseCoinAmount}]元,符合提现规则[{data['cashoutAmount']}]门槛")
rule_id = data['id']
self.tx(rule_id)
else:
logger.info(f"车头账户[{self.name}]:当前余额[{canUseCoinAmount}]元,不足提现[{data['cashoutAmount']}]门槛")
else:
logger.info(f"车头账户[{self.name}]:当前余额[{canUseCoinAmount}]元,不提现[{not_tx}]门槛")
def tx(self, rule_id):
url = f'https://wq.jd.com/prmt_exchange/client/exchange?g_ty=h5&g_tk=&appCode={appCode}&bizCode=makemoneyshop&ruleId={rule_id}&sceneval=2'
res = requests.get(url=url, headers=self.headers).json()
if res['ret'] == 0:
logger.info(f"车头账户[{self.name}]:提现成功")
return True
if res['ret'] == 232:
logger.info(f"车头账户[{self.name}]{res['msg']}")
return False
if res['ret'] == 604:
logger.info(f"车头账户[{self.name}]{res['msg']}")
return True
else:
logger.info(f"车头账户[{self.name}]{res}")
def GetUserTaskStatusList(self):
global invite_taskId, need_invite
url = f'https://wq.jd.com/newtasksys/newtasksys_front/GetUserTaskStatusList?g_ty=h5&g_tk=&appCode={appCode}&__t={getTime()}&source=makemoneyshop&bizCode=makemoneyshop&sceneval=2'
res = requests.get(url=url, headers=self.headers, timeout=10).json()
if res['ret'] == 0:
msg = []
for taskid, task in enumerate(res['data']['userTaskStatusList'], 1):
taskName = task['taskName']
reward = int(task['reward']) / 100
taskId = task['taskId']
configTargetTimes = task['configTargetTimes']
status = str(task['gettaskStatus'])
if taskName == '邀请好友打卡':
self.invite_success = task['realCompletedTimes']
if invite_taskId is None:
invite_taskId = task['taskId']
logger.info(f"已成功获取邀请好友打卡任务ID:{invite_taskId}")
if need_invite == 0:
need_invite = int(task['configTargetTimes'])
if self.invite_success < need_invite:
self.need_help = True
logger.info(
f"最高可邀请[{need_invite}]人,目前已邀请[{self.invite_success}]人,还需邀请[{int(need_invite) - int(self.invite_success)}]人")
else:
logger.info(f"最高可邀请[{need_invite}]人,目前已邀请[{self.invite_success}]人,助力已满,换号")
self.task_list.append(
{
"status": status,
"taskName": taskName,
"taskId": taskId,
"configTargetTimes": configTargetTimes
}
)
msg.append(
f"{taskid} : {taskName} -- {reward}个营业币 -- {status.replace('1', '未完成').replace('2', '已完成')}")
print('\n'.join(msg))
self.do_task()
def reward(self, taskId):
url = f'https://wq.jd.com/newtasksys/newtasksys_front/Award?g_ty=h5&g_tk=&appCode={appCode}&__t={getTime()}&source=makemoneyshop&taskId={taskId}&bizCode=makemoneyshop&sceneval=2'
self.headers[
'Referer'] = f'https://wqs.jd.com/sns/202210/20/make-money-shop/index.html?activeId={activeId}&lng=118.389971&lat=24.974751&sid={self.sha}&un_area=16_1341_1343_44855'
res = requests.get(url=url, headers=self.headers, timeout=10).json()
if res['ret'] == 0:
logger.info(f"车头账户[{self.name}]:领取成功")
else:
logger.info(f"车头账户[{self.name}]{res['msg']}")
def do_task(self):
for task in self.task_list:
if task['taskName'] in task_fn and task['status'] != "2":
logger.info(f"车头账户[{self.name}]:去做[{task['taskName']}]")
self.reward(task['taskId'])
def getTime():
return int(time.time() * 1000)
def black_user():
if os.path.exists(f'{black_user_file}.txt'):
with open(f'{black_user_file}.txt', 'r') as f:
return f.read().split('&')
else:
with open(f'{black_user_file}.txt', 'a'):
logger.info(f"文件:{black_user_file}不存在,创建")
return []
def del_black(pin):
cookie_copy = Userinfo.cookie_obj.copy()
for cookie in cookie_copy:
if pin in cookie.pt_pin and pin != '':
Userinfo.cookie_obj.remove(cookie)
def main():
try:
cookies = os.environ['JD_COOKIE'].split('&')
except:
with open(os.path.join(os.path.dirname(__file__), 'cklist.txt'), 'r') as f:
cookies = f.read().split('\n')
helpPin = os.environ.get('dyjpin', "")
if helpPin == "":
logger.info("您尚未填写'dyjpin'-- pin1&pin2&pin")
sys.exit()
try:
helpPin = helpPin.split('&')
except:
logger.info("dyjpin填写格式错误pin1&pin2&pin3")
sys.exit()
[Userinfo(cookie) for cookie in cookies]
black = black_user()
if black:
del black[-1]
for pin in black:
del_black(pin)
logger.info(f"共去除{len(black)}个黑名单pin")
logger.info(f"当前剩余[{len(Userinfo.cookie_obj)}]个cookie可助力")
inviterList = (
[cookie_obj for cookie_obj in Userinfo.cookie_obj for name in helpPin if name in cookie_obj.pt_pin])
if not inviterList:
logger.info(f"没有找到车头:{helpPin}")
sys.exit()
logger.info(f"共找到[{len(inviterList)}]车头")
for inviter in inviterList:
logger.info(f"开启助力车头:{inviter.pt_pin}")
inviter.UserTask()
time.sleep(round(random.uniform(0.7, 1.3), 2))
for cookie in Userinfo.cookie_obj:
if cookie.account_hot:
if cookie.pt_pin in str(black):
continue
if cookie.pt_pin in helpPin:
continue
with open(f'{black_user_file}.txt', 'a') as w:
w.write(cookie.pt_pin + '&')
if __name__ == '__main__':
main()

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

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

File diff suppressed because one or more lines are too long

View File

@ -1,155 +0,0 @@
/**
* -
* cron: 15 8,20 * * *
*/
import USER_AGENT, {requireConfig, wait, o2s, getshareCodeHW, post} from './TS_USER_AGENTS'
interface ShareCode {
activityId: number,
encryptProjectId: string,
encryptAssignmentId: string,
itemId: string
}
let cookie: string = '', UserName: string = '', res: any = '', message: string = '', shareCodes: ShareCode[] = [], shareCodesSelf: ShareCode[] = [], shareCodesHW: any = [], black: string[] = []
!(async () => {
let cookiesArr: string[] = await requireConfig()
let activityId: number
for (let [index, value] of cookiesArr.entries()) {
cookie = value
UserName = decodeURIComponent(cookie.match(/pt_pin=([^;]*)/)![1])
console.log(`\n开始【京东账号${index + 1}${UserName}\n`)
res = await api('showSecondFloorCardInfo', {"source": "card"})
try {
activityId = res.data.result.activityBaseInfo.activityId
} catch (e) {
console.log('获取活动信息错误')
black.push(UserName)
await wait(2000)
continue
}
let encryptProjectId: string = res.data.result.activityBaseInfo.encryptProjectId
await wait(1000)
// 任务
res = await api('superBrandTaskList', {"source": "card", "activityId": activityId, "assistInfoFlag": 1})
o2s(res)
for (let t of res.data.result.taskList) {
if (t.completionCnt !== t.assignmentTimesLimit) {
// 浏览、关注
if (t.ext?.shoppingActivity || t.ext?.followShop) {
let tp = t.ext?.shoppingActivity || t.ext?.followShop
tp = tp[0]
console.log(tp.title || tp.shopName, tp.itemId)
res = await api('superBrandDoTask', {"source": "card", "activityId": activityId, "encryptProjectId": encryptProjectId, "encryptAssignmentId": t.encryptAssignmentId, "assignmentType": t.assignmentType, "itemId": tp.itemId, "actionType": 0})
console.log(res.data?.bizMsg)
await wait(2000)
}
// 下拉
if (t.ext?.sign2) {
for (let sign of t.ext.sign2) {
if (sign.status === 0 && [10, 18].includes(new Date().getHours())) {
res = await api('superBrandDoTask', {"source": "card", "activityId": activityId, "encryptProjectId": encryptProjectId, "encryptAssignmentId": t.encryptAssignmentId, "assignmentType": t.assignmentType, "itemId": t.ext.currentSectionItemId, "actionType": 0})
console.log(res.data?.bizMsg)
await wait(2000)
console.log('下拉任务', t.ext?.sign2)
} else if (sign.status !== 0) {
console.log(`${sign.beginTime} 签到完成`)
}
}
}
}
// 助力码
if (t.ext?.assistTaskDetail) {
console.log('助力码:', t.ext.assistTaskDetail.itemId)
console.log('收到助力:', t.ext?.assistList?.length ?? 0)
shareCodesSelf.push({
activityId: activityId,
encryptProjectId: encryptProjectId,
encryptAssignmentId: t.encryptAssignmentId,
itemId: t.ext.assistTaskDetail.itemId
})
}
}
// 抽奖
try {
if (new Date().getHours() === 20) {
let sum: number = 0
res = await api('superBrandSecondFloorMainPage', {"source": "card"})
let userStarNum: number = res.data.result.activityUserInfo.userStarNum
console.log('可以抽奖', userStarNum, '次')
for (let i = 0; i < userStarNum; i++) {
res = await api('superBrandTaskLottery', {"source": "card", "activityId": activityId})
if (res.data.result?.rewardComponent?.beanList?.length) {
console.log('抽奖获得京豆:', res.data.result.rewardComponent.beanList[0].quantity)
sum += res.data.result.rewardComponent.beanList[0].quantity
} else {
console.log('没抽到?', JSON.stringify(res))
}
await wait(2000)
}
message += `【京东账号${index + 1}${UserName}\n抽奖${userStarNum}次,获得京豆${sum}\n\n`
}
} catch (e) {
console.log('error')
}
await wait(2000)
}
o2s(shareCodesSelf)
shareCodesHW = await getshareCodeHW('tewu')
shareCodes = [...shareCodesSelf, ...shareCodesHW]
let full: string[] = []
for (let [index, value] of cookiesArr.entries()) {
cookie = value
UserName = decodeURIComponent(cookie.match(/pt_pin=([^;]*)/)![1])
if (black.includes(UserName)) {
console.log('黑号')
continue
}
for (let code of shareCodes) {
if (full.includes(code.itemId))
continue
console.log(`账号${index + 1} ${UserName} 去助力 ${code.itemId}`)
res = await api('superBrandDoTask', {"source": "card", "activityId": code.activityId, "encryptProjectId": code.encryptProjectId, "encryptAssignmentId": code.encryptAssignmentId, "assignmentType": 2, "itemId": code.itemId, "actionType": 0})
if (res.data.bizCode === '0') {
console.log('助力成功')
} else if (res.data.bizCode === '103') {
console.log('助力满了')
full.push(code.itemId)
} else if (res.data.bizCode === '104') {
console.log('已助力过')
} else if (res.data.bizCode === '108') {
console.log('上限')
break
} else if (res.data.bizCode === '109') {
} else if (res.data.bizCode === '2001') {
console.log('黑号')
break
} else if (res.data.bizCode === '4001') {
console.log('助力码过期')
} else {
o2s(res, 'error')
}
await wait(2000)
}
}
})()
async function api(fn: string, body: object) {
return await post(`https://api.m.jd.com/?uuid=&client=wh5&appid=ProductZ4Brand&functionId=${fn}&t=${Date.now()}&body=${encodeURIComponent(JSON.stringify(body))}`, '', {
'Host': 'api.m.jd.com',
'Origin': 'https://pro.m.jd.com',
'User-Agent': USER_AGENT,
'Referer': 'https://pro.m.jd.com/',
'Cookie': cookie
})
}

View File

@ -1,133 +0,0 @@
/**
*
* cron: 0 0-23/4 * * *
*/
import * as path from "path"
import {sendNotify} from './sendNotify'
import {existsSync, mkdirSync, readFileSync, writeFileSync} from "fs"
import USER_AGENT, {get, requireConfig, exceptCookie, wait, o2s} from "./TS_USER_AGENTS"
import {pushplus} from "./utils/pushplus";
let cookie: string = '', UserName: string, allMessage: string = '', res: any = ''
!(async () => {
let cookiesArr: string[] = await requireConfig()
let except: string[] = exceptCookie(path.basename(__filename))
let orders: any = {}, pushplusArr: { pt_pin: string, pushplus: string }[], pushplusUser: string[] = []
try {
pushplusArr = JSON.parse(readFileSync('./utils/account.json').toString())
} catch (e) {
console.log('utils/account.json load failed')
}
for (let user of pushplusArr) {
if (user.pushplus)
pushplusUser.push(decodeURIComponent(user.pt_pin))
}
if (existsSync('./json')) {
if (existsSync('./json/jd_track.json')) {
orders = JSON.parse(readFileSync('./json/jd_track.json').toString() || '{}')
} else {
writeFileSync('./json/jd_track.json', '{}')
}
} else {
mkdirSync('./json')
writeFileSync('./json/jd_track.json', '{}')
}
for (let [index, value] of cookiesArr.entries()) {
cookie = value
UserName = decodeURIComponent(cookie.match(/pt_pin=([^;]*)/)![1])
console.log(`\n开始【京东账号${index + 1}${UserName}\n`)
if (except.includes(encodeURIComponent(UserName))) {
console.log('已设置跳过')
continue
}
let message: string = '', markdown: string = '', i: number = 1
let headers: object = {
'authority': 'wq.jd.com',
'user-agent': USER_AGENT,
'referer': 'https://wqs.jd.com/',
'cookie': cookie
}
res = await get(`https://wq.jd.com/bases/orderlist/list?order_type=2&start_page=1&last_page=0&page_size=10&callersource=mainorder&t=${Date.now()}&sceneval=2&_=${Date.now()}&sceneval=2`, headers)
await wait(1000)
for (let order of res.orderList) {
let orderId: string = order.orderId
let orderType: string = order.orderType
let title: string = order.productList[0].title
let t: string = order.progressInfo?.tip || null
let status: string = order.progressInfo?.content || null
let shopName: string = order.shopInfo.shopName
res = await get(`https://wq.jd.com/bases/wuliudetail/dealloglist?deal_id=${orderId}&orderstate=15&ordertype=${orderType}&t=${Date.now()}&sceneval=2`, headers)
await wait(1000)
let carrier: string = res.carrier, carriageId: string = res.carriageId
if (t && status) {
if (status.match(/(?=签收|已取走|已暂存)/))
continue
if (!pushplusUser.includes(UserName)) {
console.log(`<${shopName}>\t${title}`)
console.log('\t', t, status)
console.log()
} else {
console.log('隐私保护,不显示日志')
}
if (!Object.keys(orders).includes(orderId) || orders[orderId]['status'] !== status) {
if (pushplusUser.includes(UserName)) {
console.log('+ pushplus')
markdown += `${i++}. ${title}\n\t- ${carrier} ${carriageId}\n\t- ${t} ${status}\n`
} else {
console.log('+ sendNotify')
message += `<${shopName}>\t${title}\n${carrier} ${carriageId}\n${t} ${status}\n\n`
}
}
orders[orderId] = {
user: UserName, shopName, title, t, status, carrier, carriageId
}
}
}
if (message) {
message = `【京东账号${index + 1}${UserName}\n\n${message}`
allMessage += message
}
if (markdown) {
markdown = `#### <${UserName}>\n${markdown}`
await pushplus('京东快递更新', markdown, 'markdown')
}
await wait(1000)
}
let account: { pt_pin: string, remarks: string }[] = []
try {
account = JSON.parse(readFileSync('./utils/account.json').toString())
} catch (e) {
console.log('utils/account.json load failed')
}
// 删除已签收
Object.keys(orders).map(key => {
if (orders[key].status.match(/(?=签收|已取走|已暂存)/)) {
delete orders[key]
}
if (pushplusUser.includes(orders[key].user)) {
orders[key].title = '******'
}
})
// 替换通知中的用户名为备注
orders = JSON.stringify(orders, null, 2)
for (let acc of account) {
orders = orders.replace(new RegExp(decodeURIComponent(acc.pt_pin), 'g'), acc.remarks ?? acc.pt_pin)
}
writeFileSync('./json/jd_track.json', orders)
if (allMessage)
await sendNotify('京东快递更新', allMessage)
})()

File diff suppressed because one or more lines are too long