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>
This commit is contained in:
85
skills/go-rod-master/examples/request_hijacking.go
Normal file
85
skills/go-rod-master/examples/request_hijacking.go
Normal file
@@ -0,0 +1,85 @@
|
||||
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")
|
||||
}
|
||||
Reference in New Issue
Block a user