109 lines
3.1 KiB
Go
109 lines
3.1 KiB
Go
package http
|
|
|
|
import (
|
|
"runtime"
|
|
"sync"
|
|
|
|
"apigo.cc/gojs"
|
|
"apigo.cc/gojs/goja"
|
|
"github.com/go-rod/rod"
|
|
"github.com/go-rod/rod/lib/launcher"
|
|
"github.com/go-rod/rod/lib/launcher/flags"
|
|
"github.com/ssgo/u"
|
|
)
|
|
|
|
type Chrome struct {
|
|
id string
|
|
chromeURL string
|
|
chromePath string
|
|
launcher *launcher.Launcher
|
|
browser *rod.Browser
|
|
}
|
|
|
|
var chromes = map[string]*Chrome{}
|
|
var chromesLock sync.Mutex
|
|
|
|
func (ch *Chrome) Close(vm *goja.Runtime) {
|
|
logger := gojs.GetLogger(vm)
|
|
if ch.browser != nil {
|
|
ver, _ := ch.browser.Version()
|
|
logger.Info("关闭Chrome浏览器", "id", ch.id, "browser", ver.Product, "userAgent", ver.UserAgent, "chromeURL", ch.chromeURL, "chromePath", ch.chromePath)
|
|
ch.browser.Close()
|
|
ch.browser = nil
|
|
}
|
|
if ch.launcher != nil {
|
|
ch.launcher.Cleanup()
|
|
ch.launcher = nil
|
|
}
|
|
|
|
chromesLock.Lock()
|
|
delete(chromes, ch.id)
|
|
chromesLock.Unlock()
|
|
}
|
|
|
|
func CloseAllChrome(vm *goja.Runtime) {
|
|
n := len(chromes)
|
|
if n > 0 {
|
|
for _, ch := range chromes {
|
|
ch.Close(vm)
|
|
}
|
|
logger := gojs.GetLogger(vm)
|
|
logger.Info("关闭所有未主动关闭的Chrome浏览器", "count", n)
|
|
}
|
|
}
|
|
|
|
func StartChrome(showWindow *bool, vm *goja.Runtime) (*Chrome, error) {
|
|
logger := gojs.GetLogger(vm)
|
|
ch := &Chrome{}
|
|
ch.id = u.UniqueId()
|
|
ch.browser = rod.New()
|
|
ch.chromeURL = conf.ChromeURL
|
|
if conf.ChromeURL == "" {
|
|
// 使用本地Chrome
|
|
ch.launcher = launcher.New()
|
|
if localBrowserPath, hasLocalBrowser := launcher.LookPath(); hasLocalBrowser {
|
|
ch.launcher.Bin(localBrowserPath)
|
|
ch.chromePath = localBrowserPath
|
|
}
|
|
// "--headless=new", "--no-sandbox", "--disable-dev-shm-usage", "--hide-scrollbars", "--font-render-hinting=none", "--disable-blink-features=AutomationControlled", "--disable-infobars", "--lang=zh-CN,zh", "--disable-extensions", "--disable-gpu", "--use-gl=swiftshader", "--ignore-gpu-blocklist", "--use-angle=swiftshader", "--disable-features=Translate"
|
|
ch.launcher.Headless(!u.Bool(showWindow)).Set("disable-dev-shm-usage").Set("single-process").Set("disable-blink-features", "AutomationControlled")
|
|
ch.launcher.Set("user-agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36 Edg/125.0.0.0")
|
|
switch runtime.GOOS {
|
|
case "linux":
|
|
ch.launcher.Set("disable-setuid-sandbox")
|
|
case "windows":
|
|
ch.launcher.Set("disable-features=RendererCodeIntegrity")
|
|
}
|
|
for _, opt := range conf.ChromeOption {
|
|
a := u.SplitTrimN(opt, "=", 2)
|
|
if len(a) == 2 {
|
|
ch.launcher.Set(flags.Flag(a[0]), a[1])
|
|
} else {
|
|
ch.launcher.Set(flags.Flag(opt))
|
|
}
|
|
}
|
|
if localChromeURL, err := ch.launcher.Launch(); err != nil {
|
|
ch.Close(vm)
|
|
return nil, gojs.Err(err)
|
|
} else {
|
|
ch.chromeURL = localChromeURL
|
|
if ch.chromePath == "" {
|
|
ch.chromePath = ch.launcher.Get(flags.Bin)
|
|
}
|
|
}
|
|
}
|
|
|
|
ch.browser.ControlURL(ch.chromeURL)
|
|
if err := ch.browser.Connect(); err != nil {
|
|
return nil, gojs.Err(err)
|
|
}
|
|
ver, _ := ch.browser.Version()
|
|
logger.Info("启动Chrome浏览器", "id", ch.id, "browser", ver.Product, "userAgent", ver.UserAgent, "chromeURL", ch.chromeURL, "chromePath", ch.chromePath)
|
|
|
|
chromesLock.Lock()
|
|
chromes[ch.id] = ch
|
|
chromesLock.Unlock()
|
|
return ch, nil
|
|
|
|
}
|