* 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>
86 lines
2.4 KiB
Go
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")
|
|
}
|