Я пытаюсь скачать pdf с сайта, требующего авторизации. Я проверил это в Почтальоне, и все, что мне нужно сделать для успешного ответа:
- Отправьте запрос GET на URL-адрес iframe с файлами cookie страницы. IFrame - это место, где размещается PDF. Сначала я делаю это, чтобы получить куки-файл ответа, который мне нужен для запроса PDF.
- Верните ответ HTML, возьмите src iFrame, который указывает на фактический файл .pdf.
- Отправьте запрос 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();