Categorygithub.com/Leviathangk/go-unselenium
repositorypackage
0.0.5
Repository: https://github.com/leviathangk/go-unselenium.git
Documentation: pkg.go.dev

# Packages

No description provided by the author

# README

UnSelenium

实现类似 py 中 undetected_chromedriver 功能的 go 版本,可以过一些检测

该库参考了:go-undetected_chromedriver

该库具备执行 CDP 命令的能力

不论是 py 还是 go,在这里的实现方式,本质上就是开启一个浏览器,通过 driver 去控制

注意:仅在 win 下测试通过,linux 未进行过测试

安装

go get -u github.com/Leviathangk/go-unselenium@latest

驱动

需要 ChromeDriver 驱动,未安装请下载

UnSelenium 配置及方法

ExitWhenKill

由于使用了信号机制,在接收到退出信号(ctrl+c、kill)时,会去释放所有已启动的 Driver 的资源
随后 os.Exit() 终结程序执行
如果不想终结程序执行,比如你有自己的信号程序,那么可以将该参数设置为 false

unselenium.ExitWhenKill  = false // 默认是 true

Drivers

可以获取所有已启动的 Driver

unselenium.Drivers

StopAll

主动调用,释放所有已开启的 Driver 的资源

unselenium.StopAll()

使用

Config

结构体如下:

type Config struct {
	// 必传参数
	DriverPath string // 驱动路径

	// 无则自动设置
	ChromePath       string   // 浏览器路径
	ShowLog          bool     // 浏览器自己的日志:默认 false
	DriverArgs       []string // 启动 selenium 的配置
	UserDataDir      string   // 用户目录
	Language         string   // 语言:默认 zh-CN
	Headless         bool     // 无头模式:默认 false
	DisableMaxWindow bool     // 禁用全屏:默认 false
	Welcome          bool     // 启动欢迎页面:默认 false
	Sandbox          bool     // 沙箱:默认 false
	LogLevel         int      // 日志级别:默认 0

	// 自动配置:不需要自己设置
	Host       string // 远程连接的 ip
	ChromeAddr string // 远程连接的地址:chrome 的
	DriverAddr string // 远程连接的地址:driver 的
	ChromePort int    // 远程连接的端口:chrome 的
	DriverPort int    // 远程连接的端口:driver 的
}

示例:创建 Config
一般传 DriverPath 即可,如果是无头,设置下 Headless 就行

config := unselenium.NewConfig(
    unselenium.SetDriverPath("C:\\Program Files\\Python38\\chromedriver.exe"),
    unselenium.SetHeadless(),
    // unselenium.SetArgs("--headless=new"), // 自定义参数可以使用该方法
)

Driver

结构体如下:

type Driver struct {
	Config             *Config            // 配置信息
	Chrome             *exec.Cmd          // 代表启动 Chrome 的进程
	Driver             *exec.Cmd          // 代表启动 Chrome 的进程
	ChromeCancel       context.CancelFunc // 取消执行函数
	DriverCancel       context.CancelFunc // 取消执行函数
	selenium.WebDriver                    // 代表 Selenium Driver:这样写就会拥有其方法
	HasStop            bool               // 是否已关闭
	Locker             sync.Mutex         // 锁:用来防止重复停止
}

示例:创建 Driver
Driver 只要使用 selenium.WebDriver 下的方法就行,其余不用关注

driver, err := unselenium.NewDriver(unselenium.NewConfig(
    unselenium.SetDriverPath("C:\\Program Files\\Python38\\chromedriver.exe"),
    unselenium.SetHeadless(),
))
if err != nil {
    glog.Fatalln(err)
}

完整示例

func main() {
	// 启动 Driver
	driver, err := unselenium.NewDriver(unselenium.NewConfig(
		unselenium.SetDriverPath("C:\\Program Files\\Python38\\chromedriver.exe"),
		unselenium.SetHeadless(),
	))
	if err != nil {
		glog.Fatalln(err)
	}

	// 关闭浏览器及其服务(该方法被重写了)
	defer driver.Quit()

	// 测试 cdp 命令
	driver.ExecuteCDPScript("window.GK = 123;")

	// 检测点通过性查看
	// driver.Get("https://bot.sannysoft.com/")

	// 访问测试
	driver.Get("https://nowsecure.nl/")

	// 延迟关闭
	time.Sleep(10 * time.Second)

	// 保存图片测试,验证无头模式正常运行
	file, _ := os.Create("xxx.png")
	content, _ := driver.Screenshot()
	file.Write(content)
}