tl; dr
实际上,在剧作家v.1.31.1
中,有有三种配置http代理的方法:
chromium.launch
browser.newContext
-
page.setExtraHTTPHeaders
,但仅在firefox上工作
今天,我正在为无浏览器的代理设置而苦苦挣扎...
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
的前两个结果:
- node.js - How do I authenticate a proxy in playwright - Stack Overflow
- Proxy-Authorization header not working in Chromium · Issue #443 · microsoft/playwright-python · GitHub
我迅速检查了第一个链接。答案说有两种的方式。我没有进一步阅读,因为我认为自己知道这些方式 - 一种是我正在努力的方法,第二个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 (“慢慢快点”)并阅读理解!