TypeError: response.postData is not a function
TypeError: response.postData is not a function
我下面的代码给出了错误“TypeError:response.postData 不是一个函数”。
const puppeteer = require('puppeteer-extra')
const StealthPlugin = require('puppeteer-extra-plugin-stealth')
var url = ("https://www.adidas.com.tr/yeezy/product/GY1759")
function main(){
puppeteer.use(StealthPlugin())
puppeteer.launch({ headless: false }).then(async browser => {
const page = await browser.newPage()
await page.goto(url)
await page.mouse.click(1000, 40);
await page.on('response', response => {
if (response.url() === "https://www.adidas.com.tr/rhsYl92ry/P4YX/xsLtQ/uJuJSkf31r/JGkkPDcC/QGBAD/nlbSQI"){
console.log(response.postData())
}
});
})
}
main()
我想获取请求的 post 数据,我该怎么做?
Error = "TypeError: response.postData 不是一个函数"
正在阅读 Response
type definition for Puppeteer,看来您还有其他方法可以使用。
await response.json()
或 (await response.buffer()).toString()
这里有几个潜在的误解:
page.on
不是 return 承诺,它注册了一个在事件触发时异步运行的回调。它对 await page.on
具有误导性,因为它使您的代码看起来像是在等待某些东西,但实际上不会。如果你想让你的代码等待它,你需要承诺处理程序,或者链接所有依赖于回调结果的代码。
- 做
click()
,然后on()
可能不是你想要的。通常,您注册 on()
事件侦听器,然后触发触发您要捕获的请求的事件。否则,响应可能会在您有机会设置 on()
侦听器之前到达。
回答你的主要问题,你可以access the original request on the response to get the post data: response.request().postData()
. Note that this is form data only, not a JSON payload (adding a "Content-Type": "application/json"
header and proper JSON body results in undefined -- see issue #5178)。您可能还想直接使用 page.on("request", ...)
,但不清楚您的最终目标是什么。
由于您的代码对我不起作用(hard-coded 坐标点击非常脆弱;更喜欢先进行选择然后点击您定位的元素),我将分享一个最小的、可运行的您可以推断出您的需求的示例:
const puppeteer = require("puppeteer"); // ^13.5.1
const html = `
<body>
<script>
fetch("https://httpbin.org/post", {
method: "POST",
body: "foo=bar",
});
</script>
</body>
`;
let browser;
(async () => {
browser = await puppeteer.launch({headless: true});
const [page] = await browser.pages();
const responsePromise = new Promise(resolve => {
const handler = response => {
if (response.url() === "https://httpbin.org/post") {
page.off(handler);
resolve(response.request().postData());
}
};
page.on("response", handler);
});
await page.setContent(html);
const postData = await responsePromise;
console.log(postData); // => foo=bar
})()
.catch(err => console.error(err))
.finally(() => browser?.close())
;
请注意,所有这些都是迂回的,主要用于说明目的。一种更简洁的方法是使用 page.waitForResponse
,它不需要像 on()
那样的 promisification:
// same html and require as above
let browser;
(async () => {
browser = await puppeteer.launch({headless: true});
const [page] = await browser.pages();
const responsePromise = page.waitForResponse(response =>
response.url() === "https://httpbin.org/post"
);
await page.setContent(html);
const response = await responsePromise;
console.log(response.request().postData()); // => foo=bar
})()
.catch(err => console.error(err))
.finally(() => browser?.close())
;
我下面的代码给出了错误“TypeError:response.postData 不是一个函数”。
const puppeteer = require('puppeteer-extra')
const StealthPlugin = require('puppeteer-extra-plugin-stealth')
var url = ("https://www.adidas.com.tr/yeezy/product/GY1759")
function main(){
puppeteer.use(StealthPlugin())
puppeteer.launch({ headless: false }).then(async browser => {
const page = await browser.newPage()
await page.goto(url)
await page.mouse.click(1000, 40);
await page.on('response', response => {
if (response.url() === "https://www.adidas.com.tr/rhsYl92ry/P4YX/xsLtQ/uJuJSkf31r/JGkkPDcC/QGBAD/nlbSQI"){
console.log(response.postData())
}
});
})
}
main()
我想获取请求的 post 数据,我该怎么做?
Error = "TypeError: response.postData 不是一个函数"
正在阅读 Response
type definition for Puppeteer,看来您还有其他方法可以使用。
await response.json()
或 (await response.buffer()).toString()
这里有几个潜在的误解:
page.on
不是 return 承诺,它注册了一个在事件触发时异步运行的回调。它对await page.on
具有误导性,因为它使您的代码看起来像是在等待某些东西,但实际上不会。如果你想让你的代码等待它,你需要承诺处理程序,或者链接所有依赖于回调结果的代码。- 做
click()
,然后on()
可能不是你想要的。通常,您注册on()
事件侦听器,然后触发触发您要捕获的请求的事件。否则,响应可能会在您有机会设置on()
侦听器之前到达。
回答你的主要问题,你可以access the original request on the response to get the post data: response.request().postData()
. Note that this is form data only, not a JSON payload (adding a "Content-Type": "application/json"
header and proper JSON body results in undefined -- see issue #5178)。您可能还想直接使用 page.on("request", ...)
,但不清楚您的最终目标是什么。
由于您的代码对我不起作用(hard-coded 坐标点击非常脆弱;更喜欢先进行选择然后点击您定位的元素),我将分享一个最小的、可运行的您可以推断出您的需求的示例:
const puppeteer = require("puppeteer"); // ^13.5.1
const html = `
<body>
<script>
fetch("https://httpbin.org/post", {
method: "POST",
body: "foo=bar",
});
</script>
</body>
`;
let browser;
(async () => {
browser = await puppeteer.launch({headless: true});
const [page] = await browser.pages();
const responsePromise = new Promise(resolve => {
const handler = response => {
if (response.url() === "https://httpbin.org/post") {
page.off(handler);
resolve(response.request().postData());
}
};
page.on("response", handler);
});
await page.setContent(html);
const postData = await responsePromise;
console.log(postData); // => foo=bar
})()
.catch(err => console.error(err))
.finally(() => browser?.close())
;
请注意,所有这些都是迂回的,主要用于说明目的。一种更简洁的方法是使用 page.waitForResponse
,它不需要像 on()
那样的 promisification:
// same html and require as above
let browser;
(async () => {
browser = await puppeteer.launch({headless: true});
const [page] = await browser.pages();
const responsePromise = page.waitForResponse(response =>
response.url() === "https://httpbin.org/post"
);
await page.setContent(html);
const response = await responsePromise;
console.log(response.request().postData()); // => foo=bar
})()
.catch(err => console.error(err))
.finally(() => browser?.close())
;