mirror of
https://github.com/shufflewzc/faker3.git
synced 2026-04-04 00:44:07 +08:00
update
This commit is contained in:
BIN
function/.DS_Store
vendored
Normal file
BIN
function/.DS_Store
vendored
Normal file
Binary file not shown.
341
function/TS_USER_AGENTS.ts
Normal file
341
function/TS_USER_AGENTS.ts
Normal file
@@ -0,0 +1,341 @@
|
||||
import axios from "axios"
|
||||
import {Md5} from "ts-md5"
|
||||
import * as dotenv from "dotenv"
|
||||
import {existsSync, readFileSync} from "fs"
|
||||
import {sendNotify} from './sendNotify'
|
||||
|
||||
dotenv.config()
|
||||
|
||||
let fingerprint: string | number, token: string = '', enCryptMethodJD: any
|
||||
|
||||
const USER_AGENTS: Array<string> = [
|
||||
"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",
|
||||
]
|
||||
|
||||
function TotalBean(cookie: string) {
|
||||
return {
|
||||
cookie: cookie,
|
||||
isLogin: true,
|
||||
nickName: ''
|
||||
}
|
||||
}
|
||||
|
||||
function getRandomNumberByRange(start: number, end: number) {
|
||||
end <= start && (end = start + 100)
|
||||
return Math.floor(Math.random() * (end - start) + start)
|
||||
}
|
||||
|
||||
let USER_AGENT = USER_AGENTS[getRandomNumberByRange(0, USER_AGENTS.length)]
|
||||
|
||||
async function getBeanShareCode(cookie: string) {
|
||||
let {data}: any = await axios.post('https://api.m.jd.com/client.action',
|
||||
`functionId=plantBeanIndex&body=${encodeURIComponent(
|
||||
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`, {
|
||||
headers: {
|
||||
Cookie: cookie,
|
||||
Host: "api.m.jd.com",
|
||||
Accept: "*/*",
|
||||
Connection: "keep-alive",
|
||||
"User-Agent": USER_AGENT
|
||||
}
|
||||
})
|
||||
if (data.data?.jwordShareInfo?.shareUrl)
|
||||
return data.data.jwordShareInfo.shareUrl.split('Uuid=')![1]
|
||||
else
|
||||
return ''
|
||||
}
|
||||
|
||||
async function getFarmShareCode(cookie: string) {
|
||||
let {data}: any = await axios.post('https://api.m.jd.com/client.action?functionId=initForFarm', `body=${encodeURIComponent(JSON.stringify({"version": 4}))}&appid=wh5&clientVersion=9.1.0`, {
|
||||
headers: {
|
||||
"cookie": cookie,
|
||||
"origin": "https://home.m.jd.com",
|
||||
"referer": "https://home.m.jd.com/myJd/newhome.action",
|
||||
"User-Agent": USER_AGENT,
|
||||
"Content-Type": "application/x-www-form-urlencoded"
|
||||
}
|
||||
})
|
||||
|
||||
if (data.farmUserPro)
|
||||
return data.farmUserPro.shareCode
|
||||
else
|
||||
return ''
|
||||
}
|
||||
|
||||
async function requireConfig(check: boolean = false): Promise<string[]> {
|
||||
let cookiesArr: string[] = []
|
||||
const jdCookieNode = require('../jdCookie.js')
|
||||
let keys: string[] = Object.keys(jdCookieNode)
|
||||
for (let i = 0; i < keys.length; i++) {
|
||||
let cookie = jdCookieNode[keys[i]]
|
||||
if (!check) {
|
||||
cookiesArr.push(cookie)
|
||||
} else {
|
||||
if (await checkCookie(cookie)) {
|
||||
cookiesArr.push(cookie)
|
||||
} else {
|
||||
let username = decodeURIComponent(jdCookieNode[keys[i]].match(/pt_pin=([^;]*)/)![1])
|
||||
console.log('Cookie失效', username)
|
||||
await sendNotify('Cookie失效', '【京东账号】' + username)
|
||||
}
|
||||
}
|
||||
}
|
||||
console.log(`共${cookiesArr.length}个京东账号\n`)
|
||||
return cookiesArr
|
||||
}
|
||||
|
||||
async function checkCookie(cookie) {
|
||||
await wait(1000)
|
||||
try {
|
||||
let {data}: any = await axios.get(`https://api.m.jd.com/client.action?functionId=GetJDUserInfoUnion&appid=jd-cphdeveloper-m&body=${encodeURIComponent(JSON.stringify({"orgFlag": "JD_PinGou_New", "callSource": "mainorder", "channel": 4, "isHomewhite": 0, "sceneval": 2}))}&loginType=2&_=${Date.now()}&sceneval=2&g_login_type=1&callback=GetJDUserInfoUnion&g_ty=ls`, {
|
||||
headers: {
|
||||
'authority': 'api.m.jd.com',
|
||||
'user-agent': 'Mozilla/5.0 (iPhone; CPU iPhone OS 10_3_1 like Mac OS X) AppleWebKit/603.1.30 (KHTML, like Gecko) Version/10.0 Mobile/14E304 Safari/602.1',
|
||||
'referer': 'https://home.m.jd.com/',
|
||||
'cookie': cookie
|
||||
}
|
||||
})
|
||||
data = JSON.parse(data.match(/GetJDUserInfoUnion\((.*)\)/)[1])
|
||||
return data.retcode === '0';
|
||||
} catch (e) {
|
||||
return false
|
||||
}
|
||||
}
|
||||
|
||||
function wait(timeout: number) {
|
||||
return new Promise(resolve => {
|
||||
setTimeout(resolve, timeout)
|
||||
})
|
||||
}
|
||||
|
||||
async function requestAlgo(appId: number = 10032) {
|
||||
fingerprint = generateFp()
|
||||
return new Promise<void>(async resolve => {
|
||||
let {data}: any = await axios.post('https://cactus.jd.com/request_algo?g_ty=ajax', {
|
||||
"version": "1.0",
|
||||
"fp": fingerprint,
|
||||
"appId": appId,
|
||||
"timestamp": Date.now(),
|
||||
"platform": "web",
|
||||
"expandParams": ""
|
||||
}, {
|
||||
"headers": {
|
||||
'Authority': 'cactus.jd.com',
|
||||
'Pragma': 'no-cache',
|
||||
'Cache-Control': 'no-cache',
|
||||
'Accept': 'application/json',
|
||||
'User-Agent': USER_AGENT,
|
||||
'Content-Type': 'application/json',
|
||||
'Origin': 'https://st.jingxi.com',
|
||||
'Sec-Fetch-Site': 'cross-site',
|
||||
'Sec-Fetch-Mode': 'cors',
|
||||
'Sec-Fetch-Dest': 'empty',
|
||||
'Referer': 'https://st.jingxi.com/',
|
||||
'Accept-Language': 'zh-CN,zh;q=0.9,zh-TW;q=0.8,en;q=0.7'
|
||||
},
|
||||
})
|
||||
if (data['status'] === 200) {
|
||||
token = data.data.result.tk
|
||||
let enCryptMethodJDString = data.data.result.algo
|
||||
if (enCryptMethodJDString) enCryptMethodJD = new Function(`return ${enCryptMethodJDString}`)()
|
||||
} else {
|
||||
console.log(`fp: ${fingerprint}`)
|
||||
console.log('request_algo 签名参数API请求失败:')
|
||||
}
|
||||
resolve()
|
||||
})
|
||||
}
|
||||
|
||||
function generateFp() {
|
||||
let e = "0123456789"
|
||||
let a = 13
|
||||
let i = ''
|
||||
for (; a--;)
|
||||
i += e[Math.random() * e.length | 0]
|
||||
return (i + Date.now()).slice(0, 16)
|
||||
}
|
||||
|
||||
function getJxToken(cookie: string, phoneId: string = '') {
|
||||
function generateStr(input: number) {
|
||||
let src = 'abcdefghijklmnopqrstuvwxyz1234567890'
|
||||
let res = ''
|
||||
for (let i = 0; i < input; i++) {
|
||||
res += src[Math.floor(src.length * Math.random())]
|
||||
}
|
||||
return res
|
||||
}
|
||||
|
||||
if (!phoneId)
|
||||
phoneId = generateStr(40)
|
||||
let timestamp = Date.now().toString()
|
||||
let nickname = cookie.match(/pt_pin=([^;]*)/)![1]
|
||||
let jstoken = Md5.hashStr('' + decodeURIComponent(nickname) + timestamp + phoneId + 'tPOamqCuk9NLgVPAljUyIHcPRmKlVxDy')
|
||||
return {
|
||||
'strPgtimestamp': timestamp,
|
||||
'strPhoneID': phoneId,
|
||||
'strPgUUNum': jstoken
|
||||
}
|
||||
}
|
||||
|
||||
function exceptCookie(filename: string = 'x.ts') {
|
||||
let except: any = []
|
||||
if (existsSync('./utils/exceptCookie.json')) {
|
||||
try {
|
||||
except = JSON.parse(readFileSync('./utils/exceptCookie.json').toString() || '{}')[filename] || []
|
||||
} catch (e) {
|
||||
console.log('./utils/exceptCookie.json JSON格式错误')
|
||||
}
|
||||
}
|
||||
return except
|
||||
}
|
||||
|
||||
function randomString(e: number, word?: number) {
|
||||
e = e || 32
|
||||
let t = word === 26 ? "012345678abcdefghijklmnopqrstuvwxyz" : "0123456789abcdef", a = t.length, n = ""
|
||||
for (let i = 0; i < e; i++)
|
||||
n += t.charAt(Math.floor(Math.random() * a))
|
||||
return n
|
||||
}
|
||||
|
||||
function o2s(arr: object, title: string = '') {
|
||||
title ? console.log(title, JSON.stringify(arr)) : console.log(JSON.stringify(arr))
|
||||
}
|
||||
|
||||
function randomNumString(e: number) {
|
||||
e = e || 32
|
||||
let t = '0123456789', a = t.length, n = ""
|
||||
for (let i = 0; i < e; i++)
|
||||
n += t.charAt(Math.floor(Math.random() * a))
|
||||
return n
|
||||
}
|
||||
|
||||
function randomWord(n: number = 1) {
|
||||
let t = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', a = t.length
|
||||
let rnd: string = ''
|
||||
for (let i = 0; i < n; i++) {
|
||||
rnd += t.charAt(Math.floor(Math.random() * a))
|
||||
}
|
||||
return rnd
|
||||
}
|
||||
|
||||
function obj2str(obj: object) {
|
||||
return JSON.stringify(obj)
|
||||
}
|
||||
|
||||
async function getDevice() {
|
||||
let {data} = await axios.get('https://betahub.cn/api/apple/devices/iPhone', {
|
||||
headers: {
|
||||
'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/97.0.4692.71 Safari/537.36'
|
||||
}
|
||||
})
|
||||
data = data[getRandomNumberByRange(0, 16)]
|
||||
return data.identifier
|
||||
}
|
||||
|
||||
async function getVersion(device: string) {
|
||||
let {data} = await axios.get(`https://betahub.cn/api/apple/firmwares/${device}`, {
|
||||
headers: {
|
||||
'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/97.0.4692.71 Safari/537.36'
|
||||
}
|
||||
})
|
||||
data = data[getRandomNumberByRange(0, data.length)]
|
||||
return data.firmware_info.version
|
||||
}
|
||||
|
||||
async function jdpingou() {
|
||||
let device: string, version: string;
|
||||
device = await getDevice();
|
||||
version = await getVersion(device);
|
||||
return `jdpingou;iPhone;5.19.0;${version};${randomString(40)};network/wifi;model/${device};appBuild/100833;ADID/;supportApplePay/1;hasUPPay/0;pushNoticeIsOpen/0;hasOCPay/0;supportBestPay/0;session/${getRandomNumberByRange(10, 90)};pap/JA2019_3111789;brand/apple;supportJDSHWK/1;Mozilla/5.0 (iPhone; CPU iPhone OS 14_6 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148`
|
||||
}
|
||||
|
||||
function get(url: string, headers?: any): Promise<any> {
|
||||
return new Promise((resolve, reject) => {
|
||||
axios.get(url, {
|
||||
headers: headers
|
||||
}).then(res => {
|
||||
if (typeof res.data === 'string' && res.data.includes('jsonpCBK')) {
|
||||
resolve(JSON.parse(res.data.match(/jsonpCBK.?\(([\w\W]*)\);?/)[1]))
|
||||
} else {
|
||||
resolve(res.data)
|
||||
}
|
||||
}).catch(err => {
|
||||
reject({
|
||||
code: err?.response?.status || -1,
|
||||
msg: err?.response?.statusText || err.message || 'error'
|
||||
})
|
||||
})
|
||||
})
|
||||
}
|
||||
|
||||
function post(url: string, prarms?: string | object, headers?: any): Promise<any> {
|
||||
return new Promise((resolve, reject) => {
|
||||
axios.post(url, prarms, {
|
||||
headers: headers
|
||||
}).then(res => {
|
||||
resolve(res.data)
|
||||
}).catch(err => {
|
||||
reject({
|
||||
code: err?.response?.status || -1,
|
||||
msg: err?.response?.statusText || err.message || 'error'
|
||||
})
|
||||
})
|
||||
})
|
||||
}
|
||||
|
||||
export default USER_AGENT
|
||||
export {
|
||||
TotalBean,
|
||||
getBeanShareCode,
|
||||
getFarmShareCode,
|
||||
requireConfig,
|
||||
wait,
|
||||
getRandomNumberByRange,
|
||||
requestAlgo,
|
||||
getJxToken,
|
||||
randomString,
|
||||
o2s,
|
||||
randomNumString,
|
||||
getShareCodePool,
|
||||
randomWord,
|
||||
obj2str,
|
||||
jdpingou,
|
||||
get,
|
||||
post
|
||||
}
|
||||
@@ -37,20 +37,12 @@ class env {
|
||||
console.log(`🔔${this.name}, 结束!\n`)
|
||||
}
|
||||
notify(array) {
|
||||
let text = [];
|
||||
let type = 0
|
||||
let text = '';
|
||||
for (let i of array) {
|
||||
text.push(`${i.user} -- ${i.msg}`)
|
||||
type = i.type
|
||||
text += `${i.user} -- ${i.msg}\n`
|
||||
}
|
||||
console.log(`\n=============================开始发送提醒消息=============================`)
|
||||
if (type == 1) {
|
||||
for (let i of text) {
|
||||
notify.sendNotify(this.name + "消息提醒", i)
|
||||
}
|
||||
} else {
|
||||
notify.sendNotify(this.name + "消息提醒", text.join('\n'))
|
||||
}
|
||||
notify.sendNotify(this.name + "消息提醒", text)
|
||||
}
|
||||
wait(t) {
|
||||
return new Promise(e => setTimeout(e, t))
|
||||
@@ -131,20 +123,18 @@ class env {
|
||||
loads(str) {
|
||||
return JSON.parse(str)
|
||||
}
|
||||
notice(msg, type = 0) {
|
||||
notice(msg) {
|
||||
this.message.push({
|
||||
'index': this.index,
|
||||
'user': this.user,
|
||||
'msg': msg,
|
||||
type
|
||||
'msg': msg
|
||||
})
|
||||
}
|
||||
notices(msg, user, type = 0) {
|
||||
notices(msg, user, index = '') {
|
||||
this.message.push({
|
||||
'user': user,
|
||||
'msg': msg,
|
||||
// 'index': index,
|
||||
type
|
||||
'index': index
|
||||
})
|
||||
}
|
||||
urlparse(url) {
|
||||
|
||||
@@ -8,9 +8,6 @@ function mainEval($) {
|
||||
}
|
||||
$.sleep=cookies['all'].length * 500
|
||||
taskCookie=cookies['all']
|
||||
if($.config[\`\${$.runfile}_limit\`]){
|
||||
taskCookie = cookies['all'].slice(0,parseInt($.config[\`\${$.runfile}_limit\`]))
|
||||
}
|
||||
jxAlgo = new common.jxAlgo();
|
||||
if ($.readme) {
|
||||
console.log(\`使用说明:\\n\${$.readme}\\n以上内容仅供参考,有需求自行添加\\n\`,)
|
||||
|
||||
73
function/h5st.ts
Normal file
73
function/h5st.ts
Normal file
@@ -0,0 +1,73 @@
|
||||
import axios from "axios"
|
||||
import {format} from "date-fns"
|
||||
|
||||
const CryptoJS = require("crypto-js")
|
||||
|
||||
class H5ST {
|
||||
tk: string;
|
||||
timestamp: string;
|
||||
rd: string;
|
||||
appId: string;
|
||||
fp: string;
|
||||
time: number;
|
||||
ua: string
|
||||
enc: string;
|
||||
|
||||
constructor(appId: string, ua: string, fp: string) {
|
||||
this.appId = appId
|
||||
this.ua = ua
|
||||
this.fp = fp || this.__genFp()
|
||||
}
|
||||
|
||||
__genFp() {
|
||||
let e = "0123456789";
|
||||
let a = 13;
|
||||
let i = '';
|
||||
for (; a--;)
|
||||
i += e[Math.random() * e.length | 0];
|
||||
return (i + Date.now()).slice(0, 16)
|
||||
}
|
||||
|
||||
async __genAlgo() {
|
||||
this.time = Date.now()
|
||||
this.timestamp = format(this.time, "yyyyMMddHHmmssSSS")
|
||||
let {data} = await axios.post(`https://cactus.jd.com/request_algo?g_ty=ajax`, {
|
||||
'version': '3.0',
|
||||
'fp': this.fp,
|
||||
'appId': this.appId.toString(),
|
||||
'timestamp': this.time,
|
||||
'platform': 'web',
|
||||
'expandParams': ''
|
||||
}, {
|
||||
headers: {
|
||||
'Host': 'cactus.jd.com',
|
||||
'accept': 'application/json',
|
||||
'content-type': 'application/json',
|
||||
'user-agent': this.ua,
|
||||
}
|
||||
})
|
||||
this.tk = data.data.result.tk
|
||||
this.rd = data.data.result.algo.match(/rd='(.*)'/)[1]
|
||||
this.enc = data.data.result.algo.match(/algo\.(.*)\(/)[1]
|
||||
}
|
||||
|
||||
__genKey(tk, fp, ts, ai, algo) {
|
||||
let str = `${tk}${fp}${ts}${ai}${this.rd}`;
|
||||
return algo[this.enc](str, tk)
|
||||
}
|
||||
|
||||
__genH5st(body: object) {
|
||||
let y = this.__genKey(this.tk, this.fp, this.timestamp, this.appId, CryptoJS).toString(CryptoJS.enc.Hex)
|
||||
let s = ''
|
||||
for (let i in body) {
|
||||
i === 'body' ? s += `${i}:${CryptoJS.SHA256(body[i]).toString(CryptoJS.enc.Hex)}&` : s += `${i}:${body[i]}&`
|
||||
}
|
||||
s = s.slice(0, -1)
|
||||
s = CryptoJS.HmacSHA256(s, y).toString(CryptoJS.enc.Hex)
|
||||
return encodeURIComponent(`${this.timestamp};${this.fp};${this.appId.toString()};${this.tk};${s};3.0;${this.time.toString()}`)
|
||||
}
|
||||
}
|
||||
|
||||
export {
|
||||
H5ST
|
||||
}
|
||||
9
function/jinli_log.ts
Normal file
9
function/jinli_log.ts
Normal file
@@ -0,0 +1,9 @@
|
||||
let logs = [
|
||||
'"random":"34038984","log":"1649609592095~18RCD4zkS04d41d8cd98f00b204e9800998ecf8427e~1,1~E97F477EB64B001195F05A4D48067CD6C272595D~0doi8po~C~TRpGXBAPbWUeE0ZbWxoIam8ZFF9AXxAPBxQQQkEXDBoDBwYMAw8KBgcAAw4KAgEMABoeE0VQUhoIE0ZBQkxGV0dTFBQQRldUFAIQRVRBV01TRFMXGhpCVVwXDGMGHQIZBhQBHQAZB2UeE1hfFAIDHRBWRRoIEwVQUFpQAFABAAgEVAZTD1sGBwABUw9RCQMHDw1WCQAFFBQQX0IXDBp+WFxAThhKCQRqAAwQHRBBFAIQAAQBDw4CCAcMBAgLBBAZFFJZEwgXVxoeE1RFVBoIExAZFFZEEwgXcVddVl5QFnFcUhwXGhpcUEQXDBoLAwsGBRoeE0FWRBoIagQDARQBBgdoGhpAXhAPbRpTEx4XVxoeE1MXGhpTEx4XVxoeE1MXGhpTE28ZFFFdUBAPFF5UV1RTUExGEx4XV1IQCxBAFBQQUlsXDBpFAhwHGAwQHRBWUGdEEwgXBggQHRBXUhoIE0BUWFxdXA8GAggBCQsNAhoeE19fFAJpAR4FGghvHRBXWldVEwgXVxoeE19GURoIE1MXSw==~04y5u3i"',
|
||||
|
||||
|
||||
]
|
||||
|
||||
export {
|
||||
logs
|
||||
}
|
||||
@@ -3,21 +3,20 @@
|
||||
脚本默认会帮我助力开工位,介意请添加变量HELP_JOYPARK,false为不助力
|
||||
export HELP_JOYPARK=""
|
||||
|
||||
更新地址:https://github.com/Tsukasa007/my_script
|
||||
============Quantumultx===============
|
||||
[task_local]
|
||||
#汪汪乐园每日任务
|
||||
0 0,7,9,17,20 * * * jd_joypark_task.js, tag=汪汪乐园每日任务, img-url=https://raw.githubusercontent.com/tsukasa007/icon/master/jd_joypark_task.png, enabled=true
|
||||
0 1,7,20 * * * jd_joypark_task.js, tag=汪汪乐园每日任务, img-url=https://raw.githubusercontent.com/tsukasa007/icon/master/jd_joypark_task.png, enabled=true
|
||||
|
||||
================Loon==============
|
||||
[Script]
|
||||
cron "0 0,7,9,17,20 * * *" script-path=jd_joypark_task.js,tag=汪汪乐园每日任务
|
||||
cron "0 1,7,20 * * *" script-path=jd_joypark_task.js,tag=汪汪乐园每日任务
|
||||
|
||||
===============Surge=================
|
||||
汪汪乐园每日任务 = type=cron,cronexp="0 0,7,9,17,20 * * *",wake-system=1,timeout=3600,script-path=jd_joypark_task.js
|
||||
汪汪乐园每日任务 = type=cron,cronexp="0 1,7,20 * * *",wake-system=1,timeout=3600,script-path=jd_joypark_task.js
|
||||
|
||||
============小火箭=========
|
||||
汪汪乐园每日任务 = type=cron,script-path=jd_joypark_task.js, cronexpr="0 0,7,9,17,20 * * *", timeout=3600, enable=true
|
||||
汪汪乐园每日任务 = type=cron,script-path=jd_joypark_task.js, cronexpr="0 1,7,20 * * *", timeout=3600, enable=true
|
||||
*/
|
||||
const $ = new Env('汪汪乐园每日任务');
|
||||
const jdCookieNode = $.isNode() ? require('./jdCookie.js') : '';
|
||||
@@ -35,7 +34,9 @@ if ($.isNode()) {
|
||||
}
|
||||
$.invitePinTaskList = []
|
||||
$.invitePin = [
|
||||
""
|
||||
"VxQJC6Sr0QZkcOHwxoTjrw",
|
||||
"oRY9YryofcNg71MZeKSZseKD6P6BJzKv2NBGxfiuJ20",
|
||||
"EDPUVDhR7nUPh3jUGDJ_GyiLt77-wROqWVP2aesRUt8"
|
||||
]
|
||||
const JD_API_HOST = `https://api.m.jd.com/client.action`;
|
||||
message = ""
|
||||
@@ -53,37 +54,10 @@ message = ""
|
||||
$.index = i + 1;
|
||||
$.isLogin = true;
|
||||
$.nickName = '';
|
||||
$.openIndex = 0
|
||||
$.openIndex = 0;
|
||||
$.UA = `jdapp;iPhone;10.1.4;13.1.2;${randomString(40)};network/wifi;model/iPhone8,1;addressid/2308460611;appBuild/167814;jdSupportDarkMode/0;Mozilla/5.0 (iPhone; CPU iPhone OS 13_1_2 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148;supportJDSHWK/1`
|
||||
|
||||
console.log(`\n******开始【京东账号${$.index}】${$.nickName || $.UserName}*********\n`);
|
||||
// if ($.isNode()) {
|
||||
// if (process.env.HELP_JOYPARK && process.env.HELP_JOYPARK == "false") {
|
||||
// } else {
|
||||
// $.kgw_invitePin = ["7zG4VHS99AUEoX1mQTkC9Q"][Math.floor((Math.random() * 1))];
|
||||
// let resp = await getJoyBaseInfo(undefined, 2, $.kgw_invitePin);
|
||||
// if (resp.data && resp.data.helpState && resp.data.helpState === 1) {
|
||||
// $.log("帮【zero205】开工位成功,感谢!\n");
|
||||
// } else if (resp.data && resp.data.helpState && resp.data.helpState === 3) {
|
||||
// $.log("你不是新用户!跳过开工位助力\n");
|
||||
// break
|
||||
// } else if (resp.data && resp.data.helpState && resp.data.helpState === 2) {
|
||||
// $.log(`他的工位已全部开完啦!\n`);
|
||||
// $.openIndex++
|
||||
// } else {
|
||||
// $.log("开工位失败!\n");
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
await getJoyBaseInfo()
|
||||
if ($.joyBaseInfo && $.joyBaseInfo.invitePin) {
|
||||
$.log(`${$.name} - ${$.UserName} 助力码: ${$.joyBaseInfo.invitePin}`);
|
||||
$.invitePinTaskList.push($.joyBaseInfo.invitePin);
|
||||
} else {
|
||||
$.log(`${$.name} - ${$.UserName} 助力码: null`);
|
||||
$.invitePinTaskList.push('');
|
||||
$.isLogin = false
|
||||
$.log("服务端异常,不知道为啥有时候这样,后面再观察一下,手动执行应该又没问题了")
|
||||
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"
|
||||
@@ -165,11 +139,12 @@ message = ""
|
||||
// if (task.taskType === 'SHARE_INVITE') {
|
||||
// $.yq_taskid = task.id
|
||||
// }
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
$.log("\n======汪汪乐园开始内部互助======\n======有剩余助力次数则帮zero205助力======\n")
|
||||
$.log("\n======汪汪乐园开始内部互助======\n")
|
||||
for (let i = 0; i < cookiesArr.length; i++) {
|
||||
cookie = cookiesArr[i];
|
||||
if (cookie) {
|
||||
@@ -220,7 +195,7 @@ message = ""
|
||||
function getTaskList() {
|
||||
//await $.wait(20)
|
||||
return new Promise(resolve => {
|
||||
$.post(taskPostClientActionUrl(`body=%7B%22linkId%22%3A%22LsQNxL7iWDlXUs6cFl-AAg%22%7D&appid=activities_platform`, `apTaskList`), async (err, resp, data) => {
|
||||
$.post(taskPostClientActionUrl(`body={"linkId":"LsQNxL7iWDlXUs6cFl-AAg"}&appid=activities_platform`, `apTaskList`), async (err, resp, data) => {
|
||||
$.log('=== 任务列表 start ===')
|
||||
try {
|
||||
if (err) {
|
||||
@@ -265,9 +240,9 @@ function getJoyBaseInfo(taskId = '', inviteType = '', inviterPin = '') {
|
||||
} catch (e) {
|
||||
$.logErr(e, resp)
|
||||
} finally {
|
||||
$.log(`resolve start`)
|
||||
//$.log(`resolve start`)
|
||||
resolve(data);
|
||||
$.log(`resolve end`)
|
||||
//$.log(`resolve end`)
|
||||
}
|
||||
})
|
||||
})
|
||||
@@ -367,7 +342,7 @@ function taskPostClientActionUrl(body, functionId) {
|
||||
url: `https://api.m.jd.com/client.action?${functionId ? `functionId=${functionId}` : ``}`,
|
||||
body: body,
|
||||
headers: {
|
||||
'User-Agent': 'jdltapp;iPhone;3.5.6;14.6;eac3e15e91fd380664fc7c788e8ab6a07805646d;network/4g;ADID/8F6CAEEA-5BF7-4F7E-86C3-A641C19CA832;hasUPPay/0;pushNoticeIsOpen/0;lang/zh_CN;model/iPhone13,2;addressid/1995295948;hasOCPay/0;appBuild/1070;supportBestPay/0;pv/41.26;apprpd/;ref/JDLTSubMainPageViewController;psq/2;ads/;psn/eac3e15e91fd380664fc7c788e8ab6a07805646d|112;jdv/0|kong|t_500509960_|jingfen|bb9c79e4c4174521873879a27a707da4|1625071927291|1625071930;adk/;app_device/IOS;pap/JA2020_3112531|3.5.6|IOS 14.6;Mozilla/5.0 (iPhone; CPU iPhone OS 14_6 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148;supportJDSHWK/1',
|
||||
'User-Agent': $.UA,
|
||||
'Content-Type': 'application/x-www-form-urlencoded',
|
||||
'Host': 'api.m.jd.com',
|
||||
'Origin': 'https://joypark.jd.com',
|
||||
@@ -376,7 +351,13 @@ function taskPostClientActionUrl(body, functionId) {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function randomString(e) {
|
||||
e = e || 32;
|
||||
let t = "abcdef0123456789", a = t.length, n = "";
|
||||
for (i = 0; i < e; i++)
|
||||
n += t.charAt(Math.floor(Math.random() * a));
|
||||
return n
|
||||
}
|
||||
function jsonParse(str) {
|
||||
if (typeof str == "string") {
|
||||
try {
|
||||
|
||||
@@ -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) => {
|
||||
try {
|
||||
this.decode((pixels) => {
|
||||
this.pixels = pixels;
|
||||
resolve();
|
||||
});
|
||||
} catch (e) {
|
||||
console.info(e)
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
@@ -65,10 +74,14 @@ class PuzzleRecognizer {
|
||||
}
|
||||
|
||||
async run() {
|
||||
try {
|
||||
await this.bg.decodeToPixels();
|
||||
await this.patch.decodeToPixels();
|
||||
|
||||
return this.recognize();
|
||||
} catch (e) {
|
||||
console.info(e)
|
||||
}
|
||||
}
|
||||
|
||||
recognize() {
|
||||
@@ -202,19 +215,19 @@ 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='') {
|
||||
async run(scene) {
|
||||
try {
|
||||
const tryRecognize = async () => {
|
||||
const x = await this.recognize(scene, eid);
|
||||
const x = await this.recognize(scene);
|
||||
|
||||
if (x > 0) {
|
||||
return x;
|
||||
@@ -230,7 +243,6 @@ class JDJRValidator {
|
||||
// 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') {
|
||||
@@ -238,38 +250,39 @@ class JDJRValidator {
|
||||
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{
|
||||
console.count("验证失败");
|
||||
// console.count(JSON.stringify(result));
|
||||
await sleep(300);
|
||||
return await this.run(scene, eid);
|
||||
return await this.run(scene);
|
||||
}
|
||||
} catch (e) {
|
||||
console.info(e)
|
||||
}
|
||||
}
|
||||
|
||||
async recognize(scene, eid) {
|
||||
const data = await JDJRValidator.jsonp('/slide/g.html', {e: eid}, scene);
|
||||
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);
|
||||
// console.log(JSON.stringify(re))
|
||||
const puzzleX = await re.run();
|
||||
|
||||
if (puzzleX > 0) {
|
||||
this.data = {
|
||||
c: data.challenge,
|
||||
w: re.w,
|
||||
e: eid,
|
||||
e: '',
|
||||
s: '',
|
||||
o: '',
|
||||
};
|
||||
this.x = puzzleX;
|
||||
}
|
||||
return puzzleX;
|
||||
} catch (e) {
|
||||
console.info(e)
|
||||
}
|
||||
}
|
||||
|
||||
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) => {
|
||||
try {
|
||||
if (err) {
|
||||
console.error(JSON.stringify(err));
|
||||
console.error('验证请求失败.');
|
||||
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);
|
||||
|
||||
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
|
||||
}
|
||||
|
||||
@@ -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
760
utils/magic.js
Normal 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
99
utils/share_code.js
Normal 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
|
||||
}
|
||||
Reference in New Issue
Block a user