Как отправить несколько файлов cookie на два запроса в Puppeteer с авторизацией? - PullRequest
0 голосов
/ 29 августа 2018

Я пытаюсь скачать pdf с сайта, требующего авторизации. Я проверил это в Почтальоне, и все, что мне нужно сделать для успешного ответа:

  1. Отправьте запрос GET на URL-адрес iframe с файлами cookie страницы. IFrame - это место, где размещается PDF. Сначала я делаю это, чтобы получить куки-файл ответа, который мне нужен для запроса PDF.
  2. Верните ответ HTML, возьмите src iFrame, который указывает на фактический файл .pdf.
  3. Отправьте запрос GET на ссылку .pdf src, чтобы получить PDF (с созданным файлом cookie).

Проблема в том, что в Почтальоне мне не нужно вводить информацию авторизации, чтобы получить успешный ответ, но в моем скрипте ответ, который я получаю, всегда неверный логин. Кроме того, необходимо отправить несколько файлов cookie, поэтому это может быть моей проблемой.

Вот мой код. Как мне сделать эту работу?

const puppeteer = require("puppeteer");
const fs = require("fs");
const fetch = require("node-fetch");

let scrape = async () => {
  const browser = await puppeteer.launch();
  const page = await browser.newPage();

  let login = "example";
  let pwd = "password";

  await page.goto(
    "example.com"
  );
  await page.type("#LMDP_Spi_tmp", login);
  await page.type("#LMDP_Password_tmp", pwd);
  await page.click("#fg_lmdp_pwd > div > div.col-xs-5.col-sm-4 > button");
  await page.waitFor(1000);
  await page.goto("second/page/path");
  await page.waitForSelector(
    "body > table:nth-child(2) > tbody > tr:nth-child(4) > td > table > tbody > tr:nth-child(2) > td > table > tbody > tr > td:nth-child(5) > a"
  );
  await page.click(
    "body > table:nth-child(2) > tbody > tr:nth-child(4) > td > table > tbody > tr:nth-child(2) > td > table > tbody > tr > td:nth-child(5) > a > img"
  );

 const downloadUrl = "IFRAME URL"
 let sessionCookie = (await page.cookies());

  const downloadUserData = async sessionCookie => {
  console.log("requesting data");
  const res = await fetch(downloadUrl, {
      headers: {
        method: "GET",
        Cookie: sessionCookie,
        credentials: 'same-origin',
        Accept: 'text/html'
      }
    }).then(res => res.text())
    .then(body => console.log(body));

    let pdfURL = //something I need to grab from the iFrame's src!


  const pdf = await fetch(pdfUrl, {
      headers: {
        method: "GET",
        Cookie: sessionCookie
      }
    })

  fs.writeFile("doc.pdf", pdf, function(err) {
    if (err) {
      return console.log(err);
    }
    console.log("The file was saved!");
  }) 
  };
  return await downloadUserData(sessionCookie);
};





scrape();
...