238 lines
13 KiB
TypeScript
238 lines
13 KiB
TypeScript
|
import axios from "axios";
|
||
|
import {format} from 'date-fns';
|
||
|
import * as dotenv from "dotenv";
|
||
|
import {Md5} from "ts-md5";
|
||
|
|
||
|
const CryptoJS = require('crypto-js')
|
||
|
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) {
|
||
|
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} = await axios.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`, {
|
||
|
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} = await axios.post('https://api.m.jd.com/client.action?functionId=initForFarm', `body=${escape(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 ''
|
||
|
}
|
||
|
|
||
|
function requireConfig() {
|
||
|
let cookiesArr: string[] = []
|
||
|
return new Promise(resolve => {
|
||
|
console.log('开始获取配置文件\n')
|
||
|
const jdCookieNode = require('./jdCookie.js');
|
||
|
Object.keys(jdCookieNode).forEach((item) => {
|
||
|
if (jdCookieNode[item]) {
|
||
|
cookiesArr.push(jdCookieNode[item])
|
||
|
}
|
||
|
})
|
||
|
console.log(`共${cookiesArr.length}个京东账号\n`)
|
||
|
resolve(cookiesArr)
|
||
|
})
|
||
|
}
|
||
|
|
||
|
function wait(timeout: number) {
|
||
|
return new Promise(resolve => {
|
||
|
setTimeout(resolve, timeout)
|
||
|
})
|
||
|
}
|
||
|
|
||
|
async function requestAlgo(appId = 10032) {
|
||
|
fingerprint = generateFp();
|
||
|
return new Promise<void>(async resolve => {
|
||
|
let {data} = 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;
|
||
|
console.log('token:', token)
|
||
|
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 getQueryString(url: string, name: string) {
|
||
|
let reg = new RegExp("(^|&)" + name + "=([^&]*)(&|$)", "i");
|
||
|
let r = url.split('?')[1].match(reg);
|
||
|
if (r != null) return unescape(r[2]);
|
||
|
return '';
|
||
|
}
|
||
|
|
||
|
function decrypt(stk: string, url: string, appId: number) {
|
||
|
const timestamp = (format(new Date(), 'yyyyMMddhhmmssSSS'))
|
||
|
let hash1: string;
|
||
|
if (fingerprint && token && enCryptMethodJD) {
|
||
|
hash1 = enCryptMethodJD(token, fingerprint.toString(), timestamp.toString(), appId.toString(), CryptoJS).toString(CryptoJS.enc.Hex);
|
||
|
} else {
|
||
|
const random = '5gkjB6SpmC9s';
|
||
|
token = `tk01wcdf61cb3a8nYUtHcmhSUFFCfddDPRvKvYaMjHkxo6Aj7dhzO+GXGFa9nPXfcgT+mULoF1b1YIS1ghvSlbwhE0Xc`;
|
||
|
fingerprint = 9686767825751161;
|
||
|
const str = `${token}${fingerprint}${timestamp}${appId}${random}`;
|
||
|
hash1 = CryptoJS.SHA512(str, token).toString(CryptoJS.enc.Hex);
|
||
|
}
|
||
|
let st: string = '';
|
||
|
stk.split(',').map((item, index) => {
|
||
|
st += `${item}:${getQueryString(url, item)}${index === stk.split(',').length - 1 ? '' : '&'}`;
|
||
|
})
|
||
|
const hash2 = CryptoJS.HmacSHA256(st, hash1.toString()).toString(CryptoJS.enc.Hex);
|
||
|
return encodeURIComponent(["".concat(timestamp.toString()), "".concat(fingerprint.toString()), "".concat(appId.toString()), "".concat(token), "".concat(hash2)].join(";"))
|
||
|
}
|
||
|
|
||
|
function h5st(url: string, stk: string, params: object, appId: number = 10032) {
|
||
|
for (const [key, val] of Object.entries(params)) {
|
||
|
url += `&${key}=${val}`
|
||
|
}
|
||
|
url += '&h5st=' + decrypt(stk, url, appId)
|
||
|
return url
|
||
|
}
|
||
|
|
||
|
function getJxToken(cookie: 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;
|
||
|
}
|
||
|
|
||
|
let 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
|
||
|
}
|
||
|
}
|
||
|
|
||
|
export default USER_AGENT
|
||
|
export {
|
||
|
TotalBean,
|
||
|
getBeanShareCode,
|
||
|
getFarmShareCode,
|
||
|
requireConfig,
|
||
|
wait,
|
||
|
getRandomNumberByRange,
|
||
|
requestAlgo,
|
||
|
decrypt,
|
||
|
getJxToken,
|
||
|
h5st
|
||
|
}
|