如果是pm2启动,尝试连接已有实例 (#14)

* 如果是pm2启动,尝试连接已有实例

* 尝试连接已有实例增加异常处理
This commit is contained in:
2023-03-09 20:16:20 +08:00 committed by GitHub
parent 5216f6fc0a
commit fadf40e3fc
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
1 changed files with 80 additions and 8 deletions

View File

@ -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 模板参数