0

我有一个长时间运行的应用程序,我想实时监控它。HAR 文件允许我在事后执行此操作,但由于它们是“存档”,它们不允许我实时执行此操作。

他们是否无论如何都要流式传输 HAR 文件的“事件”数组,以便我可以在生成它们时对其进行处理?

这可以是 Firefox 或 chrome。

4

1 回答 1

0

因此,在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
}
于 2017-06-23T08:01:56.397 回答