123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470 |
- 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
- }
- }
|