Writing Adblock Plus filters -- 日本語訳

Posted on 2011-03-22

Writing Adblock Plus filters の和訳。ないっぽいので。元の文章のライセンスとかわからぬ。直訳しようと思ったらうまく訳せなくて意訳になってしまっている部分もあったり。途中から面倒くさくなったので、適当な訳になってたり。

あと、どうもURLとかフィルタルールが入っている関係で、レイアウトがすごくぐちゃぐちゃになります。それに加えて訳がいまいちなので、さらに読みづらい。超訳でもすればよかった……

Adblock Plusの新しいバージョンでは、さまざまなほうほうでフィルタを「いじる」ことができるようになっています。ここでは、その方法と使い方について説明しています。

免責事項: 例としてあげられているフィルタは、すべて単なる例として挙げており、使われることを意図しておりません。

Introduction to Adblock Plus filters

この章では、ときどきフィルタを書くようなユーザーにとって十分な方法を説明します。

Basic filter rules

一番平凡なフィルタはブロックしたいバナーのアドレスを定義することでしょう。しかしながら、こういったアドレスはページを開く度に変わってしまうのがしばしばです。たとえば、 http://example.com/ads/banner123.gif というアドレスで、 123の部分がランダムな数字であるようなものを考えてみましょう。このアドレスをそのままブロックするのでは、あまり役に立ちません。もっと一般的な形のフィルタ、http://example.com/ads/banner*.gifhttp://example.com/ads/* のようなものが必要でしょう。

Note: ワイルドカードを使うことで、ブロックしすぎないように注意してください。http://example.com/* というフィルタはすべてのバナーをブロックできるかもしれませんが、同時に、見たいものまでブロックしてしまうかもしれません。

Defining exception rules

だいたいの場合は非常によくブロックできるようなフィルタが、いくつかの場合ではブロックするべきでないものもブロックしてしまうことに気づくことがあるでしょう。そんなときは、そのフィルタを外したくはないですが、他方でそのいくつかの場合に対しては、マッチさせたくないと思うでしょう。

その場合は例外ルール(exception rules)が最適です。これはフィルタを適用するべきでないケースを定義することができます。たとえば、 adv というフィルタが "http://example.com/advice.html というアドレスもブロックしてしまうことが気に入らないとき、 @@advice という例外ルールを定義することによってそのアドレスがブロックされないようにすることができます。例外ルールは通常のルールと同じように記述でき、ワイルドカードや正規表現を使うことができます。定義する場合には @@ を先頭につけるだけで、そのルールは例外ルールになります。

例外ルールは他の使い方もできます。もし例外ルールが" http://https:// で始まっている場合(さらにその前にパイプ(|)があってもかまいません)、そのルールはページ全体を例外とすることができます。たとえば、@@|http://example.com という例外ルールがあった場合、 example.com のすべてのページでAdblock Plusは無効化され、何もブロックされなくなります。

Matching at beginning/end of an address

通常の場合、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.gifhttps://example.com/banner.gifhttp://www.example.com/banner.gif というようなアドレスをブロックしたいこともあるでしょう。これには二つのパイプをフィルタの先頭につけることで達成できます。このようにすることにより、ドメイン名の先頭からマッチするように指定することができます。||example.com/banner.gif というフィルタは先の3つのアドレスすべてをブロックすると同時に、 http://badexample.com/banner.gifhttp://gooddomain.example/analyze?http://example.com/banner.gif といったアドレスはブロックしません。(Adblock Plus 1.1以上のバージョンが必要です。)

Marking separator characters

しばしばフィルタの中で分割文字(separator character)を含めなければならない場合があります。たとえば、 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 のようなフィルタが有効です。

Comments

エクスクラメーションマークで始まるルールはコメントとして扱われます。コメントはフィルタリストの中で、黒でなくグレーで表示されます。Adblock Plusはこのルールを無視するので、ここには何を書いても大丈夫です。フィルタの上に、そのフィルタが何をするかの説明を書いたり、フィルタリストの先頭にそれを作った作者について書くことができます。(多くのフィルタリストの作者はそうしています。)

Advanced features

この節で説明している機能は、通常はパワーユーザーやフィルタリストの作成者にしか使われないので、スキップされてもかまいません。

Specifying filter options

Adblock Plusはフィルタの動作を変える、多くのオプションを指定することができます。これらのオプションを指定するときは、フィルタの最後に $ をつけて、カンマ区切りで並べます。たとえば */ads/*$script,match-case のようになります。このとき、 */ads/* がフィルタで、 scriptmatch-case がそのオプションになります。現在は次のようなオプションがサポートされています:

  • Type options: そのフィルタがどんな種類の要素をブロックするか(または、例外ルールの場合はホワイトリストに追加するか)を指定します。複数の種類を指定すると、指定した種類すべてにそのフィルタが適用されます。指定できる値は次の通りです。

    • script -- HTMLのスクリプトタグによって読み込まれる外部スクリプト
    • image -- HTMLのimgタグによって読み込まれるような普通の画像
    • background -- CSSで指定されるような背景画像
    • stylesheet -- 外部のCSSファイル
    • object -- FlashやJavaアプレットのようなブラウザのプラグインによるコンテンツ
    • xbl -- XBLによるバインド(通常、CSSの -moz-binding によって読み込まれる)
    • ping -- link pings
    • xmlhttprequest -- XMLHttpRequestオブジェクトによるリクエスト
    • object-subrequest -- Flashのようなプラグインによるリクエスト
    • dtd -- XML文章によって読み込まれるDTDファイル
    • subdocument -- HTMLのフレームによって読み込まれる埋め込みページ
    • document -- ページ自身(例外ルールのみがページに適用されます)
    • elemhide -- document と似ていますがページ内の要素除去ルール(element hiding rules)のみ無効になります(このオプションを指定できるのは例外ルールのみ)(Adblock Plus 1.2以上のバージョンが必要です)
    • other -- このリストで挙げられているもの以外すべて
  • Inverse type options: フィルタが適用されるべきでない要素の種類を指定します。指定できる値は次の通りです。 ~script~image~background~stylesheet~object~xbl~ping~xmlhttprequest~object-subrequest~dtd~subdocument~document~elemhide~other

  • Restriction to third-party/first-party requests: third-party オプションが指定されている場合、現在見ているページと違うところの要素にのみ、そのフィルタが適用されます。同様に、 ~third-party オプションが指定されていた場合は、現 在見ているページと同じところの要素にのみ、そのフィルタが適用されます。(訳注: たぶん同じところ(origin)って同じドメインとかだと思うんですが、よくわかりません。)

  • Domain restrictions: domain=example.com のようなオプションが指定されている場合、そのフィルタは example.com のドメインのページにのみ適用されます。 domain=example.com|example.net のように、パイプを区切り文字にして複数のドメインを指定することができます。この場合は、 example.comexample.net のページに適用されます。ドメイン名が ~ で始まっている場合、そのドメインでは適用されないようになります。たとえば、domain=~example.com は、 example.com 以外のドメインのページで適用するという意味になります。 domain=example.com|~foo.example.com は、example.com のドメインのページで適用するが、サブドメインfoo.example.com は例外として適用しないということになります。

  • match-case -- フィルタが大文字と小文字を区別するようになります。たとえば、 */BannerAd.gif$match-case というフィルタは、http://example.com/BannerAd.gif はブロックしますが、http://example.com/bannerad.gif はブロックしません。

  • collapse -- このオプションは、全体の Collapse blocked elements を上書きし、フィルタがブロックした要素を折りたたむようにします。同様に、~collapse は要素が折りたたまれないようにします。

Using regular expressions

フィルタがマッチする、しないについて、より細かい制御をしたい場合は、正規表現を使うことができます。たとえば、 /banner\d+ というフィルタは banner123banner321 にはマッチしますが、 banner にはマッチしません。正規表現の書き方については 正規表現についてのドキュメントを参照してください。

Note: パフォーマンス上の理由から、正規表現を使わなくてもよいなら使わないことをおすすめします。

Element hiding

Basic rules

広告がウェブページの中に、テキストとして埋め込まれているために、ブロックできないことがあるでしょう。そういったページのソースコードを見ると、次のようになっています:

<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>

ウェブページを読み込むと一緒に広告まで読み込まれてしまいます。こういったときには、広告を隠すことしかできません。そのために、要素を隠すことが必要になります。

上の例の最初の広告は、 textad というクラスの div 要素の中に入っています。このような広告は ##div.textad のようなルールで隠すことができます。この## というマークは要素除去ルールであることを示していて、それいがいは隠すべき要素を指定するセレクタになっています。要素は id を使うことによっても隠すことができます。 ##div#sponsorad は二番目のような広告を隠すことができます。要素名は指定しなくてもかまいません。 ##\*#sponsorad というルールも同じように働きます。また、要素名のみ指定することもできます。 ##textad というルールは三番目のような広告を隠します。

Element Hiding Helper extension は適切な要素を選び出し、対応したルールを書くことを、ソースコードを見ることなしにできるよう手助けをしてくれます。とは言っても、基本的なHTMLについての知識はあったほうがよいでしょう。

Note: 要素除去は通常のフィルタとは全く違った動きをします。要素除去ルールではワイルドカードが使えないことに注意してください。

Limiting rules to certain domains

たいていの場合、要素除去ルールは特定のサイトのみに適用して、それ以外のサイトでは適用されないようにしたいでしょう。たとえば ##\*.sponsor というルールはいくつかのサイトでは広告ではない要素も隠してしまうかもしれません。これをexample.com##\*.sponsor というように変えることで、このルールがhttp://example.com/http://something.example.com/ で適用されるようになり、同時に http://example.org/ では適用されないようになります。ドメインはカンマで区切ることで複数指定することができます。domain1.example.com,domain2.example,domain3.example##\*.sponsor

ドメイン名が ~ で始まっている場合、そのルールはそのドメイン上のページでは適用されなくなります。(Adblock Plus 1.1以上のバージョンが必要です。)たとえば、~example.com##\*.sponsorexample.com 以外のドメインすべてで適用されるようになり、 example.com,~foo.example.com##\*.sponsorfoo.example.com を除いた example.com 上で適用されるようになります。

Note: 要素除去の実装方法の関係で、フルドメイン名しか指定することができません。つまり、 domain という指定によって、 domain.exampledomain.testのようなドメインを対象にすることはできません。

Note: ドメイン指定をした要素除去ルールは、ブラウザのユーザーインターフェースにも使うことができます。たとえば、 browser##menuitem#javascriptConsole は FirefoxのToolメニューにあるJavascript Consoleを隠します。

Attribute selectors

idclass も無いような要素は除去するのが難しいかもしれません。このときは他の属性を指定することができます。たとえば、 ##table[width="80%"] というルールは width80% に指定されているようなテーブルを隠します。属性の値を完全に指定しなくてもかまいません。 ##div[title\*="adv"] というルールは title の中に adv という文字列が入っているような div 要素を隠します。属性の値は先頭や末尾にもマッチさせることができます。##div[title^="adv"][title$="ert"] といったフィルタは、 titleadv で始まり ert で終わるような div 要素を隠します。また、このように複数の条件を使うことができます。 table[width="80%"][bgcolor="white"]は、 width80% かつ、 bgcolorwhite であるようなテーブルを隠します。

Advanced selectors

FirefoxでサポートされているCSSセレクタは要素除去ルールでも使うことができます。##div.adheader + \* というルールは adheader クラスの div 要素に続く、すべての要素を隠します。CSSセレクタのすべてのリストは、W3C CSS specification で見ることができます。(すべてのセレクタがFirefoxでサポートされているわけではないことに注意してください)

Simplified element hiding syntax

Adblock Plusでは、後方互換性のために、 #div(id=foo) のような単純な要素除去ルールをサポートしています。このような書き方は推奨しておらず、CSSセレクタによる方法を推奨しています。この書き方は将来のどこかのタイミングで無効になる予定です。

Disclaimer: The opinions stated here are my own, not necessarily those of my company.