【问题标题】:Why does puppeteer not work on azure webapp为什么 puppeteer 不能在 azure webapp 上运行
【发布时间】:2021-04-05 15:14:07
【问题描述】:

我使用过 Nodejs 并尝试截取给定 URL 的屏幕截图。它在本地运行完美,但部署到 Azure 后在创建 puppeteer 时出现问题。

代码

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
    });
}

【问题讨论】:

    标签: node.js screenshot puppeteer azure-web-app-service takesscreenshot


    【解决方案1】:

    请参阅puppeteer 的 SO 标记信息,如下所示。

    Puppeteer 是一个 Node 库,它提供高级 API 以通过 DevTools 协议控制 headless ChromeChromium。它还可以配置为使用完整的(非无头)Chrome 或 Chromium

    无论是无头或非无头的 Chrome 或 Chromium,它们都需要 GDI 支持。但是,在 Windows 上的 Azure App Services 上,它与 Win32k.sys (User32/GDI32) Restrictions 冲突,如下图。

    而其他框架如PhantomJS/Selenium也受其限制,见下文。

    因此,您不能在 Windows 上的 Azure WebApp 中使用 puppeteer。解决方法是在 Linux 上使用 Azure VM 或 Azure WebApp。本质上,此问题与您的其他 SO 线程 Chrome driver is not working on azure web apps 重复。

    希望对您有所帮助。

    【讨论】:

    • 我相信它也不适用于 Linux 上的 Azure WebApp。如果它对你有用,那是个好消息。您愿意分享有关您在 linux 上的设置的更多详细信息吗?
    • 可以确认这在 linux 上也不起作用,正如 @MarkoPrcać 建议的那样。
    【解决方案2】:

    How to run Headless Chrome in Azure Cloud Service or Azure Functions

    将 puppeteer.launch 替换为 puppeteer.connect

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

    });

    【讨论】:

    • Browserless.io 非常酷,每天有少量请求免费,然后有基于使用的定价选项。这对我的用例来说是一个很好的解决方案。
    猜你喜欢
    • 1970-01-01
    • 2018-11-25
    • 2019-05-27
    • 2013-09-05
    • 2015-01-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多