Nay*_*ori 0 screenshot node.js azure-web-app-service puppeteer takesscreenshot
我使用过 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
});
}
Run Code Online (Sandbox Code Playgroud)
请参阅 SO 标签信息puppeteer,如下所示。
Puppeteer 是一个 Node 库,它提供了一个高级 API 来通过 DevTools 协议控制无头 Chrome或Chromium。它还可以配置为使用完整(非无头) Chrome 或 Chromium。
无论是无头或非无头的 Chrome 或 Chromium,它们都需要 GDI 支持。但是,在 Windows 上的 Azure 应用服务上,它与 冲突Win32k.sys (User32/GDI32) Restrictions,如下图。
和其他框架一样PhantomJS/Selenium也受它限制,见下文。
所以你不能在 Windows 上的 Azure WebApp 中使用 puppeteer。解决方法是在 Linux 上使用 Azure VM 或 Azure WebApp。从本质上讲,此问题与您的其他 SO 线程Chrome 驱动程序无法在 azure web 应用程序上工作重复。
希望能帮助到你。
| 归档时间: |
|
| 查看次数: |
3956 次 |
| 最近记录: |