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 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