返回列表 发帖

[TheWorld 3] 个人编写过滤规则的一点心得

写过滤也有一小段时间了,稍微有点个人心得,拿出来和大家分享分享

注:本人只会写我会的部分,同时希望给新来编写规则的坛友一点参考。

说起来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

评分人数

  • hblf

  • elkay

好有帮助啊``  希望高手们都能来点经验之谈啊!!!!!!

TOP

<paramex>
   <![CDATA["ad(top"|bottom")]]>
  </paramex>
这个有点晕```那括号咋从adtop中间开始的??

TOP

支持。

TOP

   <paramex>
   <![CDATA["ad(top"|bottom")]]>
  </paramex>
这个有点晕```那括号咋从adtop中间开始的??
taoran06jg1 发表于 2010-2-7 12:15 http://bbs.ioage.com/cn/images/common/back.gif


哈,这个就是 说可以用 "ad +上括号中的两个 分别匹配,分别是 "adtop" 和"adbottom" 因为前面的"ad是一样的,所以可以写成这样不然就要写成 "adtop"|"adbottom"

我这个是比较简单的例子,事实上有的地方比较多,两个看不出什么特别简化的地方,如果是四五个地方这样写代码就比较少了呀。

TOP

感谢E版的评分和补充~!

TOP

学习了,没看懂

TOP

。。。。楼上这可不是学习的心态啊,真要学习的话,把没看懂的地方指出来,我自然会给你说的呀。

TOP

好东西啊

TOP

学习下

TOP

楼主这样的解释,我怕会让人更加看不懂

TOP

这个倒是看懂了,但是经常找不到网页的广告在哪个div或js里面,有没有什么技巧?

TOP

返回列表