Skip to content

m4p1e/chromedp

 
 

Repository files navigation

Installing

Install in the usual Go way:

go get -u github.com/m4p1e/chromedp

Callback_Function For Events

There is no way for me to add callback_function for the events from chrome devtools,so i just add it and delete something i think useless(Raw js should exec in the Page context),fixed something,if u have good question pls tell me !

Examples

CallbackFunc(method string,func(interface{},*TargetHandler))

u can add a event callbackfunc like that way

package main

import(
	cdp  "github.com/chromedp/chromedp"
	"github.com/chromedp/cdproto/network"
	"github.com/chromedp/chromedp/runner"
	"log"
	"time"
	"github.com/fatih/color"
	"context"

)


func main() {

	var err error

	// create context
	ctxt, cancel:= context.WithCancel(context.Background())

	defer cancel()

	// create chrome instance cdp.WithLog(log.Printf)
	c, err := cdp.New(ctxt,cdp.WithRunnerOptions(
    runner.Flag("headless", true),
    runner.Flag("disable-gpu", true),
    runner.Flag("no-first-run", true),
    runner.Flag("no-default-browser-check", true),
    runner.Flag("no-sandbox",true),
    runner.RemoteDebuggingPort(9222),
))
	if err != nil {
		log.Fatal(err)
	}

	err = c.Run(ctxt, task(ctxt))
	if err != nil {
		log.Fatal(err)
	}

	err = c.Shutdown(ctxt)

	if err != nil {
		log.Fatal(err)
	}

	err = c.Wait()
	
	if err != nil {

		log.Println(err)

	}



}

func task(ctx context.Context)cdp.Tasks{
	return cdp.Tasks{
		cdp.CallbackFunc("Network.requestWillBeSent", func(param interface{},handler *cdp.TargetHandler){
					data := param.(*network.EventRequestWillBeSent)
					color.Red(data.Request.URL)				
					}),
		cdp.Navigate(`https://www.baidu.com`),
		cdp.Sleep(10* time.Second),
	}
}

the handler *cdp.Targethandler is for callbackfunc does next command

package main

import(
	cdp  "github.com/chromedp/chromedp"
	"github.com/chromedp/cdproto/network"
	"github.com/chromedp/chromedp/runner"
	"log"
	"time"
	"github.com/fatih/color"
	"context"

)


func main() {

	var err error

	// create context
	ctxt, cancel:= context.WithCancel(context.Background())

	defer cancel()

	// create chrome instance cdp.WithLog(log.Printf)
	c, err := cdp.New(ctxt,cdp.WithRunnerOptions(
    runner.Flag("headless", true),
    runner.Flag("disable-gpu", true),
    runner.Flag("no-first-run", true),
    runner.Flag("no-default-browser-check", true),
    runner.Flag("no-sandbox",true),
    runner.RemoteDebuggingPort(9222),
))
	if err != nil {
		log.Fatal(err)
	}

	err = c.Run(ctxt, task(ctxt))
	if err != nil {
		log.Fatal(err)
	}

	err = c.Shutdown(ctxt)

	if err != nil {
		log.Fatal(err)
	}

	err = c.Wait()
	
	if err != nil {

		log.Println(err)

	}



}

func task(ctx context.Context)cdp.Tasks{
	return cdp.Tasks{
		cdp.CallbackFunc("Network.requestWillBeSent", func(param interface{},handler *cdp.TargetHandler){
					data := param.(*network.EventRequestWillBeSent)
					color.Red(data.Request.URL)				
					}),
		network.SetRequestInterception([]*network.RequestPattern{
					&network.RequestPattern{
					URLPattern:"*",ResourceType:"Document",
					},
				}),
		cdp.CallbackFunc("Network.requestIntercepted", func(param interface{},handler *cdp.TargetHandler){
						data := param.(*network.EventRequestIntercepted)
				
						json_byte,_:= data.MarshalJSON()

						var out bytes.Buffer

						 _ = json.Indent(&out, json_byte,"","\t")

						fmt.Println(out.String())

						network.ContinueInterceptedRequest(data.InterceptionID).WithHeaders(network.Headers{"key":"val",}).Do(ctx,handler)  //add hander for each dom request

					}),
		cdp.Navigate(`https://www.baidu.com`),
		cdp.Sleep(10* time.Second),
	}
}

chromedp i wantted to rewrite its handler.go,i think its not flexible, its only does for itself CDP's Method .hope u guys like it :)

About

A faster, simpler way to drive browsers supporting the Chrome DevTools Protocol.

Resources

License

Stars

Watchers

Forks

Packages

No packages published

Languages

  • Go 96.1%
  • HTML 2.9%
  • Shell 1.0%