【问题标题】:How can I fetch an url using session data from puppeteer page?如何使用 puppeteer 页面中的会话数据获取 url?
【发布时间】:2019-06-17 02:55:40
【问题描述】:

我正在尝试使用我的凭据进入网站并使用 puppeter 下载 pdf。我使用 puppeteer 获得了 pdf url,但现在我想使用 node-fetch 来访问该页面。要获取 pdf 页面,我需要在选项中包含会话数据,但我不知道我这样做是否正确。

我尝试使用 'credentials: 'include',使用 page.cookies 获取 cookie,并在 fetch 发送的选项中进行其他小的修改。

 var response = await page.goto(urlPdf);
 var headersPup = response.request().headers(); 

 const { cookies } = await page._client.send("Network.getAllCookies", {});

  const sessionFreeCookies = cookies.map((cookie) => {
    return {
      ...cookie,
      expires: Date.now() / 1000 + 10 * 60,
      session: false
    };
  });

  headersPup['Cookie'] = sessionFreeCookies; //adding the cookies to header
  headersPup['Content-Type'] = 'application/pdf';//adding content-type

  var opts = {
      method: "GET",
      headers: headersPup,
      credentials: "include",
  }

  await fetch(urlPdf,opts).then(response => response
    .body.pipe(fs.createWriteStream('test4.pdf'))
    .on('close', () => console.log('pdf downloaded')));

当我以 txt 格式打开 test4 时,我可以看到登录页面 html,这意味着我失去了会话。如何保留会话以下载我的 pdf?

【问题讨论】:

    标签: node.js session puppeteer node-fetch


    【解决方案1】:

    当然 fetch 方法不能保持会话,它没有在你的无头浏览器中打开。

    不幸的是,puppeteer 似乎不支持 pdf 下载:https://github.com/GoogleChrome/puppeteer/issues/1248

    通常要登录,您需要先转到(loginPage)然后转到您需要的页面,cookie 在页面对象中进行管理。

    【讨论】:

    • 看来我误解了如何使用 fetch。事实上,我使用 fetch 是因为我知道使用 puppeteer 不支持 pdf 下载,所以我想使用 puppeteer 到达那里(因为它更容易),然后使用 fetch 和会话数据完成工作。我真的不明白你的意思:“当然 fetch 方法不能保持会话,它不是在你的无头浏览器中打开的。”有没有办法改变我的代码,这样我就可以在不使用 puppeteer 和 chromium 的情况下获取?顺便说一句,谢谢你的回答!
    • 你确定你在做 const { cookies } = await page._client.send("Network.getAllCookies", {}); 时登录了 puppeteer ?
    • 是的,因为我正在使用“headless = false”进行调试,它会一直运行到 pdf 没有问题(或者如果我设置为直到那里并在那里获取 cookie,则直到前一页)。饼干似乎是对的。
    猜你喜欢
    • 2019-04-17
    • 1970-01-01
    • 2013-08-10
    • 2020-02-27
    • 2019-08-21
    • 1970-01-01
    • 2020-09-23
    • 2012-06-27
    • 1970-01-01
    相关资源
    最近更新 更多