Как сохранить скриншот в облачном хранилище Google с помощью облачных функций Google и puppeteer?

#node.js #google-cloud-platform #puppeteer #screenshot #serverless

#node.js #google-облачная платформа #puppeteer #скриншот #без сервера

Вопрос:

Я перейду прямо к проблеме:

Я пытаюсь сохранить скриншот puppeteer с помощью облачных функций Google.

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

Я что-то упустил? Должен ли я использовать дополнительный пакет, такой как «помощник официанта»?

Вот код:

 /**
 * Responds to any HTTP request.
 *
 * @param {!express:Request} req HTTP request context.
 * @param {!express:Response} res HTTP response context.
 */

const moment = require('moment');
const puppeteer = require('puppeteer');
const { Storage } = require('@google-cloud/storage');
const storage = new Storage();



exports.helloWorld = async (req, res) => {
  const PUPPETEER_OPTIONS = {
    headless: true,
    slowMo: 500,
    args: [
      '--disable-dev-shm-usage',
      '--disable-setuid-sandbox',
      '--no-first-run',
      '--no-sandbox',
    ],
  };

  const bucketName = "imageBucket";
  const timeNow = new moment();
  console.log(timeNow);
  const browser = await puppeteer.launch(PUPPETEER_OPTIONS);
  const page = await browser.newPage();
  await page.goto(
    'https://www.example.com'
  );

  await page.setRequestInterception(true);
  page.on('request', (interceptedRequest) => {
    if (
      interceptedRequest.url().startsWith('https://www.google-analytics.com/')
    ) {
      const resource = interceptedRequest.url().toString();
      console.log(resource   ' blocked from loading.');
      interceptedRequest.abort();
    } else {
      interceptedRequest.continue();
    }
  });

  try {
    const searchTest = await page.$eval(
      'SELECTOR',
      (element) => {
        return element.innerHTML;
      }
    );

    await page.click('COOKIE ACCEPT SELECTOR');

    if (searchTest) {
    const screenshot = await page.screenshot({
        path: `/screenshot.png`,
    });
    const bucket = storage.bucket(bucketName);
    const file = bucket.file('puppeteer_screenshots/screenshot_XXXXX.png');
        await file.save(screenshot, {
        metadata: { contentType: 'image/png' },
    });
    await browser.close();
    res.status(200).end()

    } else {
      await browser.close();
      console.log('not found');
      res.end();
    }
  } catch (error) {

    console.log(error);

    res.status(404).end();
  }
}
  

Комментарии:

1. Вы действительно пишете прямо из своего браузера в облачное хранилище?

2. Ну, я пытаюсь записать непосредственно в хранилище Google из облачной функции Google. Запуск кода в моей локальной среде возвращает правильную строку base64 / изображение в формате .png. Должен ли я запускать внешний сервер, чтобы сделать снимок экрана?

Ответ №1:

Для работы Puppeteer требуется установка безголового chormium. Вы не можете настроить среду выполнения с помощью облачной функции.

Для этого я рекомендую вам использовать Cloud Run, где вы можете настроить свой контейнер и, следовательно, среду выполнения.

Очень легко перейти от функции к облачному запуску. Создайте веб-сервер (например, express) и добавьте свою функцию hello_world в путь «/». Вот и все!! Для файла dockerfile у вас есть пример в разделе «Начало работы» в документации.

Комментарии:

1. Большое вам спасибо. Сэкономил мне много времени!