2013年1月18日金曜日

Adblock Plusのフィルターの書き方を適当に和訳

Adblock Plusのフィルターの書き方について、よく分からずに使っていたんですがちゃんと知りたくなってネットで調べてみました。 色んなページが見つかったんですが、色んなバージョンの書き方が混ざってるんですよね。 今どうなっているのかよく分からなかったので、現時点での使い方を調べるために結局オフィシャルサイトを見ることになりました。 適当に和訳したので投稿しておきます。

firefox版についての記述です。 かなり雑な訳で、けっこう端折ってます。 書きっぱなしであまり読み返してません。 間違ってたらゴメン。

-------------------------------------------------

現在のバージョンのAdblock Plusは色々な書き方のフィルターがある。 このドキュメントでは書き方の説明と、その性質を説明する。

注意: 例示したフィルターは全て例のための物であり、実際に使えるわけではない。

◆イントロダクション

このセクションはライトユーザー向けの説明である。

ベーシックフィルタールール

定義できるもっとも平凡なフィルターは、もちろん、ブロックしたいバナーのアドレス指定である。 しかし、このアドレスはページを見に行くとたまに変わる。 例えば、http://example.com/ads/banner123.gifというアドレスの123の部分が乱数だったりする。 アドレス全部をブロック対象に書いては役に立たない。 もっと一般的なフィルターが必要だ。 例えばhttp://example.com/ads/banner*.gifとか、もっと簡略化してhttp://example.com/ads/*と書くといいだろう。

注意: ワイルドカードの適用範囲が広くなりすぎないように注意すること。 http://example.com/*というフィルターは確かに全てのバナーをブロックするが、example.comの他の画像も全てブロックしてしまう。

例外ルール(ホワイトリスト)の定義

時にはフィルタがサイトの見たい要素をブロックしてしまうこともあるだろう。 フィルタは消したくないがこの要素にだけはマッチしてほしく無いというケースでは例外ルールを使う。

例外ルールはフィルタの適用を抑止してくれる。 例えば、advというフィルタがhttp://example.com/advice.htmlをブロックして欲しくない場合、例外ルールで@@adviceと書く。 例外ルールに他のフィルタとの違いはない。 ワイルドカードと正規表現を使用することができる。 フィルタの先頭に@@と書くだけで例外ルールとして機能する。 (訳注 : とはいえ、自作フィルタを書く場合は、フィルタグループは整理した方がいいでしょう。)

例外ルールには別の使い方もある。 例外ルールが http:// か https:// で始まっている(前にパイプをつけることも可能、パイプについては後述)場合、ウェブページ全体に例外ルールが適用される。 例えば、@@|http://example.comという例外ルールがありexample.comを開いた場合、Adblock Plusはこのページで無効となり、何もブロックしない。

アドレスの始点と終点でのマッチング

Adblock Plusは普通、全てのフィルタの前後にワイルドカードが付いているかのように振舞う。 例えば、ad*ad*は同じ振る舞いである。 普通はコレでいいが、たまにフィルターが先頭からマッチして欲しい場合や終点でマッチして欲しい場合があるだろう。 例えばフラッシュをブロックしたい場合だ。 しかし、前述の振る舞いのためただ単に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はブロックしない。

場合によっては、プロトコルは違うが同じサイトのhttps://example.com/banner.gifhttp://www.example.com/banner.gifのような要素をブロックしたい事もあるだろう。 こうするには、フィルターの先頭にパイプを2つ||付ければよい。 こうすればフィルターのマッチングはドメイン名から始まる。 具体的には||example.com/banner.gifと書く。 ただし、このフィルターはhttp://badexample.com/banner.gifhttp://gooddomain.example/analyze?http://example.com/banner.gifといった要素はブロックしない。 (訳注 : 1つ目の例がダメなのはドメイン名の途中で区切っているからです。FQDNである必要はありません。) (パイプを2つが有効なのはAdblock Plus 1.1以降)

セパレータ文字

フィルターでセパレータ文字を使いたくなることもあるだろう。 例えば、http://example.com/http://example.com:8000/はブロックするがhttp://example.com.ar/はブロックしたくない場合などにだ。 そんなときはハット^を使えばセパレータ文字1つとマッチングすることができる。 例を挙げると、http://example.com^という風に書く。 (Adblock Plus 1.1以降)

セパレータ文字は英数字とアンダーバー、ハイフン、%以外の文字とマッチする。 また、アドレスの終端ともマッチする。 セパレータ文字の例を挙げると、次の赤文字で書かれた部分になる。

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/*が実際のフィルターでscriptmatch-caseはオプションである。 現在、次のオプションをサポートしている。

  • typeオプション : どの要素をブロックするか(ホワイトリストなら例外とするか)を指定する。 複数のtypeオプションを指定すれば、指定した要素全部に対して有効である。 有効なtypeは、
    • script — HTMLのscriptタグによる外部スクリプトの読み込み。
    • image — HTMLのscriptタグで読み込まれる通常の画像
    • stylesheet — 外部スタイルシートファイル
    • object — FlashやJavaのようなブラウザのプラグインで読み込まれるコンテンツ
    • xmlhttprequest — XMLHttpRequest objectのリクエスト
    • object-subrequest — Flashなどのプラグインから発行されるリクエスト
    • subdocument — HTMLのフレームなどで読み込まれる埋め込みページ
    • document — ウェブページ自身(ページ自身を指定できるのは例外ルールのみ)
    • elemhide — documentオプションに近いが、要素非表示ルールのみ無効にする (例外ルールでのみ有効、Adblock Plus 1.2以降)
    • other — 上に挙げたもの以外のリクエスト
    次のオプションは時代遅れで、もう使われることは無いだろう。 backgroundxblpingdtd
  • inverse-typeオプション : 指定した要素に対してフィルターが適用されなくなる。 有効なオプションは、~script~image~stylesheet~object~xmlhttprequest~object-subrequest~subdocument~document~elemhide~other
  • サードパーティ/ファーストパーティへのリクエストを制限する : third-partyオプションが指定された場合、フィルターは今見ているページ以外へのリクエストに対して適用される。 同様に、~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 というサブドメインに対しては適用されない。
  • match-case — 英数字の大文字小文字が一致したときのみマッチする。 例えば、*/BannerAd.gif$match-caseというフィルタはhttp://example.com/BannerAd.gifはブロックするがhttp://example.com/bannerad.gifはブロックしない。 (訳注 : デフォルトではignore-caseだったらしい)
  • collapse — これを指定するとグローバルの「ブロックした要素の代わりを表示しない」オプション(訳注 : Adblock Plus本体のオプション)を上書きし、常に要素を隠すようになる。 ~collapseオプションを指定すると常に要素の代わりを表示する。
  • donottrack — フィルタルールによりブロッキングした場合でも例外ルールにより表示された場合でも、このオプションを指定しておくとhttpリクエストヘッダにDo-Not-Trackフィールドが追加された状態でリクエストが送信される(Adblock Plus 1.3.5以降)。 後方互換のため、typeオプションと組み合わせて書くことを推奨する。 そうすることでバージョン違いによる誤動作を防ぐことができる。 *$donottrack,image,~image (訳注 : フィルタリスト作者に対する記述だと思われます。常に最新版を使っているユーザにはtypeオプションとの組み合わせは無意味。)
正規表現

マッチ/アンマッチをより高度に指定したフィルタを作りたい場合は正規表現を使用することができる。 例えば、/banner\d+/というフィルタはbanner123banner321にマッチするがbannersにはマッチしない。 詳しくは外部サイトのdocumentation on regular expressionsを参照。 (訳注 : javascriptの正規表現についてのガイドのようです。)

注意: 正規表現は重いので、使わなくて済むのなら通常のフィルタの使用を推奨。

◆要素非表示

基本ルール

広告の中にはウェブページにテキストで埋め込まれているため通常のフィルタではブロックできないものがある。 htmlのソースを見たらこのようになっているとすると、

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

必然的に、ウェブページをダウンロードしたときに広告は付いてくる。 ダウンロードされることは防げないが、要素非表示ルールで隠すことはできる。 ここではその要素非表示について説明する。

先ほどの広告はdiv要素に書かれていて、そのclass属性はtextadだ。 次のようなルールを書けばそのdiv要素は隠せる : ##div.textad。 ここでいう ## は要素非表示ルールを現している。 以降は非表示対象のセレクタだ。 id属性を指定して非表示にすることもできる。 ##div#sponsoradというフィルタは先ほどの2つ目の広告を隠す。 要素名を指定しなくても良い、##*#sponsoradでも同様に機能する。 要素名だけで非表示にすることもできる。 例えば、##textadというフィルタは3番目の広告を隠す。

別のアドオン Element Hiding Helper extension はソースを見ずに要素非表示ルールを書くのに役立つだろう。 それを使うにしてもhtmlの基礎知識は必要だが。 (訳注 : Adblock Plus公式のアドオンのようです。元の文章には直接アドオンのサイトへのリンクはあったのですが、セキュリティ的に用心して、一応firefoxのアドオンマネージャなど正規の入手ルートから探してください。)

注意: 要素非表示は通常のフィルタとはまったく別の仕組みである。 ワイルドカードには対応していない。

ドメインによるルール適用対象の制限

たいていの場合、広告のブロック対象はサイトによって違うだろう。 あるサイトのルールは別のサイトには適用したくないはずだ。 例えば、##*.sponsorというルールはどのサイトでもclassが一致すれば隠してしまう。 しかし、example.com##*.sponsorと書けばドメインが example.com のサイトだけに適用を制限することが可能だ。 http://example.com/http://something.example.com/には適用されるがhttp://example.org/には適用されない。 ドメイン名はコンマで区切ればいくつでも指定できる。 例えば、domain1.example,domain2.example,domain3.example##*.sponsorのように書ける。

もしドメイン名の先頭に~が付いていたなら、そのルールはそのドメインには適用されない(Adblock Plus 1.1以降)。 例えば、~example.com##*.sponsorというフィルタは example.com 以外のドメインには適用されるが example.com には適用されない。 example.com,~foo.example.com##*.sponsorというフィルタは example.com というドメインに適用されるが foo.example.com というサブドメインへの適用は免除される。

注意: 要素非表示ルールの実装の都合でフルドメイン名しか使用できない。 urlのドメイン名以外の部分は使用できない。 domain.exampledomain.testの代わりにdomainを指定することもできない。 (訳注 : 文脈からして、フルドメイン名というのはFQDNのことではなさそうです。 内部で @-moz-document domain(ドメイン名){} が使われているようなので、それで使えるものが対象です。 トップレベルドメインから非表示対象のドメインまで省略せずに書けばokです。)

Tips: 要素非表示ルールのドメイン制限はブラウザのユーザインターフェースの非表示にも使える。 例えば、browser##*#urlbarと書けばFirefoxのロケーションバーを隠すことができる。 (訳注 : 元の文ではJavaConsoleを消していたけど、私のFirefoxには無かったのでロケーションバーにしてみました。フィルタを消してもロケーションバーが戻らなかったらfirefoxをリブートしてください。)

属性セレクタ

広告によってはテキスト広告がidやclassの属性を持たず、簡単にブロックできない物もある。 その場合は別の属性を元にブロックできる。 例えば、##table[width="80%"]と書けばwidth属性が80%のtable要素を隠せる。 属性の値全てを書くのが面倒な場合、##div[title*="adv"]のように *= を使って属性に含まれる文字列の一部を書けばよい。 属性の先頭と終点をチェックしたいなら、##div[title^="adv"][title$="ert"]のように書く。 こうすると adv で始まり ert で終わるtitleを持つdiv要素を隠せる。 このように[]を連ねれば複数の条件を指定できる。 table[width="80%"][bgcolor="white"]というフィルタならwidthが80%で、かつbgcolorがwhiteのtableが対象だ。

拡張セレクタ

一般的に、firefoxがサポートしているcssセレクタなら使用することができる。 例えば、隣接セレクタ+を使って##div.adheader + *と書けばadheaderというclassを持つdiv要素の次の要素が対象になる。 cssの仕様についてはW3Cの公式サイトにあるW3C CSS specificationを参照。 (firefoxが全てのセレクタをサポートしているわけではないので注意。)

注意: この機能は上級ユーザのみを対象にしている。 使用するにはcssに対する十分な知識が必要だ。 Adblock Plusはユーザが追加したセレクタの構文はチェックしない。 1つのルールに間違った構文のセレクタを書くと他のルールにも影響が出る可能性がある。 cssエラーはWebコンソールに表示されるのでチェックすること。

例外ルール

例外ルールで既存のルールの一部を特定のドメインに対して無効にできる。 この機能は、フィルタ購読用のフィルタを改造して使うものにとって有用であろう。 購読したフィルタが変更できない場合役に立つ。 例えば、##div.textadというルールをexample.comでのみ無効化する場合はexample.com#@#div.textadのように書く。 これは~example.com##div.textadと書いた場合と同じ効果がある。 この #@# を使った書き方は、全般に対する要素非表示ルールを隠すためだけに使用することを推奨する。 それ以外の場合は ~ を使った書き方の方が望ましい。

要素非表示ルールの単純化した構文

Adblock Plusは後方互換のため要素非表示ルールの単純化した構文をサポートする。 例えば、#div(id=foo)のような記述を解釈できる。 後方互換のためだけに残してあるので、新たにフィルタを書くには非推奨である。 cssセレクタを使った書き方の方が望ましい。 この構文は将来サポートを停止する予定である。