Files
antigravity-skills-reference/skills/go-rod-master/examples/request_hijacking.go
8hoursking 37349607ae New skill - go-rod-master. Browser automation with Golang (#83)
* New skill - go-rod-master. Pretty big skill for browser automation with go and go-rod.

* chore: sync generated registry files

---------

Co-authored-by: 8hoursking <user@MacBook-Pro-user.local>
2026-02-16 07:20:43 +01:00

86 lines
2.4 KiB
Go

package main
import (
"fmt"
"net/http"
"time"
"github.com/go-rod/rod"
"github.com/go-rod/rod/lib/proto"
"github.com/go-rod/stealth"
)
// request_hijacking demonstrates intercepting and modifying network requests
// using Rod's HijackRequests API.
func main() {
browser := rod.New().
Timeout(time.Minute).
MustConnect()
defer browser.MustClose()
// --- Example 1: Block image requests to save bandwidth ---
router := browser.HijackRequests()
defer router.MustStop()
// Block all PNG and JPEG image requests
router.MustAdd("*.png", func(ctx *rod.Hijack) {
ctx.Response.Fail(proto.NetworkErrorReasonBlockedByClient)
})
router.MustAdd("*.jpg", func(ctx *rod.Hijack) {
ctx.Response.Fail(proto.NetworkErrorReasonBlockedByClient)
})
// Modify request headers for API calls
router.MustAdd("*api.*", func(ctx *rod.Hijack) {
ctx.Request.Req().Header.Set("X-Custom-Header", "go-rod")
ctx.Request.Req().Header.Set("Authorization", "Bearer my-token")
// Load the actual response from the server
if err := ctx.LoadResponse(http.DefaultClient, true); err != nil {
fmt.Printf("Failed to load response: %v\n", err)
return
}
fmt.Printf("API response status: %d\n", ctx.Response.Payload().ResponseCode)
})
// Inject JavaScript into every JS file loaded
router.MustAdd("*.js", func(ctx *rod.Hijack) {
if err := ctx.LoadResponse(http.DefaultClient, true); err != nil {
return
}
// Append tracking code to all JavaScript files
body := ctx.Response.Body()
ctx.Response.SetBody(body + "\n// Monitored by go-rod")
})
// IMPORTANT: Start the router in a goroutine
go router.Run()
// Use stealth page for anti-detection
page := stealth.MustPage(browser)
page.MustNavigate("https://example.com").MustWaitLoad()
fmt.Println("Page loaded with request hijacking active")
fmt.Println("Title:", page.MustElement("title").MustText())
// --- Example 2: Capture and log all network requests ---
// (Using a separate page to show different patterns)
page2 := stealth.MustPage(browser)
// Enable network domain for request logging
proto.NetworkEnable{}.Call(page2)
// Listen for network responses
go page2.EachEvent(func(e *proto.NetworkResponseReceived) {
fmt.Printf(" [%d] %s %s\n",
e.Response.Status,
e.Type.String(),
e.Response.URL,
)
})()
page2.MustNavigate("https://example.com").MustWaitLoad()
fmt.Println("\nNetwork log above shows all requests captured")
}