123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118 |
- package lxrod
- import (
- "context"
- "errors"
- "os"
- "os/exec"
- "path/filepath"
- "git.listensoft.net/tool/jspkit/taxerr"
- "github.com/go-rod/rod"
- "github.com/go-rod/rod/lib/devices"
- "github.com/go-rod/rod/lib/launcher"
- "github.com/go-rod/rod/lib/launcher/flags"
- )
- // NewLauncher 创建一个新的 rod 浏览器启动器
- func NewLauncher(ctx context.Context) *launcher.Launcher {
- return launcher.New().Context(ctx).Set("window-size", "1600,900").Headless(false)
- }
- // NewEdgeBrowser 创建一个由 rod chromium 模拟的 Edge 浏览器
- func NewEdgeBrowser(ctx context.Context, u string) *rod.Browser {
- return rod.New().Context(ctx).DefaultDevice(EdgeLandscape).ControlURL(u)
- }
- // EdgeLandscape device.
- var EdgeLandscape = devices.Device{
- Title: "Edge Laptop with HiDPI screen",
- Capabilities: []string{},
- UserAgent: "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36 Edg/131.0.0.0",
- AcceptLanguage: "en",
- Screen: devices.Screen{
- DevicePixelRatio: 2,
- Horizontal: devices.ScreenSize{
- Width: 1600,
- Height: 900,
- },
- Vertical: devices.ScreenSize{
- Width: 900,
- Height: 1600,
- },
- },
- }.Landscape()
- // NewUserMode 使用系统浏览器启动一个新的浏览器。具体使用哪个浏览器由 rod 选择。
- // 一般是 Chrome 浏览器。注意:本地的浏览器必须完全关闭,否则会启动失败。
- func (lxrod *Lxrod) NewUserMode(ctx context.Context) (b *rod.Browser, p *rod.Page, err error) {
- l := launcher.NewUserMode().Headless(false)
- l.Flags["disable-blink-features"] = []string{"AutomationControlled"}
- lxrod.Launcher = l
- wsURL, err := l.Launch()
- lxrod.WsURL = wsURL
- if err != nil {
- return nil, nil, taxerr.NewWebStuckTitle(true)
- }
- b = rod.New().NoDefaultDevice().ControlURL(wsURL).Context(ctx).MustConnect()
- p = b.MustPage().MustSetWindow(0, 0, 1600, 900).MustSetViewport(1600, 900, 1, false)
- lxrod.Browser = b
- return b, p, nil
- }
- // NewSystemEdge 使用用户的 Edge 启动浏览器。注意:本地的 Edge
- // 浏览器必须完全关闭,否则会启动失败。
- func (lxrod *Lxrod) NewSystemEdge(ctx context.Context) (b *rod.Browser, p *rod.Page, err error) {
- bin, ok := findEdgePath()
- if !ok {
- return nil, nil, errors.New("未找到 Edge 浏览器")
- }
- l := launcher.NewUserMode().Headless(false)
- l.Flags["disable-blink-features"] = []string{"AutomationControlled"}
- l.Set(flags.Bin, bin)
- lxrod.Launcher = l
- wsURL, err := l.Launch()
- if err != nil {
- return nil, nil, err
- }
- lxrod.WsURL = wsURL
- b = rod.New().NoDefaultDevice().ControlURL(wsURL).Context(ctx).MustConnect()
- p = b.MustPage().MustSetWindow(0, 0, 1600, 900).MustSetViewport(1600, 900, 1, false)
- lxrod.Browser = b
- return b, p, nil
- }
- // 查找系统 Edge 的路径。从 [launcher.LookPath] 处拷贝的。
- func findEdgePath() (found string, has bool) {
- list := append([]string{"edge"},
- expandWindowsExePaths(
- `Microsoft\Edge\Application\msedge.exe`,
- )...,
- )
- for _, path := range list {
- var err error
- found, err = exec.LookPath(path)
- has = err == nil
- if has {
- break
- }
- }
- return
- }
- func expandWindowsExePaths(list ...string) []string {
- newList := []string{}
- for _, p := range list {
- newList = append(
- newList,
- filepath.Join(os.Getenv("ProgramFiles"), p),
- filepath.Join(os.Getenv("ProgramFiles(x86)"), p),
- filepath.Join(os.Getenv("LocalAppData"), p),
- )
- }
- return newList
- }
|