簡體   English   中英

Puppeteer - 如何使用本地 IP 地址連接 WSEndpoint?

[英]Puppeteer - How to connect WSEndpoint using local IP address?

我有兩個用於 puppeteer 自動化的 Node.js 腳本。

1) 啟動器.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)connector.js

啟動無頭 chrome 並嘗試通過 WSEndPoint 通過各種主機名連接 chrome。 如果我使用 run 命令作為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 }

您可以代理 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' }

通過這種方式,我們可以在多個服務器上托管並在它們之間進行路由,如果需要,可以縮小規模等等。

和平!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM