chromedp.ProxyServer 是浏览器启动选项。应当把它应用在创建 Chromium 进程的 allocator 上:

opts := append(chromedp.DefaultExecAllocatorOptions[:],
    chromedp.ProxyServer("http://proxy.example:8080"),
)
allocCtx, cancelAllocator := chromedp.NewExecAllocator(
    context.Background(), opts...,
)
defer cancelAllocator()

tabCtx, cancelTab := chromedp.NewContext(allocCtx)
defer cancelTab()
err := chromedp.Run(tabCtx,
    chromedp.Navigate("https://www.example.com/"),
)

这段代码应放在应用已有的函数里,并对 err 做常规的错误处理。NewContext 会从 allocCtx 继承 allocator。若从另一个父级创建 context,就可能在没有该选项的情况下启动另一个浏览器。

proxy URL 指向的是 HTTP 监听端,公开候选可在 HTTP 代理列表中找到;而页面本身仍是 HTTPS 目标。ProxyServer 对应 Chromium 的 --proxy-server 参数,与 Go 的 net/http 代理配置无关。

Chromium 不接受直接写在手动 proxy URL 中的用户名和密码。需要认证的端点要靠受支持的浏览器认证机制或中间层安排;在这个参数里加 user:password 并不等于 HTTP 客户端的 URL 认证。Chrome 的 CDP 认证事件流程就是处理该代理认证挑战的受支持途径之一。

在浏览器工作结束前要保持 allocator 存活。它的取消同样属于进程清理的一部分,而标签页的取消则限定了相关浏览器 context 的范围。

相关文章