使用PAC文件代替Foxyproxy

作者:muzuiget   来源:http://qixinglu.com/archives/use_pac_replace_foxyproxy?utm_source=rss&utm_medium=rss&utm_campaign=use_pac_replace_foxyproxy

这篇文章是写给码农,一些技术探讨和实现,不是码农的请老实Foxyproxy或者Autoproxy,除非你好奇,否则不用看了。顺便说说,gmbox给我重写了,骨头给我维护了,有问题找我就行了,这文章就拖到现在。

当我码了上千字后才悲剧地发现代码本来就很好能表达我的想法了,所以先贴代码,一个pac文件和辅助用的Firegestures三个脚本。

都是javascript,能直接看懂的不用看下面的废话了。外国程序员不会研究这种问题,在这方面我超越他们,我自豪。

想法

当年让我从马桶转到Firefox的其中一个重要原因就是Foxyporxy扩展,我还自己摸索出Foxyproxy+Tor+Privoxy组合 来翻墙,一直都是必备扩展,可是这个扩展早在一个多月前被我无情抛弃,因为它满足不了我的要求,在这个天朝这个局域网了,你得准备多套翻墙方案,什么 Tor啊、Gapproxy啊、SSH、VPN,免费收费都有,有快有慢,有稳定有不稳定,我甚至改写过一个

对于我这等穷鬼,下载狂人,没钱让系统所有程序全局代理,只有给浏览器建立一套复杂的代理切换器,为不同目的地使用不同代理,下面的指“全局代理”就是指浏览器的代理。系统级别代理切换器的有没有?有!我下一篇文章再说。

Foxyproxy还有Autoproxy不就是做这个了?可惜还是满足不了我的要求。

  • 先来说说Foxyproxy,最早的代理切换扩展,也有快速添加,可是不爽的是,它不能快速对规则切换代理,举例说,我定义一批规则,使用 Tor,后来的Tor太慢,我要换成Gapproxy,行啊,打开设置窗口把代理地址改一下就行了,不能在状态栏或这快捷键切换,我依然觉得太麻烦。
  • Autoproxy可以是可以,但它只能整体切换,我还是喜欢手动添加,最好自己知道哪些网站使用了代理。Autoproxy的衍生项目 gfwlist可以转成pac,虽然Autoproxy号称使用Adblock plus的代码,效率不成问题,但是转成pac后,不知道成千上百个复杂的正则表达式匹配起来到是怎样一个情景。

还有就是全局代理,在Twitter上的链接,还有在Google上资料时,十有八九会撞。要不你逐一添加,要不就全局代理,但是如果使用了全局代 理,本来可以直接链接的网站就变得很慢,像gappproxy这样的代理浏览https也会提示证书不受信用。要不就白名单,白名单也得逐一添加,依旧麻 烦。我需要一种白名单式全局代理,也就是随时在黑白名单方式切换,白名单里的网站,在全局代理下,依然是直接连接。

设计

其实对于一个网址,有3种状态

  • 它匹配已定义的某个网址表达式,总是通过某个代理,即黑名单
  • 它匹配已定义的某个网址表达式,总是直接链接,即白名单
  • 它不匹配任何网址表达式,则试用全局设置(可以是某个代理或直接连接)

好吧,我知道我说得有点糊涂,我想要的代理切换软件是,网址表达式和代理组成一个规则,可以有多个规则,每个规则的代理可以随时切换,这里网址表达式分两种,完整的url或和host,这里先用host示例

规则1:gappproxy
proxy : 127.0.0.1:8000,
hosts : [
"blogger.com",
"blogspot.com",
"twitter.com",
"dabr.co.uk",
]
 
规则2:tor
proxy : 127.0.0.1:9050,
hosts : [
"youtube.com",
"feedburner.com",
"ytimg.com"
]
 
规则3:ssh
proxy : 127.0.0.1:8080,
hosts : [
"flickr.com",
"img.ly",
"twitpic.com",
"bit.ly",
]

当匹配某个规则的网址表达式就是使用该代理,可以按顺序做优先级。我可以随时切换某个规则的代理地址,或这添加网址表达式而不影响其它规则,这样切换起来非常方便。

其实可以直接连接都当成一个代理,比如我想google.com域名就不必走代理了,那么可以写成

规则4:直接链接
proxy : 127.0.0.1:8080,
hosts : [
"google.com",
"192.168.0.",
"127.0.0.1",
"localhost"
]

问题就是遇到网址不匹配任何规则里的网址表达式,那么就是用默认代理,直接链接或某个代理,这样就相当于在黑白名单方式切换了。

无匹配规则:随时选择
proxy : direct|127.0.0.1:8000

把直接连接也算是一种代理写代码就方面多了。

代码

我跑去看了Foxyproxy和Autoproxy的源代码,看看能不能改,还是太复杂,没看懂,MDC上又没有简单的示例代码。于是我转战PAC,PAC大部分浏览器都实现了,兼容性好,我看了一下使用方法,纯粹javascript而已,而且真的很简单,定义一个“FindProxyForURL(url, host)”函数,浏览器会调用,你传回一个代理字符串就行了,你爱搞多复杂都行,还有不少辅助函数。

于是我就根据上面的设计写了出来,才100代码左右,完全满足我的要求,用了几天,改写过一次,再写了几个配套Firegestures脚本,到现 在用了一个月,基本没改过了。地址上面贴了,100多行,包括规则示例,核心代码才40行,我就这么扔到日渐臃肿的Foxyproxy了,还不用担心升级 Firefox后不能用。对于码农来说,不需要的GUI,直接修改代码有最大的自由度,求人不如求己。

pac我放到“~/.pac.js”,修改规则就直接修改pac文件,为了方面用vim打开,我又写了个Firegestures脚本,修改后要让 Firefox去Reload一下生效,于是又有了第二个脚本了。为了能快速切换默认代理(无匹配规则),我写了个Firegestures弹出菜单脚 本,虽然用sed一行代码就能搞定,为了让Windows用户也用得上,我还是很蛋疼用Firefox的提供的文件操作接口来处理了。

问题是这样做法比不了Foxyproxy和Autoproxy快吧,没错,关键是我能黑白名单方式切换,比如我在Twitter上追推时,或者 Google资料时,甩下鼠标切换到把默认代理切换到ssh,懒得添加了,这时我定义过的的某些网站依然能直接连接。看完后看GR泡论坛切换会直接连接, 回到黑名单模式。这样在黑白名单方式中切换,不同网址不同代理,翻墙更轻松。

没有评论: