#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. Большое вам спасибо. Сэкономил мне много времени!