如何在带有身份验证标头的浏览器中打开URL?

时间:2019-10-08 12:59:10

标签: go url browser command

在Golang中,我们可以启动浏览器窗口以使用exec.Command方法打开URL。可以找到一个示例here

我的问题是我们如何打开带有标题的URL?

1 个答案:

答案 0 :(得分:0)

如果您使用的是Chrome,则可以使用Chrome DevTools Protocol附加到正在运行的Chrome实例,并发出命令导航到具有特定标题的URL。

首先,通过使用标志--remote-debugging-port=9222

启动启用了Chrome Devtools协议的Chrome

您会收到类似于DevTools listening on ws://127.0.0.1:9222/devtools/browser/2393d6e8-a85d-40a2-a79e-13f1585ff336

的回复

将该ws://... URL传递到以下程序中:

package main

import (
    "context"
    "flag"
    "log"

    "github.com/chromedp/cdproto/network"
    "github.com/chromedp/chromedp"
)

func main() {
    var devToolWsURL string
    flag.StringVar(&devToolWsURL, "devtools-ws-url", "", "DevTools Websocket URL")
    flag.Parse()

    // Create contexts.
    actxt, cancelActxt := chromedp.NewRemoteAllocator(context.Background(), devToolWsURL)
    defer cancelActxt()

    // Create new tab.
    ctxt, _ := chromedp.NewContext(actxt)

    // Custom header.
    headers := map[string]interface{}{
        "X-Header": "my request header",
    }

    task := chromedp.Tasks{
        network.Enable(),
        network.SetExtraHTTPHeaders(network.Headers(headers)),
        chromedp.Navigate("http://google.com"),
    }

    // Run task.
    err := chromedp.Run(ctxt, task)
    if err != nil {
        log.Fatal(err)
    }
}

注释:

  • 9222是此协议的默认端口,但是您可以使用任何端口 你想要的。
  • 为简洁起见,我没有包含exec.Command代码。

参考:

更新

Found a simpler way。您可以通过覆盖默认的 headless 选项直接从chromedp启动Chrome:

func main() {
    // Create contexts.
    opts := append(chromedp.DefaultExecAllocatorOptions[:], chromedp.Flag("headless", false))
    actx, cancel := chromedp.NewExecAllocator(context.Background(), opts...)
    ctx, cancel := chromedp.NewContext(actx)

    // Call cancel() to close Chrome on some condition.
    if false {
        cancel()
    }

    // Custom header.
    headers := map[string]interface{}{
        "X-Header": "my request header",
    }

    task := chromedp.Tasks{
        network.Enable(),
        network.SetExtraHTTPHeaders(network.Headers(headers)),
        chromedp.Navigate("http://tested.com"),
    }

    // Run task.
    err := chromedp.Run(ctx, task)
    if err != nil {
        log.Fatal(err)
    }
}