使用Go从Chroom中获取页面Cookies
Reverse Lv4

概述

浅浅的玩一下github.com/go-rod/rod这个库.

通过这个支持库,可以很方便的打开一个浏览器并且让他访问一个 url,在他访问 url 时你还可以监听这个 url 的 cookies.

开始实操

为了防止被检测到自动化,我这里是注入了 js 屏蔽了检测。

  1. 首先使用browser.MustPage("")打开了一个空的标签页。
  2. 注入 JS 脚本修改navigator.webdriverfalse
  3. 注入修改完成后再打开真实的目标 URL,这样目标网站就没法通过这个值去检测我是不是自动化程序了。
  4. 同时滑块成功后页面会自动跳转到其他地方,所以我做了一个拦截,如果不需要的话可以直接删除。

可能要注意下,不一定所有的站点都是通过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("")

// 在页面加载前注入 JavaScript,修改 navigator.webdriver
_, 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()

// 等待页面稳定
// page.MustWaitStable()

// 验证 navigator.webdriver
_, evalErr := page.Eval(`navigator.webdriver`)
if evalErr != nil {
slog.Error("验证 navigator.webdriver失败", "ProxyService", evalErr)
}

// 获取当前页面的所有 Cookie
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) // 等待1秒
browser.MustClose() // 关闭浏览器
return // 结束当前函数
}
}
time.Sleep(100 * time.Millisecond) // 控制一下获取频率
}
}