流HAR事件

时间:2017-06-22 15:19:24

标签: har

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

他们无论如何都要流动#34;事件" HAR文件的数组,所以我可以在生成它们时对它们进行处理?

这可以是firefox或chrome。

1 个答案:

答案 0 :(得分: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
}