- UID
- 141600
- 帖子
- 921
- 精华
- 0
- 贡献
- 0
- 推广
- 0
- 有效BUG
- 0
- 注册时间
- 2008-8-27
|
写过滤也有一小段时间了,稍微有点个人心得,拿出来和大家分享分享
注:本人只会写我会的部分,同时希望给新来编写规则的坛友一点参考。
说起来tw3的过滤规则编写真是比tw2简单得多,都不用懂正则,只要能看懂网页就行了。只是规则里看起来有点复杂罢了。但是细看的话会发觉其实真的很简单。
比如E版的这个规则范例:
<?xml version="1.0" encoding="utf-8"?>
<adfilter>
<version>2.0</version>
<rules>
<rule>
<name>tw论坛首页测试规则</name>
<onlineupdate>
<downloadurl><![CDATA[http://bbs.ioage.com/cn/attachment.php?aid=12345]]></downloadurl>
<quotewebpage><![CDATA[http://bbs.ioage.com/cn/thread-12345-1-1.html]]></quotewebpage>
</onlineupdate>
<domains>
<domain>
<include>
<![CDATA[*bbs.ioage.com/cn/*]]>
</include>
</domain>
</domains>
<pattern type="1">
<targets>
<param>
<![CDATA[div]]>
</param>
</targets>
<pattern type="3">
<targets>
<param>
<![CDATA[id="header"]]>
</param>
<replace>
<![CDATA[<!--AD Blocked by TheWorld 3-->]]>
</replace>
</targets>
</pattern>
</pattern>
</rule>
</rules>
</adfilter>
粗看好像很复杂,不过把区域划分下,看起来就很简单了。
复制一遍:
<?xml version="1.0" encoding="utf-8"?> <=蓝色部分是过滤规则的头尾,必须要加上,在管理黑名单查看的时候是不显示这些的,但是要做成导入用的xml的时候必须要加上。
<adfilter>
<version>2.0</version>
<rules>
<rule>
<name>tw论坛首页测试规则</name> <=这部分是规则的名字
<onlineupdate>
<downloadurl><![CDATA[http://bbs.ioage.com/cn/attachment.php?aid=12345]]></downloadurl>
<quotewebpage><![CDATA[http://bbs.ioage.com/cn/thread-12345-1-1.html]]></quotewebpage>
</onlineupdate> <=这部分是在线升级用的,自己用话可以不写,也可以写成本地路径,只是要注意不能以“/”结尾
<domains>
<domain>
<include>
<![CDATA[*bbs.ioage.com/cn/*]]>
</include>
</domain>
</domains> <=这里是要过滤的网址,记得根据需要加上“*”号,同时有需要排除的可以再加上<exclude>节,格式和这个是一样的
<pattern type="1"> <=这里开始就是过滤规则的主体部分了,第一行是过滤的方式,分12345五种,E版的教程里说得很清楚了
<targets> <=目标
<param> <=关键词
<![CDATA[div]]> <=关键词的具体数据
</param>
</targets>
<pattern type="3"> <=这里并没有把第一条过滤规则关闭,而是添加了type="3"的新的一条判断,E版这样写是为了说明1234是可以嵌套的。
<targets>
<param>
<![CDATA[id="header"]]> <=在上面的关键词基础上进一步搜索 id="header" 关键词,准确定位,不然就把所有div标签全删除了。
</param>
<replace>
<![CDATA[<!--AD Blocked by TheWorld 3-->]]> <=替换文本,可以换成任何东西,不过为了不生效,要加上<!---XXXX---->,把替换的文本解释成注释
</replace>
</targets>
</pattern> <=关闭模式3
</pattern> <=关闭模式1
</rule> 关闭规则
</rules>
</adfilter> <=蓝色部分是过滤规则的头尾,必须要加上,在管理黑名单查看的时候是不显示这些的,但是要做成导入用的xml的时候必须要加上。
这样分开来看是不是简单了很多呢。这样一路看下来,我们就会发现,我们要写一个过滤规则,只要找到广告的位置附近的特征,比如div标签,script标签,table标签或者是<td><tr>等等这样的地方,就可以修改上面的规则中的<![CDATA[id="XXXX"]]>和<pattern type="X"> 部分来达到我们想要的效果。
比如下面这段网页代码,是阿里妈妈广告的。
<script type="text/JavaScript">
alimama_pid="mm_10477956_546783_1919288";
alimama_titlecolor="0000FF";
alimama_descolor ="000000";
alimama_bgcolor="FFFFFF";
alimama_bordercolor="E6E6E6";
alimama_linkcolor="008000";
alimama_bottomcolor="FFFFFF";
alimama_anglesize="0";
alimama_bgpic="0";
alimama_icon="2";
alimama_sizecode="13";
alimama_width=250;
alimama_height=60;
alimama_type=2;
</script>
<script src="http://a.alimama.cn/inf.js" type=text/javascript> </script>
可以看到它们是在script标签里的。所以 我们只要把type1下面的cdata改成script,把type3下面的cdata改成alimama(注意这里可能type3无效,一般用type2就可以了),当然代码所在网址和过滤规则名称也是要改动的,这样将文本另存为xml导入黑名单,彻底刷新下页面(现在的过滤插件普通刷新也有效了),可以看到广告被过滤了。再次打开源文件,就可以看到原来广告位置的代码已经成为<!--AD Blocked by TheWorld 3-->这个你设定的替换文本了。
这样就完成编写规则的第一步了。但是一般网站广告不可能只有一个,一般会在不同位置,用同样或者不同的标签来设置。这里我们就要另外编写一条过滤另一个广告的规则,这也很简单,只要把上面我们写过的规则(<pattern>)部分复制一遍,粘贴在上面规则的关闭标签(</pattern>)后面再修改相同部位,保存后就可以多过滤一条广告了。(注意。这些操作尽量在第三方软件内进行,比如 nopad ,方便备份,不要直接在管理黑名单内进行。)
type1,type2,type3是比较常用的。而type4则是用在过滤大段文本的时候,利用<param>和<paramex>来定位头尾,把一整段删除或者替换成另一段文本。而type5则支持立即替换(即一段确切的文本,不需要div标签等等的来定位,直接替换成我们想要的,比如 width = "100" 替换成 width = "100%")和正则替换(正则本人没有研究,就不说啦)
这样一步步下来,一个网站的规则就编写好了。但是回过头来看,会发现有很多广告其实用的是同一个标签(说到这个主要是发现最近有些坛友写的规则非常长,其中是把每一个关键词写一个规则,造成冗余的情况),比如有三条js需要过滤,如果一条写一个,就会有(按E版的示例规则来算)17*3=51行的代码,这样就会很长了,其实这些代码可以写成一条的,只占用17行代码。方法如下:
多个关键词中间用 竖线 “|” 符号隔开,全部写到一个cdata里,而标签则用的同一个script。这样就完成代码的初步简化了。例:
<pattern rulename="Script" type="1">
<targets>
<param>
<![CDATA[script]]>
</param>
</targets>
<pattern type="2">
<targets>
<param>
<![CDATA[union001|1133|unionsky|vodone|tuigoo|tan]]>
</param>
<replace>
<![CDATA[<!--Script AD BLOCK BY LINJ-->]]>
</replace>
</targets>
</pattern>
</pattern>
可以看到六条规则简化成一条了。其他标签类似的,只要是同一个标签,都可以写在一起。
其实上面的代码还可以进行一步简化。type1 下面直接添加<paramex>节的时候,会在 <param>的基础上仅搜索<param>数据中关键词的属性。比如:
<script src="http://a.alimama.cn/inf.js" type=text/javascript> </script>这个就可以写成:
<pattern rulename="Script" type="1">
<targets>
<param>
<![CDATA[script]]>
</param>
<paramex><![CDATA[alimama]]>
</paramex>
<replace>
<![CDATA[<!--Script AD BLOCK BY LINJ-->]]>
</replace>
</targets>
</pattern>
因为alimama这个词是在<script>括号内的,归为script的属性,可以直接通过上面的规则查找属性值找到,而
<script type="text/JavaScript">
alimama_pid="mm_10477956_546783_1919288";
alimama_titlecolor="0000FF";
alimama_descolor ="000000";
alimama_bgcolor="FFFFFF";
alimama_bordercolor="E6E6E6";
alimama_linkcolor="008000";
alimama_bottomcolor="FFFFFF";
alimama_anglesize="0";
alimama_bgpic="0";
alimama_icon="2";
alimama_sizecode="13";
alimama_width=250;
alimama_height=60;
alimama_type=2;
</script>
这个就不行了,因为alimama这个词不在<script>的括号内,这个只能通过type2或者 type3查找整个 script 来找到alimama,从而过滤掉这条script。正因为type1+paramex只查找标签属性,而type1+type2需要查找整个块,所耗的时间不一样,因此我们在编写规则的时候如果遇到有属性的块的时候尽量使用type1+paramex的方式来写规则,既减少代码又加快规则处理时间,使得代码又小又快速!
最后,在编写代码的时候可能会遇到比如这样的情况,标签属性中具有相似的部分,又有不相似的部分。类似于<div id= "adtop"></div><div id= "adbottom"></div>...这类的。在编写paramex属性的时候可以加上括号和竖线的方式来简写。paramex属性可以写成
<paramex>
<![CDATA["ad(top"|bottom")]]>
</paramex>
这样会分别匹配"adtop" 和"adbottom"属性。很方便吧?
同样还有种情况<div id="ad_1001"></div><div id="ad_1011"></div><div id="ad_1021"></div><div id="ad_1013"></div>这样的,也可以使用“|”来写。但是还有种方法,就是使用 \d 来代表一个字符的方法 ,写成
<paramex>
<![CDATA["ad_10\d\d"]]>
</paramex>
好了,我会的都说完了。觉得有帮助的和有疑问的在下面回帖哈~
________________
稍微补充一下:
ad(top"|bottom")和ad_10\d\d这些都是正则表达式
“|” 表示“或者”
“\d”表示数字
这两个正则表达式写成这样比较简洁
"ad(top|bottom)"
"ad_\d+" |
-
2
评分人数
-
|