我一直用ssh tunnel翻墙,在firefox下用foxyproxy一直很正常。但是在chrome下就总是悲剧。
我的需求很简单,我需要三种上网模式,并能很方便的在几种模式下切换。
* 完全禁用代理
* 所有的请求都通过ssh tunnel代理
* 能根据网站url自动的决定是否使用ssh tunnel代理(我通过pac文件来实现)
Chrome下有个Switchy插件,能够满足前两点需求,但是最后一点,无论是我使用pac文件,还是使用它自身的Auto Mode,都不好使。
前天花1个小时看了一下Switchy的源代码,没看出什么头绪。昨天索性就自己写了一个,发现其实挺简单的。
不得不说,google做的东西就是好,不光chrome本身做得好,连它提供的外部接口使用起来也是方便快捷。
主要参考了三篇文章,都是官网提供的:
-
入门级教程, 主要了解了开发插件的大致过程,比如怎样加载和更新插件。
-
关于browserAction的例子,主要了解如何处理插件图标的点击事件,如何给插件设置图标。
-
chome.proxy接口文档,文档中已经提供了足够丰富的如何设置代理样例代码。
我自己的插件基本上就是在browserAction的例子上改的,然后盗用了Switchy的三张图片。
除去图片一共就三个文件,也没多少代码,全贴出来。
实现的功能就是点击插件按钮时在三种上网模式下依次切换。
而我使用的pac文件的网址,以及ssh tunnel的地址和端口号,都是写死在代码里面的。
-
manifest.json
{ "name": "tunnel switch", "version": "1.0", "background_page": "background.html", "permissions": [ "tabs", "http://*/*", "proxy" ], "browser_action": { "name": "Click to change the proxy" }, "content_security_policy": "default-src 'self'" }
-
background.html
<!doctype html> <html> <head> <title>Background Page</title> <script src="background.js"></script> </head> <body> </body> </html>
-
background.js
var currentProxyType = 'pac';
function changeProxy(type){ currentProxyType = type; if(type==‘pac’){ var config = { mode: “pac_script”, pacScript: { url:“file:///Users/oylbin/oylbin/proxy.pac?"+(new Date).getTime(), mandatory:true } }; }else if(type==‘tunnel’){ var config = { mode: “fixed_servers”, rules: { singleProxy: { scheme: “socks5”, host: “127.0.0.1”, port: 8527 }, bypassList: [“foobar.com”] } }; }else{ type=‘direct’; var config = { mode: “direct” }; } chrome.proxy.settings.set({value: config, scope: ‘regular’},function() {}); chrome.browserAction.setIcon({path:type+".png”}); }
function onIconClicked() { if(currentProxyType==‘pac’){ changeProxy(’tunnel’); }else if(currentProxyType==‘tunnel’){ changeProxy(‘direct’); }else if(currentProxyType==‘direct’){ changeProxy(‘pac’); } } chrome.browserAction.onClicked.addListener(onIconClicked); changeProxy(‘pac’);
最后,提供一个我使用的proxy.pac文件的样例,如果要加网址规则,加到site_list 和 exp_list即可
function FindProxyForURL(url, host)
{
url = url.toLowerCase();
host = host.toLowerCase();
// whole site
var site_list = [
'bitsnoop.com'
,'blogger.com'
,'blogspot.com'
];
var exp_list = [
'http(s)?://(sites|groups|picasaweb|feedproxy|fusion)\.google\.com/.*',
'http://www\.google\.com/(((search|url)\?)|analytics|calendar|profile).*',
'http://[^/]*/search\?q=cache.*'
];
for(var index = 0;index<site_list.length;index++){
if(host==site_list[index] ||
shExpMatch(host, "*." + site_list[index])){
return "SOCKS5 127.0.0.1:8527";
}
}
for(var index = 0;index<exp_list.length;index++){
var re = new RegExp(exp_list[index]);
if(url.match(re)){
return "SOCKS5 127.0.0.1:8527";
}
}
return "DIRECT";
}
Last modified on 2012-02-11