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`)
|
console.log(`🔔${this.name}, 结束!\n`)
|
||||||
}
|
}
|
||||||
notify(array) {
|
notify(array) {
|
||||||
let text = [];
|
let text = '';
|
||||||
let type = 0
|
|
||||||
for (let i of array) {
|
for (let i of array) {
|
||||||
text.push(`${i.user} -- ${i.msg}`)
|
text += `${i.user} -- ${i.msg}\n`
|
||||||
type = i.type
|
|
||||||
}
|
}
|
||||||
console.log(`\n=============================开始发送提醒消息=============================`)
|
console.log(`\n=============================开始发送提醒消息=============================`)
|
||||||
if (type == 1) {
|
notify.sendNotify(this.name + "消息提醒", text)
|
||||||
for (let i of text) {
|
|
||||||
notify.sendNotify(this.name + "消息提醒", i)
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
notify.sendNotify(this.name + "消息提醒", text.join('\n'))
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
wait(t) {
|
wait(t) {
|
||||||
return new Promise(e => setTimeout(e, t))
|
return new Promise(e => setTimeout(e, t))
|
||||||
@@ -131,20 +123,18 @@ class env {
|
|||||||
loads(str) {
|
loads(str) {
|
||||||
return JSON.parse(str)
|
return JSON.parse(str)
|
||||||
}
|
}
|
||||||
notice(msg, type = 0) {
|
notice(msg) {
|
||||||
this.message.push({
|
this.message.push({
|
||||||
'index': this.index,
|
'index': this.index,
|
||||||
'user': this.user,
|
'user': this.user,
|
||||||
'msg': msg,
|
'msg': msg
|
||||||
type
|
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
notices(msg, user, type = 0) {
|
notices(msg, user, index = '') {
|
||||||
this.message.push({
|
this.message.push({
|
||||||
'user': user,
|
'user': user,
|
||||||
'msg': msg,
|
'msg': msg,
|
||||||
// 'index': index,
|
'index': index
|
||||||
type
|
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
urlparse(url) {
|
urlparse(url) {
|
||||||
|
|||||||
@@ -8,9 +8,6 @@ function mainEval($) {
|
|||||||
}
|
}
|
||||||
$.sleep=cookies['all'].length * 500
|
$.sleep=cookies['all'].length * 500
|
||||||
taskCookie=cookies['all']
|
taskCookie=cookies['all']
|
||||||
if($.config[\`\${$.runfile}_limit\`]){
|
|
||||||
taskCookie = cookies['all'].slice(0,parseInt($.config[\`\${$.runfile}_limit\`]))
|
|
||||||
}
|
|
||||||
jxAlgo = new common.jxAlgo();
|
jxAlgo = new common.jxAlgo();
|
||||||
if ($.readme) {
|
if ($.readme) {
|
||||||
console.log(\`使用说明:\\n\${$.readme}\\n以上内容仅供参考,有需求自行添加\\n\`,)
|
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为不助力
|
脚本默认会帮我助力开工位,介意请添加变量HELP_JOYPARK,false为不助力
|
||||||
export HELP_JOYPARK=""
|
export HELP_JOYPARK=""
|
||||||
|
|
||||||
更新地址:https://github.com/Tsukasa007/my_script
|
|
||||||
============Quantumultx===============
|
============Quantumultx===============
|
||||||
[task_local]
|
[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==============
|
================Loon==============
|
||||||
[Script]
|
[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=================
|
===============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 $ = new Env('汪汪乐园每日任务');
|
||||||
const jdCookieNode = $.isNode() ? require('./jdCookie.js') : '';
|
const jdCookieNode = $.isNode() ? require('./jdCookie.js') : '';
|
||||||
@@ -35,7 +34,9 @@ if ($.isNode()) {
|
|||||||
}
|
}
|
||||||
$.invitePinTaskList = []
|
$.invitePinTaskList = []
|
||||||
$.invitePin = [
|
$.invitePin = [
|
||||||
""
|
"VxQJC6Sr0QZkcOHwxoTjrw",
|
||||||
|
"oRY9YryofcNg71MZeKSZseKD6P6BJzKv2NBGxfiuJ20",
|
||||||
|
"EDPUVDhR7nUPh3jUGDJ_GyiLt77-wROqWVP2aesRUt8"
|
||||||
]
|
]
|
||||||
const JD_API_HOST = `https://api.m.jd.com/client.action`;
|
const JD_API_HOST = `https://api.m.jd.com/client.action`;
|
||||||
message = ""
|
message = ""
|
||||||
@@ -53,37 +54,10 @@ message = ""
|
|||||||
$.index = i + 1;
|
$.index = i + 1;
|
||||||
$.isLogin = true;
|
$.isLogin = true;
|
||||||
$.nickName = '';
|
$.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`);
|
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) {
|
if (!$.isLogin) {
|
||||||
$.msg($.name, `【提示】cookie已失效`, `京东账号${$.index} ${$.nickName || $.UserName}\n请重新登录获取\nhttps://bean.m.jd.com/bean/signIndex.action`, {
|
$.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"
|
"open-url": "https://bean.m.jd.com/bean/signIndex.action"
|
||||||
@@ -165,11 +139,12 @@ message = ""
|
|||||||
// if (task.taskType === 'SHARE_INVITE') {
|
// if (task.taskType === 'SHARE_INVITE') {
|
||||||
// $.yq_taskid = task.id
|
// $.yq_taskid = task.id
|
||||||
// }
|
// }
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
$.log("\n======汪汪乐园开始内部互助======\n======有剩余助力次数则帮zero205助力======\n")
|
$.log("\n======汪汪乐园开始内部互助======\n")
|
||||||
for (let i = 0; i < cookiesArr.length; i++) {
|
for (let i = 0; i < cookiesArr.length; i++) {
|
||||||
cookie = cookiesArr[i];
|
cookie = cookiesArr[i];
|
||||||
if (cookie) {
|
if (cookie) {
|
||||||
@@ -220,7 +195,7 @@ message = ""
|
|||||||
function getTaskList() {
|
function getTaskList() {
|
||||||
//await $.wait(20)
|
//await $.wait(20)
|
||||||
return new Promise(resolve => {
|
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 ===')
|
$.log('=== 任务列表 start ===')
|
||||||
try {
|
try {
|
||||||
if (err) {
|
if (err) {
|
||||||
@@ -265,9 +240,9 @@ function getJoyBaseInfo(taskId = '', inviteType = '', inviterPin = '') {
|
|||||||
} catch (e) {
|
} catch (e) {
|
||||||
$.logErr(e, resp)
|
$.logErr(e, resp)
|
||||||
} finally {
|
} finally {
|
||||||
$.log(`resolve start`)
|
//$.log(`resolve start`)
|
||||||
resolve(data);
|
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}` : ``}`,
|
url: `https://api.m.jd.com/client.action?${functionId ? `functionId=${functionId}` : ``}`,
|
||||||
body: body,
|
body: body,
|
||||||
headers: {
|
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',
|
'Content-Type': 'application/x-www-form-urlencoded',
|
||||||
'Host': 'api.m.jd.com',
|
'Host': 'api.m.jd.com',
|
||||||
'Origin': 'https://joypark.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) {
|
function jsonParse(str) {
|
||||||
if (typeof str == "string") {
|
if (typeof str == "string") {
|
||||||
try {
|
try {
|
||||||
|
|||||||
@@ -1,10 +1,15 @@
|
|||||||
|
/*
|
||||||
|
由于 canvas 依赖系统底层需要编译且预编译包在 github releases 上,改用另一个纯 js 解码图片。若想继续使用 canvas 可调用 runWithCanvas 。
|
||||||
|
|
||||||
|
添加 injectToRequest 用以快速修复需验证的请求。eg: $.get=injectToRequest($.get.bind($))
|
||||||
|
*/
|
||||||
const https = require('https');
|
const https = require('https');
|
||||||
|
const http = require('http');
|
||||||
const stream = require('stream');
|
const stream = require('stream');
|
||||||
const zlib = require('zlib');
|
const zlib = require('zlib');
|
||||||
const vm = require('vm');
|
const vm = require('vm');
|
||||||
const PNG = require('png-js');
|
const PNG = require('png-js');
|
||||||
let UA = require('../USER_AGENTS.js').USER_AGENT;
|
const UA = require('../USER_AGENTS.js').USER_AGENT;
|
||||||
const validatorCount = process.env.JDJR_validator_Count ? process.env.JDJR_validator_Count : 100
|
|
||||||
|
|
||||||
|
|
||||||
Math.avg = function average() {
|
Math.avg = function average() {
|
||||||
@@ -28,10 +33,14 @@ class PNGDecoder extends PNG {
|
|||||||
|
|
||||||
decodeToPixels() {
|
decodeToPixels() {
|
||||||
return new Promise((resolve) => {
|
return new Promise((resolve) => {
|
||||||
|
try {
|
||||||
this.decode((pixels) => {
|
this.decode((pixels) => {
|
||||||
this.pixels = pixels;
|
this.pixels = pixels;
|
||||||
resolve();
|
resolve();
|
||||||
});
|
});
|
||||||
|
} catch (e) {
|
||||||
|
console.info(e)
|
||||||
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -65,10 +74,14 @@ class PuzzleRecognizer {
|
|||||||
}
|
}
|
||||||
|
|
||||||
async run() {
|
async run() {
|
||||||
|
try {
|
||||||
await this.bg.decodeToPixels();
|
await this.bg.decodeToPixels();
|
||||||
await this.patch.decodeToPixels();
|
await this.patch.decodeToPixels();
|
||||||
|
|
||||||
return this.recognize();
|
return this.recognize();
|
||||||
|
} catch (e) {
|
||||||
|
console.info(e)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
recognize() {
|
recognize() {
|
||||||
@@ -202,19 +215,19 @@ const DATA = {
|
|||||||
"product": "embed",
|
"product": "embed",
|
||||||
"lang": "zh_CN",
|
"lang": "zh_CN",
|
||||||
};
|
};
|
||||||
const SERVER = 'iv.jd.com';
|
const SERVER = '61.49.99.122';
|
||||||
|
|
||||||
class JDJRValidator {
|
class JDJRValidator {
|
||||||
constructor() {
|
constructor() {
|
||||||
this.data = {};
|
this.data = {};
|
||||||
this.x = 0;
|
this.x = 0;
|
||||||
this.t = Date.now();
|
this.t = Date.now();
|
||||||
this.count = 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
async run(scene = 'cww', eid='') {
|
async run(scene) {
|
||||||
|
try {
|
||||||
const tryRecognize = async () => {
|
const tryRecognize = async () => {
|
||||||
const x = await this.recognize(scene, eid);
|
const x = await this.recognize(scene);
|
||||||
|
|
||||||
if (x > 0) {
|
if (x > 0) {
|
||||||
return x;
|
return x;
|
||||||
@@ -230,7 +243,6 @@ class JDJRValidator {
|
|||||||
// console.log(pos[pos.length-1][2] -Date.now());
|
// console.log(pos[pos.length-1][2] -Date.now());
|
||||||
// await sleep(4500);
|
// await sleep(4500);
|
||||||
await sleep(pos[pos.length - 1][2] - Date.now());
|
await sleep(pos[pos.length - 1][2] - Date.now());
|
||||||
this.count++;
|
|
||||||
const result = await JDJRValidator.jsonp('/slide/s.html', {d, ...this.data}, scene);
|
const result = await JDJRValidator.jsonp('/slide/s.html', {d, ...this.data}, scene);
|
||||||
|
|
||||||
if (result.message === 'success') {
|
if (result.message === 'success') {
|
||||||
@@ -238,38 +250,39 @@ class JDJRValidator {
|
|||||||
console.log('JDJR验证用时: %fs', (Date.now() - this.t) / 1000);
|
console.log('JDJR验证用时: %fs', (Date.now() - this.t) / 1000);
|
||||||
return result;
|
return result;
|
||||||
} else {
|
} else {
|
||||||
console.log(`验证失败: ${this.count}/${validatorCount}`);
|
console.count("验证失败");
|
||||||
// console.log(JSON.stringify(result));
|
// console.count(JSON.stringify(result));
|
||||||
if(this.count >= validatorCount){
|
|
||||||
console.log("JDJR验证次数已达上限,退出验证");
|
|
||||||
return result;
|
|
||||||
}else{
|
|
||||||
await sleep(300);
|
await sleep(300);
|
||||||
return await this.run(scene, eid);
|
return await this.run(scene);
|
||||||
}
|
}
|
||||||
|
} catch (e) {
|
||||||
|
console.info(e)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
async recognize(scene, eid) {
|
async recognize(scene) {
|
||||||
const data = await JDJRValidator.jsonp('/slide/g.html', {e: eid}, scene);
|
try {
|
||||||
|
const data = await JDJRValidator.jsonp('/slide/g.html', {e: ''}, scene);
|
||||||
const {bg, patch, y} = data;
|
const {bg, patch, y} = data;
|
||||||
// const uri = 'data:image/png;base64,';
|
// const uri = 'data:image/png;base64,';
|
||||||
// const re = new PuzzleRecognizer(uri+bg, uri+patch, y);
|
// const re = new PuzzleRecognizer(uri+bg, uri+patch, y);
|
||||||
const re = new PuzzleRecognizer(bg, patch, y);
|
const re = new PuzzleRecognizer(bg, patch, y);
|
||||||
// console.log(JSON.stringify(re))
|
|
||||||
const puzzleX = await re.run();
|
const puzzleX = await re.run();
|
||||||
|
|
||||||
if (puzzleX > 0) {
|
if (puzzleX > 0) {
|
||||||
this.data = {
|
this.data = {
|
||||||
c: data.challenge,
|
c: data.challenge,
|
||||||
w: re.w,
|
w: re.w,
|
||||||
e: eid,
|
e: '',
|
||||||
s: '',
|
s: '',
|
||||||
o: '',
|
o: '',
|
||||||
};
|
};
|
||||||
this.x = puzzleX;
|
this.x = puzzleX;
|
||||||
}
|
}
|
||||||
return puzzleX;
|
return puzzleX;
|
||||||
|
} catch (e) {
|
||||||
|
console.info(e)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
async report(n) {
|
async report(n) {
|
||||||
@@ -286,7 +299,6 @@ class JDJRValidator {
|
|||||||
}
|
}
|
||||||
|
|
||||||
console.log('验证成功: %f\%', (count / n) * 100);
|
console.log('验证成功: %f\%', (count / n) * 100);
|
||||||
console.clear()
|
|
||||||
console.timeEnd('PuzzleRecognizer');
|
console.timeEnd('PuzzleRecognizer');
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -294,20 +306,19 @@ class JDJRValidator {
|
|||||||
return new Promise((resolve, reject) => {
|
return new Promise((resolve, reject) => {
|
||||||
const fnId = `jsonp_${String(Math.random()).replace('.', '')}`;
|
const fnId = `jsonp_${String(Math.random()).replace('.', '')}`;
|
||||||
const extraData = {callback: fnId};
|
const extraData = {callback: fnId};
|
||||||
const query = new URLSearchParams({...DATA,...{"scene": scene}, ...extraData, ...data}).toString();
|
const query = new URLSearchParams({...DATA, ...{"scene": scene}, ...extraData, ...data}).toString();
|
||||||
const url = `https://${SERVER}${api}?${query}`;
|
const url = `http://${SERVER}${api}?${query}`;
|
||||||
const headers = {
|
const headers = {
|
||||||
'Accept': '*/*',
|
'Accept': '*/*',
|
||||||
'Accept-Encoding': 'gzip,deflate,br',
|
'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',
|
'Connection': 'keep-alive',
|
||||||
'Host': "iv.jd.com",
|
'Host': SERVER,
|
||||||
'Proxy-Connection': 'keep-alive',
|
'Proxy-Connection': 'keep-alive',
|
||||||
'Referer': 'https://h5.m.jd.com/',
|
'Referer': 'https://h5.m.jd.com/babelDiy/Zeus/2wuqXrZrhygTQzYA7VufBEpj4amH/index.html',
|
||||||
'User-Agent': UA,
|
'User-Agent': UA,
|
||||||
};
|
};
|
||||||
|
const req = http.get(url, {headers}, (response) => {
|
||||||
const req = https.get(url, {headers}, (response) => {
|
|
||||||
let res = response;
|
let res = response;
|
||||||
if (res.headers['content-encoding'] === 'gzip') {
|
if (res.headers['content-encoding'] === 'gzip') {
|
||||||
const unzipStream = new stream.PassThrough();
|
const unzipStream = new stream.PassThrough();
|
||||||
@@ -395,7 +406,7 @@ function getCoordinate(c) {
|
|||||||
return b.join("")
|
return b.join("")
|
||||||
}
|
}
|
||||||
|
|
||||||
const HZ = 20;
|
const HZ = 5;
|
||||||
|
|
||||||
class MousePosFaker {
|
class MousePosFaker {
|
||||||
constructor(puzzleX) {
|
constructor(puzzleX) {
|
||||||
@@ -500,32 +511,43 @@ class MousePosFaker {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function injectToRequest(fn,scene = 'cww', ua = '') {
|
// new JDJRValidator().run();
|
||||||
if(ua) UA = ua
|
// new JDJRValidator().report(1000);
|
||||||
|
// console.log(getCoordinate(new MousePosFaker(100).run()));
|
||||||
|
|
||||||
|
function injectToRequest2(fn, scene = 'cww') {
|
||||||
return (opts, cb) => {
|
return (opts, cb) => {
|
||||||
fn(opts, async (err, resp, data) => {
|
fn(opts, async (err, resp, data) => {
|
||||||
|
try {
|
||||||
if (err) {
|
if (err) {
|
||||||
console.error(JSON.stringify(err));
|
console.error('验证请求失败.');
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (data.search('验证') > -1) {
|
if (data.search('验证') > -1) {
|
||||||
console.log('JDJR验证中......');
|
console.log('JDJR验证中......');
|
||||||
let arr = opts.url.split("&")
|
const res = await new JDJRValidator().run(scene);
|
||||||
let eid = ''
|
if (res) {
|
||||||
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}`;
|
opts.url += `&validate=${res.validate}`;
|
||||||
|
}
|
||||||
fn(opts, cb);
|
fn(opts, cb);
|
||||||
} else {
|
} else {
|
||||||
cb(err, resp, data);
|
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([
|
await Promise.all([
|
||||||
JingDongBean(stop), //京东京豆
|
JingDongBean(stop), //京东京豆
|
||||||
JingDongStore(stop), //京东超市
|
JingDongStore(stop), //京东超市
|
||||||
JingRongSteel(stop, jrBody), //金融钢镚
|
//JingRongSteel(stop, jrBody), //金融钢镚
|
||||||
JingDongTurn(stop), //京东转盘
|
//JingDongTurn(stop), //京东转盘
|
||||||
JDFlashSale(stop), //京东闪购
|
// JDFlashSale(stop), //京东闪购
|
||||||
JingDongCash(stop), //京东现金红包
|
// JingDongCash(stop), //京东现金红包
|
||||||
JDMagicCube(stop, 2), //京东小魔方
|
// JDMagicCube(stop, 2), //京东小魔方
|
||||||
JingDongSubsidy(stop), //京东金贴
|
//JingDongSubsidy(stop), //京东金贴
|
||||||
JingDongGetCash(stop), //京东领现金
|
JingDongGetCash(stop), //京东领现金
|
||||||
JingDongShake(stop), //京东摇一摇
|
//JingDongShake(stop), //京东摇一摇
|
||||||
JDSecKilling(stop), //京东秒杀
|
//JDSecKilling(stop), //京东秒杀
|
||||||
// JingRongDoll(stop, 'JRDoll', '京东金融-签壹', '4D25A6F482'),
|
// JingRongDoll(stop, 'JRDoll', '京东金融-签壹', '4D25A6F482'),
|
||||||
// JingRongDoll(stop, 'JRThreeDoll', '京东金融-签叁', '69F5EC743C'),
|
// JingRongDoll(stop, 'JRThreeDoll', '京东金融-签叁', '69F5EC743C'),
|
||||||
// JingRongDoll(stop, 'JRFourDoll', '京东金融-签肆', '30C4F86264'),
|
// JingRongDoll(stop, 'JRFourDoll', '京东金融-签肆', '30C4F86264'),
|
||||||
// JingRongDoll(stop, 'JRFiveDoll', '京东金融-签伍', '1D06AA3B0F')
|
// JingRongDoll(stop, 'JRFiveDoll', '京东金融-签伍', '1D06AA3B0F')
|
||||||
]);
|
]);
|
||||||
await Promise.all([
|
await Promise.all([
|
||||||
JDUserSignPre(stop, 'JDUndies', '京东商城-内衣', '4PgpL1xqPSW1sVXCJ3xopDbB1f69'), //京东内衣馆
|
//JDUserSignPre(stop, 'JDUndies', '京东商城-内衣', '4PgpL1xqPSW1sVXCJ3xopDbB1f69'), //京东内衣馆
|
||||||
JDUserSignPre(stop, 'JDCard', '京东商城-卡包', '7e5fRnma6RBATV9wNrGXJwihzcD'), //京东卡包
|
//JDUserSignPre(stop, 'JDCard', '京东商城-卡包', '7e5fRnma6RBATV9wNrGXJwihzcD'), //京东卡包
|
||||||
// JDUserSignPre(stop, 'JDCustomized', '京东商城-定制', '2BJK5RBdvc3hdddZDS1Svd5Esj3R'), //京东定制
|
// JDUserSignPre(stop, 'JDCustomized', '京东商城-定制', '2BJK5RBdvc3hdddZDS1Svd5Esj3R'), //京东定制
|
||||||
JDUserSignPre(stop, 'JDaccompany', '京东商城-陪伴', 'kPM3Xedz1PBiGQjY4ZYGmeVvrts'), //京东陪伴
|
//JDUserSignPre(stop, 'JDaccompany', '京东商城-陪伴', 'kPM3Xedz1PBiGQjY4ZYGmeVvrts'), //京东陪伴
|
||||||
JDUserSignPre(stop, 'JDShoes', '京东商城-鞋靴', '4RXyb1W4Y986LJW8ToqMK14BdTD'), //京东鞋靴
|
//JDUserSignPre(stop, 'JDShoes', '京东商城-鞋靴', '4RXyb1W4Y986LJW8ToqMK14BdTD'), //京东鞋靴
|
||||||
JDUserSignPre(stop, 'JDChild', '京东商城-童装', '3Af6mZNcf5m795T8dtDVfDwWVNhJ'), //京东童装馆
|
//JDUserSignPre(stop, 'JDChild', '京东商城-童装', '3Af6mZNcf5m795T8dtDVfDwWVNhJ'), //京东童装馆
|
||||||
JDUserSignPre(stop, 'JDBaby', '京东商城-母婴', '3BbAVGQPDd6vTyHYjmAutXrKAos6'), //京东母婴馆
|
//JDUserSignPre(stop, 'JDBaby', '京东商城-母婴', '3BbAVGQPDd6vTyHYjmAutXrKAos6'), //京东母婴馆
|
||||||
JDUserSignPre(stop, 'JD3C', '京东商城-数码', '4SWjnZSCTHPYjE5T7j35rxxuMTb6'), //京东数码电器馆
|
//JDUserSignPre(stop, 'JD3C', '京东商城-数码', '4SWjnZSCTHPYjE5T7j35rxxuMTb6'), //京东数码电器馆
|
||||||
JDUserSignPre(stop, 'JDWomen', '京东商城-女装', 'DpSh7ma8JV7QAxSE2gJNro8Q2h9'), //京东女装馆
|
//JDUserSignPre(stop, 'JDWomen', '京东商城-女装', 'DpSh7ma8JV7QAxSE2gJNro8Q2h9'), //京东女装馆
|
||||||
JDUserSignPre(stop, 'JDBook', '京东商城-图书', '3SC6rw5iBg66qrXPGmZMqFDwcyXi'), //京东图书
|
//JDUserSignPre(stop, 'JDBook', '京东商城-图书', '3SC6rw5iBg66qrXPGmZMqFDwcyXi'), //京东图书
|
||||||
// JDUserSignPre(stop, 'ReceiveJD', '京东商城-领豆', 'Ni5PUSK7fzZc4EKangHhqPuprn2'), //京东-领京豆
|
// JDUserSignPre(stop, 'ReceiveJD', '京东商城-领豆', 'Ni5PUSK7fzZc4EKangHhqPuprn2'), //京东-领京豆
|
||||||
JingRongDoll(stop, 'JTDouble', '京东金贴-双签', '1DF13833F7'), //京东金融 金贴双签
|
//JingRongDoll(stop, 'JTDouble', '京东金贴-双签', '1DF13833F7'), //京东金融 金贴双签
|
||||||
// JingRongDoll(stop, 'XJDouble', '金融现金-双签', 'F68B2C3E71', '', '', '', 'xianjin') //京东金融 现金双签
|
// JingRongDoll(stop, 'XJDouble', '金融现金-双签', 'F68B2C3E71', '', '', '', 'xianjin') //京东金融 现金双签
|
||||||
]);
|
]);
|
||||||
await Promise.all([
|
await Promise.all([
|
||||||
JDUserSignPre(stop, 'JDStory', '京东失眠-补贴', 'UcyW9Znv3xeyixW1gofhW2DAoz4'), //失眠补贴
|
//JDUserSignPre(stop, 'JDStory', '京东失眠-补贴', 'UcyW9Znv3xeyixW1gofhW2DAoz4'), //失眠补贴
|
||||||
JDUserSignPre(stop, 'JDPhone', '京东手机-小时', '4Vh5ybVr98nfJgros5GwvXbmTUpg'), //手机小时达
|
//JDUserSignPre(stop, 'JDPhone', '京东手机-小时', '4Vh5ybVr98nfJgros5GwvXbmTUpg'), //手机小时达
|
||||||
JDUserSignPre(stop, 'JDEsports', '京东商城-电竞', 'CHdHQhA5AYDXXQN9FLt3QUAPRsB'), //京东电竞
|
//JDUserSignPre(stop, 'JDEsports', '京东商城-电竞', 'CHdHQhA5AYDXXQN9FLt3QUAPRsB'), //京东电竞
|
||||||
JDUserSignPre(stop, 'JDClothing', '京东商城-服饰', '4RBT3H9jmgYg1k2kBnHF8NAHm7m8'), //京东服饰
|
//JDUserSignPre(stop, 'JDClothing', '京东商城-服饰', '4RBT3H9jmgYg1k2kBnHF8NAHm7m8'), //京东服饰
|
||||||
JDUserSignPre(stop, 'JDSuitcase', '京东商城-箱包', 'ZrH7gGAcEkY2gH8wXqyAPoQgk6t'), //京东箱包馆
|
// JDUserSignPre(stop, 'JDSuitcase', '京东商城-箱包', 'ZrH7gGAcEkY2gH8wXqyAPoQgk6t'), //京东箱包馆
|
||||||
JDUserSignPre(stop, 'JDSchool', '京东商城-校园', '2QUxWHx5BSCNtnBDjtt5gZTq7zdZ'), //京东校园
|
//JDUserSignPre(stop, 'JDSchool', '京东商城-校园', '2QUxWHx5BSCNtnBDjtt5gZTq7zdZ'), //京东校园
|
||||||
JDUserSignPre(stop, 'JDHealth', '京东商城-健康', 'w2oeK5yLdHqHvwef7SMMy4PL8LF'), //京东健康
|
//JDUserSignPre(stop, 'JDHealth', '京东商城-健康', 'w2oeK5yLdHqHvwef7SMMy4PL8LF'), //京东健康
|
||||||
JDUserSignPre(stop, 'JDShand', '京东拍拍-二手', '3S28janPLYmtFxypu37AYAGgivfp'), //京东拍拍二手
|
//JDUserSignPre(stop, 'JDShand', '京东拍拍-二手', '3S28janPLYmtFxypu37AYAGgivfp'), //京东拍拍二手
|
||||||
JDUserSignPre(stop, 'JDClean', '京东商城-清洁', '2Tjm6ay1ZbZ3v7UbriTj6kHy9dn6'), //京东清洁馆
|
// JDUserSignPre(stop, 'JDClean', '京东商城-清洁', '2Tjm6ay1ZbZ3v7UbriTj6kHy9dn6'), //京东清洁馆
|
||||||
JDUserSignPre(stop, 'JDCare', '京东商城-个护', '2tZssTgnQsiUqhmg5ooLSHY9XSeN'), //京东个人护理馆
|
// JDUserSignPre(stop, 'JDCare', '京东商城-个护', '2tZssTgnQsiUqhmg5ooLSHY9XSeN'), //京东个人护理馆
|
||||||
JDUserSignPre(stop, 'JDJiaDian', '京东商城-家电', '3uvPyw1pwHARGgndatCXddLNUxHw'), // 京东小家电
|
// JDUserSignPre(stop, 'JDJiaDian', '京东商城-家电', '3uvPyw1pwHARGgndatCXddLNUxHw'), // 京东小家电
|
||||||
// JDUserSignPre(stop, 'JDJewels', '京东商城-珠宝', 'zHUHpTHNTaztSRfNBFNVZscyFZU'), //京东珠宝馆
|
// JDUserSignPre(stop, 'JDJewels', '京东商城-珠宝', 'zHUHpTHNTaztSRfNBFNVZscyFZU'), //京东珠宝馆
|
||||||
// JDUserSignPre(stop, 'JDMakeup', '京东商城-美妆', '2smCxzLNuam5L14zNJHYu43ovbAP'), //京东美妆馆
|
// JDUserSignPre(stop, 'JDMakeup', '京东商城-美妆', '2smCxzLNuam5L14zNJHYu43ovbAP'), //京东美妆馆
|
||||||
JDUserSignPre(stop, 'JDVege', '京东商城-菜场', 'Wcu2LVCFMkBP3HraRvb7pgSpt64'), //京东菜场
|
// JDUserSignPre(stop, 'JDVege', '京东商城-菜场', 'Wcu2LVCFMkBP3HraRvb7pgSpt64'), //京东菜场
|
||||||
// JDUserSignPre(stop, 'JDLive', '京东智能-生活', 'KcfFqWvhb5hHtaQkS4SD1UU6RcQ') //京东智能生活
|
// JDUserSignPre(stop, 'JDLive', '京东智能-生活', 'KcfFqWvhb5hHtaQkS4SD1UU6RcQ') //京东智能生活
|
||||||
JDUserSignPre(stop, 'JDPlus', '京东商城-PLUS', '3bhgbFe5HZcFCjEZf2jzp3umx4ZR'), //京东PLUS
|
JDUserSignPre(stop, 'JDPlus', '京东商城-PLUS', '3bhgbFe5HZcFCjEZf2jzp3umx4ZR'), //京东PLUS
|
||||||
JDUserSignPre(stop, 'JDStore', '京东超市', 'QPwDgLSops2bcsYqQ57hENGrjgj') //京东超市
|
JDUserSignPre(stop, 'JDStore', '京东超市', 'QPwDgLSops2bcsYqQ57hENGrjgj') //京东超市
|
||||||
@@ -120,36 +120,36 @@ async function all(cookie, jrBody) {
|
|||||||
// await JingRongDoll(Wait(stop), 'JRFiveDoll', '京东金融-签伍', '1D06AA3B0F');
|
// await JingRongDoll(Wait(stop), 'JRFiveDoll', '京东金融-签伍', '1D06AA3B0F');
|
||||||
// await JingRongDoll(Wait(stop), 'JRDoll', '京东金融-签壹', '4D25A6F482');
|
// await JingRongDoll(Wait(stop), 'JRDoll', '京东金融-签壹', '4D25A6F482');
|
||||||
// await JingRongDoll(Wait(stop), 'XJDouble', '金融现金-双签', 'F68B2C3E71', '', '', '', 'xianjin'); //京东金融 现金双签
|
// await JingRongDoll(Wait(stop), 'XJDouble', '金融现金-双签', 'F68B2C3E71', '', '', '', 'xianjin'); //京东金融 现金双签
|
||||||
await JingRongDoll(Wait(stop), 'JTDouble', '京东金贴-双签', '1DF13833F7'); //京东金融 金贴双签
|
// await JingRongDoll(Wait(stop), 'JTDouble', '京东金贴-双签', '1DF13833F7'); //京东金融 金贴双签
|
||||||
await JDUserSignPre(Wait(stop), 'JDStory', '京东失眠-补贴', 'UcyW9Znv3xeyixW1gofhW2DAoz4'); //失眠补贴
|
// await JDUserSignPre(Wait(stop), 'JDStory', '京东失眠-补贴', 'UcyW9Znv3xeyixW1gofhW2DAoz4'); //失眠补贴
|
||||||
await JDUserSignPre(Wait(stop), 'JDPhone', '京东手机-小时', '4Vh5ybVr98nfJgros5GwvXbmTUpg'); //手机小时达
|
// await JDUserSignPre(Wait(stop), 'JDPhone', '京东手机-小时', '4Vh5ybVr98nfJgros5GwvXbmTUpg'); //手机小时达
|
||||||
await JDUserSignPre(Wait(stop), 'JDCard', '京东商城-卡包', '7e5fRnma6RBATV9wNrGXJwihzcD'); //京东卡包
|
// await JDUserSignPre(Wait(stop), 'JDCard', '京东商城-卡包', '7e5fRnma6RBATV9wNrGXJwihzcD'); //京东卡包
|
||||||
await JDUserSignPre(Wait(stop), 'JDUndies', '京东商城-内衣', '4PgpL1xqPSW1sVXCJ3xopDbB1f69'); //京东内衣馆
|
// await JDUserSignPre(Wait(stop), 'JDUndies', '京东商城-内衣', '4PgpL1xqPSW1sVXCJ3xopDbB1f69'); //京东内衣馆
|
||||||
await JDUserSignPre(Wait(stop), 'JDEsports', '京东商城-电竞', 'CHdHQhA5AYDXXQN9FLt3QUAPRsB'); //京东电竞
|
// await JDUserSignPre(Wait(stop), 'JDEsports', '京东商城-电竞', 'CHdHQhA5AYDXXQN9FLt3QUAPRsB'); //京东电竞
|
||||||
// await JDUserSignPre(Wait(stop), 'JDCustomized', '京东商城-定制', '2BJK5RBdvc3hdddZDS1Svd5Esj3R'); //京东定制
|
// await JDUserSignPre(Wait(stop), 'JDCustomized', '京东商城-定制', '2BJK5RBdvc3hdddZDS1Svd5Esj3R'); //京东定制
|
||||||
await JDUserSignPre(Wait(stop), 'JDSuitcase', '京东商城-箱包', 'ZrH7gGAcEkY2gH8wXqyAPoQgk6t'); //京东箱包馆
|
// await JDUserSignPre(Wait(stop), 'JDSuitcase', '京东商城-箱包', 'ZrH7gGAcEkY2gH8wXqyAPoQgk6t'); //京东箱包馆
|
||||||
await JDUserSignPre(Wait(stop), 'JDClothing', '京东商城-服饰', '4RBT3H9jmgYg1k2kBnHF8NAHm7m8'); //京东服饰
|
// await JDUserSignPre(Wait(stop), 'JDClothing', '京东商城-服饰', '4RBT3H9jmgYg1k2kBnHF8NAHm7m8'); //京东服饰
|
||||||
await JDUserSignPre(Wait(stop), 'JDSchool', '京东商城-校园', '2QUxWHx5BSCNtnBDjtt5gZTq7zdZ'); //京东校园
|
// await JDUserSignPre(Wait(stop), 'JDSchool', '京东商城-校园', '2QUxWHx5BSCNtnBDjtt5gZTq7zdZ'); //京东校园
|
||||||
await JDUserSignPre(Wait(stop), 'JDHealth', '京东商城-健康', 'w2oeK5yLdHqHvwef7SMMy4PL8LF'); //京东健康
|
await JDUserSignPre(Wait(stop), 'JDHealth', '京东商城-健康', 'w2oeK5yLdHqHvwef7SMMy4PL8LF'); //京东健康
|
||||||
await JDUserSignPre(Wait(stop), 'JDShoes', '京东商城-鞋靴', '4RXyb1W4Y986LJW8ToqMK14BdTD'); //京东鞋靴
|
// await JDUserSignPre(Wait(stop), 'JDShoes', '京东商城-鞋靴', '4RXyb1W4Y986LJW8ToqMK14BdTD'); //京东鞋靴
|
||||||
await JDUserSignPre(Wait(stop), 'JDChild', '京东商城-童装', '3Af6mZNcf5m795T8dtDVfDwWVNhJ'); //京东童装馆
|
// await JDUserSignPre(Wait(stop), 'JDChild', '京东商城-童装', '3Af6mZNcf5m795T8dtDVfDwWVNhJ'); //京东童装馆
|
||||||
await JDUserSignPre(Wait(stop), 'JDBaby', '京东商城-母婴', '3BbAVGQPDd6vTyHYjmAutXrKAos6'); //京东母婴馆
|
// await JDUserSignPre(Wait(stop), 'JDBaby', '京东商城-母婴', '3BbAVGQPDd6vTyHYjmAutXrKAos6'); //京东母婴馆
|
||||||
await JDUserSignPre(Wait(stop), 'JD3C', '京东商城-数码', '4SWjnZSCTHPYjE5T7j35rxxuMTb6'); //京东数码电器馆
|
// await JDUserSignPre(Wait(stop), 'JD3C', '京东商城-数码', '4SWjnZSCTHPYjE5T7j35rxxuMTb6'); //京东数码电器馆
|
||||||
await JDUserSignPre(Wait(stop), 'JDWomen', '京东商城-女装', 'DpSh7ma8JV7QAxSE2gJNro8Q2h9'); //京东女装馆
|
// await JDUserSignPre(Wait(stop), 'JDWomen', '京东商城-女装', 'DpSh7ma8JV7QAxSE2gJNro8Q2h9'); //京东女装馆
|
||||||
await JDUserSignPre(Wait(stop), 'JDBook', '京东商城-图书', '3SC6rw5iBg66qrXPGmZMqFDwcyXi'); //京东图书
|
// await JDUserSignPre(Wait(stop), 'JDBook', '京东商城-图书', '3SC6rw5iBg66qrXPGmZMqFDwcyXi'); //京东图书
|
||||||
await JDUserSignPre(Wait(stop), 'JDShand', '京东拍拍-二手', '3S28janPLYmtFxypu37AYAGgivfp'); //京东拍拍二手
|
// await JDUserSignPre(Wait(stop), 'JDShand', '京东拍拍-二手', '3S28janPLYmtFxypu37AYAGgivfp'); //京东拍拍二手
|
||||||
// await JDUserSignPre(Wait(stop), 'JDMakeup', '京东商城-美妆', '2smCxzLNuam5L14zNJHYu43ovbAP'); //京东美妆馆
|
// 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), 'JDPlus', '京东商城-PLUS', '3bhgbFe5HZcFCjEZf2jzp3umx4ZR'); //京东PLUS
|
||||||
await JDUserSignPre(Wait(stop), 'JDStore', '京东超市', 'QPwDgLSops2bcsYqQ57hENGrjgj'); //京东超市
|
// await JDUserSignPre(Wait(stop), 'JDStore', '京东超市', 'QPwDgLSops2bcsYqQ57hENGrjgj'); //京东超市
|
||||||
await JDUserSignPre(Wait(stop), 'JDaccompany', '京东商城-陪伴', 'kPM3Xedz1PBiGQjY4ZYGmeVvrts'); //京东陪伴
|
// await JDUserSignPre(Wait(stop), 'JDaccompany', '京东商城-陪伴', 'kPM3Xedz1PBiGQjY4ZYGmeVvrts'); //京东陪伴
|
||||||
// await JDUserSignPre(Wait(stop), 'JDLive', '京东智能-生活', 'KcfFqWvhb5hHtaQkS4SD1UU6RcQ'); //京东智能生活
|
// await JDUserSignPre(Wait(stop), 'JDLive', '京东智能-生活', 'KcfFqWvhb5hHtaQkS4SD1UU6RcQ'); //京东智能生活
|
||||||
await JDUserSignPre(Wait(stop), 'JDClean', '京东商城-清洁', '2Tjm6ay1ZbZ3v7UbriTj6kHy9dn6'); //京东清洁馆
|
// await JDUserSignPre(Wait(stop), 'JDClean', '京东商城-清洁', '2Tjm6ay1ZbZ3v7UbriTj6kHy9dn6'); //京东清洁馆
|
||||||
await JDUserSignPre(Wait(stop), 'JDCare', '京东商城-个护', '2tZssTgnQsiUqhmg5ooLSHY9XSeN'); //京东个人护理馆
|
// await JDUserSignPre(Wait(stop), 'JDCare', '京东商城-个护', '2tZssTgnQsiUqhmg5ooLSHY9XSeN'); //京东个人护理馆
|
||||||
await JDUserSignPre(Wait(stop), 'JDJiaDian', '京东商城-家电', '3uvPyw1pwHARGgndatCXddLNUxHw'); // 京东小家电馆
|
// await JDUserSignPre(Wait(stop), 'JDJiaDian', '京东商城-家电', '3uvPyw1pwHARGgndatCXddLNUxHw'); // 京东小家电馆
|
||||||
// await JDUserSignPre(Wait(stop), 'ReceiveJD', '京东商城-领豆', 'Ni5PUSK7fzZc4EKangHhqPuprn2'); //京东-领京豆
|
// await JDUserSignPre(Wait(stop), 'ReceiveJD', '京东商城-领豆', 'Ni5PUSK7fzZc4EKangHhqPuprn2'); //京东-领京豆
|
||||||
// await JDUserSignPre(Wait(stop), 'JDJewels', '京东商城-珠宝', 'zHUHpTHNTaztSRfNBFNVZscyFZU'); //京东珠宝馆
|
// await JDUserSignPre(Wait(stop), 'JDJewels', '京东商城-珠宝', 'zHUHpTHNTaztSRfNBFNVZscyFZU'); //京东珠宝馆
|
||||||
await JingRongDoll(Wait(stop), 'JDDouble', '金融京豆-双签', 'F68B2C3E71', '', '', '', 'jingdou'); //京东金融 京豆双签
|
//await JingRongDoll(Wait(stop), 'JDDouble', '金融京豆-双签', 'F68B2C3E71', '', '', '', 'jingdou'); //京东金融 京豆双签
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
await Promise.all([
|
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