在 heroku 上,puppeteer 的 Network.webSocketFrameReceived 事件永远不会被触发。为什么?

On heroku, puppeteer's Network.webSocketFrameReceived event is never triggered. Why?

我构建了一个部署到 heroku 的小应用程序。在本地,整个事情都按预期进行。但是在部署时,永远不会触发 Network.webSocketFrameReceived 事件。它是一个节点应用程序,运行s 具有最小的 websocket 服务器。 该应用程序的目标是使用 headless chrome 打开一些 url(我在这里使用 puppeteer),记录 websocket 帧并解析它们是否包含某些特定字段,成功时关闭连接。然后移动到下一个url.

async function openUrlAndParseFrames(page, url) {
  await new Promise(async function (resolve) {
    const parseWebsocketFrame = (response) => {
      console.log('parsing websocket frame...', response);
      let payload;
      
        try {
          // some parsing here
        } catch (e) {
          console.error(`Error while parsing payload ${response.response.payloadData}`)
        }
     
    }

    console.log('Go to url', url);

    await page.goto(url);
    const cdp = await page.target().createCDPSession();
    await cdp.send('Network.enable');
    await cdp.send('Page.enable');
    cdp.on('Network.webSocketFrameReceived', parseWebsocketFrame);

  });
}

是否无法使用 puppeteer 在 heroku 上建立此 websocket 连接?我从未收到“正在解析 websocket 框架...”日志...

PS: 我知道我需要在 heroku

上为 puppeteer 设置 运行 这个特殊的参数
puppeteer.launch({ args: ['--no-sandbox', '--disable-setuid-sandbox'] });

我还添加了构建包 heroku/nodejs 和 https://github.com/jontewks/puppeteer-heroku-buildpack

我自己找到了答案。真正的问题是,IP 范围(来自 Heroku)被阻止,我什至没有访问我试图访问的页面,但被 CloudFront 的 403 阻止了。

我通过记录页面内容弄明白了。 const websiteContent = await page.content(); 显示错误页面 html。

尝试各种方法后,我决定离开 Heroku,现在已成功部署到 Google App Engine。