0
我有一個長時間運行的應用程序,我想實時監控。 HAR文件允許我在事後做到這一點,但由於它們是「存檔」,因此它們不允許我實時執行此操作。流HAR事件
他們無論如何都要流式處理HAR文件的「events」數組,以便在生成它們時處理它們?
這可以是Firefox或Chrome。
我有一個長時間運行的應用程序,我想實時監控。 HAR文件允許我在事後做到這一點,但由於它們是「存檔」,因此它們不允許我實時執行此操作。流HAR事件
他們無論如何都要流式處理HAR文件的「events」數組,以便在生成它們時處理它們?
這可以是Firefox或Chrome。
所以從https://github.com/mafredri/cdp/tree/master/example/screencast一些幫助,我想通了如何使用Chrome的調試API
這段代碼沒有做的是要求身體綁到響應(如果是不可用)爲此在去,但正如我所示RequestID
將是一致的,所以如果一個序列化事件處理(比如通過鎖定),可以保存主體並在發現響應事件時使用它。
package main
import (
"context"
"log"
"github.com/mafredri/cdp"
"github.com/mafredri/cdp/cdpcmd"
"github.com/mafredri/cdp/devtool"
"github.com/mafredri/cdp/rpcc"
)
func main() {
if err := run(); err != nil {
panic(err)
}
}
func run() error {
ctx, cancel := context.WithCancel(context.TODO())
defer cancel()
devt := devtool.New("http://localhost:9222")
page, err := devt.Get(ctx, devtool.Page)
if err != nil {
return err
}
conn, err := rpcc.DialContext(ctx, page.WebSocketDebuggerURL)
if err != nil {
return err
}
defer conn.Close()
c := cdp.NewClient(conn)
err = c.Page.Enable(ctx)
if err != nil {
return err
}
loadEventFired, err := c.Page.LoadEventFired(ctx)
if err != nil {
return err
}
_, err = c.Page.Navigate(ctx, cdpcmd.NewPageNavigateArgs("https://github.com/"))
if err != nil {
return err
}
_, err = loadEventFired.Recv()
if err != nil {
return err
}
loadEventFired.Close()
a := &cdpcmd.NetworkEnableArgs{}
a.SetMaxResourceBufferSize(32000)
a.SetMaxTotalBufferSize(96000)
err = c.Network.Enable(ctx, a)
responseEvents, err := c.Network.ResponseReceived(ctx)
requestEvents, err := c.Network.RequestWillBeSent(ctx)
go func() {
defer responseEvents.Close()
for {
ev, err := responseEvents.Recv()
if err != nil {
log.Printf("Failed to receive network event: %v", err)
return
}
log.Printf("requestid = %v, url = %v", ev.RequestID, ev.Response.URL)
}
}()
go func() {
defer requestEvents.Close()
for {
ev, err := requestEvents.Recv()
if err != nil {
log.Printf("Failed to receive network event: %v", err)
return
}
log.Printf("requestid = %v, url = %v", ev.RequestID, ev.Request.URL)
}
}()
select {}
return nil
}