Получение PDF-файла BLOB-объекта из URL и вставка на диск напрямую с использованием библиотеки кукловода и выборки - PullRequest
0 голосов
/ 15 января 2019

Я пытаюсь использовать puppeteer для входа на веб-сайт и «загрузки» PDF непосредственно на мой диск. Мне удалось добраться до страницы PDF с кукловодом, и я попытался (между другими попытками) получить большой двоичный объект, используя fetch с файлами cookie для отправки на диск. Я не могу опубликовать здесь информацию для входа, но если бы вы могли помочь мне найти ошибку (или более) в коде, это было бы здорово! На данный момент он переходит на страницу до pdf, получает ссылку, загружает файлы cookie и вставляет pdf в дисковод, но pdf поврежден с 0 кб.

Я попробовал setRequestInterception, getPdf (от puppeteer) и использовал буфер с некоторыми вещами, которые я нашел в своем исследовании.

 //Page before pdfPage. Here I got the link: urlPdf
 //await page.goto(urlPdf); 
 //await page.waitForNavigation();
 //const htmlPdf = await page.content();

 const cookies = await page.cookies()
 const opts = {
    headers: {
        cookie: cookies
    }
};

 let blob = await fetch(urlPdf,opts).then(r => r.blob());
 console.log("pegou o blob")
 // upload file in specific folder

 var file ;
  console.log("driveApi upload reached")
  function blobToFile(req){
    file = req.body.blob
    //A Blob() is almost a File() - it's just missing the two properties below which we will add
    file.lastModifiedDate = new Date();
    file.name = teste.pdf;//req.body.word;
    return file;
  }


var folderId = myFolderId;
var fileMetadata = {
  'name': 'teste.pdf',
  parents: [folderId]
};
var media = {
  mimeType: 'application/pdf',
  body: file
};
drive.files.create({
  auth: jwToken,
  resource: fileMetadata,
  media: media,
  fields: 'id'
}, function(err, file) {
  if (err) {
    // Handle error
    console.error(err);
  } else {
    console.log('File Id: ', file.data.id);
  }
});

1 Ответ

0 голосов
/ 29 января 2019

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

Кукольник - Как я могу получить текущую страницу (application / pdf) в виде буфера или файла?

await page.setRequestInterception(true);

page.on('request', async request => {
    if (request.url().indexOf('exibirFat.do')>0) { //This condition is true only in pdf page (in my case of course)
      const options = {
        encoding: null,
        method: request._method,
        uri: request._url,
        body: request._postData,
        headers: request._headers
      }
      /* add the cookies */
      const cookies = await page.cookies();
      options.headers.Cookie = cookies.map(ck => ck.name + '=' + ck.value).join(';');
      /* resend the request */
      const response = await request_client(options);
      //console.log(response); // PDF Buffer
      buffer = response;
      let filename = 'file.pdf';
      fs.writeFileSync(filename, buffer); //Save file
   } else {
      request.continue();
   }
});

Для этого решения нужны: const request_client = require ('request-обещание-native');

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...