使用PAC来过滤视频广告

之前写过一篇文章关于PAC自动代理和ios翻墙,使用自动代理技术和一个pac文件来方便的实现翻墙的功能,pac文件中匹配到的域名将进行HTTP代理。一直使用的广告过滤软件是adbyby,也建议有需求的同学可以使用这款软件,支持全平台版本,自动更新,规则全面。自用路由器(ar7161)一直运行着adbyby+iptables透明代理来为局域网提供广告过滤,但在其他环境中移动端并不能方便的过滤广告,这里为移动端提供一种广告过滤的思路(pc端原理来说也可以,不过得取决于代理服务器带宽)。

原理很简单,我们在一台具有公网ip的服务器上运行adbyby,进行HTTP代理,在配合一个pac文件,将指定域名的流量通过改服务器进行HTTP代理来实现广告过滤的功能。经测试,1M带宽的服务器已经足够提供两台(我只测试了两台)移动设备超清播放。

首先我们去adbyby的官网下载对应的版本,这里为linux x64

adhook.ini中我们可以修改配置文件,这里我们需要修改监听的ip地址和端口,这里配置如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
[info]
id=Linux
[update]
rule=video,lazy
[cfg]
listen-address=0.0.0.0:18118
buffer-limit=1024
keep-alive-timeout=30
socket-timeout=60
max_client_connections=0
stack_size=200
auto_restart=1
debug=0

需要将默认的127.0.0.1:8118修改为0.0.0.0:18118,其中端口可以任意修改,建议改成非知名高端口。如果配置了iptables,需要在iptales中放行该端口。

提供的pac文件如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
var domains = {
"letv.com":1,
"video.qq.com":1,
"sohu.com":1,
"youku.com":1,
"iqiyi.com":1,
"pptv.com":1,
"71.am":1,
"qiyi.com":1};
var proxy = 'PROXY proxy.com:18118;';
var direct = 'DIRECT;';
var hasOwnProperty = Object.hasOwnProperty;
var empty=true;
for(key in domains)
{
if(hasOwnProperty.call(domains,key))
{
empty=false;break;
}
};
function FindProxyForURL(url, host)
{
if(empty)
{
return proxy;
}
var suffix;
var pos = host.lastIndexOf('.');
pos = host.lastIndexOf('.', pos - 1);
while(1)
{
if (pos <= 0)
{
if (hasOwnProperty.call(domains, host))
{
return proxy;
}
else
{
return direct;
}
}
suffix = host.substring(pos + 1);
if (hasOwnProperty.call(domains, suffix))
{
return proxy;
}
pos = host.lastIndexOf('.', pos - 1);
}
}

需要修改上述代码中的代理服务器ip和端口

上述规则将乐视、搜狐、优酷、PPTV、腾讯视频、爱奇艺的流量使用adbyby服务器来进行代理,其他流量不做代理。经过测试,移动端可以过滤乐视、搜狐视频、PPTV、优酷的视频广告,pc端还可以过滤腾讯视频的广告,不过都无法过滤爱奇艺的广告。

关于如何筛选出需要过滤的域名,我的想法是使用fiddler作为代理,来抓取移动设备的流量。希望有了解如何过滤腾讯和爱奇艺广告的同学不吝赐教,我也会找时间继续研究一下。

如果您觉得这篇文章对您有帮助,不妨支持我一下!