51 lines
1.7 KiB
TypeScript
51 lines
1.7 KiB
TypeScript
import axios from "axios";
|
|
import {format} from "date-fns";
|
|
|
|
const CryptoJS = require('crypto-js')
|
|
|
|
let fp: string = '', tk: string = '', genKey: any = null
|
|
|
|
async function requestAlgo(appId: string, USER_AGENT: string = 'jdpingou;') {
|
|
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)
|
|
}
|
|
|
|
fp = generateFp()
|
|
let {data} = await axios.post(`https://cactus.jd.com/request_algo?g_ty=ajax`, `{"version":"3.0","fp":"${fp}","appId":"${appId}","timestamp":${Date.now()},"platform":"web","expandParams":""}`, {
|
|
headers: {
|
|
'Accept': 'application/json',
|
|
'Content-Type': 'application/json',
|
|
"Accept-Encoding": "gzip, deflate, br",
|
|
"Accept-Language": "zh-CN,zh;q=0.9,en;q=0.8",
|
|
'host': 'cactus.jd.com',
|
|
'Referer': 'https://cactus.jd.com',
|
|
'User-Agent': USER_AGENT
|
|
}
|
|
})
|
|
tk = data.data.result.tk;
|
|
genKey = new Function(`return ${data.data.result.algo}`)();
|
|
return {fp, tk, genKey}
|
|
}
|
|
|
|
function geth5st(t: { key: string, value: string } [], appId: string) {
|
|
let a = ''
|
|
t.forEach(({key, value}) => {
|
|
a += `${key}:${value}&`
|
|
})
|
|
a = a.slice(0, -1)
|
|
let time = Date.now()
|
|
let timestamp = format(time, "yyyyMMddHHmmssSSS");
|
|
let hash1 = genKey(tk, fp.toString(), timestamp.toString(), appId.toString(), CryptoJS).toString(CryptoJS.enc.Hex);
|
|
const hash2 = CryptoJS.HmacSHA256(a, hash1).toString();
|
|
return encodeURIComponent(["".concat(timestamp.toString()), "".concat(fp.toString()), "".concat(appId.toString()), "".concat(tk), "".concat(hash2), "3.0", "".concat(time.toString())].join(";"))
|
|
}
|
|
|
|
export {
|
|
requestAlgo,
|
|
geth5st,
|
|
} |