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.
 
 

64 lines
2.2 KiB

let fs = require('node:fs');
const path = require("node:path");
class JsUtil {
// 加载 js 文本
static async loadJs(document, areaName, cookie) {
let js = '';
// 加载 页面上的js
const allScript = document.querySelectorAll('script[r="m"]');
for (let i = 0; i < allScript.length; i++) {
const script = allScript[i];
let attr = script.textContent;
if (attr) {
js += attr
} else {
//获取script @src 属性
let jsSrc = script.src;
let url = new URL(jsSrc);
let fileName = areaName + url.pathname.replaceAll('/', '_');
let filePath = path.resolve(__dirname, `../public/static/js/`);
let existDir = fs.existsSync(filePath);
if (!existDir) {
fs.mkdirSync(filePath, {recursive: true});
}
let file = path.resolve(filePath, fileName);
let existFile = fs.existsSync(file);
let jsText;
if (existFile) {
let buffer = fs.readFileSync(file);
jsText = buffer.toString('utf8')
} else {
// 文件下载
jsText = await this.downloadJs(jsSrc, filePath, fileName, cookie)
}
js += jsText
}
js += ";\n"
}
return js;
}
static async downloadJs(downloadUrl, filePath, fileName) {
let url = new URL(downloadUrl);
const response = await fetch(url);
if (!response.ok) {
throw new Error(`HTTP error! Status: ${response.status}`);
}
const arrayBuffer = await response.arrayBuffer();
const buffer = Buffer.from(arrayBuffer);
let file = path.resolve(filePath, fileName);
fs.writeFile(file, buffer, {encoding: 'utf8'}, (err) => {
if (err) {
console.error(`文件${file}写入失败 ---> ${err}`)
} else {
console.info(`文件${file}写入成功`)
}
})
return buffer.toString('utf8')
}
}
module.exports = JsUtil