go-rod / rod

A Chrome DevTools Protocol driver for web automation and scraping.

Home Page:https://go-rod.github.io

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

Limit the number of redirects and store all accessed URLs

and0x00 opened this issue · comments

Rod Version: v0.116.0

The code to demonstrate your question

Hello, how could I implement rod.Hijack in order to allow a limited number of redirects when accessing a web page? I would also like to store all pages accessed, is this possible? THANKS!!!

My current code looks like this:

package browser

import (
 "log"
 "time"

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

// Browser struct represents the browser.
type Browser struct {
 browser *rod.Browser
 pages   []*Page
 debug   bool
}

// Page struct represents the browser page.
type Page struct {
 page         *rod.Page
 stealth      bool
 url          string
 maxRedirects int
}

// NewBrowser initializes a new Browser instance.
func NewBrowser(debug bool) *Browser {
 return &Browser{
 	debug: debug,
 }
}

// Initialize starts the browser.
func (b *Browser) Start() error {
 log.Println("Initializing browser...")

 // Launcher configuration
 l := launcher.New()
 if b.debug {
 	l = l.Headless(false).Devtools(true)
 }
 defer l.Cleanup()

 // Launching the browser
 launchURL, err := l.Launch()
 if err != nil {
 	log.Printf("Failed to launch browser: %v\n", err)
 	return err
 }

 log.Printf("Browser launched at URL: %s\n", launchURL)
 b.browser = rod.New().ControlURL(launchURL)

 if b.debug {
 	b.browser = b.browser.Trace(true).SlowMotion(3 * time.Second)
 }

 // Connecting to the browser
 err = b.browser.Connect()
 if err != nil {
 	log.Printf("Failed to connect to browser: %v\n", err)
 	return err
 }
 log.Println("Browser connected successfully.")

 err = b.NewPage("https://youtube.com", true, 1)
 if err != nil {
 	log.Printf("Failed to open initial blank page: %v\n", err)
 	return err
 }

 log.Println("Page created, waiting for load and stability...")
 b.pages[0].page.MustWaitLoad().MustWaitStable()
 log.Println("Page opened successfully.")
 return nil
}

// NewPage creates a new page in the browser.
func (b *Browser) NewPage(url string, isStealth bool, maxRedirects int) error {

 var err error
 var rodPage *rod.Page

 if isStealth {
 	if b.debug {
 		log.Fatalln("Stealth mode is not supported in debug mode.")
 	}
 	log.Printf("Creating stealth page for URL: %s\n", url)
 	rodPage, err = stealth.Page(b.browser)
 	if err != nil {
 		log.Printf("Failed to create stealth page: %v\n", err)
 		return err
 	}
 } else {
 	log.Printf("Creating new page for URL: %s\n", url)
 	rodPage, err = b.browser.Page(proto.TargetCreateTarget{URL: url})
 	if err != nil {
 		log.Printf("Failed to create new page: %v\n", err)
 		return err
 	}
 }
 rodPage.MustNavigate(url)
 time.Sleep(5 * time.Second)

 page := &Page{
 	page:         rodPage,
 	url:          url,
 	stealth:      isStealth,
 	maxRedirects: maxRedirects,
 }
 b.pages = append(b.pages, page)

 log.Println("New page created successfully.")
 return nil
}

google "golang http client CheckRedirect"