Chrome DevTools 协议获取域 - getResponseBody - 显然因 HTTP 重定向而失败

我希望收集 HTTP 请求的正文,包括页面重定向到其他地方时。显然,我可以使用非 Fetch 域机制,例如 Network.getResponseBody 。这适用于重定向链中的“最终”页面,但不能用于中间页面,因为 Chrome 在转到下一个重定向目标时似乎会转储内容。

所以,我实现了 Fetch.enable ( { patterns: [ { requestStage: Response } ] } ) (使用 PHP,但细节无关紧要,如您所见)。此方法调用不返回错误。然后执行 Page.navigate 之后,我等待包含成员 Fetch.requestPausedrequestIdresponseStatusCoderesponseHeaders 事件,然后发送 Fetch.getResponseBody (使用 requestId 来自 Fetch.requestPaused ) 并且我得到的响应取决于对页面本身的实际响应是什么。因此,对于 200 ,我得到一个响应正文(欢呼),但对于 30x( 301302 等),我总是得到错误代码 -32000 和消息 {JXM= }。现在,即使 Chrome DevTools 协议 (CDP) 不打算捕获 HTTP 重定向页面的正文,发出该错误消息(在我看来)与 "Can only get response body on requests captured after headers received" 事件数据不一致。顺便说一句,带有内容触发重定向(通过 META 元素或 JavaScript)的页面可以被捕获,我认为是因为它们返回 200 状态代码。

那么,问题是我正在关注的调用序列还是 Fetch.requestPaused 返回的错误消息中的问题,我是否正确假设 CDP 不打算捕获重定向链中的文档主体(除了最后一个, 明显地)?

stack overflow Chrome DevTools Protocol Fetch Domain - getResponseBody - apparently fails with HTTP redirects
原文答案

答案:

作者头像

您需要在 301/302 上继续请求并让浏览器跟随它(重定向中没有正文):

    if (
      params.responseStatusCode === 301 || params.responseStatusCode === 302
    ) {
      await this.#client.send('Fetch.continueRequest', {
        requestId,
      });
    } else {
      // get body here
      const responseCdp = await this.#client.send('Fetch.getResponseBody', {
        requestId,
      });

      await this.#client.send('Fetch.fulfillRequest', {
        requestId,
        responseCode: params.responseStatusCode,
        responseHeaders: params.responseHeaders,
        body: responseCdp.body,
      });
    }