From 897d66c48090e69eef7204249b2830abfe1cd899 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=F0=9F=8C=8C?= Date: Wed, 6 Sep 2023 12:31:45 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96=20puppeteer?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- renderers/puppeteer/lib/puppeteer.js | 79 +++++++++++----------------- 1 file changed, 32 insertions(+), 47 deletions(-) diff --git a/renderers/puppeteer/lib/puppeteer.js b/renderers/puppeteer/lib/puppeteer.js index d8c8236..8101cf0 100644 --- a/renderers/puppeteer/lib/puppeteer.js +++ b/renderers/puppeteer/lib/puppeteer.js @@ -14,7 +14,7 @@ const _path = process.cwd() let mac = '' export default class PuppeteerRenderer { - constructor (config) { + constructor(config) { this.browser = false this.lock = false this.shoting = [] @@ -23,7 +23,7 @@ export default class PuppeteerRenderer { /** 截图次数 */ this.renderNum = 0 this.config = { - headless: Data.def(config.headless, true), + headless: Data.def(config.headless, "new"), args: Data.def(config.args, [ '--disable-gpu', '--disable-setuid-sandbox', @@ -45,7 +45,7 @@ export default class PuppeteerRenderer { this.createDir('./temp/html') } - createDir (dir) { + createDir(dir) { if (!fs.existsSync(dir)) { let dirs = dir.split('/') for (let idx = 1; idx <= dirs.length; idx++) { @@ -60,12 +60,12 @@ export default class PuppeteerRenderer { /** * 初始化chromium */ - async browserInit () { + async browserInit() { if (this.browser) return this.browser if (this.lock) return false this.lock = true - logger.mark('puppeteer Chromium 启动中...') + logger.info('puppeteer Chromium 启动中...') let connectFlag = false try { @@ -77,7 +77,7 @@ export default class PuppeteerRenderer { // 是否有browser实例 const browserUrl = (await redis.get(this.browserMacKey)) || this.config.wsEndpoint if (browserUrl) { - logger.mark(`puppeteer Chromium from ${browserUrl}`) + logger.info(`puppeteer Chromium from ${browserUrl}`) const browserWSEndpoint = await puppeteer.connect({ browserWSEndpoint: browserUrl }).catch((err) => { logger.error('puppeteer Chromium 缓存的实例已关闭') redis.del(this.browserMacKey) @@ -91,7 +91,7 @@ export default class PuppeteerRenderer { } } } catch (e) { - logger.mark('puppeteer Chromium 不存在已有实例') + logger.info('puppeteer Chromium 不存在已有实例') } if (!this.browser || !connectFlag) { @@ -103,12 +103,12 @@ export default class PuppeteerRenderer { } else { logger.error(err.toString()) if (errMsg.includes('Could not find Chromium')) { - logger.error('没有正确安装Chromium,可以尝试执行安装命令:node ./node_modules/puppeteer/install.js') - } else if (errMsg.includes('libatk-bridge')) { - logger.error('没有正确安装Chromium,可尝试执行 sudo yum install -y chromium') + logger.error('没有正确安装 Chromium,可以尝试执行安装命令:node node_modules/puppeteer/install.js') + } else if (errMsg.includes('cannot open shared object file')) { + logger.error('没有正确安装 Chromium 运行库') } } - console.log(err, trace) + logger.error(err, trace) }) } @@ -119,20 +119,20 @@ export default class PuppeteerRenderer { return false } if (connectFlag) { - logger.mark('puppeteer Chromium 已连接启动的实例') + logger.info('puppeteer Chromium 已连接启动的实例') } else { - console.log('chromium', this.browser.wsEndpoint()) + logger.info(`[Chromium] ${this.browser.wsEndpoint()}`) if (process.env.pm_id && this.browserMacKey) { //缓存一下实例30天 const expireTime = 60 * 60 * 24 * 30 await redis.set(this.browserMacKey, this.browser.wsEndpoint(), { EX: expireTime }) } - logger.mark('puppeteer Chromium 启动成功') + logger.info('puppeteer Chromium 启动成功') } /** 监听Chromium实例是否断开 */ this.browser.on('disconnected', (e) => { - logger.error('Chromium实例关闭或崩溃!') + logger.error('Chromium 实例关闭或崩溃!') this.browser = false }) @@ -140,29 +140,15 @@ export default class PuppeteerRenderer { } // 获取Mac地址 - async getMac () { - // 获取Mac地址 - let mac = '00:00:00:00:00:00' + getMac() { + const mac = '00:00:00:00:00:00' try { const network = os.networkInterfaces() - let osMac - // 判断系统 - if (os.platform() === 'win32') { - // windows下获取mac地址 - let osMacList = Object.keys(network).map(key => network[key]).flat() - osMacList = osMacList.filter(item => item.family === 'IPv4' && item.mac !== mac) - osMac = osMacList[0].mac - } else if (os.platform() === 'linux') { - // linux下获取mac地址 - osMac = network.enp6s18.filter(item => item.family === 'IPv4' && item.mac !== mac)[0].mac - } - if (osMac) { - mac = String(osMac) - } - } catch (e) { - console.log('获取Mac地址失败', e.toString()) - } - mac = mac.replace(/:/g, '') + for (const a in network) + for (const i of network[a]) + if (i.mac && i.mac != mac) + return i.mac + } catch (e) {} return mac } @@ -180,7 +166,7 @@ export default class PuppeteerRenderer { * @param data.pageGotoParams 页面goto时的参数 * @return img/[]img 不做segment包裹 */ - async screenshot (name, data = {}) { + async screenshot(name, data = {}) { if (!await this.browserInit()) { return false } @@ -225,7 +211,7 @@ export default class PuppeteerRenderer { if (!data.multiPage) { buff = await body.screenshot(randData) /** 计算图片大小 */ - const kb = (buff.length / 1024).toFixed(2) + 'kb' + const kb = (buff.length / 1024).toFixed(2) + 'KB' logger.mark(`[图片生成][${name}][${this.renderNum}次] ${kb} ${logger.green(`${Date.now() - start}ms`)}`) this.renderNum++ ret.push(buff) @@ -256,7 +242,7 @@ export default class PuppeteerRenderer { this.renderNum++ /** 计算图片大小 */ - const kb = (buff.length / 1024).toFixed(2) + 'kb' + const kb = (buff.length / 1024).toFixed(2) + 'KB' logger.mark(`[图片生成][${name}][${i}/${num}] ${kb}`) ret.push(buff) } @@ -267,7 +253,7 @@ export default class PuppeteerRenderer { page.close().catch((err) => logger.error(err)) } catch (error) { - logger.error(`图片生成失败:${name}:${error}`) + logger.error(`[图片生成][${name}] 图片生成失败:${error}`) /** 关闭浏览器 */ if (this.browser) { await this.browser.close().catch((err) => logger.error(err)) @@ -280,7 +266,7 @@ export default class PuppeteerRenderer { this.shoting.pop() if (ret.length === 0 || !ret[0]) { - logger.error(`图片生成为空:${name}`) + logger.error(`[图片生成][${name}] 图片生成为空`) return false } @@ -290,7 +276,7 @@ export default class PuppeteerRenderer { } /** 模板 */ - dealTpl (name, data) { + dealTpl(name, data) { let { tplFile, saveId = name } = data let savePath = `./temp/html/${name}/${saveId}.html` @@ -322,7 +308,7 @@ export default class PuppeteerRenderer { } /** 监听配置文件 */ - watch (tplFile) { + watch(tplFile) { if (this.watcher[tplFile]) return const watcher = chokidar.watch(tplFile) @@ -335,7 +321,7 @@ export default class PuppeteerRenderer { } /** 重启 */ - restart () { + restart() { /** 截图超过重启数时,自动关闭重启浏览器,避免生成速度越来越慢 */ if (this.renderNum % this.restartNum === 0) { if (this.shoting.length <= 0) { @@ -344,10 +330,9 @@ export default class PuppeteerRenderer { await this.browser.close().catch((err) => logger.error(err)) } this.browser = false - logger.mark('puppeteer 关闭重启...') + logger.info('puppeteer Chromium 关闭重启...') }, 100) } } } -} - +} \ No newline at end of file