【Go 实战】利用 Rod 库绕过 WebDriver 检测并提取 Cookies

【Go 实战】利用 Rod 库绕过 WebDriver 检测并提取 Cookies

一、 概述

在进行自动化爬虫或资源采集时,很多网站会通过 navigator.webdriver 属性来识别请求是否由自动化工具(如 Selenium、Puppeteer、Rod)发起。

本文将演示如何使用 Go 语言的高性能自动化库 github.com/go-rod/rod,通过预注入 JavaScript 的方式屏蔽自动化检测,并实现对目标站点 Cookies 的实时拦截与提取。


二、 核心技术点

  • 对抗检测:在页面加载前修改全局对象,隐藏自动化特征。

  • 请求劫持 (Hijacking):拦截并阻止页面非法跳转(例如滑块验证成功后的强制重定向)。

  • 动态监控:循环轮询获取特定名称的 Cookie,直到成功获取后自动关闭浏览器。


三、 环境准备

在你的 Go 项目中引入以下依赖:

Bash

go get github.com/go-rod/rod

 


四、 完整实现代码

我对代码进行了格式化,并添加了更详细的中文注释,方便读者理解每一行的作用。

Go

package main

import (
	"log/slog"
	"time"

	"github.com/go-rod/rod"
	"github.com/go-rod/rod/lib/launcher"
	"github.com/go-rod/rod/lib/proto"
)

func main() {
	targetURL := "https://qq.com"

	// 1. 初始化浏览器启动器
	u := launcher.New().
		Headless(false). // 设置为 false 方便观察交互过程
		Set("window-size", "1200,800").
		Set("disable-blink-features", "AutomationControlled"). // 基础反屏蔽设置
		MustLaunch()

	browser := rod.New().ControlURL(u).MustConnect()
	defer browser.MustClose()

	// 2. 创建空白页面并注入反检测脚本
	// 关键:必须在 Navigate 之前注入 EvalOnNewDocument
	page := browser.MustPage("")
	_, err := page.EvalOnNewDocument(`
		Object.defineProperty(navigator, 'webdriver', {
			get: () => false
		});
	`)
	if err != nil {
		slog.Error("注入反检测脚本失败", "Error", err)
	}

	// 3. 访问目标页面
	page.MustNavigate(targetURL).MustWaitLoad()

	// 4. 开启请求劫持(拦截跳转)
	// 应用场景:防止滑块成功后页面自动跳转,导致无法获取当前页 Cookies
	router := page.HijackRequests()
	router.MustAdd("*", func(ctx *rod.Hijack) {
		if ctx.Request.Type() == proto.NetworkResourceTypeDocument && ctx.Request.URL().String() != targetURL {
			slog.Info("阻止非预期页面跳转", "Target", ctx.Request.URL())
			ctx.Response.Fail(proto.NetworkErrorReasonAborted)
			return
		}
		ctx.MustLoadResponse()
	})
	go router.Run()

	slog.Info("正在监控 Cookies,请在浏览器中完成交互操作...")

	// 5. 动态循环获取 Cookies
	for {
		cookies := page.MustCookies()
		for _, c := range cookies {
			// 匹配你需要的特定 Cookie 名称
			if c.Name == "demo_cookies_name" && c.Value != "" {
				slog.Info("成功拦截目标 Cookie!", "Name", c.Name, "Value", c.Value)
				
				// 业务逻辑处理完成后退出
				time.Sleep(1 * time.Second)
				return 
			}
		}
		time.Sleep(200 * time.Millisecond) // 避免高频轮询占用 CPU
	}
}


五、 避坑指南(注意事项)

  1. 注入时机EvalOnNewDocument 必须在 MustNavigate 之前调用,否则目标网站的 JS 脚本可能会抢先执行并记录下 webdriver: true

  2. 检测多样性:修改 webdriver 属性只能绕过基础检测。部分高级站点会通过 Canvas 指纹、WebRTC 或 TLS 指纹进行识别,这时可能需要配合代理 IP 或更高级的插件。

  3. 跳转拦截:文中使用的 router.Run() 可以在用户完成滑块验证后,强行将页面留在当前 URL,确保你有足够的时间从当前上下文提取加密后的 Cookies。

© 版权声明
THE END
喜欢就支持一下吧
点赞6 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容