如何连接到电子webview中的代理 - 动态

时间:2016-10-14 10:52:44

标签: webview electron

我正在使用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,但它不会动态更改代理。是否可以用电子来做。

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