adblock过滤规则编写

本指南旨在帮助您编写和维护自己的Adblock Plus过滤器。通过创建自己的过滤器,您可以更好地控制要访问的网站上不希望看到的东西,包括广告,图像,请求和脚本。

重要提示:本指南中的所有过滤器示例仅是示例,并不意味着要使用。

目录

  • [关于Adblock Plus过滤器]
  • [创建过滤器]
  • 基本过滤规则
    • [定义例外规则]
    • [在地址的开头或结尾匹配]
    • [标记分隔符]
    • [注释]
  • 高级功能
    • 指定过滤器选项
      • [类型选项]
      • [反类型选项]
      • [对第三方/第一方请求的限制]
      • [域限制]
      • [Sitekey限制]
      • [内容安全政策]
      • 将请求重定向到内部资源
        • [有关使用重写选项的一些注意事项]
    • [使用正则表达式]
    • [特别评论]
  • 元素隐藏
    • [基本规则]
    • [将规则限制到某些域]
    • [属性选择器]
    • [高级选择器]
    • [扩展CSS选择器(特定于Adblock Plus)]
    • [例外规则]
    • [通用/特定过滤器]
  • [在服务器上实现站点密钥]

关于Adblock Plus过滤器

以下过滤器列表已随Adblock Plus预先安装:

  • 可接受的广告
  • EasyList(+捆绑的语言过滤器列表-取决于浏览器的语言设置)
  • ABP反规避过滤器列表

除了这些预安装的过滤器列表之外,您还可以创建自己的过滤器。过滤器只是一个告诉您的浏览器要阻止哪些元素的规则。过滤器列表是一组规则,告诉您的浏览器要阻止的内容。

创建过滤器

过滤器或过滤器规则有几种类型,包括:

  • 阻塞过滤器

    在网络级别上应用,以决定是否应阻止请求。

  • 隐藏过滤器

  • (通常称为元素隐藏过滤器)

隐藏页面上的特定元素,包括使用扩展选择器(模拟)和代码片段隐藏元素。

  • 异常过滤器

    用于取消阻止某些请求或取消隐藏某些网站上的某些元素。此外,尽管过滤器会阻止某些请求,但它们仍可以允许某些网络请求。

注意:可以将“阻止和隐藏”滤镜设置为否定或反转其他滤镜的效果。然后将它们视为异常过滤器

您可以通过Adblock Plus设置页面轻松创建过滤器。

适用于所有支持WebExtensions API(例如Chrome,Edge,Firefox,Opera和Yandex Browser)的浏览器的Adblock Plus(3.4版及更高版本):

  1. 单击Adblock Plus图标,然后单击右上角的齿轮图标。
    将打开“ *Adblock Plus设置”*选项卡。
  2. 选择“ *高级”*选项卡,然后滚动到“ *创建和编辑过滤器列表”*部分。
  3. 单击开始创建我的过滤器列表
  4. 输入您的过滤器,然后点击保存

基本过滤规则

您可以定义的最简单的过滤器是您要阻止的请求的地址。但是,每次打开页面时,此地址通常都会更改。例如,它可能是http://example.com/ads/banner123.gif在那里123是一个随机数。在这里,封锁完整的地址将无济于事。您将需要一个更通用的过滤器,例如http://example.com/ads/banner*.gif或什至http://example.com/ads/,该过滤器会阻止“ ads”目录中的所有内容。

注意:请确保不要过多地使用通配符。过滤器http://example.com/将阻止所有横幅,但也会阻止example.com您可能仍希望看到的所有其他内容。

定义例外规则

如果您发现过滤器阻止了不应过滤的内容,则可以考虑使用例外规则,而不是删除或匹配过滤器。例外规则允许您定义不应应用过滤器的情况。异常规则与过滤规则没有什么不同;您可以使用通配符或正则表达式。

示例:如果您对过滤器adv阻止不满意http://example.com/advice.html,则可以定义例外规则@@advice。您只需要在其之前@@指示异常规则即可。

但是,异常规则可以做更多的事情。例如,如果指定$document option,则整个页面都会出现异常。如果您的例外规则是,@@||example.com^$document并且您从打开一个页面example.com,则Adblock Plus将在此页面上关闭,并且不会阻止任何内容。

在地址的开头或结尾匹配

Adblock Plus通常将每个过滤器视为在其开头和结尾都带有通配符(即,ad和之间没有区别*ad*)。尽管这通常没有问题,但有时您可能希望定义的过滤器仅在地址的开头或结尾匹配。

示例:您想阻止所有Flash,但是如果添加过滤器swf,该地址http://example.com/swf/index.html也将被阻止。解决方案是在过滤器中添加管道符号(|),以表明此时应有确定的终点。例如,过滤器swf|阻止,http://example.com/annoyingflash.swf但不阻止http://example.com/swf/index.html。和过滤|http://baddomain.example/http://baddomain.example/banner.gif,但没有http://gooddomain.example/analyze?http://baddomain.example

你可能想阻止http://example.com/banner.gif,以及https://example.com/banner.gifhttp://www.example.com/banner.gif。您可以通过在过滤器前面放置两个管道符号来实现。这样可确保过滤器在域名“:”的开头匹配||example.com/banner.gif,并阻止所有这些地址,而不阻止http://badexample.com/banner.gifhttp://gooddomain.example/analyze?http://example.com/banner.gif

标记分隔符

有时,您可能需要在过滤器中接受任何分隔符。例如,你可以写一个过滤器,阻止http://example.com/http://example.com:8000/,但不会http://example.com.ar/。此处,该符号^可用作单个分隔符的占位符http://example.com^。分隔符可以是任何东西,但一个字母,数字或以下情况之一:_-.%。地址的末尾也可以用作分隔符。

在以下示例中,所有分隔符均以蓝色粗体显示:

HTTP: // example.com 8000 / foo.bar **?**a = 12 b =%D1%82%D0%B5%D1%81%D1%82

可以使用过滤器^example.com^^%D1%82%D0%B5%D1%81%D1%82^或阻止该地址^foo.bar^

注释

任何以感叹号(!)开头的规则均被视为注释。Adblock Plus会忽略此规则进行实际屏蔽,因此可以在注释中编写任何内容。您可以在过滤器上方放置注释规则以描述其目的或功能,也可以在过滤器列表上方放置注释以说明您的作者身份(大多数过滤器列表作者都这样做)。

高级功能

指定过滤器选项

Adblock Plus允许您指定许多选项来修改过滤器的行为。这些选项应在过滤器末尾的,美元符号($)后用逗号()分隔。

示例:/ ads / * $ script,match-case

在这里,/ads/*是实际的过滤器,script并且match-case是其选项。当前,支持以下选项:

类型选项

这些决定了过滤器可以阻止哪些元素类型(或在例外规则的情况下进入白名单)。可以指定多个类型选项以指示该过滤器应应用于几种类型的元素。可能的类型包括:

  • script -通过HTML脚本标签加载的外部脚本
  • image -常规图像,通常通过HTML img标签加载
  • stylesheet -外部CSS样式表文件
  • object -由浏览器插件处理的内容,例如Flash或Java
  • xmlhttprequest-使用XMLHttpRequest对象或fetch()API开始的请求
  • subdocument -嵌入式页面,通常通过HTML嵌入式框架(iframe)包含在内
  • ping -请求发起人 或navigator.sendBeacon()(需要Adblock Plus 2.7.1或更高版本)
  • websocket-通过WebSocket对象发起的请求(需要Adblock Plus 2.8或更高版本)
  • webrtc-通过RTCPeerConnection实例打开与ICE服务器的连接(要求更高的Adblock Plus 1.13.3或更高版本(对于Chrome和Opera),要求3.0或更高版本(对于Firefox)
  • document-页面本身(只能将异常规则应用于该页面)
  • elemhide-仅适用于例外规则,类似于document但仅关闭页面上的元素隐藏规则,而不是关闭所有过滤器规则(需要Adblock Plus 1.2或更高版本)
  • generichide-仅适用于例外规则,类似于elemhide但仅关闭页面上的通用元素隐藏规则(需要Adblock Plus 2.6.12或更高版本)
  • genericblock-仅适用于例外规则,就像generichide但可以关闭通用阻止规则(需要Adblock Plus 2.6.12或更高版本)
  • popup-在新选项卡或窗口中打开的页面注意:默认情况下,只有$popup指定了type选项,过滤器才会阻止弹出窗口。
  • font -外部字体文件
  • media -常规媒体文件,例如音乐和视频
  • other -上面列表中未涵盖的请求类型
  • match-case-确保过滤器仅适用于大小写匹配的请求,例如过滤器*/BannerAd.gif$match-case块,http://example.com/BannerAd.gif但不适用于http://example.com/bannerad.gif
反类型选项

这些指定了不应应用过滤器的请求类型。可能的反类型选项包括〜script,〜image,〜stylesheet,〜object,〜xmlhttprequest,〜subdocument,〜ping,〜websocket,〜webrtc,〜document,〜elemhide,〜other

对第三方/第一方请求的限制

如果指定了第三方选项,则过滤器仅应用于来自与当前查看页面不同来源的请求。同样,〜third-party将过滤器限制为来自与当前查看页面相同来源的请求。

域限制

该选项domain=example.com意味着过滤器应仅应用于example.com域中的页面。可以指定多个域|作为分隔符。对于选项domain=example.com|example.net,过滤器仅应用于来自example.comexample.net域的页面。如果域名以开头~则不应将过滤器应用于该域的页面。例如,domain=~example.com装置,该过滤器应的网页上施加从任意域,但example.comdomain=example.com|~foo.example.com限制滤波器应用于example.com与外域foo.example.com的子域。

Sitekey限制

该选项sitekey=abcdsitekeydcba意味着过滤器应仅应用于提供公共密钥和签名的页面,该签名可以由过滤器中也包含的同一公共密钥来验证(但不能结尾=)。可以将多个站点密钥|用作分隔符。例如,该选项sitekey=abcdsitekeydcba|bcdesitekeyedcb仅允许将过滤器应用于提供sitekey abcdsitekeydcba或的页面bcdesitekeyedcb。这类似于域限制,但允许单个过滤器应应用于大量域的情况。注意:Sitekey限制要求在服务器端进行修改

内容安全政策

该选项将向与过滤器匹配的请求文档的HTTP响应中注入csp=script-src: 'none'Content Security Policy标头script-src: 'none'(假设具有相同选项的例外规则也不匹配,并且该文档未列入白名单)。内容安全策略会script-src: 'none'阻止文档中的所有脚本,包括内联脚本。通常应避免使用此过滤器选项,除非作为最后的手段来避免高级规避。(需要Adblock Plus 3.1或更高版本。)

将请求重定向到内部资源

rewrite=选项允许将URL重写(或重定向请求)到内部资源,以便在不引起错误的情况下将其停用。通过名称和前缀指示内部资源abp-resource:以便被识别。例如,$rewrite=abp-resource:blank-js发送一个空的JavaScript。(需要Adblock Plus 3.5或更高版本。)可用的内部资源是:

  • blank-text -空文字
  • blank-css -空的样式表
  • blank-js -空的JavaScript
  • blank-html -空的HTML文档
  • blank-mp3 -一个0.1秒的静音MP3音频文件
  • 1x1-transparent-gif -1x1像素透明GIF图像
  • 2x2-transparent-png -2x2像素的透明PNG图像
  • 3x2-transparent-png -3x2像素的透明PNG图像
  • 32x32-transparent-png -32x32像素的透明PNG图像

其他任何值都将使过滤器无效,并让请求通过。

有关使用重写选项的一些注意事项
  1. rewrite=使用$domain过滤器选项只能在某些域中使用。有关更多信息,请参阅本指南的“ 域限制”部分。
  2. rewrite=不能与$third-partyfilter选项一起使用,但可以与一起使用$~third-party
  3. 过滤器模式必须为*或以开头||

使用正则表达式

Adblock Plus支持以正则表达式(regex)编写的过滤器。例如,过滤器/banner\d+/匹配banner123banner321但不匹配banners。我们建议您查阅Mozilla 关于正则表达式文档,以学习如何编写它们。

注意:出于性能原因,建议尽可能避免使用正则表达式。

特别评论

特殊注释仅对下载的过滤器列表有效,而对自定义过滤器无效。他们可以为过滤器列表设置许多参数:

  • ! Homepage: http://example.com/ -此评论确定应将哪个网页链接为过滤器列表主页。
  • ! Title: FooList-此注释为过滤器列表设置了固定的标题。如果存在此注释,则用户不再能够更改标题。
  • ! Expires: 5 days-此注释设置过滤器列表的更新间隔。该值可以以天(例如5天)或小时(例如8小时)为单位给出。1小时到14天之间的任何值都是可以的。请注意,此时间间隔之后不一定会进行更新。实际的更新时间会稍微随机化,并取决于一些其他因素以减少服务器负载。
  • ! Redirect: http://example.com/list.txt-此注释表示过滤器列表已移至新的下载地址。Adblock Plus会忽略该注释以外的任何文件内容,并立即尝试从新地址下载。如果成功,则在设置中更新过滤器列表的地址。如果新地址与当前地址相同,则忽略此注释,这意味着它可用于强制执行过滤器列表的“规范”地址。
  • ! Version: 1234-此注释定义了过滤器列表的数字版本。此版本号显示在问题报告中,可用于验证报告是否引用了过滤器列表的当前版本。

元素隐藏

基本规则

不幸的是,有些广告不能立即被阻止。这是因为它们作为文本嵌入在网页本身中。如果您查看网页的源代码,则可能会发现以下内容:

Cheapest tofu, only here and now!
Really cheap tofu, click here!
Only here you get the best tofu!

您需要下载网页才能下载广告。下载网页后,您可以隐藏不想看的广告。

上面的示例广告包含在具有class属性的元素内textad。该规则##.textad将隐藏任何此类元素。这里##标记了元素隐藏规则,其余的是选择器,用于标识需要隐藏的元素。您可以按元素的ID属性(同样,###sponsorad隐藏第二个广告)和按名称(例如##textad,第三个广告)隐藏元素。

将规则限制到某些域

通常,您可能希望在一个网站上隐藏特定的广告,但不希望将规则应用于另一网站。例如,该规则##.sponsor可能会在某些站点上隐藏有效的代码。但是,如果将其编写为example.com##.sponsor,它将应用于http://example.com/http://something.example.com/,但不会应用于http://example.org/。您也可以通过简单的用逗号分隔指定多个域:domain1.exampledomain2.exampledomain3.example##.sponsor

如果域名前面带有~,则该规则不适用于该域的页面。例如,~example.com##.sponsor适用于任何领域的页面,但"example.com"example.com,~foo.example.com##.sponsor让规则适用于"example.com"与外域"foo.example.com"的子域。

注意:由于元素隐藏的实现方式,您只能将其限制为完整域名。您不能使用地址的任何其他部分,也不能domain代替domain.example,domain.test

属性选择器

有些广告客户对您而言并不容易-他们的文字广告既没有ID,也没有类别属性。您可以使用其他属性来隐藏这些属性,例如,##table[width="80%"]隐藏宽度属性设置为80%的表。如果您不想指定属性的完整值,请##div[title*="adv"]隐藏所有div具有title属性的字符串,其中该属性包含string "adv"。您还可以检查开始和属性的末尾,例如##div[title^="adv"][title$="ert"]皮格与标题开始元素"adv"和结尾"ert"。如您所见,您还可以使用多个条件- table[width="80%"][bgcolor="white"]匹配宽度属性设置为80%且bgcolor属性设置为白色的表。

高级选择器

通常,浏览器支持的任何CSS选择器都可以用于元素隐藏。例如,以下规则隐藏了div具有“ adheader”类的元素之后的所有内容:##。adheader + *。有关CSS选择器的完整列表,请参考W3C的CSS选择器文档。请记住,与仅基于类或ID属性的选择器相比,浏览器处理这些类型的选择器速度较慢。

注意:建议高级用户使用此功能。您应该对CSS选择器感到满意。如果您使用无效的CSS语法,Adblock Plus将不接受您的自定义过滤器。

扩展CSS选择器(特定于Adblock Plus)

有时,标准CSS选择器的功能不足以隐藏广告。对于这些情况,我们添加了一些新的选择器,即:

  • :-abp-has()
  • :-abp-contains()
  • :-abp-properties()(Chrome和Opera需要Adblock Plus 1.13.3或更高版本。)

在编写使用这些扩展选择器的元素隐藏过滤器时,必须使用#?#csyntax,例如example.com#?#selector。但是,请务必注意,这样做会对性能产生影响,因此应谨慎行事,并确保这些过滤器特定于尽可能少的域和元素。

  • :-abp-has()

    所述:-abp-has(selector)选择器选择元件基于它们的内容。例如,:-abp-has(> div > a.advertiser)选择包含与类广告商一起包含的元素作为直接后代的元素。内部选择器可以相对于元素范围,并且可以使用任何伪选择器(包括:-abp-has())来确定是否进行选择。

注意:过滤器会example.com#?#:-abp-has(.sponsored)隐藏所有页面,因为该类也包含在中``。为避免隐藏所有页面,只需添加>+

示例:如果您eyeo.com#?#:-abp-has(code)在https://blog.csdn.net/weixin_40747900/article/details/104328954/how-to-write-filters上添加过滤器并进行硬刷新,则所有内容都会被阻止。这是因为包含。要解决此问题,请将过滤器更改为eyeo.com#?#:-abp-has(> code)。硬刷新后,仅的父元素``被阻止。

  • :-abp-contains()

    :-abp-contains(text)选择器选择元素基于其文本内容。例如,div.sidebar > span:-abp-contains(Advertisement)选择带有包含单词“ Advertisement”的侧边栏类的元素``。实际上,您希望将其与结合使用:-abp-has()以选择外部容器(类似于div.sidebar > div:-abp-has(span:-abp-contains(Advertisement))选择包含广告标签的容器)。

示例:如果您将过滤器添加到eyeo.com#?#:-abp-contains(filters)https://blog.csdn.net/weixin_40747900/article/details/104328954/how-to-write-filters并进行硬刷新,则不会发生任何变化。如果将过滤器更改为,eyeo.com#?#div:-abp-contains(filters)并且硬刷新div.outer(包含页面的中间部分)被阻止,因为其中的某个位置``是“过滤器”一词。要解决此问题,请将过滤器更改为eyeo.com#?#.article-heading:-abp-contains(filters)。硬刷新后,仅隐藏每篇文章的标题。

  • :-abp-properties()

    所述:-abp-properties(properties)选择器选择元件基于样式表的属性。例如,:-abp-properties(width:300px;height:250px;)在样式表中选择具有相应CSS规则的元素,该样式表将width和height分别设置为300px和250px的值。属性名称区分大小写。此外,可以使用通配符,以:-abp-properties(width:*px;height:250px;)匹配以像素为单位指定的任何宽度和250像素的高度。

您也可以通过用“ /”括起属性表达式来使用正则表达式。例如,:-abp-properties(/width:30[2-8]px;height:250px;/)匹配302和308像素之间的宽度和250像素的高度。

注意:CSS属性过滤器的旧语法已被弃用,并将自动转换为新格式。选择样式属性的语法保持不变。

注意:使用时background-color property,请使用rgb()表示法。例如:-abp-properties(background-color: #3D9C4F;),使用代替:-abp-properties(background-color: rgb(61, 156, 79))

示例[-abp-properties='width:300px;height:250px;']转换为:-abp-properties(width:300px;height:250px;):-abp-properties()还使用伪元素中的样式属性(例如:: before和:: after)来选择元素。例如,:-abp-properties(content:'Advertisement')匹配Advertisement找到字符串的元素::before::after伪元素。

例外规则

例外规则可以停用特定域上的现有规则。这些对过滤订阅者非常有用,这些作者正在扩展他们无法更改的另一个过滤订阅。例如,##.textad可以使用exception rule在example.com上停用该规则example.com#@#.textad。这两个规则的组合与单个规则具有完全相同的效果~example.com##.textad。建议仅在无法更改过于笼统的元素隐藏规则时才使用异常规则。在所有其他情况下,最好将此规则限制为必要的域。这些例外也将应用于高级伪选择器规则

示例:如果您##aside.info在https://blog.csdn.net/weixin_40747900/article/details/104328954/how-to-write-filters上添加过滤器,eyeo.com#@#aside则不会将任何内容列入白名单。如果添加过滤器##asideeyeo.com#@#aside.info则不会将任何内容列入白名单。过滤器必须完全相同,即eyeo.com#@#aside.info

通用/特定过滤器

使用$generichide$genericblock过滤器选项,区分常规过滤器和特定过滤器变得很重要。

如果过滤器匹配一个或多个域,或者匹配站点密钥,则我们将其分类为特定过滤器。如果过滤器未指定任何域(或仅指定了域例外),也没有站点键,则该过滤器将视为通用。例如,example.com##.textad是一个特定的过滤器,而##.textad~example.com##.textad是通用的。

请注意,使用阻止规则时,必须在$domain选项下指定域,以将其视为特定域。例如,||example.com^被认为是通用的而/ads/*$domain=example.com特定于站点。

在服务器上实现站点密钥

要应用受网站密钥限制的过滤器,网页需要返回base64编码的公共密钥版本以及Adblock Plus可以验证的签名。当前,这意味着将它们包括在HTTP响应标头(X-Adblock-Key:abcdpublickeydcba_abcdsignaturedcba)和文档的根标记()中。

您必须创建一个私有RSA密钥(最好是512位,以保持较低的传输量),然后创建一个公共密钥的DER表示。用于创建签名的数据是由NUL字符“ \ 0”分隔的请求变量(即URI,主机和用户代理)的级联列表。例如, /index.html?q=foo\0www.example.com\0Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:30.0) Gecko/20100101 Firefox/30.0

要生成此字符串的签名,请使用签名算法SEC_OID_ISO_SHA_WITH_RSA_SIGNATURE(使用OpenSSL时的默认算法)。

  • 7
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值