我正在使用Electron创建简单的Web浏览器。我的用例是我需要通过不同/相应的代理IP路由每个URL。如果用户输入 google.com ,则必须通过123.123.122.1:8081
进行路由,如果他键入gmail.com
,则必须通过111.111.111.123:8080
[代理/端口]进行路由.I看到了这个http://stackoverflow.com/questions/37393248/how-connect-to-proxy-in-electron-webview?rq=1
,但它不会动态更改代理。是否可以用电子来做。
答案 0 :(得分:1)
有两种方法可以解决这个问题。 您可以使用proxy.pac方法或会话/代理规则来更改代理
持久化会话方法:
var proxyIp ='12.12.133.12’
var port =‘8080’
<webview id="wv1" src="https://github.com" partition="persist:webviewsession"></webview>
if(proxyIp.trim() =='noproxy'){
var my_proxy = 'direct://';
session.fromPartition('persist:webviewsession').setProxy({proxyRules:my_proxy}, function (){
console.log('using the proxy ' + proxyIp);
});
}else{
var my_proxy = "http://"+proxyIp+":"+port;
session.fromPartition('persist:webviewsession').setProxy({proxyRules:my_proxy}, function (){
console.log('using the proxy ' + proxyIp);
});
}
proxy.pac方法
的proxy.js
const {app, BrowserWindow} = require('electron');
const {session} = require('electron')
let mainWindow;
app.on('window-all-closed', function() {
app.quit();
});
app.on('ready', function() {
mainWindow = new BrowserWindow({width: 1024, height: 768 });
session.defaultSession.allowNTLMCredentialsForDomains('*')//to access internal sites
var myVar = setInterval(myTimer, 3000);
function myTimer() {
mainWindow.webContents.session.setProxy({pacScript:'file://' + __dirname + '/proxy.pac'}, function () {return true;});
}
mainWindow.webContents.session.setProxy({pacScript:'file://' + __dirname + '/proxy.pac'}, function () {mainWindow.loadURL('file://' + __dirname + '/browser.html');});
mainWindow.openDevTools();
});
proxy.pac文件
function FindProxyForURL(url, host) {
if (shExpMatch(url, "*google*"))
return "PROXY 164.83.99.74:80";
if (shExpMatch(url, "*amazon*"))
return "PROXY 194.73.29.74:8080";
return "DIRECT";
}
Proxy.pac文件可以位于某个S3位置或某些其他远程服务器或本地,因此即使您更改将反映在电子工具中的远程proxy.pac文件。使用proxy.pac方法的问题是您何时更改proxy.pac中的代理IP你需要在电子中重新加载proxy.pac文件,这就是为什么我在上面的代码中每3秒重新加载一次。
两者都可以正常工作,我自己测试了。 您可以根据您的用例使用任何内容。
详细讨论可以在这里找到 https://discuss.atom.io/t/how-to-set-proxy-for-each-webview-tag-in-electronjs/37307/2
电子文件:https://github.com/electron/electron/blob/master/docs/api/session.md#sessetproxyconfig-callback
电子维护者的建议: https://github.com/electron/electron/issues/8247#issuecomment-268435712