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