privoxy——广告过滤和自动代理切换

最初用Privoxy是因为七星庐的文章强大的代理调度器代理Privoxy,用作代理切换,后来顺便也用起它广告过滤的功能

能实现这两个功能的软件/插件很多,而且用起来往往比privoxy来的方便,比如foxproxy和adblock。我之所以用privoxy是因为以下原因:

  • 作为系统的全局自动代理切换器。GNOME和环境变量的代理设置不是对任何软件都管用,PAC也不是哪里都行
  • 广告过滤可用于任何浏览器,并且容易定制,改改网页什么的

配置是繁琐些,但用起来确实不错。

安装用源里的就可以,默认是作为系统服务启动的。装好后请将浏览器代理设置为127.0.0.1:8118,以便测试。地址栏输入"p.p"可以查看配置、文档、调试等等。

代理切换

配置文件都在/etc/privoxy目录下。编辑config文件,加入一行

actionsfile pac.action

这表示添加一个动作文件,文件名是pac.action。在同目录下建立文件"pac.action",并写入配置。一个示例如下

{{alias}}
direct      = +forward-override{forward .}
ssh         = +forward-override{forward-socks5 127.0.0.1:7000 .}
gae         = +forward-override{forward 127.0.0.1:8000} 
default     = direct
#==========默认代理==========
{default}
/
#==========直接连接==========
{direct} 
.edu.cn
202.117.255.
222.24.211.70
#==========SSH代理==========
{ssh}
.launchpad.net
#==========GAE代理==========
{gae}
.webupd8.org
222.24.211.70

上面的{{alias}}部分定义了一些缩写,注意http代理和socks代理的写法不同。

后面的如{direct}部分定义对哪些地址应用这个代理。其中"/"表示全部地址。注意一个URL的域名部分只能用glob匹配,而地址部分可以用复杂的正则表达式。具体可以看Privoxy的文档

这些规则在后面的会覆盖前面的,比如222.24.211.70实际是以gae代理访问的。这样可以实现一些稍微复杂的功能

广告过滤

广告过滤用的文件要多些,可能还需要filter文件。先看一个最基本的只使用action文件和block动作的广告过滤。直接编辑user.action文件,添加

{+block}
.5622.cn
/.*\.swf$

这样5622.cn和所有flash都被阻止了。如果你还想看某些flash视频,可以在后面再-block,这会覆盖前面的设置,如

{-block}
static.youku.com/.*\.swf$

配合filter文件和action文件,可以实现对网页内容的替换,从而屏蔽某些不想要的内容。先编辑config文件,去掉"filterfile user.filter"这行的注释,然后在同目录下建立user.filter文件,写入

FILTER: iframe
s@</head>@<style type="text/css">\n\
    iframe {display:none; !important}\n\
</style>\n$0@

这样就定义了一个名为"iframe"的过滤器。之后再编辑user.action文件,添加

{+filter{iframe}}
.filestube.com

这表明对filestube应用"iframe"这个过滤器。filter书写复杂些

除了过滤广告,还能做做地址转向,比如

{+redirect{s@^http://[^/]*/.*?&q=(.*)@http://www.google.com/search?hl=en&q=$1@}}
.google.com.hk/search

{+redirect{s@^http://[^/]*(/$|$)@http://www.google.com/ncr@}}
.google.com.hk/$

其它内容

以普通用户启动

先关掉privoxy服务,可以用sysv-rc-conf或者直接删掉/etc/init.d/privoxy文件。然后将/etc/privoxy目录的内容复制到家目录下,比如~/.privoxy。编辑config文件,将"confdir /etc/privoxy"改为

confdir /home/用户名/.privoxy

然后用下面命令启动

privoxy --no-daemon $HOME/.privoxy/config

有身份验证的代理

先获得"用户名:密码"的base64编码,方法如下

perl -e "use MIME::Base64; print encode_base64('用户名:密码');"

然后这样写alias

proxy = +forward-override{forward 127.0.0.1:808} +add-header{Proxy-authorization: Basic <auth>}

将<auth>替换为上面得到的base64编码的用户名和密码

一个完整的方案

上面这些文件完全可以精简和清晰,我的目录下只有config、pac.action、user.action、user.filter这四个文件。另外还可以小脚本来切换默认的代理。下面贴出这些配置和切换脚本,略加修改过的,我的配置目录是~/.proxy

上面的pac.action是我在家里用的,学校因为有ipv6等有些不一样:http://paste.pocoo.org/show/372767/

切换脚本:http://paste.pocoo.org/show/372771/

这个脚本是,在家里默认代理(default)在direct和gae之间切换,学校是在paper和gae之间切换。绑定个快捷键会很方便

评论

2011/04/17 12:25 回复

呵呵,我也是看了七星庐的那篇文章就把 FoxyProxy 给换掉了。privoxy 用来改网页确实不错。

2011/04/18 13:46 回复

曾经为了装tor折腾过,但tor好像用不了,就没去整了。

2011/04/19 14:12 回复

这个看起来有点复杂啊,我想实现这个功能,你有没有什么比较简单的软件推荐啊? 就是,一个播放器,clementine,它要访问一个url,但是墙掉鸟,我要让它访问另一个url代替之……

lainme
2011/04/19 15:56 回复

@Q.D.: 那就直接设置吧,或许它能用系统的代理设置。我是程序多,还经常换,这样方便些。

不过单纯做代理切换的话也并不复杂,装好后直接编辑/etc/privoxy/user.action,把代理的部分加到最后面也行。

pocoyo
2011/04/19 23:36 回复

这个真看不懂. 喜欢 polipo 转换 sock5 代理 为 http 代理 这个 :D

2011/04/19 23:53 回复

@pocoyo: 火狐用户表示 sock5 代理不需要转换。需要转换时我也是用的 proxychains,其上层支持任何 TCP 协议。

另外,相同的评论竟然发了三次,输验证码不累啊。。。

2011/04/20 12:35 回复

@pocoyo: 其实就是个PAC的功能。看来我上次改代码改出问题了。。。

liumailong
2011/05/27 02:13 回复

你好,我一直想 Privoxy 使用的做广告过滤,但苦于没有中文文档。

博主有 Privoxy 的中文文档吗?

lainme
2011/05/29 10:35 回复

@liumailong: 没有。我看的英文的

Jason
2011/05/30 16:05 回复

好文,很有启发。Privoxy的中文资料确实很少,全英文帮助让人看了云里雾里。最近在找将ABP之easylist转.action的方法,结果只有一个相关网站,还是德文,哭笑不得。

liumailong
2011/06/01 17:16 回复

请教一个 Privoxy 正则的问题。

如何用正则不匹配某个网址?

以 163 为例。 我想阻止除了 news.163.com 以外的所有 163 网址(如 www.163.com 、sports.163.com 等)

我的写法是 {+block{ZuZhi}} (.(?!news))+.163.com

但没有效果,要怎样写才正确。

lainme
2011/06/01 19:05 回复

@liumailong: privoxy在域名部分不支持正则,只能用在路径部分,也就是http://[域名]/[路径]

你要实现这种,可以先屏蔽掉所有的163地址,再单独打开news.163.com

{+block}
.163.com
{-block}
news.163.com

后面的设置会覆盖前面的

liumailong
2011/06/01 22:08 回复

@lainme: 改一下 我在 default.action 文件中看到了下面的片断 很明显是在域名中使用了正则,域名是完全不能用正则还是有什么限制?

.[a-vx-z]*.doubleclick.net/(?!(.*/)?ad[ji])
[a-z].clickdensity.com
[a-z][0-9].nedstatbasic.net/
[a-v]*.valueclick.com
lainme
2011/06/01 22:09 回复

@liumailong: 那是glob匹配,可以用,但正则不行。可以参考

http://www.privoxy.org/user-manual/actions-file.html#AF-PATTERNS

PS:上一条删除了……

liumailong
2011/06/25 09:34 回复

filter中的正则和 Perl 相比有什么不同或限制?

能相互引用变量吗?支持动态正则吗?

关于网页中的套嵌结构有什么办法?

lainme
2011/06/25 11:32 回复

@liumailong: 文档中说用的PCRE,应该和perl比较类似。其他的也不太了解,不是很懂正则

嵌套的,以前试过,没写出来。可能水平太差吧

2012/02/17 13:12 回复

博主 您好!

Privoxy 是不是不支持中文字符的过滤

我尝试过滤优酷网所有的《果宝特攻》(少儿不宜),失败了。

FILTER: youku

s@<head>.*果宝特攻.*</title>@$0<style type="text/css">\#playBox {display: none !important;}</style>@s

请问有什么解决办法吗?求解!

她舅
2012/02/17 13:32 回复

@她舅: 把配置文件转换为UTF8后 成功了 谢谢

她舅
2012/02/17 23:27 回复

楼主 为什么IE9连接不上Privoxy啊? 同一台电脑的Chrome却可以, 单位上的IE8也可以连接上, 非常困惑…

127.0.0.1:8118 设置完整正确

还是哪里没有设置对?求解啊!

lainme
2012/02/17 23:35 回复

@她舅: 没用过IE9,不清楚。可以试下别的HTTP代理能不能连接

trs
2012/05/09 22:40 回复

2个监听端口如何设置?config文件中,另外config、pac.action、user.action、user.filter文件无法下载,能否提供其他下载地址,谢谢!

lainme
2012/05/09 22:47 回复

@trs: 不知道两个端口的设置。看来那个网站倒下了,我可能会有这些文件的备份,这几天会找找

trs
2012/05/12 07:52 回复

博主试过在路由器上privoxy与tor结合起来使用吗?我整了好久一直不能成功。郁闷!




评论支持Dokuwiki语法,参见http://www.dokuwiki.org/zh:syntax