返回列表 发帖

[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

看不懂.......

TOP

本帖最后由 SMTP 于 2014-6-11 19:25 编辑

呵呵,路过!支持一下!
[attach]116428[/attach]

TOP

技术帖子,我得好好看看。

TOP

好东西啊

TOP

好东西啊

TOP

TOP

楼上  说到大家心里了。哎。世界之窗好几年了,

TOP

说实话,还是很复杂。普通用户为了过滤某个网站上的广告要这么费劲,基本都放弃了。
完全可以做的简易些,既然规则里有很多固定的内容,为什么不隐藏它使之对用户不可见?这样不就降低了复杂度了吗?
另外,还得用户自己查找广告代码,这无疑让普通用户无法使用,普通用户就能看见广告图片在哪,漂浮广告在哪,哪里还懂什么div、table之类的代码?
就应该做成进入广告拦截模式点击相应的广告图片然后即可删除该部分广告的形式。
易用性做的太差了,能研究的用户极少,比例不会超过5%,对绝大部分用户来说,看天书,而且,他们即便看了,一看这么复杂,压根就不会再看了。

TOP

别的先不问了,请教下这个http://gamego.renren.com/屏弊怎么写。

TOP

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

TOP

返回列表