From fadf40e3fc0941be2951438a8a2fb2053d8dc8c6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=95=85?= <45375162+story-x@users.noreply.github.com> Date: Thu, 9 Mar 2023 20:16:20 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A6=82=E6=9E=9C=E6=98=AFpm2=E5=90=AF?= =?UTF-8?q?=E5=8A=A8=EF=BC=8C=E5=B0=9D=E8=AF=95=E8=BF=9E=E6=8E=A5=E5=B7=B2?= =?UTF-8?q?=E6=9C=89=E5=AE=9E=E4=BE=8B=20(#14)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * 如果是pm2启动,尝试连接已有实例 * 尝试连接已有实例增加异常处理 --- lib/puppeteer/puppeteer.js | 88 ++++++++++++++++++++++++++++++++++---- 1 file changed, 80 insertions(+), 8 deletions(-) diff --git a/lib/puppeteer/puppeteer.js b/lib/puppeteer/puppeteer.js index a7eb92d..fe417f5 100644 --- a/lib/puppeteer/puppeteer.js +++ b/lib/puppeteer/puppeteer.js @@ -4,11 +4,15 @@ import lodash from 'lodash' import { segment } from 'icqq' import chokidar from 'chokidar' import cfg from '../config/config.js' +import os from 'os' const _path = process.cwd() let puppeteer = {} +// mac地址 +let mac ='' + class Puppeteer { constructor () { this.browser = false @@ -72,13 +76,45 @@ class Puppeteer { logger.mark('puppeteer Chromium 启动中...') - /** 初始化puppeteer */ - this.browser = await puppeteer.launch(this.config).catch((err) => { - logger.error(err.toString()) - if (String(err).includes('correct Chromium')) { - logger.error('没有正确安装Chromium,可以尝试执行安装命令:node ./node_modules/puppeteer/install.js') + let connectFlag = false + try { + //如果是pm2启动,尝试连接已有实例 + if (process.env.pm_id) { + //获取Mac地址 + if (!mac){ + mac = await this.getMac() + this.browserMacKey = `Yz:chromium:browserWSEndpoint:${mac}` + } + //是否有browser实例 + const browserUrl = await redis.get(this.browserMacKey) + if (browserUrl){ + const browserWSEndpoint = await puppeteer.connect({browserWSEndpoint: browserUrl}).catch((err) => { + logger.error("puppeteer Chromium 缓存的实例已关闭") + redis.del(this.browserMacKey) + }) + //如果有实例,直接使用 + if (browserWSEndpoint) { + this.browser = browserWSEndpoint + if (this.browser) { + connectFlag = true + } + } + } } - }) + }catch (e) { + logger.error("puppeteer Chromium 尝试连接已有实例失败") + } + + + if (!this.browser||!connectFlag){ + //如果没有实例,初始化puppeteer + this.browser = await puppeteer.launch(this.config).catch((err) => { + logger.error(err.toString()) + if (String(err).includes('correct Chromium')) { + logger.error('没有正确安装Chromium,可以尝试执行安装命令:node ./node_modules/puppeteer/install.js') + } + }) + } this.lock = false @@ -86,8 +122,17 @@ class Puppeteer { logger.error('puppeteer Chromium 启动失败') return false } - - logger.mark('puppeteer Chromium 启动成功') + if (connectFlag){ + logger.mark('puppeteer Chromium 已连接启动的实例') + }else { + console.log("chromium",this.browser.wsEndpoint()) + if (this.browserMacKey) { + //缓存一下实例30天 + const expireTime = 60 * 60 * 24 * 30 + await redis.set(this.browserMacKey, this.browser.wsEndpoint(), { EX: expireTime }) + } + logger.mark('puppeteer Chromium 启动成功') + } /** 监听Chromium实例是否断开 */ this.browser.on('disconnected', (e) => { @@ -98,6 +143,33 @@ class Puppeteer { return this.browser } + //获取Mac地址 + async getMac () { + //获取Mac地址 + let 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.eth0.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, '') + return mac + } + /** * `chromium` 截图 * @param data 模板参数