撰寫 Adblock Plus 過濾規(guī)則
AdBlock Plus 過濾規(guī)則介紹基本過濾規(guī)則
定義例外規(guī)則
匹配網(wǎng)址開頭/結(jié)尾
標(biāo)記分隔符
注釋特殊注釋
進(jìn)階功能指定過濾規(guī)則選項(xiàng)
使用正則表達(dá)式
元素隱藏基本規(guī)則
限定在特定域名的規(guī)則
屬性選擇符
高級(jí)選擇符
例外規(guī)則
簡(jiǎn)單元素隱藏語法
Generic / Specific filters
當(dāng)前的 Adblock Plus 版本允許您通過許多不同的方法來優(yōu)化過濾規(guī)則克胳。本文檔就是告訴您如何做次洼。
聲明:這里給出的過濾規(guī)則只是示例,不一定能直接使用青伤。
AdBlock Plus 過濾規(guī)則介紹
本章節(jié)描述的過濾規(guī)則屬性,對(duì)偶爾才寫過濾規(guī)則的用戶來說足矣勺届。
基本過濾規(guī)則
最簡(jiǎn)單的過濾規(guī)則當(dāng)然就是您想阻擋的橫幅廣告地址雹有,但是這些地址常常會(huì)在您每次打開頁(yè)面時(shí)改變忍级。例如: http://example.com/ads/banner123.gif
,其中 123 是一個(gè)隨機(jī)數(shù)字胡陪。在這里阻擋整個(gè)圖片地址是沒用的沥寥,您需要?jiǎng)?chuàng)建一條更通用的過濾規(guī)則 —— 如 http://example.com/ads/banner.gif
∧或者更為通用一些的邑雅,如 http://example.com/ads/
。
注:不要使用通配符來代替過多的字符妈经。過濾規(guī)則 http://example.com/*
固然可以阻擋所有的橫幅廣告淮野, 但也會(huì)阻擋 example.com 下其它一些您想看的內(nèi)容。
定義例外規(guī)則
有時(shí)您可能會(huì)發(fā)現(xiàn)某個(gè)過濾規(guī)則平時(shí)擋廣告擋得很好吹泡,但在某些情況下骤星,會(huì)阻擋一些不該擋的內(nèi)容。您不想移除這條過濾規(guī)則爆哑,但也不希望它阻擋不該擋的內(nèi)容洞难。
這就是例外規(guī)則的好處——它們?cè)试S您定義過濾規(guī)則不被使用的情況。例如揭朝,您不滿意過濾規(guī)則 adv
阻擋了 http://example.com/advice.html
队贱,您就可以定義一條例外規(guī)則 @@advice
。 例外規(guī)則和過濾規(guī)則沒什么兩樣潭袱,您可以使用通配符或正則表達(dá)式柱嫌。您只需在規(guī)則前添加 @@
來聲明這是一個(gè)例外規(guī)則。
Exception rules can do more. If you specify $document
option you will get an exception for the entire page. For example, if your exception rule is @@||example.com^$document
and you open some page from example.com — Adblock Plus will be entirely disabled on this page and nothing will be blocked.
匹配網(wǎng)址開頭/結(jié)尾
通常 Adblock Plus 處理過濾規(guī)則時(shí)屯换,會(huì)自己假設(shè)在過濾規(guī)則的開頭與結(jié)尾都有一個(gè)通配符编丘,例如,過濾規(guī)則 ad
和 ad
是一樣。 正常情況下這沒什么問題嘉抓,但有時(shí)您可能想要定義可以匹配以網(wǎng)址開頭或結(jié)尾的過濾規(guī)則索守。例如,您想要阻擋所有的 Flash掌眠,但如果您添加過濾規(guī)則 swf
地址 http://example.com/swf/index.html
同樣也將被阻擋蕾盯。
這個(gè)問題的解決方法:使用管線符號(hào)(|)來表示地址的最前端或最末端。例如這條過濾規(guī)則 swf|
會(huì)阻擋 http://example.com/annoyingflash.swf
但不會(huì)阻擋 http://example.com/swf/index.html
蓝丙。這條過濾規(guī)則 |http://baddomain.example/
會(huì)阻擋 http://baddomain.example/banner.gif
但不會(huì)阻擋 http://gooddomain.example/analyze?http://baddomain.example
。
有時(shí)您想阻擋 http://example.com/banner.gif
以及 https://example.com/banner.gif
和 http://www.example.com/banner.gif
望拖。這時(shí)只需在過濾規(guī)則的域名前面加上兩個(gè)管線符號(hào)(||):||example.com/banner.gif
將會(huì)阻擋上面的地址而不會(huì)阻擋 http://badexample.com/banner.gif
或者 http://gooddomain.example/analyze?http://example.com/banner.gif
(需要 Adblock Plus 1.1 或更高版本)渺尘。
標(biāo)記分隔符
通常您需要接受過濾規(guī)則的任何分隔符。例如说敏,您可能寫這樣一個(gè)規(guī)則阻擋 http://example.com/
和 http://example.com:8000/
但不能阻擋 http://example.com.ar/
鸥跟。在這里,符號(hào)(^)用作一個(gè)分隔符盔沫。 http://example.com^
(需要 Adblock Plus 1.1 或更高版本)医咨。
分隔符可以是除了字母、數(shù)字或者 _ - . % 之外的任何字符架诞。 這個(gè)地址的結(jié)尾也是作為一個(gè)分隔符拟淮,下面的例子中所有的分隔符以紅色標(biāo)記出: http://example.com:8000/foo.bar?a=12&b=%D1%82%D0%B5%D1%81%D1%82。所以這個(gè)地址可以通過這些過濾規(guī)則過濾 example.com
或 %D1%82%D0%B5%D1%81%D1%82
或 foo.bar
谴忧。
注釋
任何以感嘆號(hào) (!) 開始的規(guī)則很泊,都被視為注釋。在過濾規(guī)則的列表中沾谓,仍然會(huì)顯示這些規(guī)則委造,但會(huì)用灰色的字來顯示,而不是黑色均驶。Adblock Plus 在判斷規(guī)則時(shí)昏兆,會(huì)忽略這些注釋,所以我們可以寫下任何我們想寫的東西妇穴。您可以在一條規(guī)則上面寫下這條規(guī)則是做什么用的爬虱。也可以在過濾列表的上方寫上作者信息(大多數(shù)過濾列表的作者已經(jīng)這樣做了)。
特殊注釋
特殊注釋只在下載的過濾規(guī)則列表中生效伟骨,在自定義列表中無效饮潦。 它們可以為該過濾規(guī)則列表設(shè)置許多參數(shù):
! Homepage: http://example.com/
此注釋表明哪個(gè)網(wǎng)頁(yè)是該過濾規(guī)則列表的首頁(yè)。
! Title: FooList
此注釋為該過濾規(guī)則列表設(shè)置一個(gè)固定的標(biāo)題携狭。 如果此注釋存在继蜡,用戶不能再更改該標(biāo)題。
! Expires: 5 days
此注釋設(shè)置該過濾規(guī)則列表的更新間隔,指定的值為天數(shù)(例如5 days
)或者小時(shí)數(shù)(例如8 hours
)稀并。 可以提供1小時(shí)至14天之間的值仅颇。 注意:更新并不一定會(huì)在指定的間隔到達(dá)時(shí)發(fā)生。 實(shí)際的更新時(shí)間會(huì)稍微隨機(jī)化并取決于一些額外因素碘举,以減少服務(wù)器負(fù)載忘瓦。
! Checksum: OaopkIiiAl77sSHk/VAWDA
此注釋確保數(shù)據(jù)的意外損壞不會(huì)導(dǎo)致出現(xiàn)過濾規(guī)則的意外損壞。 舉例來說引颈,一些防火墻軟件可能會(huì)在下載時(shí)修改像是 /adnetwork/
的過濾規(guī)則來試圖保護(hù)用戶免于廣告耕皮。 但這會(huì)導(dǎo)致移除過濾規(guī)則的部分內(nèi)容,Adblock Plus 將只會(huì)看到過濾規(guī)則像是 **
蝙场。 過濾規(guī)則列表中的校驗(yàn)和注釋就是為了防止這種情況凌停,任何修改將導(dǎo)致該校驗(yàn)和不再與內(nèi)容相匹配,然后 Adblock Plus 將忽略該數(shù)據(jù)售滤。
計(jì)算該校驗(yàn)和需要執(zhí)行下列步驟:
移除現(xiàn)存的校驗(yàn)和及注釋(如果有)罚拟。
使用 UTF-8 編碼對(duì)過濾規(guī)則列表的文本進(jìn)行編碼。
轉(zhuǎn)換所有換行符為 Unix 樣式(替換掉 \r
用 \n
完箩,如果有)赐俗。
移除空行(用 \n
字符替換掉連續(xù)的 \n
字符)。
計(jì)算該文本的 MD5 校驗(yàn)和的 Base64 編碼弊知,去除結(jié)尾的 =
字符(如有)阻逮。
您也可以看看基于 Python 實(shí)現(xiàn)的 驗(yàn)證校驗(yàn)和和 添加校驗(yàn)和到文件作為參考。
! Redirect: http://example.com/list.txt
此注釋表明該過濾規(guī)則列表已被轉(zhuǎn)移到一個(gè)新的下載地址吉捶。 Adblock Plus 將忽略此注釋后的任何文件內(nèi)容并立即嘗試從新的地址下載夺鲜。 如果成功,過濾規(guī)則列表的地址將按此設(shè)置被更新呐舔。 如果新的地址與當(dāng)前地址相同币励,此注釋將被忽略,并意味著它可以作為該過濾規(guī)則列表的“權(quán)威”地址使用珊拼。
! Version: 1234
此注釋定義過濾規(guī)則列表的數(shù)字版本食呻。 此版本號(hào)將顯示在問題報(bào)告中,并且可以用于驗(yàn)證報(bào)告指向的是否是過濾規(guī)則列表的當(dāng)前版本澎现。
進(jìn)階功能
本章節(jié)描述的特性通常只有高級(jí)用戶和維護(hù)過濾列表的作者才會(huì)看仅胞。普通用戶可跳過。
指定過濾規(guī)則選項(xiàng)
Adblock Plus 允許您指定某些選項(xiàng)來改變某條規(guī)則的行為剑辫。您列舉這些選項(xiàng)的時(shí)候?qū)⑺鼈兎旁诿涝?hào) ($) 后面并用逗號(hào) (,) 分割這些選項(xiàng)干旧,放在過濾規(guī)則的最后面,例如:
/ads/$script,match-case
這里的 /ads/
是真實(shí)的過濾規(guī)則 script
和 match-case
是其指定的選項(xiàng)妹蔽。下面是目前支持的選項(xiàng):
類型選項(xiàng):判定過濾規(guī)則(或例外規(guī)則)過濾元素的類型椎眯。過濾規(guī)則可以指定多個(gè)類型選項(xiàng)來過濾指定的元素類型挠将。可以指定的類型包括:script
—— 外部腳本编整,由 HTML script 標(biāo)簽加載
image
—— 正常圖片舔稀,通常由 HTML 的 img 標(biāo)簽所載入
stylesheet
—— 外部 CSS 樣式文件
object
—— 由瀏覽器插件處理的內(nèi)容,例如 Flash 或 Java
xmlhttprequest
— requests started using the XMLHttpRequest
object or fetch()
API
object-subrequest
—— 插件的請(qǐng)求掌测,比如Flash
subdocument
—— 內(nèi)嵌的頁(yè)面内贮,通常通過 HTML 的框架方式內(nèi)嵌
ping
— requests started by <a ping>
or navigator.sendBeacon()
(Adblock Plus 2.7.1 or higher required)
websocket
— requests initiated via WebSocket
object (Adblock Plus 2.8 or higher required)
document
—— 網(wǎng)頁(yè)本身(只適用于 例外規(guī)則 )
elemhide
—— 只適用于例外規(guī)則,類似于document
但是只禁用頁(yè)面上的隱藏規(guī)則而不是所有規(guī)則(需要Adblock Plus 1.2 或更高版本)
generichide
— for exception rules only, similar to elemhide
but only disables generic element hiding rules on the page (Adblock Plus 2.6.12 or higher required)
genericblock
— for exception rules only, just like generichide
but disables generic blocking rules (Adblock Plus 2.6.12 or higher required)
other
—— 其他不在上面的類型的請(qǐng)求
The type options background
, xbl
and dtd
are outdated and should no longer be used.
反轉(zhuǎn)類型選項(xiàng):指定過濾規(guī)則不應(yīng)用的元素類型汞斧∫褂簦可以指定的類型選項(xiàng): ~script
, ~image
, ~stylesheet
, ~object
, ~xmlhttprequest
, ~object-subrequest
, ~subdocument
, ~document
, ~elemhide
, ~other
third-party/first-party 請(qǐng)求限制:如果指定了 third-party
選項(xiàng), 則過濾規(guī)則只適用于來源與當(dāng)前正在瀏覽的頁(yè)面的不同的請(qǐng)求粘勒。類似地拂酣,~third-party
適用于來源與當(dāng)前瀏覽頁(yè)面相同的請(qǐng)求。
域名限定:選項(xiàng) domain=example.com
指過濾規(guī)則只適用于 "example.com" 下的頁(yè)面 仲义。多個(gè)域名可以用 "|" 分隔: 過濾規(guī)則 domain=example.com|example.net
將只適用于 "example.com" 或 "example.net" 的頁(yè)面。如果一個(gè)域名是前面有"~"剑勾,則該過濾規(guī)則不適用于這個(gè)域名的頁(yè)面埃撵。例如: domain=~example.com
指過濾規(guī)則適用于除了 example.com 之外的任何域名的頁(yè)面而 domain=example.com|~foo.example.com
限定了過濾規(guī)則適用于 "example.com" 但不包括 "foo.example.com" 。
Sitekey 限制:選項(xiàng) sitekey=abcdsitekeydcba
意味著該過濾規(guī)則應(yīng)該只在頁(yè)面上提供了一個(gè)與過濾規(guī)則內(nèi)含有的非常相似的(但沒有 = 后綴的)公鑰和一個(gè)可被驗(yàn)證的簽名時(shí)應(yīng)用虽另≡萘酰可以使用“|”作為分隔指定多個(gè) sitekey:使用 sitekey=abcdsitekeydcba|bcdesitekeyedcb
作為過濾規(guī)則的選項(xiàng)時(shí),將只會(huì)在頁(yè)面提供了“abcdsitekeydcba”或者“bcdesitekeyedcb”的 sitekey 時(shí)應(yīng)用捂刺。這類似于域名限制谣拣,但這允許單條過濾規(guī)則應(yīng)用到相當(dāng)多的域。注意族展,sitekey 限制需要服務(wù)器側(cè)的修改森缠。
match-case
—— 使過濾規(guī)則只適用于匹配地址,例如:過濾規(guī)則 */BannerAd.gif$match-case
會(huì)阻擋 http://example.com/BannerAd.gif
但不會(huì)阻擋 http://example.com/bannerad.gif
仪缸。
collapse
— 這個(gè)選項(xiàng)將覆蓋全局"隱藏已屏蔽元素的占位符"選項(xiàng)贵涵,并確保過濾規(guī)則總是隱藏這些元素。類似地恰画,~collapse
選項(xiàng)將確保過濾規(guī)則不隱藏這些元素宾茂。
donottrack
—— 對(duì)有該選項(xiàng)的阻擋規(guī)則匹配到且有該選項(xiàng)的例外規(guī)則未匹配到的地址會(huì)發(fā)送一個(gè) Do-Not-Track 頭 (需要Adblock Plus 1.3.5 或更高版本)。 為了向后兼容拴还,使用此選項(xiàng)時(shí)建議使用矛盾的組合類型選項(xiàng)跨晴,防止此規(guī)則在早期版本的 Adblock Plus 中阻擋任何東西: *$donottrack,image,~image
使用正則表達(dá)式
如果您想更好地控制您的過濾規(guī)則,什么匹配片林,什么不匹配端盆,您可以使用正則表達(dá)式怀骤。例如過濾規(guī)則 /banner\d+/
會(huì)匹配 banner123
和 banner321
而不會(huì)匹配 banners
。 您可以查看正則表達(dá)式的文檔來學(xué)習(xí)如何寫正則表達(dá)式爱谁。
注: 由于性能原因晒喷,建議盡可能避免使用正則表達(dá)式。
元素隱藏
基本規(guī)則
有時(shí)您可能會(huì)發(fā)現(xiàn)無法阻擋某些內(nèi)嵌在網(wǎng)頁(yè)中的文字廣告访敌。如果查看源碼的話凉敲,可能發(fā)現(xiàn)類似這樣的代碼:
<div class="textad">Cheapest tofu, only here and now!</div><div id="sponsorad">Really cheap tofu, click here!</div><textad>Only here you get the best tofu!</textad>
因?yàn)槟仨毾螺d頁(yè)面的內(nèi)容,所以您也必須下載這些廣告寺旺。對(duì)于這種情況爷抓,您可以做的就是把這些廣告藏起來,這樣您就不會(huì)看到他們了阻塑。這也就是元素隱藏的意義所在蓝撇。
上面代碼中的第一則廣告是在一個(gè) class 屬性為“textad”的 div 容器內(nèi)。過濾規(guī)則 ##div.textad
陈莽。 這里的 ## 表明這是一條元素隱藏規(guī)則渤昌,剩下的就是定義需要隱藏元素的選擇器,同樣的走搁,您可以通過他們的 id 屬性來隱藏 ##div#sponsorad
會(huì)隱藏第二個(gè)廣告独柑。您不需要指定元素的名稱, 過濾規(guī)則 ###sponsorad
同樣也可以私植。您也可以僅指定要阻擋的元素名稱來隱藏忌栅,例如:##textad
可以隱藏第三則廣告。
在不查看頁(yè)面源碼的情況下曲稼,Element Hiding Helper 擴(kuò)展 可以幫助選擇正確的元素并寫出相應(yīng)的規(guī)則索绪。基礎(chǔ)的HTML知識(shí)還是很有用的贫悄。
注:元素隱藏規(guī)則與普通過濾規(guī)則的工作方式有很大的差別瑞驱。元素隱藏規(guī)則不支持通配符。
限定在特定域名的規(guī)則
通常您只想要隱藏特定網(wǎng)站的特定廣告清女,而不希望規(guī)則會(huì)作用于其他網(wǎng)站钱烟。例如,過濾規(guī)則 ##.sponsor
可能會(huì)把某些網(wǎng)站的有效代碼也隱藏了嫡丙。但如果你把它寫成 example.com##.sponsor
就只會(huì)在 http://example.com/
和 http://something.example.com/
生效了拴袭,而不是 http://example.org/
。 你也可以指定多個(gè)域名——只要用逗號(hào)(,)分隔即可:domain1.example,domain2.example,domain3.example##.sponsor
曙博。
如果在域名之前有 "~"拥刻,該過濾規(guī)則不適用于這個(gè)域名的頁(yè)面(需要 AdBlock Plus 1.1或更高版本)。例如父泳, ~example.com##.sponsor
將適用于除了 "example.com" 之外的域名般哼,example.com,~foo.example.com##.sponsor
適用于 "example.com" 但不適用于 "foo.example.com" 子域名吴汪。
注:由于元素隱藏實(shí)現(xiàn)方式的關(guān)系,您只可以將隱藏規(guī)則限定在完整的域名蒸眠。您不能使用網(wǎng)址的其他部份漾橙,也不可用 domain
代替 domain.example,domain.test
。
注: 限定域名的元素隱藏規(guī)則也可用來隱藏瀏覽器的使用界面楞卡。例如霜运,過濾規(guī)則 browser##menuitem#javascriptConsole
會(huì)隱藏 Firefox 工具菜單中的 JavaScript 控制臺(tái)。
屬性選擇符
一些廣告隱藏起來并不容易——它們廣告不僅沒有 id 也沒有 class 屬性蒋腮。您可以使用其他屬性來隱藏淘捡,例如 ##table[width="80%"]
可以隱藏 width 屬性值為 80% 的表格元素。 如果您不想指定屬性的完整值池摧,##div[title*="adv"]
會(huì)隱藏所有 title 屬性包含 adv 字符的 div 元素焦除。您還可以檢查屬性的開始和結(jié)束字符,例如 ##div[title^="adv"][title$="ert"]
會(huì)隱藏 titile 屬性以 adv 開始并且以 ert 結(jié)束的 div 元素作彤。正如您所見膘魄,你可以使用多個(gè)條件 —— table[width="80%"][bgcolor="white"]
會(huì)匹配到 width 屬性為 80%、bgcolor 屬性為 white 的表格元素竭讳。
高級(jí)選擇符
通常情況下瓣距,F(xiàn)irefox 支持的 CSS 選擇器都可用于元素隱藏。例如:下面的過濾規(guī)則會(huì)隱藏 class 的屬性為 adheader 的 div 元素相鄰的元素: ##div.adheader + *
代咸。完整的 CSS 列表請(qǐng)查看 W3C CSS 規(guī)范 (Firefox 目前并沒有支持所有的選擇器)。
注:這個(gè)功能只是給高級(jí)用戶使用的成黄,您可以很舒服地通過 CSS 選擇符去使用它呐芥。Adblock Plus 無法檢查您添加的選擇器的語法是否正確,如果您使用無效的 CSS 語法奋岁,可能會(huì)破壞其它已有的有效過濾規(guī)則思瘟。建議使用 JavaScript 控制臺(tái)檢查是否有 CSS 錯(cuò)誤。
例外規(guī)則
例外規(guī)則的作用是在特定域名中禁用已有的規(guī)則闻伶。 這對(duì)于那些與其他訂閱組配合使用滨攻,且無法更改該訂閱組的作者來說較為有用。 例如蓝翰,如要讓 ##div.textad
規(guī)則禁用于 example.com
光绕,可以使用 example.com#@#div.textad
。 這條組合規(guī)則就等同于~example.com##div.textad
畜份。 建議您僅在無法調(diào)整全局隱藏規(guī)則時(shí)才使用例外規(guī)則诞帐,否則請(qǐng)首選限定在特定域名的規(guī)則。
簡(jiǎn)單元素隱藏語法
Adblock Plus 支持簡(jiǎn)單元素隱藏語法(例如: #div(id=foo)
)只是為了向后兼容性爆雹。使用這個(gè)語法是不好的停蕉,CSS 選擇器才是首選愕鼓。對(duì)這個(gè)語法的支持可能在以后的某個(gè)時(shí)間就不支持了。
Generic / Specific filters
With the $generichide
and $genericblock
filter options the distinction between generic and specific filters becomes important.
We classify a filter to be specific if it matches one or more domains or matches a sitekey. If a filter has no domains specified (or only domain exceptions) and no sitekey then it counts as generic. For example, example.com##div.textad
is a specific filter, whereas both ##div.textad
and ~example.com##div.textad
are generic.
Note that with blocking rules the domain must be specified under the $domain option for them to be considered specific. For example, ||example.com^
is considered generic whereas /ads/$domain=example.com
is site-specific.
在服務(wù)器上實(shí)施 sitekey
若想完成一個(gè)采用 sitekey 限制的過濾規(guī)則慧起,一個(gè)網(wǎng)頁(yè)需要返回 Base64 編碼的公鑰版本和 Adblock Plus 可以驗(yàn)證的簽名菇晃。目前來說,這需要在 HTTP 相應(yīng)頭中包含(X-Adblock-Key: abcdpublickeydcba_abcdsignaturedcba
)及 document 的根標(biāo)簽中(<html data-adblockkey="abcdpublickeydcba_abcdsignaturedcba">
)蚓挤。
首先磺送,您需要?jiǎng)?chuàng)建一個(gè)專用的 RSA 密鑰(最好是 512 位以保證較低傳輸負(fù)擔(dān))和一個(gè)公鑰的 DER 表示。
創(chuàng)建簽名使用的數(shù)據(jù)是一個(gè)請(qǐng)求變量的連續(xù)列表(即 URI屈尼、Host 和 User Agent)册着,分隔符是 NUL
字符,即“\0”脾歧。舉例來說:
/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 時(shí)的默認(rèn)值)。