概述
浅浅的玩一下github.com/go-rod/rod这个库.
通过这个支持库,可以很方便的打开一个浏览器并且让他访问一个 url,在他访问 url 时你还可以监听这个 url 的 cookies.
开始实操
为了防止被检测到自动化,我这里是注入了 js 屏蔽了检测。
- 首先使用
browser.MustPage("")打开了一个空的标签页。
- 注入 JS 脚本修改
navigator.webdriver为false。
- 注入修改完成后再打开真实的目标 URL,这样目标网站就没法通过这个值去检测我是不是自动化程序了。
- 同时滑块成功后页面会自动跳转到其他地方,所以我做了一个拦截,如果不需要的话可以直接删除。
可能要注意下,不一定所有的站点都是通过webdriver来检测自动化程序的,但是我这里只提供这个方式,至于其他的需要按照实际场景来看。
并且我这里 go 程序只是为了获取滑块后的 cookies,如果想获取请求头或者其他东西的话,可能得自己再研究下。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78
| package main
import ( "context" "log/slog" "time"
"github.com/go-rod/rod" "github.com/go-rod/rod/lib/launcher" "github.com/go-rod/rod/lib/proto" )
func main() {
url := "https://qq.com"
u := launcher.New(). Headless(false). Set("window-size", "1200,800"). Set("disable-blink-features", "AutomationControlled"). MustLaunch()
browser := rod.New().ControlURL(u).MustConnect()
page := browser.MustPage("")
_, err := page.EvalOnNewDocument(` Object.defineProperty(navigator, 'webdriver', { get: () => false }); `) if err != nil { slog.Error("在页面加载前注入 JavaScript,修改 navigator.webdriver失败", "ProxyService", err) }
page.MustNavigate(url).MustWaitLoad()
router := page.HijackRequests() router.MustAdd("*", func(ctx *rod.Hijack) { if ctx.Request.Type() == proto.NetworkResourceTypeDocument && ctx.Request.URL().String() != url { slog.Info("阻止页面跳转", "ProxyService", ctx.Request.URL()) ctx.Response.Fail(proto.NetworkErrorReasonAborted) return } ctx.MustLoadResponse() }) go router.Run()
_, evalErr := page.Eval(`navigator.webdriver`) if evalErr != nil { slog.Error("验证 navigator.webdriver失败", "ProxyService", evalErr) }
for { cookies := page.MustCookies() slog.Info("自动化拦截页面cookies", "ProxyService", cookies) for _, c := range cookies { if c.Name == "demo_cookies_name" && c.Value != "" { slog.Info("已拦截到demo_cookies_name", "ProxyService", c.Value) time.Sleep(1000 * time.Millisecond) browser.MustClose() return } } time.Sleep(100 * time.Millisecond) } }
|