Cloudflare Workers中puppeteer不被支持的解决方案

ChatGPT4o 使用 ChatGPT 4o 回答

问题:

cf worker 代码有报错:export default { async fetch(request: Request, env: Env, ctx: ExecutionContext): Promise<Response> { const browser = await puppeteer.launch(env.MYBROWSER); const page = await browser.newPage(); await page.goto(PH_URL); // img = (await page.screenshot()) as Buffer; const metrics = await page.metrics(); await browser.close(); 报错如下:Cannot read properties of undefined (reading 'fetch')

回答:

你遇到的错误 Cannot read properties of undefined (reading 'fetch') 可能是由于 puppeteer 在 Cloudflare Workers 环境中不被支持。Cloudflare Workers 是一个无服务器的JavaScript执行环境,基于V8引擎,但它不支持所有Node.js的API和库,特别是那些依赖于底层操作系统的库,如puppeteer

为了在Cloudflare Workers中实现类似的功能,你可以考虑使用其他方法,比如通过API调用来获取你需要的数据,或者使用其他不依赖于操作系统的库。

如果你确实需要在Cloudflare Workers中使用浏览器自动化功能,可以考虑以下替代方案:

  1. 使用无头浏览器服务:有一些在线服务提供无头浏览器的API,你可以通过HTTP请求来使用这些服务。例如,BrowserlessPuppeteer as a Service

  2. 使用其他库:如果你只是需要进行一些简单的网页抓取,可以使用cheerio等库,它们不依赖于操作系统。

以下是一个使用cheerio的示例代码:

import cheerio from 'cheerio';

export default {
  async fetch(request: Request, env: Env, ctx: ExecutionContext): Promise<Response> {
    const response = await fetch('https://example.com');
    const html = await response.text();
    const $ = cheerio.load(html);

    // 例如,获取页面标题
    const title = $('title').text();

    return new Response(`Page title is: ${title}`);
  }
};

如果你需要使用无头浏览器服务,可以参考以下示例:

export default {
  async fetch(request: Request, env: Env, ctx: ExecutionContext): Promise<Response> {
    const response = await fetch('https://api.browserless.io/screenshot?token=YOUR_API_TOKEN', {
      method: 'POST',
      headers: {
        'Content-Type': 'application/json'
      },
      body: JSON.stringify({
        url: 'https://example.com',
        options: {
          fullPage: true
        }
      })
    });

    const screenshot = await response.arrayBuffer();
    return new Response(screenshot, {
      headers: {
        'Content-Type': 'image