package libs import ( "log" "path/filepath" "strconv" "github.com/go-rod/rod" "github.com/go-rod/rod/lib/launcher" "github.com/go-rod/rod/lib/proto" "github.com/go-rod/stealth" ) type Chrome struct{} func (c *Chrome) Create(accountId int, params *Fingerprint) (*rod.Browser, string, *rod.Page) { var accountIdStr = strconv.Itoa(accountId) userDataDir := "user-data/" + accountIdStr absPath, _ := filepath.Abs(userDataDir) log.Printf("用户数据目录: %s", absPath) path, _ := launcher.LookPath() // 获取当前系统的浏览器目录 // 判断是否传递代理 // var proxyHandle utils.ProxyHandle // protocol, username, password, ip, port, errProxy := proxyHandle.ParseProxy(params.Proxy) l := launcher.New(). Bin(path). // Proxy("210.51.27.121:50003"). // 直接传入完整认证URL Delete("use-mock-keychain"). // delete flag "--use-mock-keychain" Set("disable-blink-features", "AutomationControlled"). // 绕过自动化检测 // Set("incognito"). // 无痕模式 Set("user-data-dir", absPath). // 数据持久化目录 Set("window-size", "1920,1480"). // 窗口尺寸 Set("disable-infobars", "true"). // 隐藏自动化提示栏 Set("no-sandbox", "true"). Set("excludeSwitches", "enable-automation"). Set("enable-gpu"). // 启用 GPU 加速 Set("ignore-certificate-errors"). // 忽略证书错误 Set("use-fake-ui-for-media-stream"). // 允许媒体流 Set("autoplay-policy", "no-user-gesture-required"). // 自动播放 Set("ignore-certificate-errors"). Set("disable-application-cache"). Set("disable-dev-shm-usage"). // 禁用webrtc Set("disable-webrtc", "true"). // 核心禁用参数 Set("disable-features", "WebRtcHideLocalIpsWithMdns"). // 隐藏本地IP Set("webrtc-ip-handling-policy", "disable_non_proxied_udp"). // 禁用非代理UDP Set("force-webrtc-ip-handling-policy"). Headless(false) // 关闭无头模式 // 修改时区 l.Set("disable-geolocation", "true") // 启用地理定位API l.Set("disable-web-security", "true") // 允许跨域(某些网站需要) 可以跨域访问iframe标签 l.Set("disable-notifications", "true") l.Set("disable-site-isolation-trials", "true") // if errProxy == nil { // if strings.Contains(protocol, "http") { // log.Println(protocol + "://" + ip + ":" + port) // l = l.Proxy(ip + ":" + port) // } // } uri := l.MustLaunch() browser := rod.New(). ControlURL(uri). MustConnect().NoDefaultDevice() browser.MustIgnoreCertErrors(true) // if errProxy == nil { // if strings.Contains(protocol, "http") { // log.Println(username, password) // go browser.MustHandleAuth(username, password)() // } // } page := stealth.MustPage(browser) // page := browser.MustPage() go browser.EachEvent(func(e *proto.TargetTargetCreated) { if e.TargetInfo.Type != proto.TargetTargetInfoTypePage { return } browser.MustPageFromTargetID(e.TargetInfo.TargetID).MustEvalOnNewDocument(stealth.JS) })() // 在页面加载前注入时区覆盖代码 page.MustSetViewport(1920, 1480, 1.0, false) return browser, uri, page }