【问题标题】:Puppeteer - How to connect WSEndpoint using local IP address?Puppeteer - 如何使用本地 IP 地址连接 WSEndpoint?
【发布时间】:2018-12-30 04:09:47
【问题描述】:

我有两个用于 puppeteer 自动化的 Node.js 脚本。

1)launcher.js

此 Puppeteer 脚本启动 chrome 浏览器并断开 chrome 以便可以使用 WSEndpoint 进行连接。

const puppeteer = require('puppeteer');

module.exports = async () => {
    try {
        const options = {
            headless: false,
            devtools: false,
            ignoreHTTPSErrors: true,
            args: [
                `--no-sandbox`,
                `--disable-setuid-sandbox`,
                `--ignore-certificate-errors`
            ]
        };
        const browser = await puppeteer.launch(options);
        let pagesCount = await browser.pages();
        const browserWSEndpoint = await browser.wsEndpoint();
        // console  WSEndPoint say : "ws://127.0.0.1:42207/devtools/browser/dbb2525b-ce44-43c2-a335-ff15d0306f36"
        console.log("browserWSEndpoint----- :> ", browserWSEndpoint);
        await browser.disconnect();
        return browserWSEndpoint;
    } catch (err) {
        console.error(err);
        process.exit(1);
        return false;
    }
};

2) 连接器.js

启动无头 chrome 并尝试通过各种主机名通过 WSEndPoint 连接 chrome。如果我使用node connector.js localhost 的运行命令运行此脚本,它会尝试以 localhost 作为主机名连接 WSEndpint。

const puppeteer = require('puppeteer');
const launcher = require('./launcher');

(async (host) => {
    try {
        let WSEndPoint = await launcher();
        WSEndPoint = WSEndPoint.replace('127.0.0.1', host);
        console.log("WSENDPOINT :", WSEndPoint);
        const browser = await puppeteer.connect({
            browserWSEndpoint: WSEndPoint,
            ignoreHTTPSErrors: true
        });
        let pagesCount = await browser.pages();
        console.log("Pages available :> ", pagesCount.length);
        // const browserWSEndpoint = await browser.wsEndpoint();
        await browser.disconnect();
        process.exit(1);
        return true;
    } catch (err) {
        console.error(err);
        process.exit(1);
        return false;
    }
})(process.argv[2]);

但我无法使用我的本地 IP 地址(例如 192.168.1.36)连接 chrome 的 WSEndpint。为什么?

错误信息是

{ Error: connect ECONNREFUSED 192.168.1.33:36693
    at Object._errnoException (util.js:992:11)
    at _exceptionWithHostPort (util.js:1014:20)
    at TCPConnectWrap.afterConnect [as oncomplete] (net.js:1186:14)
  code: 'ECONNREFUSED',
  errno: 'ECONNREFUSED',
  syscall: 'connect',
  address: '192.168.1.33',
  port: 36693 }

【问题讨论】:

    标签: node.js google-chrome puppeteer google-chrome-headless


    【解决方案1】:

    您可以代理 websocket 并连接到代理。我在自己的服务器上测试了一下,运行成功了。

    以下是我们使用http-proxy 创建 websocket 服务器的方法,

    服务器

    const httpProxy = require("http-proxy");
    const host = "0.0.0.0";
    const port = 8080;
    async function createServer(WSEndPoint, host, port) {
      await httpProxy
        .createServer({
          target: WSEndPoint, // where we are connecting
          ws: true,
          localAddress: host // where to bind the proxy
        })
        .listen(port); // which port the proxy should listen to
      return `ws://${host}:${port}`; // ie: ws://123.123.123.123:8080
    }
    

    然后当我们运行它时,我们创建一个代理服务器并改为监听 ws 端点。我不是为了让解释更简单而导出它。

    // your other codes
    const pagesCount = (await browser.pages()).length; // just to make sure we have the same stuff on both place
    const browserWSEndpoint = await browser.wsEndpoint();
    const customWSEndpoint = await createServer(browserWSEndpoint, host, port); // create the server here
    console.log({ browserWSEndpoint, customWSEndpoint, pagesCount });
    // your other code here
    

    当我在服务器上运行时,我们得到以下信息,

    在水滴上,

    ➜  node index.js 
    { browserWSEndpoint: 'ws://127.0.0.1:45722/devtools/browser/df0ca6a9-48ba-4962-9a20-a3a536d403fa',
      customWSEndpoint: 'ws://0.0.0.0:8080',
      pagesCount: 1 }
    

    客户

    然后我们就这样连接起来,

    const puppeteer = require("puppeteer-core");
    (async serverAddr => {
      const browser = await puppeteer.connect({
        browserWSEndpoint: `ws://${serverAddr}`,
        ignoreHTTPSErrors: true
      });
      const pagesCount = (await browser.pages()).length;
      const browserWSEndpoint = await browser.wsEndpoint();
      console.log({ browserWSEndpoint, pagesCount });
    })(process.argv[2]);
    

    在我的访客计算机上,

    ➜  node index.js "123.123.123.123:8080"
    Pages available :>  1
    { browserWSEndpoint: 'ws://123.123.123.123:8080' }
    

    通过这种方式,我们可以在多个服务器上托管并在它们之间进行路由,如果需要,可以进行扩展等。

    和平!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-06
      • 1970-01-01
      • 2022-01-23
      • 1970-01-01
      • 2020-03-01
      • 1970-01-01
      相关资源
      最近更新 更多