Если вы используете Chrome, вы можете использовать Chrome DevTools Protocol , чтобы присоединиться к работающему экземпляру Chrome и выполнить команду для перехода к URL с определенными заголовками.
Во-первых,Запустите Chrome с включенным протоколом Chrome Devtools, используя флаг --remote-debugging-port=9222
. Вы получите ответ, аналогичный 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 является портом по умолчанию для этого протокола, но вы можете использовать любой порт, который хотите.
- Я не сделалt включает код
exec.Command
для краткости.
Ссылки:
ОБНОВЛЕНИЕ
Найден более простой способ . Вы можете просто запустить Chrome прямо из chromedp
, переопределив параметр по умолчанию без головы :
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)
}
}