如何在木偶操作员请求POST?

J. *_*Doe 9 https google-chrome http google-chrome-headless puppeteer

(async() => {
    const browser = await puppeteer.launch();
    const page = await browser.newPage();
    await page.goto('https://www.example.com/search');
    const data = await page.content();
    browser.close();
    res.send(data);
})();
Run Code Online (Sandbox Code Playgroud)

我为发送get请求执行此代码.我不明白我应该如何发送post请求?

小智 15

获得正确的"订单"可能是一个挑战.文档没有那么多的例子......在示例文件夹中的存储库中有一些多汁的项目,你一定要看一下.

https://github.com/GoogleChrome/puppeteer/tree/master/examples

这是一个例子; 将以下内容放入异步块:

    // Create browser instance, and give it a first tab
    const browser = await puppeteer.launch();
    const page = await browser.newPage();

    // Allows you to intercept a request; must appear before
    // your first page.goto()
    await page.setRequestInterception(true);

    // Request intercept handler... will be triggered with 
    // each page.goto() statement
    page.on('request', interceptedRequest => {

        // Here, is where you change the request method and 
        // add your post data
        var data = {
            'method': 'POST',
            'postData': 'paramFoo=valueBar&paramThis=valueThat'
        };

        // Request modified... finish sending! 
        interceptedRequest.continue(data);
    });

    // Navigate, trigger the intercept, and resolve the response
    const response = await page.goto('https://www.example.com/search');     
    const responseBody = await response.text();
    console.log(responseBody);

    // Close the browser - done! 
    await browser.close();
Run Code Online (Sandbox Code Playgroud)

  • 我必须添加 [下面 Dmitry Sheiko 的答案](/sf/answers/4142152101/) 中的 `"Content-Type": "application/x-www-form-urlencoded"` 标头工作。 (3认同)

Dmi*_*iko 10

这是 Puppeteer 2.0.0 的完整示例:

    const puppeteer = require("puppeteer");
    const devices = require("puppeteer/DeviceDescriptors");

    async function main() {
      const browser = await puppeteer.launch({
        args: ["--enable-features=NetworkService", "--no-sandbox"],
        ignoreHTTPSErrors: true
      });
      const page = await browser.newPage();

      await page.setRequestInterception(true);

      page.once("request", interceptedRequest => {
        interceptedRequest.continue({
          method: "POST",
          postData: "foo=FOO&bar=BAR",
          headers: {
            ...interceptedRequest.headers(),
            "Content-Type": "application/x-www-form-urlencoded"
          }
        });
      });

      const response = await page.goto("https://postman-echo.com/post");

      console.log({
        url: response.url(),
        statusCode: response.status(),
        body: await response.text()
      });

      await browser.close();
    }

    main();

Run Code Online (Sandbox Code Playgroud)

请注意,如果您检查response.request().method()它不会更新(仍然是GET)


wee*_*eix 10

您可以使用Page.evaluate() 方法在浏览器中运行Fetch API 。例如:

const postResponse = await page.evaluate( async (param1, param2, param3) => {
  const response = await fetch("https://www.example.com/add", {
    "headers": {
      "content-type": "application/x-www-form-urlencoded; charset=UTF-8"
    },
    "body": `param1=${param1}&param2=${param2}&param3=${param3}`,
    "method": "POST"
  });
  const data = await response.json();
  return data;
}, param1, param2, param3);
Run Code Online (Sandbox Code Playgroud)


mop*_*led 9

方式setRequestInterception'request'活动的运作有一个怪癖。一旦激活,Puppeteer 会将 POST 数据发送到页面上的每个资源,而不仅仅是原始请求的页面。我遇到的问题是,一旦我在 Puppeteer 中添加了 POST 数据,我的所有页面资源(脚本、CSS)都无法加载。

由于我只想将 POST 数据应用于第一个请求,因此此代码对我有用:

// Used for serializing POST parameters from an object
const querystring = require('querystring');

// ...

const browser = await puppeteer.launch();
const page = await browser.newPage();

let postData = {a: 1, b: 2};

await page.setRequestInterception(true);

page.once('request', request => {
    var data = {
        'method': 'POST',
        'postData': querystring.stringify(postData),
        'headers': {
            ...request.headers(),
            'Content-Type': 'application/x-www-form-urlencoded'
        },
    };

    request.continue(data);

    // Immediately disable setRequestInterception, or all other requests will hang
    page.setRequestInterception(false);
});

const response = await page.goto('https://www.example.com/');
Run Code Online (Sandbox Code Playgroud)

  • 真希望我在 5 小时前就已经向下滚动了。我发现在 Express 应用程序中使用 puppeteer 制作动态 PDF 时,禁用请求拦截绝对至关重要。这一行就是我继续前进所需要的一切! (3认同)