系统设计-过滤网站的弹窗广告的思路

系统设计-过滤网站的弹窗广告的思路

泛泛之交 发布于 2017-05-17 字数 133 浏览 1228 回复 3

现在很多网站都放有弹窗广告,着实很烦人,如果浏览器能过滤这些垃圾广告就好了,如果让你来设计一个浏览器,你会怎么处理这些广告的?

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

灵芸 2017-09-08 3 楼

广告窗口的泛滥使得不少网民不堪铺天盖地的广告骚扰纷纷放弃标准IE浏览器而使用诸如GoSurf、MyIE2、NetCapter这样的使用IE内核支持多页面并能自动屏蔽广告的软件。这对大多数网民当然是件好事,可对于程序员而言,我们使用弹出窗口的方式与一般广告并无本质的不同,这样的窗口也会被弹出窗口管理器不分青红皂白的封杀,其结果当然是我们不愿看到的。有没有一个标准的方式能让窗口正常的弹出呢?这就要求我们了解浏览器封杀广告的原理。通常的广告封杀器使用以下三种方式进行广告过滤:

(1)、基于窗口标题的封杀方式

  这种封杀方式的原理是定时检查所有的IE窗口标题,然后于已经有的列表(由程序维护的一个数组列表)来比较,如果有相同的,我们就关闭这个窗口。显然,这种方式有着诸多缺陷,它封杀了所有的弹出的窗口,管得太死,在程序真正使用的很少。不过,依据它进行的变形方式倒使用得相当的普遍。那就是,基于窗口标题名称的智能过滤技术,它根据弹出窗口的标题是否含有关于广告的关键字进行封杀,这为提高过滤效果作出了很好的探索。

(2)、基于窗口类和位置的封杀方式

  经过分析发现正常浏览窗口的类名是IEFRAME和CabinetWClass,而广告窗口的类名是CabinetWClass。进一步分析发现:广告窗口的WorkerA类和Shell Docobject View类的rect.top的值是相同的,正常IE窗口的WorkerA类和Shell Docobject View类的rect.top的值是不相同的。根据以上两点就可以书写广告杀手程序了。事实上,我对此程序的通用性持怀疑态度。因为笔者用Spy++分析发现,在Windows2000( 笔者使用的XX 作系统)中,IE窗口的类都为IEFrame。同时,由于Win2000是一个基于Unicode代码的XX 作系统,所以没有WorkerA类,而以WorkerW类取而代之。同时,也不存在rect.top不相同的情况,由于笔者没有WindowsXPXX 作系统,所以不能针对WindowsXP作进一步的试验。

(3)、基于IE COM组件的封杀方式

  以上两种方式都是把IE窗口当作一个普通的Windows窗口对待,进行判断的。事实上,IE是一个典型的基于COM组件的浏览器,所有的基于IE内核的浏览器都是包装shdocvw.dll文件,然后书写相应的BHO代码。只有这样才能做到真正的控制IE浏览器,而不是方法一、二这样的隔靴搔痒。

  还有一种基于IE内核的弹出窗口封杀方法。它可以在弹出窗口打开之前加以拦截。其原理是:每当IE打开一个新的窗口时候都会触发NewWindow事件,执行OnNewWindow2([out] IDispatch*, [out] BOOL *bCancel)方法。重载此方法,判断打开新窗口事件是否发生在浏览页面已经下载完毕之后。如果是,说明是正常的弹出窗口,反之加以拦截。

  由于Gosurf这样的浏览器本身就重载了Shocvm.dll组件,所以使用第三种方法就自然成了顺理成章的事。然而在使用过程中有时也会发现,广告过滤不很完美,但原理基本如此。

泛泛之交 2017-07-08 2 楼

浏览器的广告过滤功能一般都是配置一个广告过滤配置文件,然后在这个配置文件里编写广告过滤规则,当用户浏览网站时,会对HTTP返回的HTML信息根据这个广告过滤配置文件里的过滤规划对HTML进行过滤,然后再由浏览器渲染出页面。

当然浏览器还应该提供给用户一下“自定义广告过滤规则”的功能供用户定义过滤规则。

以下是搜狗浏览器的广告过滤规则:
1、以@@|开头的规则表示免过滤站点;比如@@http://www.123456.com
2、以@@表示??
3、以|开头表示??
4、以||开头表示??
5、以.开头表示??
6、直接书写URL地址表示过滤URL

偏爱自由 2017-06-18 1 楼

看看金山卫士等对广告的过滤规则,弹出广告一般都是JS代码,或者是Frame的,frame会被浏览器认为是不安全的代码,所以检测这些就可以了,具体没做过,希望对你有用。