可以在Google Cloud功能中运行Headless Chrome/Chromium吗?

at.*_*at. 13 google-chrome google-cloud-platform google-cloud-functions

有没有办法在Google Cloud功能中运行Headless Chrome/Chromium?我知道我可以在GCF中包含和运行静态编译的二进制文件.我可以获得一个静态编译的Chrome版本吗?

Ste*_*ren 16

Google Cloud Functions的Node.js 8运行时现在包含运行Headless Chrome所需的所有操作系统包.

以下是返回屏幕截图的HTTP函数的代码示例:

index.js文件:

const puppeteer = require('puppeteer');

exports.screenshot = async (req, res) => {
  const url = req.query.url;

  if (!url) {
    return res.send('Please provide URL as GET parameter, for example: <a href="?url=https://example.com">?url=https://example.com</a>');
  }

  const browser = await puppeteer.launch({
    args: ['--no-sandbox']
  });
  const page = await browser.newPage();
  await page.goto(url);
  const imageBuffer = await page.screenshot();
  await browser.close();

  res.set('Content-Type', 'image/png');
  res.send(imageBuffer);
}
Run Code Online (Sandbox Code Playgroud)

package.json

{
  "name": "screenshot",
  "version": "0.0.1",
  "dependencies": {
    "puppeteer": "^1.6.2"
  }
}
Run Code Online (Sandbox Code Playgroud)

  • @ebidel,Python env 是否具有运行 Headless chrome 的等效包? (2认同)

Ali*_*xel 6

我刚刚部署了一个运行 headless Chrome 的 GCF 函数。一些要点:

  1. 你必须在 Debian 8 上静态编译 Chromium 和 NSS
  2. 在启动 Chromium 之前,您必须修补环境变量以指向 NSS
  3. 性能比 AWS Lambda 差很多(3 秒以上)

对于 1,您应该能够在网上找到大量说明。

对于2,我使用的代码如下:

static executablePath() {
  let bin = path.join(__dirname, '..', 'bin', 'chromium');
  let nss = path.join(__dirname, '..', 'bin', 'nss', 'Linux3.16_x86_64_cc_glibc_PTH_64_OPT.OBJ');

  if (process.env.PATH === undefined) {
    process.env.PATH = path.join(nss, 'bin');
  } else if (process.env.PATH.indexOf(nss) === -1) {
    process.env.PATH = [path.join(nss, 'bin'), process.env.PATH].join(':');
  }

  if (process.env.LD_LIBRARY_PATH === undefined) {
    process.env.LD_LIBRARY_PATH = path.join(nss, 'lib');
  } else if (process.env.LD_LIBRARY_PATH.indexOf(nss) === -1) {
    process.env.LD_LIBRARY_PATH = [path.join(nss, 'lib'), process.env.LD_LIBRARY_PATH].join(':');
  }

  if (fs.existsSync('/tmp/chromium') === true) {
    return '/tmp/chromium';
  }

  return new Promise(
    (resolve, reject) => {
      try {
        fs.chmod(bin, '0755', () => {
          fs.symlinkSync(bin, '/tmp/chromium'); return resolve('/tmp/chromium');
        });
      } catch (error) {
        return reject(error);
      }
    }
  );
}
Run Code Online (Sandbox Code Playgroud)

启动 Chrome 时,您还需要使用一些必需的参数,即:

--disable-dev-shm-usage
--disable-setuid-sandbox
--no-first-run
--no-sandbox
--no-zygote
--single-process
Run Code Online (Sandbox Code Playgroud)

我希望这有帮助。


小智 0

正如评论中提到的,正在研究在云功能中运行无头浏览器的可能解决方案。可以在 Google 网上论坛上阅读直接适用的讨论:“ headless chrome & aws lambda ”。