在剧作家中配置HTTP代理的三种方法
#java #todayilearned #playwright #browserless

tl; dr

实际上,在剧作家v.1.31.1中,有有三种配置http代理的方法:

  • chromium.launch
  • browser.newContext
  • page.setExtraHTTPHeaders,但仅在firefox上工作

今天,我正在为无浏览器的代理设置而苦苦挣扎...

Official docs说:

Both browserless, and Chrome itself, support the usage of external proxies. In order to fully utilize a 3rd-party proxy you'll need to do two things:

-   Specify the address of where the proxy is with the `--proxy-server` switch.
-   Optionally, you'll also need to send in your username and password if the proxy is authenticated.

好,所以我需要设置--proxy-server。我正在使用Docker图像在本地运行无浏览器。我发现有一个称为PROXY_URL的环境变量:

podman run --rm -p 3000:3000 -e "PROXY_URL=my-proxy-url" browserless/chrome:latest

很好,但是如何传递用户名和密码?
文档说有两种方法:

## Using username and password
### Method 1: page.authenticate
### Method 2: page.setExtraHTTPHeaders

我正在使用playwright-java,没有方法page.authenticate,所以我认为page.setExtraHTTPHeaders剩下。

page.setExtraHTTPHeaders(Map.of("Proxy-Authorization", "Basic "  
   + new String(Base64.getEncoder().encode("username:password".getBytes()))));

不幸的是,它不起作用。我收到以下奇怪的错误:net::ERR_INVALID_ARGUMENT。此外,容器的日志中没有错误。什么是黑客?

Google的playwright Proxy-Authorization的前两个结果:

我迅速检查了第一个链接。答案说有两种的方式。我没有进一步阅读,因为我认为自己知道这些方式 - 一种是我正在努力的方法,第二个chromium.launch,对吗? :) 后来发现我错了!

第二个链接看起来像我需要的。但是,问题没有任何结论,没有任何结论。显示的替代方法是我已经知道的:

browser = await playwright.chromium.launch(
    proxy={"server": "localhost:8080", "username": "user", "password": ""},
)

情况是我不想浏览器lanuch浏览器,而是在容器内创建的connect

我更深入地发现了剧作家项目中的另一个类似问题:
# [Feature] Directly set Proxy-Authorization in Chrome without configuring any other proxy settings

问题(无论如何在铬/铬中)是Proxy-Authorization可能无法通过extraHTTPHeaders明确设置。如果您执行此操作,然后尝试导航到任何页面Chrome都会给您以下错误:net::ERR_INVALID_ARGUMENT

我迷路了,考虑改变我的方法...

幸运的是,我的队友通过展示了一些我发现缺少的作品的例子来协助我:

Browser.NewContextOptions options = new Browser.NewContextOptions()  
   .setProxy(new Proxy("my-proxy-url")  
      .setUsername("username")  
      .setPassword("password"));  
BrowserContext context = browser.newContext(options);

ta da!就如此容易! ð

我检查了playwright docs,似乎有可能:

Proxy can be either set globally for the entire browser, or for each browser context individually.

不幸的是没有例子,所以很难发现。

我还仔细检查了node.js - How do I authenticate a proxy in playwright - Stack Overflow并通过browser.newContext配置代理实际上在那里,但是我错过了(被浏览器文档混淆了吗?):

const browser = await chromium.launch({
    proxy: { server: 'per-context' }
});
const context = await browser.newContext({
    proxy: { server: 'http://myproxy.com:3128' }
})

要指出:
festina lente (“慢慢快点”)并阅读理解!