0

ターゲットサーバーから直接取得できない特定の応答を得ることを目指していますが、Webドライバを使用して一度ロードされたWebページの固有のJavaScriptコードによって開始された要求を起動するなどのテクニックを使用します。要求にはサーバー側の検証用のコードが含まれていますが、現在は生成アルゴリズムをデコードできません。ネットワークトラフィックを傍受してchromedp(または代替)を使用して応答を取得するにはどうすればよいですか?

Chromeの「開発者向けツール」は、リクエストとレスポンスを検査する便利な方法を提供します。chromedpなどの強力なライブラリを使用してプロセスを自動化する必要があります。

AFAIK networkパッケージは、GetResponseBody機能を提供しますが、requestIDパラメータが必要です。特定のリクエストIDを取得するにはどうすればよいですか?

cdp.ActionFunc(func(ctxt context.Context, h cdptypes.Handler) error { 
     rptn := &network.RequestPattern{ 
      ResourceType: page.ResourceTypeScript, 
     } 
     network.SetRequestInterception([]*network.RequestPattern{rptn}).Do(ctxt, h) 

     //begin interception 
     network.ContinueInterceptedRequest("AlphaInterceptor").Do(ctxt, h) 

     //How to identify the requestID? 
     network.GetResponseBody("???") 

     ... 
} 
+0

これはwebdriverでなぜタグ付けしましたか? AFAICT、それはwebdriverとは関係ありません。 – CMerrill

+0

@CMerrill申し訳ありませんが、Webドライバは実際にはより広いトピックです。何か不便な点がある場合は、そのタグを削除します。 – carusyte

答えて

0

chromedpのlibがその時点で完全ではなかったようです。私はイベントのリスニングメカニズムを実装し、pull requestを提出しました。必要な場合は、ネットワークイベントをリッスンして特定のサーバーリソースを取得し、RequestIDとレスポンスボディを取得することができます。

cdp.Tasks{ 
    cdp.ActionFunc(func(ctxt context.Context, h cdptypes.Handler) error { 
     go func() { 
      echan := h.Listen(cdptypes.EventNetworkRequestWillBeSent, cdptypes.EventNetworkLoadingFinished) 
      for d := range echan { 
       switch d.(type) { 
       case *network.EventRequestWillBeSent: 
        req := d.(*network.EventRequestWillBeSent) 
        if strings.HasSuffix(req.Request.URL, "/data_I_want.js") { 
         reqId1 = req.RequestID 
        } else if strings.HasSuffix(req.Request.URL, "/another_one.js") { 
         reqId2 = req.RequestID 
        } 
       case *network.EventLoadingFinished: 
        res := d.(*network.EventLoadingFinished) 
        var data []byte 
        var e error 
        if reqId1 == res.RequestID { 
         data, e = network.GetResponseBody(reqId1).Do(ctxt, h) 
        } else if reqId2 == res.RequestID { 
         data, e = network.GetResponseBody(reqId2).Do(ctxt, h) 
        } 
        if e != nil { 
         panic(e) 
        } 
        if len(data) > 0 { 
         fmt.Printf("=========data: %+v\n", string(data)) 
        } 
       } 
      } 
     }() 
     return nil 
    }), 
    cdp.Navigate(url), 
    ... 
} 
関連する問題