package main import ( "context" "fmt" "github.com/chromedp/cdproto/page" "github.com/chromedp/cdproto/target" "github.com/chromedp/chromedp" "github.com/chromedp/chromedp/device" "io/ioutil" "log" "math/rand" "net/http" "path/filepath" "strings" "time" ) const ( BROWSER_DEVICE_TYPE_PC = 0 BROWSER_DEVICE_TYPE_MOBILE = 1 BROWSER_RESET_ERROR_LIMIT = 10 ) var ( fakeDevice FakeDevice = 1234 mobileFaceDevice MobileFakeDevice = 1234 screensize = [][2]int64{ {3840, 2160}, {2560, 1440}, {1920, 1080}, {1600, 900}, {1366, 768}, } //BrowserGroup 支持多并发的浏览器组 BrowserGroup chan *Browser useragent = []string{ "Chrome: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.113 Safari/537.36", "Firefox: Mozilla/5.0 (Windows NT 6.3; WOW64; rv:41.0) Gecko/20100101 Firefox/41.0", "Safari: Mozilla/5.0 (iPhone; CPU iPhone OS 11_2_5 like Mac OS X) AppleWebKit/604.5.6 (KHTML, like Gecko) Version/11.0 Mobile/15D60 Safari/604.1", "MacOSX: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_5) AppleWebKit/602.2.14 (KHTML, like Gecko) Version/10.0.1 Safari/602.2.14", "Mozilla/5.0(Macintosh;U;IntelMacOSX10_6_8;en-us)AppleWebKit/534.50(KHTML,likeGecko)Version/5.1Safari/534.50", "Mozilla/5.0(Windows;U;WindowsNT6.1;en-us)AppleWebKit/534.50(KHTML,likeGecko)Version/5.1Safari/534.50", "Mozilla/5.0(Macintosh;IntelMacOSX10.6;rv:2.0.1)Gecko/20100101Firefox/4.0.1", "Mozilla/5.0(WindowsNT6.1;rv:2.0.1)Gecko/20100101Firefox/4.0.1", "Mozilla/5.0(Macintosh;IntelMacOSX10_7_0)AppleWebKit/535.11(KHTML,likeGecko)Chrome/17.0.963.56Safari/535.11", "Mozilla/4.0(compatible;MSIE7.0;WindowsNT5.1;Trident/4.0;SE2.XMetaSr1.0;SE2.XMetaSr1.0;.NETCLR2.0.50727;SE2.XMetaSr1.0)", "Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.70 Safari/537.36", "Chrome 9 Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.81 Safari/537.36", "Safari Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_6) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/14.0.3 Safari/605.1.15", "Safari Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/14.1.2 Safari/605.1.15", "Safari 11 Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/11.1.2 Safari/605.1.15 QQBrowserLite/1.3.0", "Chrome 9 Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.81 Safari/537.36", "Chrome 59 Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.115 Safari/537.36", "Chrome 9 Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.71 Safari/537.36", "Safari 11 Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_1) AppleWebKit/604.3.5 (KHTML, like Gecko) Version/11.0.1 Safari/604.3.5", "Firefox 9 Mozilla/5.0 (Macintosh; Intel Mac OS X 10.13; rv:93.0) Gecko/20100101 Firefox/93.0", "Safari Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_6) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/14.1.1 Safari/605.1.15", "Chrome 8 Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.90 Safari/537.36", "Chrome Mozilla/5.0 (X11; U; U; Linux x86_64; zh-my) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36 Puffin/8.3.1.41624AP", "Opera 28 Mozilla/5.0 (Linux; BRAVIA 4K 2015 Build/LMY48E.S265) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2272.101 Safari/537.36 OPR/28.0.1754.0", "Safari Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Safari/537.36 HeyTapBrowser/40.7.29.1", "Chrome 9 Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.4577.58 Safari/537.36 Edg/93.0.961.33", "Chrome 9 Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) SamsungBrowser/15.0 Chrome/90.0.4430.210 Safari/537.36", "Chrome 9 Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.131 Safari/537.36", "Chrome Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36", "Microsoft Edge Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.140 Safari/537.36 Edge/17.17134", "Chrome 8 Mozilla/5.0 (Windows NT 10.0; ) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.97 Safari/537.36", "Chrome 8 Mozilla/5.0 (Windows NT 10.0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 Safari/537.36", "Chrome 9 Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.61 Safari/537.36", "Chrome 8 Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.121 Safari/537.36", "Chrome 9 Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36", "Chrome Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36", "Firefox 7 Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:78.0) Gecko/20100101 Firefox/78.0", "Chrome 9 Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.81 Safari/537.36", "Internet Explorer 11 Mozilla/5.0 (Windows NT 6.3; WOW64; Trident/7.0; LCJB; rv:11.0) like Gecko", "Chrome 9 Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.71 Safari/537.36", "Firefox 36 Mozilla/5.0 (Windows NT 6.3; rv:36.0) Gecko/20100101 Firefox/36.0", "Chrome Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.25 Safari/537.36 Core/1.70.3870.400 QQBrowser/10.8.4405.400", "Chrome 58 Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36 SE 2.X MetaSr 1.0", "Firefox 9 Mozilla/5.0 (Windows NT 6.3; Win64; x64; rv:93.0) Gecko/20100101 Firefox/93.0", "Chrome 8 Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 Safari/537.36", "Chrome 9 Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.71 Safari/537.36 Edg/94.0.992.38", } mobileUserAgent = []string{ "Chrome Mobile Mozilla/5.0 (Linux; U; Android 9; en-US; SM-G950F Build/PPR1.180610.011) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/78.0.3904.108 UCBrowser/13.4.0.1306 Mobile Safari/537.36", "Chrome Mobile Mozilla/5.0 (Linux; U; Android 9; zh-cn; RVL-AL09 Build/HUAWEIRVL-AL09) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/66.0.3359.126 MQQBrowser/10.7 Mobile Safari/537.36", "Chrome Mobile Mozilla/5.0 (Linux; U; Android 9; zh-cn; PDBM00 Build/PPR1.180610.011) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/77.0.3865.120 MQQBrowser/11.9 Mobile Safari/537.36 COVC/045709", "Chrome Mobile Mozilla/5.0 (Linux; Android 9; INE-AL00; HMSCore 6.1.0.313; GMSCore 19.6.29) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.93 HuaweiBrowser/11.1.5.310 Mobile Safari/537.36", "Chrome Mobile Mozilla/5.0 (Linux; Android 9; V1913A Build/P00610; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/87.0.4280.141 Mobile Safari/537.36 VivoBrowser/10.2.11.6", "Chrome Mobile Mozilla/5.0 (Linux; Android 9; V1934A Build/PPR1.180610.011; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/68.0.3440.91 Mobile Safari/537.36 iThunder;thirdChannel_SHOUJIXUNLEI/7.09.2.7123 xl_cloud", "Chrome Mobile Mozilla/5.0 (Linux; U; Android 9; zh-cn; MI 6X Build/PKQ1.180904.001) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/89.0.4389.116 Mobile Safari/537.36 XiaoMi/MiuiBrowser/15.4.12", "Chrome Mobile Mozilla/5.0 (Linux; Android 9; Mi Note 3 Build/PKQ1.181007.001; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/80.0.3987.99 Mobile Safari/537.36 iThunder;thirdChannel_SHOUJIXUNLEI/7.32.0.7705 xl_cloud statusBarHeight/66 statusBarHeightDp/24.0", "Chrome Mobile Mozilla/5.0 (Linux; U; Android 9; zh-cn; LLD-AL30 Build/HONORLLD-AL30) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/89.0.4389.72 MQQBrowser/12.0 Mobile Safari/537.36 COVC/045817", "Chrome Mobile Mozilla/5.0 (Linux; Android 9; COL-AL10; HMSCore 6.1.0.305; GMSCore 17.7.85) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.93 HuaweiBrowser/11.1.4.301 Mobile Safari/537.36", "Mobile Safari Mozilla/5.0 (iPad; CPU OS 10_3_3 like Mac OS X) AppleWebKit/603.1.30 (KHTML, like Gecko) GSA/68.0.234683655 Mobile/14G60 Safari/602.1", "Mobile Safari Mozilla/5.0 (iPad; CPU OS 10_3_3 like Mac OS X) AppleWebKit/603.3.8 (KHTML, like Gecko) Version/10.0 Mobile/14G60 Safari/602.1", "Mobile Safari Mozilla/5.0 (iPad; CPU OS 10_3_4 like Mac OS X) AppleWebKit/603.3.8 (KHTML, like Gecko) Version/10.0 EdgiOS/46.3.26 Mobile/14G61 Safari/603.3.8", "Mobile Safari Mozilla/5.0 (iPad; CPU OS 11_4_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/11.0 Mobile/15E148 Safari/604.1", "Mobile Safari Mozilla/5.0 (iPhone; CPU iPhone OS 11_0_3 like Mac OS X) AppleWebKit/604.3.5 (KHTML, like Gecko) Version/11.0 MQQBrowser/11.8.3 Mobile/15B87 Safari/604.1 QBWebViewUA/2 QBWebViewType/1 WKType/1", "Mobile Safari Mozilla/5.0 (iPhone; CPU iPhone OS 11_4_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/11.0 Mobile/15E148 Safari/604.1", "Mobile Safari Mozilla/5.0 (iPhone; CPU iPhone OS 11_0 like Mac OS X) AppleWebKit/604.3.5 (KHTML, like Gecko) Version/11.0 MQQBrowser/12.0.1 Mobile/15B87 Safari/604.1 QBWebViewUA/2 QBWebViewType/1 WKType/1", "Apple WebKit Mozilla/5.0 (iPhone; CPU iPhone OS 11_4 like Mac OS X; zh-CN) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15F79 UCBrowser/13.5.8.1568 Mobile AliApp(TUnionSDK/0.1.20.4)", "Apple WebKit Mozilla/5.0 (iPhone; CPU iPhone OS 11_1_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148 MicroMessenger/7.0.12(0x17000c2f) NetType/4G Language/zh_CN wechatdevtools", "Mobile Safari Mozilla/5.0 (iPad; CPU OS 13_6 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/13.1.2 Mobile/15E148 Safari/604.1", "Chrome Mobile Mozilla/5.0 (iPad; CPU OS 14_7 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) CriOS/94.0.4606.76 Mobile/15E148 Safari/604.1", "Mobile Safari Mozilla/5.0 (iPad; CPU OS 14_7_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148 MQBHD/6.9.1 Safari/537.22", "Mobile Safari Mozilla/5.0 (iPad; CPU OS 12_4_4 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/12.1.2 Mobile/15E148 Safari/604.1", "Mobile Safari Mozilla/5.0 (iPad; CPU OS 12_4 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/12.1.2 Mobile/15E148 Safari/604.1", "Apple WebKit Mozilla/5.0 (iPad; CPU OS 14_7_1 like Mac OS X) AppleWebKit/601.1.46 (KHTML, like Gecko) Mobile/18G82 Quark/4.5.9.19 Mobile", "Mobile Safari Mozilla/5.0 (iPad; CPU OS 14_7 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) GSA/180.0.400278405 Mobile/15E148 Safari/604.1", "Mobile Safari Mozilla/5.0 (iPad; CPU OS 12_5 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) GSA/160.0.373863126 Mobile/15E148 Safari/604.1", "Apple WebKit Mozilla/5.0 (iPad; CPU OS 12_5_4 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148 MQBHD/6.8.9", "Mobile Safari Mozilla/5.0 (iPad; CPU OS 12_4_9 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148 MQBHD/6.9.1 Safari/537.22", "Mobile Safari Mozilla/5.0 (iPhone; CPU iPhone OS 15_0_2 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/14.0 Mobile/15E148 Safari/604.1", "Apple WebKit Mozilla/5.0 (iPhone; CPU iPhone OS 14_4 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148 SP-engine/2.34.0 main%2F1.0 baiduboxapp/12.21.1.10 (Baidu; P2 14.4) NABar/1.0 themeUA=Theme/default", "Mobile Safari Mozilla/5.0 (iPhone; CPU iPhone OS 12_3_1 like Mac OS X) AppleWebKit/604.3.5 (KHTML, like Gecko) Version/12.0 MQQBrowser/12.0.1 Mobile/15B87 Safari/604.1 QBWebViewUA/2 QBWebViewType/1 WKType/1", "Apple WebKit Mozilla/5.0 (iPhone; CPU iPhone OS 14_6 like Mac OS X; zh-CN) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/18F72 UCBrowser/13.5.8.1568 Mobile AliApp(TUnionSDK/0.1.20.4)", "Mobile Safari Mozilla/5.0 (iPhone; CPU iPhone OS 14_7 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) GSA/164.0.378717864 Mobile/15E148 Safari/604.1", "Apple WebKit Mozilla/5.0 (iPhone; CPU iPhone OS 12_3_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148", "Mobile Safari Mozilla/5.0 (iPhone; CPU iPhone OS 13_3_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/13.0.5 Mobile/15E148 Safari/604.1", "Mobile Safari Mozilla/5.0 (iPhone; CPU iPhone OS 15_0_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/14.0 Mobile/15E148 Safari/604.1", "Apple WebKit Mozilla/5.0 (iPhone; CPU iPhone OS 13_6 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148 SogouMobileBrowser/6.3.7", "Mobile Safari Mozilla/5.0 (iPhone; CPU iPhone OS 12_5_2 like Mac OS X) AppleWebKit/607.3.11 (KHTML, like Gecko) Mobile/16H30 Version/13.0 Safari/604.1", } ) type ( //Browser 浏览器 Browser struct { timeoutAmount int showImages bool incognito bool socks5proxy, proxyChangeIpUrl, clearTraceUrl string userDataDir, diskCacheDir, extesionDir string ctx, allocCtx, incCtx context.Context cancelFn, allocCancelFn, incCancelFn context.CancelFunc } Option func(b *Browser) error //FakeDevice 伪造的设备 FakeDevice int MobileFakeDevice int ) // String func (fd FakeDevice) String() string { defer Catch() return "pc custom browser" } // Device func (fd FakeDevice) Device() device.Info { defer Catch() size := screensize[rand.Intn(5)] return device.Info{ "device name", useragent[rand.Intn(len(useragent))], size[0], size[1], 1, false, false, false, } } // String func (fd MobileFakeDevice) String() string { return "mobile custom browser" } // Device func (fd MobileFakeDevice) Device() device.Info { defer Catch() return device.Info{ "device name", mobileUserAgent[rand.Intn(len(mobileUserAgent))], 0, 0, 1, false, false, false, } } // UserDataDir 用户目录 func SetUserDataDir(dir string) Option { defer Catch() return func(b *Browser) error { b.userDataDir = dir return nil } } // DiskCacheDir 磁盘缓存目录,cookie等的存放位置,设置此值,可以调用清理用户痕迹 func SetDiskCacheDir(dir string) Option { defer Catch() return func(b *Browser) error { b.diskCacheDir = dir return nil } } // ExtesionDir 插件目录 func SetExtesionDir(dir string) Option { defer Catch() // fs, _ := ioutil.ReadDir(dir) es := make([]string, 0, 0) for _, f := range fs { if f.IsDir() && !strings.HasPrefix(f.Name(), ".") { es = append(es, dir+string(filepath.Separator)+f.Name()) } } return func(b *Browser) error { b.extesionDir = strings.Join(es, ",") return nil } } // Socks5proxy socks5代理地址 func SetSocks5proxy(addr string) Option { defer Catch() return func(b *Browser) error { b.socks5proxy = addr return nil } } // ShowImages 浏览器是否屏蔽显示图像,不显示可以提速 func SetShowImage(showImages bool) Option { defer Catch() return func(b *Browser) error { b.showImages = showImages return nil } } // Incognito 隐身模式 func SetIncognito(incognito bool) Option { defer Catch() return func(b *Browser) error { b.incognito = incognito return nil } } // ProxyChangeIpUrl socks5跳板,切换IP的url地址 func SetProxyChangeIpUrl(url string) Option { defer Catch() return func(b *Browser) error { b.proxyChangeIpUrl = url return nil } } // ChangeIp func (b *Browser) ChangeIp() error { defer Catch() if b.proxyChangeIpUrl == "" { return nil } ctx, _ := context.WithTimeout(context.TODO(), 5*time.Second) req, err := http.NewRequest("GET", b.proxyChangeIpUrl, nil) if err != nil { return err } resp, err := http.DefaultClient.Do(req.WithContext(ctx)) if err == nil { _, _ = ioutil.ReadAll(resp.Body) resp.Body.Close() } return err } // NewBrowser 构造一个新的浏览器实例 func NewBrowser(headless bool, ops ...Option) *Browser { defer Catch() b := new(Browser) for _, op := range ops { op(b) } b.ctx, b.cancelFn = chromedp.NewContext(context.Background()) chromeOptions := append(chromedp.DefaultExecAllocatorOptions[:], chromedp.Flag("disable-blink-features", "AutomationControlled"), //headless参数是用来控制Chrome/Chromium是否以无头模式运行的 chromedp.NoDefaultBrowserCheck, //不检查默认浏览器 chromedp.Flag("force-dev-mode-highlighting", true), chromedp.Flag("disable-extensions", false), //是否禁用扩展 chromedp.Flag("headless", headless), chromedp.Flag("user-agent", useragent[rand.Intn(10)]), //搞到底还是要在这里设置useragent chromedp.Flag("disable-keep-alive", true), chromedp.Flag("disable-gpu", true), chromedp.Flag("no-sandbox", true), chromedp.Flag("disable-dev-shm-usage", true), chromedp.Flag("default-browser-check", false), chromedp.Flag("ignore-certificate-errors", true), //忽略错误 chromedp.Flag("disable-web-security", true), //禁用网络安全标志 chromedp.Flag("mute-audio", false), chromedp.Flag("accept-language", `zh-CN,zh;q=0.9,en-US;q=0.8,en;q=0.7,zh-TW;q=0.6`), ) fmt.Println("代理IP:", fmt.Sprintf("socks5://%s", b.socks5proxy)) if b.socks5proxy != "" { chromeOptions = append(chromeOptions, chromedp.ProxyServer(fmt.Sprintf("socks5://%s", b.socks5proxy)), ) } if b.userDataDir != "" { chromeOptions = append(chromeOptions, chromedp.Flag("user-data-dir", b.userDataDir), ) } if b.diskCacheDir != "" { chromeOptions = append(chromeOptions, chromedp.Flag("disk-cache-dir", b.diskCacheDir), ) } if b.extesionDir != "" { chromeOptions = append(chromeOptions, chromedp.Flag("load-extension", b.extesionDir), ) } if !b.showImages { chromeOptions = append(chromeOptions, chromedp.Flag("blink-settings", "imagesEnabled=false"), ) } if b.incognito { chromeOptions = append(chromeOptions, chromedp.Flag("incognito", true), ) } b.allocCtx, b.allocCancelFn = chromedp.NewExecAllocator(b.ctx, chromeOptions...) // 创建一个浏览器实例 b.incCtx, b.incCancelFn = chromedp.NewContext(b.allocCtx, chromedp.WithLogf(log.Printf)) return b } // NewTab 打开新的Tab页,一般不单独调用 func (b *Browser) NewTab() (context.Context, context.CancelFunc) { return chromedp.NewContext(b.incCtx) } // RunWithTimeout 支持超时设定的方法执行 func (b *Browser) RunWithTimeout(fn func(ctx context.Context, exit chan<- bool), timeout int64) { defer Catch() ctx, cancelFn := b.NewTab() exit := make(chan bool, 1) go fn(ctx, exit) select { case <-exit: b.timeoutAmount = 0 cancelFn() return case <-time.After(time.Duration(timeout) * time.Second): fmt.Print("ooo") b.timeoutAmount += 1 cancelFn() return } } // CloseTab 过滤,关闭Tab页 func (b *Browser) CloseTab(ctx context.Context, filter func(title, url string) bool) { if ctx == nil { ctx = b.incCtx } ctx, _ = context.WithTimeout(ctx, 5*time.Second) ts, err := chromedp.Targets(ctx) if err != nil { return } for _, t := range ts { if filter(t.Title, t.URL) { newCtx, _ := chromedp.NewContext(ctx, chromedp.WithTargetID(t.TargetID)) chromedp.Run(newCtx, page.Close(), ) } } } func (b *Browser) Revert() *Browser { if b.timeoutAmount > BROWSER_RESET_ERROR_LIMIT { //超时太多了,可能是内部错了,重新创建浏览器实例 fmt.Print("[Reset browser]") b.Close() browser := NewBrowser(Headless, SetUserDataDir(UserDataDir), SetSocks5proxy(ProxyAddr), SetProxyChangeIpUrl(ProxyChangeIpUrl), SetDiskCacheDir(DiskCacheDir), SetExtesionDir(ExtesionDir), SetShowImage(ShowImage), //SetIncognito(env.Incognito), ) return browser } return b } // Close func (b *Browser) Close() { defer Catch() if b.cancelFn != nil { b.cancelFn() } } // RandTimedution func RandTimedution(to int64) time.Duration { return time.Duration(rand.Int63n(to*2)+to) * time.Second } // RandTimedution func RandTimedution2(min, max int64) time.Duration { return time.Duration(rand.Int63n(max-min)+min) * time.Second } // ChangeBrowserDevice func ChangeBrowserDevice(ctx context.Context, deviceType int) { defer Catch() var act chromedp.Action if deviceType == BROWSER_DEVICE_TYPE_PC { act = chromedp.Emulate(fakeDevice) } else { act = chromedp.Emulate(mobileFaceDevice) } chromedp.Run( ctx, act, ) } // NewBrowserGroup func InitBrowserGroup() { defer Catch() fmt.Println("ProxyChangeIpUrl:", ProxyChangeIpUrl, "ProxyAddr:", ProxyAddr) for i := 1; i <= BrowserSize; i++ { browser := NewBrowser(Headless, SetUserDataDir(UserDataDir), SetSocks5proxy(ProxyAddr), SetProxyChangeIpUrl(ProxyChangeIpUrl), SetDiskCacheDir(DiskCacheDir), SetExtesionDir(ExtesionDir), SetShowImage(ShowImage), //SetIncognito(env.Incognito), ) BrowserGroup <- browser } } func NewTabWithTatgetID(targetID target.ID, ctx context.Context) (context.Context, context.CancelFunc) { return chromedp.NewContext(ctx, chromedp.WithTargetID(targetID)) } // RunWithTimeout 支持超时设定的方法执行 func RunWithTimeoutByTatgetID(targetID target.ID, ctx context.Context, fn func(ctx context.Context, exit chan<- bool), timeout int64) { defer Catch() ctx, cancelFn := NewTabWithTatgetID(targetID, ctx) exit := make(chan bool, 1) go fn(ctx, exit) select { case <-exit: cancelFn() return case <-time.After(time.Duration(timeout) * time.Second): cancelFn() return } }