browser.go 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470
  1. package main
  2. import (
  3. "context"
  4. "fmt"
  5. "github.com/chromedp/cdproto/page"
  6. "github.com/chromedp/cdproto/target"
  7. "github.com/chromedp/chromedp"
  8. "github.com/chromedp/chromedp/device"
  9. "io/ioutil"
  10. "log"
  11. "math/rand"
  12. "net/http"
  13. "path/filepath"
  14. "strings"
  15. "time"
  16. )
  17. const (
  18. BROWSER_DEVICE_TYPE_PC = 0
  19. BROWSER_DEVICE_TYPE_MOBILE = 1
  20. BROWSER_RESET_ERROR_LIMIT = 10
  21. )
  22. var (
  23. fakeDevice FakeDevice = 1234
  24. mobileFaceDevice MobileFakeDevice = 1234
  25. screensize = [][2]int64{
  26. {3840, 2160},
  27. {2560, 1440},
  28. {1920, 1080},
  29. {1600, 900},
  30. {1366, 768},
  31. }
  32. //BrowserGroup 支持多并发的浏览器组
  33. BrowserGroup chan *Browser
  34. useragent = []string{
  35. "Chrome: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.113 Safari/537.36",
  36. "Firefox: Mozilla/5.0 (Windows NT 6.3; WOW64; rv:41.0) Gecko/20100101 Firefox/41.0",
  37. "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",
  38. "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",
  39. "Mozilla/5.0(Macintosh;U;IntelMacOSX10_6_8;en-us)AppleWebKit/534.50(KHTML,likeGecko)Version/5.1Safari/534.50",
  40. "Mozilla/5.0(Windows;U;WindowsNT6.1;en-us)AppleWebKit/534.50(KHTML,likeGecko)Version/5.1Safari/534.50",
  41. "Mozilla/5.0(Macintosh;IntelMacOSX10.6;rv:2.0.1)Gecko/20100101Firefox/4.0.1",
  42. "Mozilla/5.0(WindowsNT6.1;rv:2.0.1)Gecko/20100101Firefox/4.0.1",
  43. "Mozilla/5.0(Macintosh;IntelMacOSX10_7_0)AppleWebKit/535.11(KHTML,likeGecko)Chrome/17.0.963.56Safari/535.11",
  44. "Mozilla/4.0(compatible;MSIE7.0;WindowsNT5.1;Trident/4.0;SE2.XMetaSr1.0;SE2.XMetaSr1.0;.NETCLR2.0.50727;SE2.XMetaSr1.0)",
  45. "Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.70 Safari/537.36",
  46. "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",
  47. "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",
  48. "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",
  49. "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",
  50. "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",
  51. "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",
  52. "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",
  53. "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",
  54. "Firefox 9 Mozilla/5.0 (Macintosh; Intel Mac OS X 10.13; rv:93.0) Gecko/20100101 Firefox/93.0",
  55. "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",
  56. "Chrome 8 Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.90 Safari/537.36",
  57. "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",
  58. "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",
  59. "Safari Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Safari/537.36 HeyTapBrowser/40.7.29.1",
  60. "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",
  61. "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",
  62. "Chrome 9 Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.131 Safari/537.36",
  63. "Chrome Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36",
  64. "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",
  65. "Chrome 8 Mozilla/5.0 (Windows NT 10.0; ) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.97 Safari/537.36",
  66. "Chrome 8 Mozilla/5.0 (Windows NT 10.0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 Safari/537.36",
  67. "Chrome 9 Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.61 Safari/537.36",
  68. "Chrome 8 Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.121 Safari/537.36",
  69. "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",
  70. "Chrome Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36",
  71. "Firefox 7 Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:78.0) Gecko/20100101 Firefox/78.0",
  72. "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",
  73. "Internet Explorer 11 Mozilla/5.0 (Windows NT 6.3; WOW64; Trident/7.0; LCJB; rv:11.0) like Gecko",
  74. "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",
  75. "Firefox 36 Mozilla/5.0 (Windows NT 6.3; rv:36.0) Gecko/20100101 Firefox/36.0",
  76. "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",
  77. "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",
  78. "Firefox 9 Mozilla/5.0 (Windows NT 6.3; Win64; x64; rv:93.0) Gecko/20100101 Firefox/93.0",
  79. "Chrome 8 Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 Safari/537.36",
  80. "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",
  81. }
  82. mobileUserAgent = []string{
  83. "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",
  84. "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",
  85. "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",
  86. "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",
  87. "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",
  88. "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",
  89. "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",
  90. "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",
  91. "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",
  92. "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",
  93. "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",
  94. "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",
  95. "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",
  96. "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",
  97. "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",
  98. "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",
  99. "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",
  100. "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)",
  101. "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",
  102. "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",
  103. "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",
  104. "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",
  105. "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",
  106. "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",
  107. "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",
  108. "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",
  109. "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",
  110. "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",
  111. "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",
  112. "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",
  113. "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",
  114. "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",
  115. "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)",
  116. "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",
  117. "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",
  118. "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",
  119. "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",
  120. "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",
  121. "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",
  122. }
  123. )
  124. type (
  125. //Browser 浏览器
  126. Browser struct {
  127. timeoutAmount int
  128. showImages bool
  129. incognito bool
  130. socks5proxy, proxyChangeIpUrl, clearTraceUrl string
  131. userDataDir, diskCacheDir, extesionDir string
  132. ctx, allocCtx, incCtx context.Context
  133. cancelFn, allocCancelFn, incCancelFn context.CancelFunc
  134. }
  135. Option func(b *Browser) error
  136. //FakeDevice 伪造的设备
  137. FakeDevice int
  138. MobileFakeDevice int
  139. )
  140. // String
  141. func (fd FakeDevice) String() string {
  142. defer Catch()
  143. return "pc custom browser"
  144. }
  145. // Device
  146. func (fd FakeDevice) Device() device.Info {
  147. defer Catch()
  148. size := screensize[rand.Intn(5)]
  149. return device.Info{
  150. "device name",
  151. useragent[rand.Intn(len(useragent))],
  152. size[0], size[1],
  153. 1,
  154. false, false, false,
  155. }
  156. }
  157. // String
  158. func (fd MobileFakeDevice) String() string {
  159. return "mobile custom browser"
  160. }
  161. // Device
  162. func (fd MobileFakeDevice) Device() device.Info {
  163. defer Catch()
  164. return device.Info{
  165. "device name",
  166. mobileUserAgent[rand.Intn(len(mobileUserAgent))],
  167. 0, 0,
  168. 1,
  169. false, false, false,
  170. }
  171. }
  172. // UserDataDir 用户目录
  173. func SetUserDataDir(dir string) Option {
  174. defer Catch()
  175. return func(b *Browser) error {
  176. b.userDataDir = dir
  177. return nil
  178. }
  179. }
  180. // DiskCacheDir 磁盘缓存目录,cookie等的存放位置,设置此值,可以调用清理用户痕迹
  181. func SetDiskCacheDir(dir string) Option {
  182. defer Catch()
  183. return func(b *Browser) error {
  184. b.diskCacheDir = dir
  185. return nil
  186. }
  187. }
  188. // ExtesionDir 插件目录
  189. func SetExtesionDir(dir string) Option {
  190. defer Catch()
  191. //
  192. fs, _ := ioutil.ReadDir(dir)
  193. es := make([]string, 0, 0)
  194. for _, f := range fs {
  195. if f.IsDir() && !strings.HasPrefix(f.Name(), ".") {
  196. es = append(es,
  197. dir+string(filepath.Separator)+f.Name())
  198. }
  199. }
  200. return func(b *Browser) error {
  201. b.extesionDir = strings.Join(es, ",")
  202. return nil
  203. }
  204. }
  205. // Socks5proxy socks5代理地址
  206. func SetSocks5proxy(addr string) Option {
  207. defer Catch()
  208. return func(b *Browser) error {
  209. b.socks5proxy = addr
  210. return nil
  211. }
  212. }
  213. // ShowImages 浏览器是否屏蔽显示图像,不显示可以提速
  214. func SetShowImage(showImages bool) Option {
  215. defer Catch()
  216. return func(b *Browser) error {
  217. b.showImages = showImages
  218. return nil
  219. }
  220. }
  221. // Incognito 隐身模式
  222. func SetIncognito(incognito bool) Option {
  223. defer Catch()
  224. return func(b *Browser) error {
  225. b.incognito = incognito
  226. return nil
  227. }
  228. }
  229. // ProxyChangeIpUrl socks5跳板,切换IP的url地址
  230. func SetProxyChangeIpUrl(url string) Option {
  231. defer Catch()
  232. return func(b *Browser) error {
  233. b.proxyChangeIpUrl = url
  234. return nil
  235. }
  236. }
  237. // ChangeIp
  238. func (b *Browser) ChangeIp() error {
  239. defer Catch()
  240. if b.proxyChangeIpUrl == "" {
  241. return nil
  242. }
  243. ctx, _ := context.WithTimeout(context.TODO(), 5*time.Second)
  244. req, err := http.NewRequest("GET", b.proxyChangeIpUrl, nil)
  245. if err != nil {
  246. return err
  247. }
  248. resp, err := http.DefaultClient.Do(req.WithContext(ctx))
  249. if err == nil {
  250. _, _ = ioutil.ReadAll(resp.Body)
  251. resp.Body.Close()
  252. }
  253. return err
  254. }
  255. // NewBrowser 构造一个新的浏览器实例
  256. func NewBrowser(headless bool, ops ...Option) *Browser {
  257. defer Catch()
  258. b := new(Browser)
  259. for _, op := range ops {
  260. op(b)
  261. }
  262. b.ctx, b.cancelFn = chromedp.NewContext(context.Background())
  263. chromeOptions := append(chromedp.DefaultExecAllocatorOptions[:],
  264. chromedp.Flag("disable-blink-features", "AutomationControlled"), //headless参数是用来控制Chrome/Chromium是否以无头模式运行的
  265. chromedp.NoDefaultBrowserCheck, //不检查默认浏览器
  266. chromedp.Flag("force-dev-mode-highlighting", true),
  267. chromedp.Flag("disable-extensions", false), //是否禁用扩展
  268. chromedp.Flag("headless", headless),
  269. chromedp.Flag("user-agent", useragent[rand.Intn(10)]), //搞到底还是要在这里设置useragent
  270. chromedp.Flag("disable-keep-alive", true),
  271. chromedp.Flag("disable-gpu", true),
  272. chromedp.Flag("no-sandbox", true),
  273. chromedp.Flag("disable-dev-shm-usage", true),
  274. chromedp.Flag("default-browser-check", false),
  275. chromedp.Flag("ignore-certificate-errors", true), //忽略错误
  276. chromedp.Flag("disable-web-security", true), //禁用网络安全标志
  277. chromedp.Flag("mute-audio", false),
  278. chromedp.Flag("accept-language", `zh-CN,zh;q=0.9,en-US;q=0.8,en;q=0.7,zh-TW;q=0.6`),
  279. )
  280. fmt.Println("代理IP:", fmt.Sprintf("socks5://%s", b.socks5proxy))
  281. if b.socks5proxy != "" {
  282. chromeOptions = append(chromeOptions,
  283. chromedp.ProxyServer(fmt.Sprintf("socks5://%s", b.socks5proxy)),
  284. )
  285. }
  286. if b.userDataDir != "" {
  287. chromeOptions = append(chromeOptions,
  288. chromedp.Flag("user-data-dir", b.userDataDir),
  289. )
  290. }
  291. if b.diskCacheDir != "" {
  292. chromeOptions = append(chromeOptions,
  293. chromedp.Flag("disk-cache-dir", b.diskCacheDir),
  294. )
  295. }
  296. if b.extesionDir != "" {
  297. chromeOptions = append(chromeOptions,
  298. chromedp.Flag("load-extension", b.extesionDir),
  299. )
  300. }
  301. if !b.showImages {
  302. chromeOptions = append(chromeOptions,
  303. chromedp.Flag("blink-settings", "imagesEnabled=false"),
  304. )
  305. }
  306. if b.incognito {
  307. chromeOptions = append(chromeOptions,
  308. chromedp.Flag("incognito", true),
  309. )
  310. }
  311. b.allocCtx, b.allocCancelFn = chromedp.NewExecAllocator(b.ctx, chromeOptions...)
  312. // 创建一个浏览器实例
  313. b.incCtx, b.incCancelFn = chromedp.NewContext(b.allocCtx,
  314. chromedp.WithLogf(log.Printf))
  315. return b
  316. }
  317. // NewTab 打开新的Tab页,一般不单独调用
  318. func (b *Browser) NewTab() (context.Context, context.CancelFunc) {
  319. return chromedp.NewContext(b.incCtx)
  320. }
  321. // RunWithTimeout 支持超时设定的方法执行
  322. func (b *Browser) RunWithTimeout(fn func(ctx context.Context, exit chan<- bool), timeout int64) {
  323. defer Catch()
  324. ctx, cancelFn := b.NewTab()
  325. exit := make(chan bool, 1)
  326. go fn(ctx, exit)
  327. select {
  328. case <-exit:
  329. b.timeoutAmount = 0
  330. cancelFn()
  331. return
  332. case <-time.After(time.Duration(timeout) * time.Second):
  333. fmt.Print("ooo")
  334. b.timeoutAmount += 1
  335. cancelFn()
  336. return
  337. }
  338. }
  339. // CloseTab 过滤,关闭Tab页
  340. func (b *Browser) CloseTab(ctx context.Context, filter func(title, url string) bool) {
  341. if ctx == nil {
  342. ctx = b.incCtx
  343. }
  344. ctx, _ = context.WithTimeout(ctx, 5*time.Second)
  345. ts, err := chromedp.Targets(ctx)
  346. if err != nil {
  347. return
  348. }
  349. for _, t := range ts {
  350. if filter(t.Title, t.URL) {
  351. newCtx, _ := chromedp.NewContext(ctx, chromedp.WithTargetID(t.TargetID))
  352. chromedp.Run(newCtx,
  353. page.Close(),
  354. )
  355. }
  356. }
  357. }
  358. func (b *Browser) Revert() *Browser {
  359. if b.timeoutAmount > BROWSER_RESET_ERROR_LIMIT {
  360. //超时太多了,可能是内部错了,重新创建浏览器实例
  361. fmt.Print("[Reset browser]")
  362. b.Close()
  363. browser := NewBrowser(Headless,
  364. SetUserDataDir(UserDataDir),
  365. SetSocks5proxy(ProxyAddr),
  366. SetProxyChangeIpUrl(ProxyChangeIpUrl),
  367. SetDiskCacheDir(DiskCacheDir),
  368. SetExtesionDir(ExtesionDir),
  369. SetShowImage(ShowImage),
  370. //SetIncognito(env.Incognito),
  371. )
  372. return browser
  373. }
  374. return b
  375. }
  376. // Close
  377. func (b *Browser) Close() {
  378. defer Catch()
  379. if b.cancelFn != nil {
  380. b.cancelFn()
  381. }
  382. }
  383. // RandTimedution
  384. func RandTimedution(to int64) time.Duration {
  385. return time.Duration(rand.Int63n(to*2)+to) * time.Second
  386. }
  387. // RandTimedution
  388. func RandTimedution2(min, max int64) time.Duration {
  389. return time.Duration(rand.Int63n(max-min)+min) * time.Second
  390. }
  391. // ChangeBrowserDevice
  392. func ChangeBrowserDevice(ctx context.Context, deviceType int) {
  393. defer Catch()
  394. var act chromedp.Action
  395. if deviceType == BROWSER_DEVICE_TYPE_PC {
  396. act = chromedp.Emulate(fakeDevice)
  397. } else {
  398. act = chromedp.Emulate(mobileFaceDevice)
  399. }
  400. chromedp.Run(
  401. ctx,
  402. act,
  403. )
  404. }
  405. // NewBrowserGroup
  406. func InitBrowserGroup() {
  407. defer Catch()
  408. fmt.Println("ProxyChangeIpUrl:", ProxyChangeIpUrl, "ProxyAddr:", ProxyAddr)
  409. for i := 1; i <= BrowserSize; i++ {
  410. browser := NewBrowser(Headless,
  411. SetUserDataDir(UserDataDir),
  412. SetSocks5proxy(ProxyAddr),
  413. SetProxyChangeIpUrl(ProxyChangeIpUrl),
  414. SetDiskCacheDir(DiskCacheDir),
  415. SetExtesionDir(ExtesionDir),
  416. SetShowImage(ShowImage),
  417. //SetIncognito(env.Incognito),
  418. )
  419. BrowserGroup <- browser
  420. }
  421. }
  422. func NewTabWithTatgetID(targetID target.ID, ctx context.Context) (context.Context, context.CancelFunc) {
  423. return chromedp.NewContext(ctx, chromedp.WithTargetID(targetID))
  424. }
  425. // RunWithTimeout 支持超时设定的方法执行
  426. func RunWithTimeoutByTatgetID(targetID target.ID, ctx context.Context, fn func(ctx context.Context, exit chan<- bool), timeout int64) {
  427. defer Catch()
  428. ctx, cancelFn := NewTabWithTatgetID(targetID, ctx)
  429. exit := make(chan bool, 1)
  430. go fn(ctx, exit)
  431. select {
  432. case <-exit:
  433. cancelFn()
  434. return
  435. case <-time.After(time.Duration(timeout) * time.Second):
  436. cancelFn()
  437. return
  438. }
  439. }