You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
85 lines
2.8 KiB
85 lines
2.8 KiB
const CryptoJS = require('crypto-js'); |
|
const {jsdomFromText, browser} = require("sdenv"); |
|
const {Script} = require("node:vm"); |
|
const fs = require("node:fs"); |
|
const path = require("node:path"); |
|
|
|
const FpCrypt = require("./static/fp/fp-crypt"); |
|
|
|
class FpService { |
|
js = fs.readFileSync(path.resolve(__dirname, './static/fp/chunk-npjg4qgmmrfrjl3r.js'), 'utf8').toString(); |
|
|
|
/** |
|
* |
|
* @param url |
|
* @param param |
|
* @param html |
|
* @param loginCookieStr |
|
* @param publicKey |
|
* @returns {Promise<*>} |
|
*/ |
|
async get_los(url, param, html, loginCookieStr, publicKey) { |
|
let baseUrl = new URL(url).origin; |
|
let urlPath = url.replace(baseUrl, ""); |
|
let headers = {}; |
|
|
|
console.time('los生成时长') |
|
const [jsDom, cookieJar] = jsdomFromText({ |
|
url: `${baseUrl}/invoice-query/invoice-query`, |
|
referrer: baseUrl, |
|
userAgent: 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/127.0.0.0 Safari/537.36', |
|
contentType: "text/html", |
|
runScripts: "outside-only", // runScripts: 'dangerously'/'outside-only' |
|
}) |
|
// 加载dom |
|
let dom = await jsDom(html); |
|
const window = dom.window |
|
|
|
// 设置 cookie |
|
if (loginCookieStr != null && loginCookieStr != "") { |
|
for (let cookie of loginCookieStr.trim().split("; ")) { |
|
cookieJar.setCookieSync(cookie, baseUrl); |
|
} |
|
} |
|
|
|
|
|
browser(window, 'chrome'); |
|
// 加载js |
|
let script = new Script(this.js); |
|
let internalVMContext = dom.getInternalVMContext(); |
|
// 执行 js |
|
script.runInContext(internalVMContext, {timeout: 1000}); |
|
|
|
if (window.$dunm.$byno) { |
|
window.$dunm.$byno(); |
|
} |
|
|
|
let fpCrypt = new FpCrypt(loginCookieStr, publicKey); |
|
|
|
// 处理 Param |
|
let handleParam = fpCrypt.handleParam(param, urlPath); |
|
console.log(`处理 Param 结果 ${JSON.stringify(handleParam)}`) |
|
var enParam = "" |
|
if (handleParam["enVal"]) { |
|
enParam = JSON.stringify({'Jmbw': handleParam["enVal"]}); |
|
headers['security-mes-key'] = handleParam["enMesKey"] |
|
} |
|
// 处理 xhr 后缀 |
|
let handleSuffix = fpCrypt.handleSuffix(urlPath); |
|
console.log(`处理 xhr 后缀 ${JSON.stringify(handleSuffix)}`) |
|
|
|
let los = window[window["_d_ts"]](handleSuffix, enParam); |
|
headers['lzkqow23819'] = los.hd |
|
los["headers"] = headers['security-mes-key'] |
|
los["cookies"] = cookieJar.getCookieStringSync(baseUrl); |
|
|
|
console.log('js执行完成,返回结果 ', los) |
|
// 关闭 |
|
dom.window.close() |
|
console.timeEnd('los生成时长') |
|
return los |
|
} |
|
|
|
} |
|
|
|
module.exports = FpService |