2 min read

使用 Privoxy 屏蔽网页广告

很多浏览器扩展可以屏蔽网页广告,比如 Firefox 下的 Adblock Plus,Google Chrome 下同样有 Adblock Plus;在 Firefox 下,甚至可以通过 GreaseMonkeyScriptish 来编写 JavaScript 脚本移除广告。

如果只使用一个浏览器,则装插件来屏蔽广告可能没什么问题,而且即装即用,省事。但如果用多个浏览器,每个浏览器都得装一遍就非常麻烦。

Privoxy 可以解决这种问题。

在我们的电脑上,它扮演的是中间代理服务器的角色。浏览器通过它向远程服务器发出请求,远程服务器返回文件后经过 Privoxy 过滤后再发送回浏览器。

因为它的网站上文档太不入门了,所以写一篇介绍下怎么使用 Privoxy

安装 Privoxy

Privoxy 提供了多个平台的支持,比如 Windows、Linux、Macintosh 等。

Ubuntu 下可以通过如下命令安装:

sudo apt-get install privoxy

Mac OS 上可以通过 brew 安装:

brew install privoxy

Windows 平台可以下载 EXE 文件安装。

更多系统下的安装方法参见 Privoxy 网站说明

启动 Privoxy

同样的,Privoxy 网站上提供有各平台启动的说明。

配置浏览器

Privoxy 服务器在电脑上的 ip 是 127.0.0.1,端口默认为 8118。根据需要,将个别浏览器或系统的 HTTP 与 HTTPS 代理服务器地址设置为 127.0.0.1,端口设置为 8118。

Privoxy 上同样有配图说明。

测试 Privoxy

Privoxy 提供 http://p.p/ 来测试它的运行是否在当前浏览器下正常。

如果该页面头部显示诸如:

This is Privoxy 3.0.19 on localhost (127.0.0.1), port 8118, enabled”

则说明 Privoxy 已经在正常使用中。

在 Privoxy 提供的默认配置文件下,如果仅是浏览英文站,则大部分广告已经可以对付掉。至于中文的,则需要自行调配配置文件了。

Privoxy 提供多个配置文件,比如

  • match-all.action
  • default.action

但不要去动这些配置文件,因为升级时这些文件会被覆盖,而 user.action、user.filter 这类文件在升级不会被覆盖,我们的规则就写在这些 user.* 的配置文件里。

屏蔽图片广告

先来说怎样用 Privoxy 来屏蔽图片。

说明( 2015.09.30):因为我的博客迁移到 https,所以以下涉及图片 url 的规则不再有效,这是因为 Privoxy 仅能处理 https 协议的 url 的 host 部分

举个最简单的例子,打开 user.action 文件,在文件末加入以下内容:

{+block}
www.zfanw.com/blog/wp-content/uploads/2013/02/0-300x169.png

这是最直白的方法,+block 指示 Privoxy 屏蔽随后的内容,这个内容由一个 URL 规则 指定,这个 URL 规则的格式为 <domain><port>/<path>,三个值均为可选,另外需要注意,domain 部分不需要写 “http://”,因为 Privoxy 已经默认这个协议。

保存 user.action 配置文件后强制刷新页面可以看到,图片已经被一个丑陋的 Pattern 替换掉。

页面中被屏蔽的图片需要一个东西来替代,这个可以通过 +set-image-blocker 设置:

{+block +set-image-blocker{pattern}}
www.zfanw.com/blog/wp-content/uploads/2013/02/0-300x169.png

其中 pattern 为该命令的默认参数值,即是你所见的丑陋的 Pattern;另两个取值分别是 “blank” 与「图片地址」。

“blank” 使用一个 1×1 像素的白色 gif 文件填充被屏蔽的图片位置。

而第三个取值,即「图片地址」,可以是本地,也可以是网络上:

{+block +handle-as-image +set-image-blocker{http://farm9.staticflickr.com/8298/7976223037_941a1ed84f_z.jpg}}
www.zfanw.com/blog/wp-content/uploads/2013/02/0-300x169.png

当在 user.action 文件中写入上面的命令并保存后,强制刷新页面,你看到的将是一朵茶花,而不是原来的几个男性图片。是的,Privoxy 用你指定的图片替换被屏蔽的广告图片。

规则写好后,你可能想检查它是否生效,Privoxy 提供一个网页工具 http://config.privoxy.org/show-url-info,可以用来查看规则是否对某 URL 生效,借此我们可以检查规则是不是写对,是不是能达到我们的目的。

屏蔽文字广告

在屏蔽图片广告时,Privoxy 用到的是 action,动作,指示在匹配相应的 URL 时执行动作。屏蔽文字广告则有所不同,需要用到 filter,如果你接触过 WordPress 的代码,则相信对这个概念很了解。简单地理解,就是对相应的内容进行处理后再输出。

同样的,我们将把规则写在 user.filter 文件中。

先拿 Privoxy 上的示例做个说明:

FILTER: foo Replace all "foo" with "bar"
s/foo/bar/g

FILTER 是 Privoxy 关键词,表示过滤文本,另外还有两个关键词,这里不做介绍。foo 是这个 filter 的名称,「Replace all “foo” with “bar”」则是描述。s/foo/bar/g 则是替换命令,如果熟悉 Vim 或 Sed 则应该对这个命令非常清楚。

定义名称为 foo 的过滤器后,我们需要在 user.action 中调用它:

{+filter{foo}}
.privoxy.org/user-manual/filter-file.html

强制刷新该页面后,就会看到,页面内的所有 foo 都被换成 bar 了。

然后进入实战,如何屏蔽百度的广告 – 这里,需要 HTML/CSS 知识来找出广告部分的代码。比如百度搜索结果前的推广有个 class 为 ec_pp_f,右侧推广链接的 id 为 content_right

首先定义一个 filter:

FILTER: block-baidu 屏蔽百度广告
s|</head>|<style type="text/css">table.ec_pp_f,\#content_right,.ec_pp_f+br,[class~=EC_mr15]{display:none;}</style></head>|

注意 # 前的 \,因为在 user.filter 文件中 # 开头的行表示注释,所以需要转义。至于 s 命令后使用 | 而非 / 是因为 HTML 标签中带有 /,为避免加转义符号,就另外找个字符分隔,Privoxy 的 default.filter 文件中是使用 @ 符号来分隔的,我这里用 |。

之后在 user.action 文件中调用该 filter:

{+filter{block-baidu}}
.baidu.com

刷新页面后就可以看到,百度的推广广告已经屏蔽掉了。

在写规则时,需要小心,因为 Privoxy 对配置文件非常敏感,一旦写错,就会退出,所以,如果发现代理不正常了,请重启 Privoxy。

定住 gif 动画

如果你对 gif 动画不耐烦,则 Privoxy 提供方法来「定」住它不动。在 user.action 文件中加入如下:

{+deanimate-gifs{last}}
.tumblr.com

last 表示定在最后一帧,还有个 first 表示定在最前一帧。

这样,tumblr.com 网站上的 gif 动画就不会闪瞎眼了。不过据我测试,还是有些漏网之鱼。

补充

补充中是我添加到 user.action 与 user.filter 文件的内容,以后可能会进行更新。仅作参考。

  1. user.action gist 文件
  2. user.filter gist 文件

更新

因为 gist 的更新非常不便,就在 github 上创建了一个库,专门用来存放这两个配置文件。

报告问题 修订

如果你有自建 https 代理的需求,欢迎尝试 Phantom,一键搭建,方便快捷。查看 demo