Chrome DevTools协议获取域-getResponseBody-显然无法通过HTTP重定向



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

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

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

您需要在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,
});
}

最新更新