Почему кукловод не работает в лазурном веб-приложении

Я использовал Nodejs и пытаюсь сделать снимок экрана с заданным URL. Он отлично работает на локальном компьютере, но после развертывания в Azure возникают проблемы при создании кукловода.

Код

exports.getScreenShot = async function (req, res) {
    const requesturl = req.param('url');
    if (!requesturl) {
        return res.send(400, 'Missing url');
    }
    const parsedUrl = url.parse(requesturl);
    if (!parsedUrl.protocol) {
        return res.send(400, 'Invalid url, missing protocol');
    }
    if (!parsedUrl.hostname) {
        return res.send(400, 'Invalid url, missing hostname');
    }

    const options = {
        'width': req.param('width'),
        'height': req.param('height'),
        'delay': req.param('delay'),
        'userAgent': req.param('userAgent'),
        'full': (req.param('full') === 'true')
    };

    options.width = options.width || 1024;
    options.height = options.height || 768;
    options.delay = options.delay || 200;    
    const browser = await puppeteer.connect({
        browserWSEndpoint: 'wss://chrome.browserless.io/'
    });

    let page = await browser.newPage();
    await page.goto(requesturl);
    await page.waitFor(parseInt(options.delay));
    let imageName = parsedUrl.hostname.replace(/\W/g, '_');
    let pathName = parsedUrl.pathname.replace(/\W/g, '_').replace(/_$/, '');
    if (pathName) {
        imageName += pathName;
    }
    imageName = `${imageName}.png`;
    var tempPath = temp.path({ suffix: '.png' });
    await page.setViewport({ width: parseInt(options.width), height: parseInt(options.height) });
    await page.screenshot({
        path: tempPath,
        fullPage: options.full
    });
}

2 ответа

Обратитесь к SO Tag Info для puppeteer, как показано ниже.

Puppeteer - это библиотека узлов, которая предоставляет высокоуровневый API для управления Chrome или Chromium без протокола через протокол DevTools. Он также может быть настроен на использование полного (без заголовка) Chrome или Chromium.

Что бы ни Chrome или Chromium с безголовым или безголовым, все они требуют поддержки GDI. Однако в службах приложений Azure в Windows это конфликтует с Win32k.sys (User32/GDI32) Restrictions, как на рисунке ниже.

И другие рамки, такие как PhantomJS/Selenium также ограничено этим, см. ниже.

Поэтому вы не можете использовать кукловодов в Azure WebApp в Windows. Обходным решением является использование виртуальной машины Azure или Azure WebApp в Linux. По сути, эта проблема дублируется другим потоком SO. Драйвер Chrome не работает в веб-приложениях Azure.

Надеюсь, это поможет.

Как запустить Headless Chrome в облачной службе Azure или в функциях Azure

Замените puppeteer.launch на puppeteer.connect

      const browser = await puppeteer.connect({  browserWSEndpoint: 'wss://chrome.browserless.io/'

});

Другие вопросы по тегам