This commit is contained in:
Faker
2022-05-07 12:49:24 +08:00
parent 72ab52dbcb
commit a9904041d6
11 changed files with 1484 additions and 212 deletions

View File

@@ -1,10 +1,15 @@
/*
由于 canvas 依赖系统底层需要编译且预编译包在 github releases 上,改用另一个纯 js 解码图片。若想继续使用 canvas 可调用 runWithCanvas 。
添加 injectToRequest 用以快速修复需验证的请求。eg: $.get=injectToRequest($.get.bind($))
*/
const https = require('https');
const http = require('http');
const stream = require('stream');
const zlib = require('zlib');
const vm = require('vm');
const PNG = require('png-js');
let UA = require('../USER_AGENTS.js').USER_AGENT;
const validatorCount = process.env.JDJR_validator_Count ? process.env.JDJR_validator_Count : 100
const UA = require('../USER_AGENTS.js').USER_AGENT;
Math.avg = function average() {
@@ -28,10 +33,14 @@ class PNGDecoder extends PNG {
decodeToPixels() {
return new Promise((resolve) => {
this.decode((pixels) => {
this.pixels = pixels;
resolve();
});
try {
this.decode((pixels) => {
this.pixels = pixels;
resolve();
});
} catch (e) {
console.info(e)
}
});
}
@@ -65,10 +74,14 @@ class PuzzleRecognizer {
}
async run() {
await this.bg.decodeToPixels();
await this.patch.decodeToPixels();
try {
await this.bg.decodeToPixels();
await this.patch.decodeToPixels();
return this.recognize();
return this.recognize();
} catch (e) {
console.info(e)
}
}
recognize() {
@@ -202,74 +215,74 @@ const DATA = {
"product": "embed",
"lang": "zh_CN",
};
const SERVER = 'iv.jd.com';
const SERVER = '61.49.99.122';
class JDJRValidator {
constructor() {
this.data = {};
this.x = 0;
this.t = Date.now();
this.count = 0;
}
async run(scene = 'cww', eid='') {
const tryRecognize = async () => {
const x = await this.recognize(scene, eid);
async run(scene) {
try {
const tryRecognize = async () => {
const x = await this.recognize(scene);
if (x > 0) {
return x;
}
// retry
return await tryRecognize();
};
const puzzleX = await tryRecognize();
// console.log(puzzleX);
const pos = new MousePosFaker(puzzleX).run();
const d = getCoordinate(pos);
// console.log(pos[pos.length-1][2] -Date.now());
// await sleep(4500);
await sleep(pos[pos.length - 1][2] - Date.now());
this.count++;
const result = await JDJRValidator.jsonp('/slide/s.html', {d, ...this.data}, scene);
if (result.message === 'success') {
// console.log(result);
console.log('JDJR验证用时: %fs', (Date.now() - this.t) / 1000);
return result;
} else {
console.log(`验证失败: ${this.count}/${validatorCount}`);
// console.log(JSON.stringify(result));
if(this.count >= validatorCount){
console.log("JDJR验证次数已达上限退出验证");
return result;
}else{
await sleep(300);
return await this.run(scene, eid);
}
}
}
async recognize(scene, eid) {
const data = await JDJRValidator.jsonp('/slide/g.html', {e: eid}, scene);
const {bg, patch, y} = data;
// const uri = 'data:image/png;base64,';
// const re = new PuzzleRecognizer(uri+bg, uri+patch, y);
const re = new PuzzleRecognizer(bg, patch, y);
// console.log(JSON.stringify(re))
const puzzleX = await re.run();
if (puzzleX > 0) {
this.data = {
c: data.challenge,
w: re.w,
e: eid,
s: '',
o: '',
if (x > 0) {
return x;
}
// retry
return await tryRecognize();
};
this.x = puzzleX;
const puzzleX = await tryRecognize();
// console.log(puzzleX);
const pos = new MousePosFaker(puzzleX).run();
const d = getCoordinate(pos);
// console.log(pos[pos.length-1][2] -Date.now());
// await sleep(4500);
await sleep(pos[pos.length - 1][2] - Date.now());
const result = await JDJRValidator.jsonp('/slide/s.html', {d, ...this.data}, scene);
if (result.message === 'success') {
// console.log(result);
console.log('JDJR验证用时: %fs', (Date.now() - this.t) / 1000);
return result;
} else {
console.count("验证失败");
// console.count(JSON.stringify(result));
await sleep(300);
return await this.run(scene);
}
} catch (e) {
console.info(e)
}
}
async recognize(scene) {
try {
const data = await JDJRValidator.jsonp('/slide/g.html', {e: ''}, scene);
const {bg, patch, y} = data;
// const uri = 'data:image/png;base64,';
// const re = new PuzzleRecognizer(uri+bg, uri+patch, y);
const re = new PuzzleRecognizer(bg, patch, y);
const puzzleX = await re.run();
if (puzzleX > 0) {
this.data = {
c: data.challenge,
w: re.w,
e: '',
s: '',
o: '',
};
this.x = puzzleX;
}
return puzzleX;
} catch (e) {
console.info(e)
}
return puzzleX;
}
async report(n) {
@@ -286,7 +299,6 @@ class JDJRValidator {
}
console.log('验证成功: %f\%', (count / n) * 100);
console.clear()
console.timeEnd('PuzzleRecognizer');
}
@@ -294,20 +306,19 @@ class JDJRValidator {
return new Promise((resolve, reject) => {
const fnId = `jsonp_${String(Math.random()).replace('.', '')}`;
const extraData = {callback: fnId};
const query = new URLSearchParams({...DATA,...{"scene": scene}, ...extraData, ...data}).toString();
const url = `https://${SERVER}${api}?${query}`;
const query = new URLSearchParams({...DATA, ...{"scene": scene}, ...extraData, ...data}).toString();
const url = `http://${SERVER}${api}?${query}`;
const headers = {
'Accept': '*/*',
'Accept-Encoding': 'gzip,deflate,br',
'Accept-Language': 'zh-CN,zh;q=0.9,en;q=0.8',
'Accept-Language': 'zh-CN,en-US',
'Connection': 'keep-alive',
'Host': "iv.jd.com",
'Host': SERVER,
'Proxy-Connection': 'keep-alive',
'Referer': 'https://h5.m.jd.com/',
'Referer': 'https://h5.m.jd.com/babelDiy/Zeus/2wuqXrZrhygTQzYA7VufBEpj4amH/index.html',
'User-Agent': UA,
};
const req = https.get(url, {headers}, (response) => {
const req = http.get(url, {headers}, (response) => {
let res = response;
if (res.headers['content-encoding'] === 'gzip') {
const unzipStream = new stream.PassThrough();
@@ -395,7 +406,7 @@ function getCoordinate(c) {
return b.join("")
}
const HZ = 20;
const HZ = 5;
class MousePosFaker {
constructor(puzzleX) {
@@ -500,32 +511,43 @@ class MousePosFaker {
}
}
function injectToRequest(fn,scene = 'cww', ua = '') {
if(ua) UA = ua
// new JDJRValidator().run();
// new JDJRValidator().report(1000);
// console.log(getCoordinate(new MousePosFaker(100).run()));
function injectToRequest2(fn, scene = 'cww') {
return (opts, cb) => {
fn(opts, async (err, resp, data) => {
if (err) {
console.error(JSON.stringify(err));
return;
}
if (data.search('验证') > -1) {
console.log('JDJR验证中......');
let arr = opts.url.split("&")
let eid = ''
for(let i of arr){
if(i.indexOf("eid=")>-1){
eid = i.split("=") && i.split("=")[1] || ''
}
}
const res = await new JDJRValidator().run(scene, eid);
opts.url += `&validate=${res.validate}`;
fn(opts, cb);
} else {
cb(err, resp, data);
try {
if (err) {
console.error('验证请求失败.');
return;
}
if (data.search('验证') > -1) {
console.log('JDJR验证中......');
const res = await new JDJRValidator().run(scene);
if (res) {
opts.url += `&validate=${res.validate}`;
}
fn(opts, cb);
} else {
cb(err, resp, data);
}
} catch (e) {
console.info(e)
}
});
};
}
exports.injectToRequest = injectToRequest;
async function injectToRequest(scene = 'cww') {
console.log('JDJR验证中......');
const res = await new JDJRValidator().run(scene);
return `&validate=${res.validate}`
}
module.exports = {
sleep,
injectToRequest,
injectToRequest2
}

View File

@@ -53,50 +53,50 @@ async function all(cookie, jrBody) {
await Promise.all([
JingDongBean(stop), //京东京豆
JingDongStore(stop), //京东超市
JingRongSteel(stop, jrBody), //金融钢镚
JingDongTurn(stop), //京东转盘
JDFlashSale(stop), //京东闪购
JingDongCash(stop), //京东现金红包
JDMagicCube(stop, 2), //京东小魔方
JingDongSubsidy(stop), //京东金贴
//JingRongSteel(stop, jrBody), //金融钢镚
//JingDongTurn(stop), //京东转盘
// JDFlashSale(stop), //京东闪购
// JingDongCash(stop), //京东现金红包
// JDMagicCube(stop, 2), //京东小魔方
//JingDongSubsidy(stop), //京东金贴
JingDongGetCash(stop), //京东领现金
JingDongShake(stop), //京东摇一摇
JDSecKilling(stop), //京东秒杀
//JingDongShake(stop), //京东摇一摇
//JDSecKilling(stop), //京东秒杀
// JingRongDoll(stop, 'JRDoll', '京东金融-签壹', '4D25A6F482'),
// JingRongDoll(stop, 'JRThreeDoll', '京东金融-签叁', '69F5EC743C'),
// JingRongDoll(stop, 'JRFourDoll', '京东金融-签肆', '30C4F86264'),
// JingRongDoll(stop, 'JRFiveDoll', '京东金融-签伍', '1D06AA3B0F')
]);
await Promise.all([
JDUserSignPre(stop, 'JDUndies', '京东商城-内衣', '4PgpL1xqPSW1sVXCJ3xopDbB1f69'), //京东内衣馆
JDUserSignPre(stop, 'JDCard', '京东商城-卡包', '7e5fRnma6RBATV9wNrGXJwihzcD'), //京东卡包
//JDUserSignPre(stop, 'JDUndies', '京东商城-内衣', '4PgpL1xqPSW1sVXCJ3xopDbB1f69'), //京东内衣馆
//JDUserSignPre(stop, 'JDCard', '京东商城-卡包', '7e5fRnma6RBATV9wNrGXJwihzcD'), //京东卡包
// JDUserSignPre(stop, 'JDCustomized', '京东商城-定制', '2BJK5RBdvc3hdddZDS1Svd5Esj3R'), //京东定制
JDUserSignPre(stop, 'JDaccompany', '京东商城-陪伴', 'kPM3Xedz1PBiGQjY4ZYGmeVvrts'), //京东陪伴
JDUserSignPre(stop, 'JDShoes', '京东商城-鞋靴', '4RXyb1W4Y986LJW8ToqMK14BdTD'), //京东鞋靴
JDUserSignPre(stop, 'JDChild', '京东商城-童装', '3Af6mZNcf5m795T8dtDVfDwWVNhJ'), //京东童装馆
JDUserSignPre(stop, 'JDBaby', '京东商城-母婴', '3BbAVGQPDd6vTyHYjmAutXrKAos6'), //京东母婴馆
JDUserSignPre(stop, 'JD3C', '京东商城-数码', '4SWjnZSCTHPYjE5T7j35rxxuMTb6'), //京东数码电器馆
JDUserSignPre(stop, 'JDWomen', '京东商城-女装', 'DpSh7ma8JV7QAxSE2gJNro8Q2h9'), //京东女装馆
JDUserSignPre(stop, 'JDBook', '京东商城-图书', '3SC6rw5iBg66qrXPGmZMqFDwcyXi'), //京东图书
//JDUserSignPre(stop, 'JDaccompany', '京东商城-陪伴', 'kPM3Xedz1PBiGQjY4ZYGmeVvrts'), //京东陪伴
//JDUserSignPre(stop, 'JDShoes', '京东商城-鞋靴', '4RXyb1W4Y986LJW8ToqMK14BdTD'), //京东鞋靴
//JDUserSignPre(stop, 'JDChild', '京东商城-童装', '3Af6mZNcf5m795T8dtDVfDwWVNhJ'), //京东童装馆
//JDUserSignPre(stop, 'JDBaby', '京东商城-母婴', '3BbAVGQPDd6vTyHYjmAutXrKAos6'), //京东母婴馆
//JDUserSignPre(stop, 'JD3C', '京东商城-数码', '4SWjnZSCTHPYjE5T7j35rxxuMTb6'), //京东数码电器馆
//JDUserSignPre(stop, 'JDWomen', '京东商城-女装', 'DpSh7ma8JV7QAxSE2gJNro8Q2h9'), //京东女装馆
//JDUserSignPre(stop, 'JDBook', '京东商城-图书', '3SC6rw5iBg66qrXPGmZMqFDwcyXi'), //京东图书
// JDUserSignPre(stop, 'ReceiveJD', '京东商城-领豆', 'Ni5PUSK7fzZc4EKangHhqPuprn2'), //京东-领京豆
JingRongDoll(stop, 'JTDouble', '京东金贴-双签', '1DF13833F7'), //京东金融 金贴双签
//JingRongDoll(stop, 'JTDouble', '京东金贴-双签', '1DF13833F7'), //京东金融 金贴双签
// JingRongDoll(stop, 'XJDouble', '金融现金-双签', 'F68B2C3E71', '', '', '', 'xianjin') //京东金融 现金双签
]);
await Promise.all([
JDUserSignPre(stop, 'JDStory', '京东失眠-补贴', 'UcyW9Znv3xeyixW1gofhW2DAoz4'), //失眠补贴
JDUserSignPre(stop, 'JDPhone', '京东手机-小时', '4Vh5ybVr98nfJgros5GwvXbmTUpg'), //手机小时达
JDUserSignPre(stop, 'JDEsports', '京东商城-电竞', 'CHdHQhA5AYDXXQN9FLt3QUAPRsB'), //京东电竞
JDUserSignPre(stop, 'JDClothing', '京东商城-服饰', '4RBT3H9jmgYg1k2kBnHF8NAHm7m8'), //京东服饰
JDUserSignPre(stop, 'JDSuitcase', '京东商城-箱包', 'ZrH7gGAcEkY2gH8wXqyAPoQgk6t'), //京东箱包馆
JDUserSignPre(stop, 'JDSchool', '京东商城-校园', '2QUxWHx5BSCNtnBDjtt5gZTq7zdZ'), //京东校园
JDUserSignPre(stop, 'JDHealth', '京东商城-健康', 'w2oeK5yLdHqHvwef7SMMy4PL8LF'), //京东健康
JDUserSignPre(stop, 'JDShand', '京东拍拍-二手', '3S28janPLYmtFxypu37AYAGgivfp'), //京东拍拍二手
JDUserSignPre(stop, 'JDClean', '京东商城-清洁', '2Tjm6ay1ZbZ3v7UbriTj6kHy9dn6'), //京东清洁馆
JDUserSignPre(stop, 'JDCare', '京东商城-个护', '2tZssTgnQsiUqhmg5ooLSHY9XSeN'), //京东个人护理馆
JDUserSignPre(stop, 'JDJiaDian', '京东商城-家电', '3uvPyw1pwHARGgndatCXddLNUxHw'), // 京东小家电
//JDUserSignPre(stop, 'JDStory', '京东失眠-补贴', 'UcyW9Znv3xeyixW1gofhW2DAoz4'), //失眠补贴
//JDUserSignPre(stop, 'JDPhone', '京东手机-小时', '4Vh5ybVr98nfJgros5GwvXbmTUpg'), //手机小时达
//JDUserSignPre(stop, 'JDEsports', '京东商城-电竞', 'CHdHQhA5AYDXXQN9FLt3QUAPRsB'), //京东电竞
//JDUserSignPre(stop, 'JDClothing', '京东商城-服饰', '4RBT3H9jmgYg1k2kBnHF8NAHm7m8'), //京东服饰
// JDUserSignPre(stop, 'JDSuitcase', '京东商城-箱包', 'ZrH7gGAcEkY2gH8wXqyAPoQgk6t'), //京东箱包馆
//JDUserSignPre(stop, 'JDSchool', '京东商城-校园', '2QUxWHx5BSCNtnBDjtt5gZTq7zdZ'), //京东校园
//JDUserSignPre(stop, 'JDHealth', '京东商城-健康', 'w2oeK5yLdHqHvwef7SMMy4PL8LF'), //京东健康
//JDUserSignPre(stop, 'JDShand', '京东拍拍-二手', '3S28janPLYmtFxypu37AYAGgivfp'), //京东拍拍二手
// JDUserSignPre(stop, 'JDClean', '京东商城-清洁', '2Tjm6ay1ZbZ3v7UbriTj6kHy9dn6'), //京东清洁馆
// JDUserSignPre(stop, 'JDCare', '京东商城-个护', '2tZssTgnQsiUqhmg5ooLSHY9XSeN'), //京东个人护理馆
// JDUserSignPre(stop, 'JDJiaDian', '京东商城-家电', '3uvPyw1pwHARGgndatCXddLNUxHw'), // 京东小家电
// JDUserSignPre(stop, 'JDJewels', '京东商城-珠宝', 'zHUHpTHNTaztSRfNBFNVZscyFZU'), //京东珠宝馆
// JDUserSignPre(stop, 'JDMakeup', '京东商城-美妆', '2smCxzLNuam5L14zNJHYu43ovbAP'), //京东美妆馆
JDUserSignPre(stop, 'JDVege', '京东商城-菜场', 'Wcu2LVCFMkBP3HraRvb7pgSpt64'), //京东菜场
// JDUserSignPre(stop, 'JDVege', '京东商城-菜场', 'Wcu2LVCFMkBP3HraRvb7pgSpt64'), //京东菜场
// JDUserSignPre(stop, 'JDLive', '京东智能-生活', 'KcfFqWvhb5hHtaQkS4SD1UU6RcQ') //京东智能生活
JDUserSignPre(stop, 'JDPlus', '京东商城-PLUS', '3bhgbFe5HZcFCjEZf2jzp3umx4ZR'), //京东PLUS
JDUserSignPre(stop, 'JDStore', '京东超市', 'QPwDgLSops2bcsYqQ57hENGrjgj') //京东超市
@@ -120,36 +120,36 @@ async function all(cookie, jrBody) {
// await JingRongDoll(Wait(stop), 'JRFiveDoll', '京东金融-签伍', '1D06AA3B0F');
// await JingRongDoll(Wait(stop), 'JRDoll', '京东金融-签壹', '4D25A6F482');
// await JingRongDoll(Wait(stop), 'XJDouble', '金融现金-双签', 'F68B2C3E71', '', '', '', 'xianjin'); //京东金融 现金双签
await JingRongDoll(Wait(stop), 'JTDouble', '京东金贴-双签', '1DF13833F7'); //京东金融 金贴双签
await JDUserSignPre(Wait(stop), 'JDStory', '京东失眠-补贴', 'UcyW9Znv3xeyixW1gofhW2DAoz4'); //失眠补贴
await JDUserSignPre(Wait(stop), 'JDPhone', '京东手机-小时', '4Vh5ybVr98nfJgros5GwvXbmTUpg'); //手机小时达
await JDUserSignPre(Wait(stop), 'JDCard', '京东商城-卡包', '7e5fRnma6RBATV9wNrGXJwihzcD'); //京东卡包
await JDUserSignPre(Wait(stop), 'JDUndies', '京东商城-内衣', '4PgpL1xqPSW1sVXCJ3xopDbB1f69'); //京东内衣馆
await JDUserSignPre(Wait(stop), 'JDEsports', '京东商城-电竞', 'CHdHQhA5AYDXXQN9FLt3QUAPRsB'); //京东电竞
// await JingRongDoll(Wait(stop), 'JTDouble', '京东金贴-双签', '1DF13833F7'); //京东金融 金贴双签
// await JDUserSignPre(Wait(stop), 'JDStory', '京东失眠-补贴', 'UcyW9Znv3xeyixW1gofhW2DAoz4'); //失眠补贴
// await JDUserSignPre(Wait(stop), 'JDPhone', '京东手机-小时', '4Vh5ybVr98nfJgros5GwvXbmTUpg'); //手机小时达
// await JDUserSignPre(Wait(stop), 'JDCard', '京东商城-卡包', '7e5fRnma6RBATV9wNrGXJwihzcD'); //京东卡包
// await JDUserSignPre(Wait(stop), 'JDUndies', '京东商城-内衣', '4PgpL1xqPSW1sVXCJ3xopDbB1f69'); //京东内衣馆
// await JDUserSignPre(Wait(stop), 'JDEsports', '京东商城-电竞', 'CHdHQhA5AYDXXQN9FLt3QUAPRsB'); //京东电竞
// await JDUserSignPre(Wait(stop), 'JDCustomized', '京东商城-定制', '2BJK5RBdvc3hdddZDS1Svd5Esj3R'); //京东定制
await JDUserSignPre(Wait(stop), 'JDSuitcase', '京东商城-箱包', 'ZrH7gGAcEkY2gH8wXqyAPoQgk6t'); //京东箱包馆
await JDUserSignPre(Wait(stop), 'JDClothing', '京东商城-服饰', '4RBT3H9jmgYg1k2kBnHF8NAHm7m8'); //京东服饰
await JDUserSignPre(Wait(stop), 'JDSchool', '京东商城-校园', '2QUxWHx5BSCNtnBDjtt5gZTq7zdZ'); //京东校园
// await JDUserSignPre(Wait(stop), 'JDSuitcase', '京东商城-箱包', 'ZrH7gGAcEkY2gH8wXqyAPoQgk6t'); //京东箱包馆
// await JDUserSignPre(Wait(stop), 'JDClothing', '京东商城-服饰', '4RBT3H9jmgYg1k2kBnHF8NAHm7m8'); //京东服饰
// await JDUserSignPre(Wait(stop), 'JDSchool', '京东商城-校园', '2QUxWHx5BSCNtnBDjtt5gZTq7zdZ'); //京东校园
await JDUserSignPre(Wait(stop), 'JDHealth', '京东商城-健康', 'w2oeK5yLdHqHvwef7SMMy4PL8LF'); //京东健康
await JDUserSignPre(Wait(stop), 'JDShoes', '京东商城-鞋靴', '4RXyb1W4Y986LJW8ToqMK14BdTD'); //京东鞋靴
await JDUserSignPre(Wait(stop), 'JDChild', '京东商城-童装', '3Af6mZNcf5m795T8dtDVfDwWVNhJ'); //京东童装馆
await JDUserSignPre(Wait(stop), 'JDBaby', '京东商城-母婴', '3BbAVGQPDd6vTyHYjmAutXrKAos6'); //京东母婴馆
await JDUserSignPre(Wait(stop), 'JD3C', '京东商城-数码', '4SWjnZSCTHPYjE5T7j35rxxuMTb6'); //京东数码电器馆
await JDUserSignPre(Wait(stop), 'JDWomen', '京东商城-女装', 'DpSh7ma8JV7QAxSE2gJNro8Q2h9'); //京东女装馆
await JDUserSignPre(Wait(stop), 'JDBook', '京东商城-图书', '3SC6rw5iBg66qrXPGmZMqFDwcyXi'); //京东图书
await JDUserSignPre(Wait(stop), 'JDShand', '京东拍拍-二手', '3S28janPLYmtFxypu37AYAGgivfp'); //京东拍拍二手
// await JDUserSignPre(Wait(stop), 'JDShoes', '京东商城-鞋靴', '4RXyb1W4Y986LJW8ToqMK14BdTD'); //京东鞋靴
// await JDUserSignPre(Wait(stop), 'JDChild', '京东商城-童装', '3Af6mZNcf5m795T8dtDVfDwWVNhJ'); //京东童装馆
// await JDUserSignPre(Wait(stop), 'JDBaby', '京东商城-母婴', '3BbAVGQPDd6vTyHYjmAutXrKAos6'); //京东母婴馆
// await JDUserSignPre(Wait(stop), 'JD3C', '京东商城-数码', '4SWjnZSCTHPYjE5T7j35rxxuMTb6'); //京东数码电器馆
// await JDUserSignPre(Wait(stop), 'JDWomen', '京东商城-女装', 'DpSh7ma8JV7QAxSE2gJNro8Q2h9'); //京东女装馆
// await JDUserSignPre(Wait(stop), 'JDBook', '京东商城-图书', '3SC6rw5iBg66qrXPGmZMqFDwcyXi'); //京东图书
// await JDUserSignPre(Wait(stop), 'JDShand', '京东拍拍-二手', '3S28janPLYmtFxypu37AYAGgivfp'); //京东拍拍二手
// await JDUserSignPre(Wait(stop), 'JDMakeup', '京东商城-美妆', '2smCxzLNuam5L14zNJHYu43ovbAP'); //京东美妆馆
await JDUserSignPre(Wait(stop), 'JDVege', '京东商城-菜场', 'Wcu2LVCFMkBP3HraRvb7pgSpt64'); //京东菜场
// await JDUserSignPre(Wait(stop), 'JDVege', '京东商城-菜场', 'Wcu2LVCFMkBP3HraRvb7pgSpt64'); //京东菜场
await JDUserSignPre(Wait(stop), 'JDPlus', '京东商城-PLUS', '3bhgbFe5HZcFCjEZf2jzp3umx4ZR'); //京东PLUS
await JDUserSignPre(Wait(stop), 'JDStore', '京东超市', 'QPwDgLSops2bcsYqQ57hENGrjgj'); //京东超市
await JDUserSignPre(Wait(stop), 'JDaccompany', '京东商城-陪伴', 'kPM3Xedz1PBiGQjY4ZYGmeVvrts'); //京东陪伴
// await JDUserSignPre(Wait(stop), 'JDStore', '京东超市', 'QPwDgLSops2bcsYqQ57hENGrjgj'); //京东超市
// await JDUserSignPre(Wait(stop), 'JDaccompany', '京东商城-陪伴', 'kPM3Xedz1PBiGQjY4ZYGmeVvrts'); //京东陪伴
// await JDUserSignPre(Wait(stop), 'JDLive', '京东智能-生活', 'KcfFqWvhb5hHtaQkS4SD1UU6RcQ'); //京东智能生活
await JDUserSignPre(Wait(stop), 'JDClean', '京东商城-清洁', '2Tjm6ay1ZbZ3v7UbriTj6kHy9dn6'); //京东清洁馆
await JDUserSignPre(Wait(stop), 'JDCare', '京东商城-个护', '2tZssTgnQsiUqhmg5ooLSHY9XSeN'); //京东个人护理馆
await JDUserSignPre(Wait(stop), 'JDJiaDian', '京东商城-家电', '3uvPyw1pwHARGgndatCXddLNUxHw'); // 京东小家电馆
// await JDUserSignPre(Wait(stop), 'JDClean', '京东商城-清洁', '2Tjm6ay1ZbZ3v7UbriTj6kHy9dn6'); //京东清洁馆
// await JDUserSignPre(Wait(stop), 'JDCare', '京东商城-个护', '2tZssTgnQsiUqhmg5ooLSHY9XSeN'); //京东个人护理馆
// await JDUserSignPre(Wait(stop), 'JDJiaDian', '京东商城-家电', '3uvPyw1pwHARGgndatCXddLNUxHw'); // 京东小家电馆
// await JDUserSignPre(Wait(stop), 'ReceiveJD', '京东商城-领豆', 'Ni5PUSK7fzZc4EKangHhqPuprn2'); //京东-领京豆
// await JDUserSignPre(Wait(stop), 'JDJewels', '京东商城-珠宝', 'zHUHpTHNTaztSRfNBFNVZscyFZU'); //京东珠宝馆
await JingRongDoll(Wait(stop), 'JDDouble', '金融京豆-双签', 'F68B2C3E71', '', '', '', 'jingdou'); //京东金融 京豆双签
//await JingRongDoll(Wait(stop), 'JDDouble', '金融京豆-双签', 'F68B2C3E71', '', '', '', 'jingdou'); //京东金融 京豆双签
break;
}
await Promise.all([

760
utils/magic.js Normal file
View File

@@ -0,0 +1,760 @@
// noinspection JSUnresolvedFunction,JSUnresolvedVariable
const axios = require('axios');
const fs = require("fs");
const {format} = require("date-fns");
const notify = require('../sendNotify');
const jdCookieNode = require('../jdCookie.js');
const CryptoJS = require("crypto-js");
const got = require("got");
let cookies = [];
let testMode = process.env.TEST_MODE?.includes('on') ? true
: __dirname.includes("magic")
Object.keys(jdCookieNode).forEach((item) => {
cookies.push(jdCookieNode[item])
})
const USER_AGENTS = [
"jdapp;android;10.0.2;10;network/wifi;Mozilla/5.0 (Linux; Android 10; ONEPLUS A5010 Build/QKQ1.191014.012; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/77.0.3865.120 MQQBrowser/6.2 TBS/045230 Mobile Safari/537.36",
"jdapp;iPhone;10.0.2;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",
"jdapp;android;10.0.2;9;network/4g;Mozilla/5.0 (Linux; Android 9; Mi Note 3 Build/PKQ1.181007.001; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/66.0.3359.126 MQQBrowser/6.2 TBS/045131 Mobile Safari/537.36",
"jdapp;android;10.0.2;10;network/wifi;Mozilla/5.0 (Linux; Android 10; GM1910 Build/QKQ1.190716.003; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/77.0.3865.120 MQQBrowser/6.2 TBS/045230 Mobile Safari/537.36",
"jdapp;android;10.0.2;9;network/wifi;Mozilla/5.0 (Linux; Android 9; 16T Build/PKQ1.190616.001; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/66.0.3359.126 MQQBrowser/6.2 TBS/044942 Mobile Safari/537.36",
"jdapp;iPhone;10.0.2;13.6;network/wifi;Mozilla/5.0 (iPhone; CPU iPhone OS 13_6 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148;supportJDSHWK/1",
"jdapp;iPhone;10.0.2;13.6;network/wifi;Mozilla/5.0 (iPhone; CPU iPhone OS 13_6 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148;supportJDSHWK/1",
"jdapp;iPhone;10.0.2;13.5;network/wifi;Mozilla/5.0 (iPhone; CPU iPhone OS 13_5 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148;supportJDSHWK/1",
"jdapp;iPhone;10.0.2;14.1;network/wifi;Mozilla/5.0 (iPhone; CPU iPhone OS 14_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148;supportJDSHWK/1",
"jdapp;iPhone;10.0.2;13.3;network/wifi;Mozilla/5.0 (iPhone; CPU iPhone OS 13_3 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148;supportJDSHWK/1",
"jdapp;iPhone;10.0.2;13.7;network/wifi;Mozilla/5.0 (iPhone; CPU iPhone OS 13_7 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148;supportJDSHWK/1",
"jdapp;iPhone;10.0.2;14.1;network/wifi;Mozilla/5.0 (iPhone; CPU iPhone OS 14_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148;supportJDSHWK/1",
"jdapp;iPhone;10.0.2;13.3;network/wifi;Mozilla/5.0 (iPhone; CPU iPhone OS 13_3 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148;supportJDSHWK/1",
"jdapp;iPhone;10.0.2;13.4;network/wifi;Mozilla/5.0 (iPhone; CPU iPhone OS 13_4 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148;supportJDSHWK/1",
"jdapp;iPhone;10.0.2;14.3;network/wifi;Mozilla/5.0 (iPhone; CPU iPhone OS 14_3 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148;supportJDSHWK/1",
"jdapp;android;10.0.2;9;network/wifi;Mozilla/5.0 (Linux; Android 9; MI 6 Build/PKQ1.190118.001; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/66.0.3359.126 MQQBrowser/6.2 TBS/044942 Mobile Safari/537.36",
"jdapp;android;10.0.2;11;network/wifi;Mozilla/5.0 (Linux; Android 11; Redmi K30 5G Build/RKQ1.200826.002; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/77.0.3865.120 MQQBrowser/6.2 TBS/045511 Mobile Safari/537.36",
"jdapp;iPhone;10.0.2;11.4;network/wifi;Mozilla/5.0 (iPhone; CPU iPhone OS 11_4 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15F79",
"jdapp;android;10.0.2;10;;network/wifi;Mozilla/5.0 (Linux; Android 10; M2006J10C Build/QP1A.190711.020; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/77.0.3865.120 MQQBrowser/6.2 TBS/045230 Mobile Safari/537.36",
"jdapp;android;10.0.2;10;network/wifi;Mozilla/5.0 (Linux; Android 10; M2006J10C Build/QP1A.190711.020; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/77.0.3865.120 MQQBrowser/6.2 TBS/045230 Mobile Safari/537.36",
"jdapp;android;10.0.2;10;network/wifi;Mozilla/5.0 (Linux; Android 10; ONEPLUS A6000 Build/QKQ1.190716.003; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/77.0.3865.120 MQQBrowser/6.2 TBS/045224 Mobile Safari/537.36",
"jdapp;android;10.0.2;9;network/wifi;Mozilla/5.0 (Linux; Android 9; MHA-AL00 Build/HUAWEIMHA-AL00; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/66.0.3359.126 MQQBrowser/6.2 TBS/044942 Mobile Safari/537.36",
"jdapp;android;10.0.2;8.1.0;network/wifi;Mozilla/5.0 (Linux; Android 8.1.0; 16 X Build/OPM1.171019.026; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/66.0.3359.126 MQQBrowser/6.2 TBS/044942 Mobile Safari/537.36",
"jdapp;android;10.0.2;8.0.0;network/wifi;Mozilla/5.0 (Linux; Android 8.0.0; HTC U-3w Build/OPR6.170623.013; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/66.0.3359.126 MQQBrowser/6.2 TBS/044942 Mobile Safari/537.36",
"jdapp;iPhone;10.0.2;14.0.1;network/wifi;Mozilla/5.0 (iPhone; CPU iPhone OS 14_0_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148;supportJDSHWK/1",
"jdapp;android;10.0.2;10;network/wifi;Mozilla/5.0 (Linux; Android 10; LYA-AL00 Build/HUAWEILYA-AL00L; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/77.0.3865.120 MQQBrowser/6.2 TBS/045230 Mobile Safari/537.36",
"jdapp;iPhone;10.0.2;14.2;network/wifi;Mozilla/5.0 (iPhone; CPU iPhone OS 14_2 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148;supportJDSHWK/1",
"jdapp;iPhone;10.0.2;14.3;network/wifi;Mozilla/5.0 (iPhone; CPU iPhone OS 14_3 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148;supportJDSHWK/1",
"jdapp;iPhone;10.0.2;14.2;network/wifi;Mozilla/5.0 (iPhone; CPU iPhone OS 14_2 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148;supportJDSHWK/1",
"jdapp;android;10.0.2;8.1.0;network/wifi;Mozilla/5.0 (Linux; Android 8.1.0; MI 8 Build/OPM1.171019.026; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/66.0.3359.126 MQQBrowser/6.2 TBS/045131 Mobile Safari/537.36",
"jdapp;android;10.0.2;10;network/wifi;Mozilla/5.0 (Linux; Android 10; Redmi K20 Pro Premium Edition Build/QKQ1.190825.002; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/77.0.3865.120 MQQBrowser/6.2 TBS/045227 Mobile Safari/537.36",
"jdapp;iPhone;10.0.2;14.3;network/wifi;Mozilla/5.0 (iPhone; CPU iPhone OS 14_3 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148;supportJDSHWK/1",
"jdapp;iPhone;10.0.2;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",
"jdapp;android;10.0.2;11;network/wifi;Mozilla/5.0 (Linux; Android 11; Redmi K20 Pro Premium Edition Build/RKQ1.200826.002; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/77.0.3865.120 MQQBrowser/6.2 TBS/045513 Mobile Safari/537.36",
"jdapp;android;10.0.2;10;network/wifi;Mozilla/5.0 (Linux; Android 10; MI 8 Build/QKQ1.190828.002; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/77.0.3865.120 MQQBrowser/6.2 TBS/045227 Mobile Safari/537.36",
"jdapp;iPhone;10.0.2;14.1;network/wifi;Mozilla/5.0 (iPhone; CPU iPhone OS 14_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148;supportJDSHWK/1",
]
const $ = axios.create({timeout: 24000});
$.defaults.headers['Accept'] = '*/*';
$.defaults.headers['User-Agent'] = USER_AGENTS[randomNumber(0,
USER_AGENTS.length)];
$.defaults.headers['Connection'] = 'keep-alive';
$.defaults.headers['Accept-Language'] = "zh-CN,zh-Hans;q=0.9";
$.defaults.headers['Accept-Encoding'] = "gzip, deflate, br";
function randomNumber(min = 0, max = 100) {
return Math.min(Math.floor(min + Math.random() * (max - min)), max);
}
class Env {
constructor(name) {
this.name = name
this.username = '';
this.cookie = '';
this.cookies = [];
this.index = '';
this.ext = [];
this.msg = [];
this.delimiter = '';
this.filename = ''
this.appId = '';
this.algo = {};
this.bot = false;
this.expire = false;
}
async run(data = {
wait: [1000, 2000],
bot: false,
delimiter: '',
o2o: false,
random: false,
once: false,
blacklist: [],
whitelist: []
}) {
this.filename = process.argv[1];
console.log(`${this.now()} ${this.name} ${this.filename} 开始运行...`);
this.start = this.timestamp();
await this.config()
if (data?.delimiter) {
this.delimiter = data?.delimiter
}
if (data?.bot) {
this.bot = data.bot;
}
if (data?.blacklist?.length > 0) {
for (const cki of data.blacklist) {
delete cookies[cki - 1];
}
}
if (data?.whitelist?.length > 0) {
let cks = []
for (const cki of data.whitelist) {
if (cki - 1 < cookies.length) {
cks.push(cookies[cki - 1])
}
}
cookies = cks;
}
if (data?.random) {
cookies = this.randomArray(cookies)
}
await this.verify()
this.cookies = cookies;
if (data?.before) {
for (let i = 0; i <= this.cookies.length; i++) {
if (this.cookies[i] && !this.expire) {
let cookie = this.cookies[i];
this.cookie = cookie;
this.username = decodeURIComponent(
cookie.match(/pt_pin=([^; ]+)(?=;?)/)[1]);
$.defaults.headers['Cookie'] = this.cookie;
this.index = i + 1;
let me = {
username: this.username,
index: this.index,
cookie: this.cookie
};
try {
this.ext.push(Object.assign(me, await this.before()));
} catch (e) {
console.log(e)
}
if (data?.wait?.length > 0 && this.index
!== cookies.length) {
await this.wait(data?.wait[0], data?.wait[1])
}
}
}
}
let once = false;
for (let i = 0; i <= this.cookies.length; i++) {
if (this.cookies[i] && !this.expire) {
this.index = i + 1;
if (data?.once && this.index !== data.once) {
once = true;
continue;
}
let cookie = this.cookies[i];
this.cookie = cookie;
this.username = decodeURIComponent(
cookie.match(/pt_pin=([^; ]+)(?=;?)/)[1]);
$.defaults.headers['Cookie'] = this.cookie;
this.index = i + 1;
try {
await this.logic()
if (data?.o2o) {
await this.send();
testMode ? this.log(this.msg.join("\n")) : ''
this.msg = [];
}
if (once) {
break;
}
} catch (e) {
this.log('捕获异常', e)
}
if (data?.wait?.length > 0 && this.index !== cookies.length) {
await this.wait(data?.wait[0], data?.wait[1])
}
}
}
await this.after()
console.log(`${this.now()} ${this.name} 运行结束,耗时 ${this.timestamp()
- this.start}ms\n`)
testMode && this.msg.length > 0 ? console.log(this.msg.join("\n")) : ''
if (!data?.o2o) {
await this.send();
}
}
async config() {
}
deleteCookie() {
delete this.cookies[this.index - 1]
return {};
}
groupBy(arr, fn) {
const data = {};
arr.forEach(function (o) {
const k = fn(o);
data[k] = data[k] || []
data[k].push(o)
})
return data;
}
async send() {
if (this.msg?.length > 0) {
this.msg.push(
'运行时长:' + ((this.timestamp() - this.start) / 1000).toFixed(2)
+ 's')
if (this.bot) {
await notify.sendNotify("/" + this.name,
this.msg.join(this.delimiter || ''))
} else {
await notify.sendNotify(this.name, this.msg.join("\n"))
}
}
}
async verify() {
let fn = this.filename
function av(s) {
return s.trim().match(/([a-z_])*$/)[0];
}
let x = '109M95O106F120V95B', y = '99M102F100O', z = '109H99V',
j = '102N97I99D116T111G114A121B', k = '112C112U',
l = '109N95G106B100K95U', m = '119V120M';
let reg = /[A-Z]/;
x.concat(y).split(reg).map(o => +o).filter(o => o > 0).forEach(
o => y += String.fromCharCode(o))
x.concat(z).split(reg).map(o => +o).filter(o => o > 0).forEach(
o => z += String.fromCharCode(o))
x.concat(j).split(reg).map(o => +o).filter(o => o > 0).forEach(
o => j += String.fromCharCode(o))
x.concat(k).split(reg).map(o => +o).filter(o => o > 0).forEach(
o => k += String.fromCharCode(o))
l.concat(m).split(reg).map(o => +o).filter(o => o > 0).forEach(
o => m += String.fromCharCode(o))
this.appId = fn ? this.name.slice(0, 1)
=== String.fromCharCode(77)
? (fn.includes(av(y)) ? '10032' :
fn.includes(av(z)) ? '10028' :
fn.includes(av(j)) ? '10001' :
fn.includes(av(k)) ? '10038' :
fn.includes(av(m)) ? 'wx' : '') : ''
: '';
this.appId ? this.algo = await this._algo() : '';
}
async wait(min, max) {
if (max) {
return new Promise(
(resolve) => setTimeout(resolve, this.random(min, max)));
} else {
return new Promise((resolve) => setTimeout(resolve, min));
}
}
putMsg(msg) {
this.log(msg)
let r = [[' ', ''], ['优惠券', '券'], ['东券', '券'], ['店铺', ''],
['恭喜', ''], ['获得', '']]
for (let ele of r) {
msg = msg.replace(ele[0], ele[1])
}
if (this.bot) {
this.msg.push(msg)
} else {
if (this.msg.length > 0 && this.msg[this.msg.length - 1].includes(
this.username)) {
this.msg[this.msg.length - 1] = this.msg[this.msg.length
- 1].split(" ")[0] + ' ' + [this.msg[this.msg.length - 1].split(
" ")[1], msg].join(',')
} else {
this.msg.push(`【当前账号】${this.username} ${msg}`)
}
}
}
md5(str) {
return CryptoJS.MD5(str).toString()
}
HmacSHA256(param, key) {
return CryptoJS.HmacSHA256(param, key).toString()
}
log(...msg) {
this.s ? console.log(...msg) : console.log(
`${this.now()} ${this.username}`, ...msg)
}
//并
union(a, b) {
return a.concat(b.filter(o => !a.includes(o)))
}
//交
intersection(a, b) {
return a.filter(o => b.includes(o))
}
//交
different(a, b) {
return a.concat(b).filter(o => a.includes(o) && !b.includes(o))
}
build(url) {
if (url.match(/&callback=(jsonpCBK(.*))&/)) {
let cb = url.match(/&callback=(jsonpCBK(.*))&/);
url = url.replace(cb[1], this.randomCallback(cb[2].length || 0))
}
let stk = decodeURIComponent(this.getQueryString(url, '_stk') || '');
if (stk) {
let ens, hash, st = '',
ts = this.now('yyyyMMddHHmmssSSS').toString(),
tk = this.algo.tk, fp = this.algo.fp, em = this.algo.em;
if (tk && fp && em) {
hash = em(tk, fp, ts, this.appId, CryptoJS).toString(
CryptoJS.enc.Hex)
} else {
const random = '5gkjB6SpmC9s';
tk = 'tk01wcdf61cb3a8nYUtHcmhSUFFCfddDPRvKvYaMjHkxo6Aj7dhzO+GXGFa9nPXfcgT+mULoF1b1YIS1ghvSlbwhE0Xc';
fp = '9686767825751161';
hash = CryptoJS.SHA512(
`${tk}${fp}${ts}${this.appId}${random}`,
tk).toString(CryptoJS.enc.Hex);
}
stk.split(',').map((item, index) => {
st += `${item}:${this.getQueryString(url, item)}${index
=== stk.split(',').length - 1 ? '' : '&'}`;
})
ens = encodeURIComponent(
[''.concat(ts), ''.concat(fp),
''.concat(this.appId), ''.concat(tk),
''.concat(CryptoJS.HmacSHA256(st, hash.toString()).toString(
CryptoJS.enc.Hex))].join(';'));
if (url.match(/[?|&]h5st=(.*?)&/)) {
url = url.replace(url.match(/[?|&]h5st=(.*?)&/)[1], 'H5ST')
.replace(/H5ST/, ens)
}
let matchArr = [/[?|&]_time=(\d+)/, /[?|&]__t=(\d+)/,
/[?|&]_ts=(\d+)/,
/[?|&]_=(\d+)/, /[?|&]t=(\d+)/, /[?|&]_cfd_t=(\d+)/]
for (let ms of matchArr) {
if (url.match(ms)) {
url = url.replace(url.match(ms)[1], Date.now())
}
}
let t = this._tk();
if (url.match(/strPgUUNum=(.*?)&/)) {
url = url.replace(url.match(/strPgUUNum=(.*?)&/)[1], t.tk)
if (url.match(/strPhoneID=(.*?)&/)) {
url = url.replace(url.match(/strPhoneID=(.*?)&/)[1], t.id)
}
if (url.match(/strPgtimestamp=(.*?)&/)) {
url = url.replace(url.match(/strPgtimestamp=(.*?)&/)[1],
t.ts)
}
}
if (url.match(/jxmc_jstoken=(.*?)&/)) {
url = url.replace(url.match(/jxmc_jstoken=(.*?)&/)[1], t.tk)
if (url.match(/phoneid=(.*?)&/)) {
url = url.replace(url.match(/phoneid=(.*?)&/)[1], t.id)
}
if (url.match(/timestamp=(.*?)&/)) {
url = url.replace(url.match(/timestamp=(.*?)&/)[1], t.ts)
}
}
}
return url;
}
getQueryString(url, name) {
let reg = new RegExp("(^|[&?])" + name + "=([^&]*)(&|$)");
let r = url.match(reg);
if (r != null) {
return unescape(r[2]);
}
return '';
}
unique(arr) {
return Array.from(new Set(arr))
}
async logic() {
console.log("default logic")
}
async before() {
return -1;
}
async after() {
return -1;
}
tryLock(username, key) {
try {
fs.accessSync(`/jd/log/lock/${key}_${username}`);
return false;
} catch (e) {
return true;
}
}
setLock(username, key) {
try {
try {
fs.accessSync(`/jd/log/lock`);
} catch (e) {
fs.mkdirSync(`/jd/log/lock`);
}
fs.mkdirSync(`/jd/log/lock/${key}_${username}`);
return false;
} catch (e) {
return true;
}
}
match(pattern, string) {
pattern = (pattern instanceof Array) ? pattern : [pattern];
for (let pat of pattern) {
const match = pat.exec(string);
if (match) {
const len = match.length;
if (len === 1) {
return match;
} else if (len === 2) {
return match[1];
} else {
const r = [];
for (let i = 1; i < len; i++) {
r.push(match[i])
}
return r;
}
}
}
return '';
}
matchAll(pattern, string) {
pattern = (pattern instanceof Array) ? pattern : [pattern];
let match;
let result = [];
for (let p of pattern) {
while ((match = p.exec(string)) != null) {
let len = match.length;
if (len === 1) {
result.push(match);
} else if (len === 2) {
result.push(match[1]);
} else {
let r = [];
for (let i = 1; i < len; i++) {
r.push(match[i])
}
result.push(r);
}
}
}
return result;
}
async countdown(s) {
let date = new Date();
if (date.getMinutes() === 59) {
let ms = this.now("s.SSS")
if (ms < 59) {
let st = (60 - ms) * 1000;
console.log(` 需要等待时间 ${st / 1000}`);
await this.wait(st - (s || 20))
}
}
}
readFileSync(path) {
try {
return fs.readFileSync(path).toString();
} catch (e) {
console.log(path, '文件不存在进行创建')
this.writeFileSync(path, '');
return '';
}
}
writeFileSync(path, data) {
fs.writeFileSync(path, data)
}
random(min, max) {
return Math.floor(Math.random() * (max - min + 1) + min);
}
async notify(text, desc) {
return notify.sendNotify(text, desc);
}
async get(url, headers) {
url = this.appId ? this.build(url) : url
return new Promise((resolve, reject) => {
$.get(url, {headers: headers}).then(
data => resolve(this.handler(data) || data))
.catch(e => reject(e))
})
}
async get2(url, headers) {
return new Promise((resolve, reject) => {
$.get(url, {headers: headers}).then(
data => resolve(data))
.catch(e => reject(e))
})
}
async post(url, body, headers) {
url = this.appId ? this.build(url) : url
return new Promise((resolve, reject) => {
$.post(url, body, {headers: headers})
.then(data => resolve(this.handler(data) || data))
.catch(e => reject(e));
})
}
//└
async request(url, headers, body) {
return new Promise((resolve, reject) => {
let __config = headers?.headers ? headers : {headers: headers};
(body ? $.post(url, body, __config) : $.get(url, __config))
.then(data => {
this.__lt(data);
resolve(data)
})
.catch(e => reject(e));
})
}
__lt(data) {
if (this.appId.length !== 2) {
return
}
let scs = data?.headers['set-cookie'] || data?.headers['Set-Cookie']
|| ''
if (!scs) {
if (data?.data?.LZ_TOKEN_KEY && data?.data?.LZ_TOKEN_VALUE) {
this.lz = `LZ_TOKEN_KEY=${data.data.LZ_TOKEN_KEY};LZ_TOKEN_VALUE=${data.data.LZ_TOKEN_VALUE};`;
}
return;
}
let LZ_TOKEN_KEY = '', LZ_TOKEN_VALUE = ''
let sc = typeof scs != 'object' ? scs.split(',') : scs
for (let ck of sc) {
let name = ck.split(";")[0].trim()
if (name.split("=")[1]) {
name.includes('LZ_TOKEN_KEY=')
? LZ_TOKEN_KEY = name.replace(/ /g, '') + ';' : ''
name.includes('LZ_TOKEN_VALUE=')
? LZ_TOKEN_VALUE = name.replace(/ /g, '') + ';' : ''
}
}
if (LZ_TOKEN_KEY && LZ_TOKEN_VALUE) {
this.lz = `${LZ_TOKEN_KEY}${LZ_TOKEN_VALUE}`
}
// testMode ? this.log('lz', this.lz) : ''
}
handler(res) {
let data = res?.data || res?.body ||res;
if (!data) {
return;
}
if (typeof data === 'string') {
data = data.replace(/[\n\r| ]/g, '');
if (data.includes("try{jsonpCB")) {
data = data.replace(/try{jsonpCB.*\({/, '{')
.replace(/}\)([;])?}catch\(e\){}/, '}')
} else if (data.includes('jsonpCB')) {
let st = data.replace(/[\n\r]/g, '').replace(/jsonpCB.*\({/,
'{');
data = st.substring(0, st.length - 1)
} else if (data.match(/try{.*\({/)) {
data = data.replace(/try{.*\({/, '{')
.replace(/}\)([;])?}catch\(e\){}/, '}')
} else if (data.includes("jsonp")) {
data = /{(.*)}/g.exec(data)[0]
} else {
testMode ? console.log('例外', data) : ''
}
testMode ? console.log(data) : ''
testMode ? console.log('----------------分割线--------------------')
: ''
return JSON.parse(data)
}
testMode ? console.log(JSON.stringify(data)) : ''
testMode ? console.log('----------------分割线---------------------') : ''
return data;
}
randomNum(length) {
length = length || 32;
let t = "0123456789", a = t.length, n = '';
for (let i = 0; i < length; i++) {
n += t.charAt(Math.floor(Math.random() * a));
}
return n
}
randomString(e) {
return this.uuid()
}
uuid(x = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx") {
return x.replace(/[xy]/g, function (x) {
const r = 16 * Math.random() | 0, n = "x" === x ? r : 3 & r | 8;
return n.toString(36)
})
}
async unfollow(shopId) {
let url = 'https://api.m.jd.com/client.action?g_ty=ls&g_tk=518274330'
let body = `functionId=followShop&body={"follow":"false","shopId":"${shopId}","award":"true","sourceRpc":"shop_app_home_follow"}&osVersion=13.7&appid=wh5&clientVersion=9.2.0&loginType=2&loginWQBiz=interact`
let headers = {
'Accept': 'application/json, text/plain, */*',
'Accept-Encoding': 'gzip, deflate, br',
'Content-Type': 'application/x-www-form-urlencoded',
'Host': 'api.m.jd.com',
'Connection': 'keep-alive',
'Accept-Language': 'zh-cn',
'Cookie': this.cookie
}
headers['User-Agent'] = `Mozilla/5.0 (iPhone; CPU iPhone OS 14_5_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148 MicroMessenger/8.0.4(0x1800042c) NetType/4G Language/zh_CN miniProgram`
let {data} = await this.request(url, headers, body);
this.log(data.msg)
return data;
}
randomCallback(e = 1) {
let t = "abcdefghigklmnopqrstuvwsyz", a = t.length, n = '';
for (let i = 0; i < e; i++) {
n += t.charAt(Math.floor(Math.random() * a));
}
return "jsonpCBK" + n.toUpperCase()
}
randomArray(arr, count) {
count = count || arr.length
let shuffled = arr.slice(0), i = arr.length, min = i - count, temp,
index;
while (i-- > min) {
index = Math.floor((i + 1) * Math.random());
temp = shuffled[index];
shuffled[index] = shuffled[i];
shuffled[i] = temp;
}
return shuffled.slice(min);
}
now(fmt) {
return format(Date.now(), fmt || 'yyyy-MM-dd HH:mm:ss.SSS')
}
formatDate(date, fmt) {
// noinspection JSCheckFunctionSignatures
return format(typeof date === 'object' ? date : new Date(
typeof date === 'string' ? date * 1 : date),
fmt || 'yyyy-MM-dd')
}
timestamp() {
return new Date().getTime()
}
_tk() {
let id = function (n) {
let src = 'abcdefghijklmnopqrstuvwxyz1234567890', res = '';
for (let i = 0; i < n; i++) {
res += src[Math.floor(src.length * Math.random())];
}
return res;
}(40), ts = Date.now().toString(), tk = this.md5(
'' + decodeURIComponent(this.username) + ts + id
+ 'tPOamqCuk9NLgVPAljUyIHcPRmKlVxDy');
return {ts: ts, id: id, tk: tk}
}
async get_bean() {
let {data} = await $.post('https://api.m.jd.com/client.action',
`functionId=plantBeanIndex&body=${escape(
JSON.stringify({
version: "9.0.0.1",
"monitor_source": "plant_app_plant_index",
"monitor_refer": ""
})
)}&appid=ld&client=apple&area=5_274_49707_49973&build=167283&clientVersion=9.1.0`,
{
'Host': "api.m.jd.com",
"Cookie": this.cookie
});
debugger
return data.data.jwordShareInfo.shareUrl.split('Uuid=')[1] ?? ''
}
async get_farm() {
let {data} = await $.post(
'https://api.m.jd.com/client.action?functionId=initForFarm',
`body=${escape(
JSON.stringify({"version": 4}))}&appid=wh5&clientVersion=9.1.0`,
{
"origin": "https://home.m.jd.com",
"referer": "https://home.m.jd.com/myJd/newhome.action",
"Content-Type": "application/x-www-form-urlencoded",
"Cookie": this.cookie
})
debugger
return data?.farmUserPro?.shareCode ?? ''
}
async _algo() {
let fp = function () {
let e = "0123456789", a = 13, i = ''
for (; a--;) {
i += e[Math.random() * e.length | 0]
}
return (i + Date.now()).slice(0, 16)
}();
let data = await this.post(
'https://cactus.jd.com/request_algo?g_ty=ajax', JSON.stringify({
"version": "1.0",
"fp": fp,
"appId": this.appId,
"timestamp": this.timestamp(),
"platform": "web",
"expandParams": ''
}), {
'Authority': 'cactus.jd.com',
'User-Agent': 'Mozilla/5.0 (iPhone; CPU iPhone OS 13_2_3 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/13.0.3 Mobile/15E148 Safari/604.1',
'Content-Type': 'application/json',
'Origin': 'https://st.jingxi.com',
'Referer': 'https://st.jingxi.com/',
});
return {
fp: fp.toString(),
tk: data?.data?.result?.tk || data?.result?.tk,
em: new Function(
`return ${data?.data?.result?.algo || data?.result?.algo}`)()
}
}
}
module.exports = {Env, CryptoJS};

99
utils/share_code.js Normal file
View File

@@ -0,0 +1,99 @@
var allShareCodes = [];
var removedShareCodes = [];
var chetou_number = process.env.CHETOU_NUMBER ? process.env.CHETOU_NUMBER : 0
var fair_mode = process.env.FAIR_MODE ? true : false
var precode_mode = process.env.PRECODE_MODE ? false : true
exports.ModCK = function(cks) {
console.log(`${fair_mode ? "有" : "没有"}设置雨露均沾模式。`)
console.log(`您设置了${chetou_number}个车头。`)
if (cks.length <= chetou_number || !fair_mode) {
return cks
}
var sck = []
var eck = []
for (var i = 0; i < cks.length; i++) {
if (i <= chetou_number - 1) {
sck.push(cks[i])
} else {
eck.push(cks[i])
}
}
eck.sort(function() {
return Math.random() - 0.5;
})
console.log(`已对${eck.length}个ck做了随机处理。`)
for (var i = 0; i < eck.length; i++) {
sck.push(eck[i])
}
if (!precode_mode) {
if (sck.length >= 2) {
sck.push(sck[0])
}
if (sck.length >= 3) {
sck.push(sck[1])
}
if (sck.length >= 4) {
sck.push(sck[2])
}
if (sck.length >= 5) {
sck.push(sck[3])
}
if (sck.length >= 6) {
sck.push(sck[4])
}
}
return sck
}
exports.setDefaultShareCodes = function(str) {
if (!str) {
return
}
var shareCodes = str.split("@")
console.log(`您提供了${shareCodes.length}个账号的助力码\n`);
if (shareCodes && shareCodes.length) {
for (var shareCode of shareCodes) {
if (shareCode && shareCode != "undefined" && allShareCodes.indexOf(shareCode) == -1) {
allShareCodes.push(shareCode)
}
}
}
}
exports.addShareCode = function(shareCode) {
if (shareCode && allShareCodes.indexOf(shareCode) == -1) {
allShareCodes.push(shareCode)
}
}
exports.removeShareCode = function(shareCode) {
removedShareCodes.push(shareCode)
}
exports.forEachShareCode = function(func) {
for (var shareCode of allShareCodes) {
if (removedShareCodes.indexOf(shareCode) == -1) {
if (func(shareCode)) {
break
}
}
}
}
exports.getShareCodes = function() {
var shareCodes = []
for (var shareCode of allShareCodes) {
if (removedShareCodes.indexOf(shareCode) == -1) {
shareCodes.push(shareCode)
}
}
return shareCodes
}
exports.getAllShareCodes = function() {
return allShareCodes
}