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版及更高版本):
- 單擊Adblock Plus圖標,然後單擊右上角的齒輪圖標。
將打開“ *Adblock Plus設置”*選項卡。 - 選擇“ *高級”*選項卡,然後滾動到“ *創建和編輯過濾器列表”*部分。
- 單擊開始創建我的過濾器列表。
- 輸入您的過濾器,然後點擊保存。
基本過濾規則
您可以定義的最簡單的過濾器是您要阻止的請求的地址。但是,每次打開頁面時,此地址通常都會更改。例如,它可能是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.gif
和http://www.example.com/banner.gif
。您可以通過在過濾器前面放置兩個管道符號來實現。這樣可確保過濾器在域名“:”的開頭匹配||example.com/banner.gif
,並阻止所有這些地址,而不阻止http://badexample.com/banner.gif
或http://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或Javaxmlhttprequest
-使用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.com
或example.net
域的頁面。如果域名以開頭~
,則不應將過濾器應用於該域的頁面。例如,domain=~example.com
裝置,該過濾器應的網頁上施加從任意域,但example.com
與domain=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
-空的JavaScriptblank-html
-空的HTML文檔blank-mp3
-一個0.1秒的靜音MP3音頻文件1x1-transparent-gif
-1×1像素透明GIF圖像2x2-transparent-png
-2×2像素的透明PNG圖像3x2-transparent-png
-3×2像素的透明PNG圖像32x32-transparent-png
-32×32像素的透明PNG圖像
其他任何值都將使過濾器無效,並讓請求通過。
有關使用重寫選項的一些注意事項
rewrite=
使用$domain
過濾器選項只能在某些域中使用。有關更多信息,請參閱本指南的“ 域限制”部分。rewrite=
不能與$third-party
filter選項一起使用,但可以與一起使用$~third-party
。- 過濾器模式必須為
*
或以開頭||
。
使用正則表達式
Adblock Plus支持以正則表達式(regex)編寫的過濾器。例如,過濾器/banner\d+/
匹配banner123
,banner321
但不匹配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
-此注釋定義了過濾器列表的數字版本。此版本號顯示在問題報告中,可用於驗證報告是否引用了過濾器列表的當前版本。
元素隱藏
基本規則
不幸的是,有些廣告不能立即被阻止。這是因為它們作為文本嵌入在網頁本身中。如果您查看網頁的源代碼,則可能會發現以下內容:
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.example
,domain2.example
,domain3.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
則不會將任何內容列入白名單。如果添加過濾器##aside
,eyeo.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時的默認算法)。
原創文章,作者:超哥,如若轉載,請註明出處:https://www.chaoneo.cn/zh-hant/archives/3286.html
如果您覺得超哥分享對您有所幫助的話,記得打賞給我😀