digital 千里眼 @abp_jp

アナログな日常とデジタルの接点

広告やリンクを消したり変更できる Privoxy フィルタのカスタマイズ方法

    • 自分が見たくない広告に限って表示される...
    • lifehacker にはカスタマイズの説明が抜けてる... orz

−> 調べてカスタマイズしてみたので記録に残しておきます

予習しましょう(必要に応じて)

特徴は...

  • キャッシング機能を持たない proxy(代理サーバ)
  • ホームページのコンテンツをフィルタリングできる(HTMLファイルをブラウザが受信する前に UNIXLinux でおなじみの sed で処理した感じ)。要するに HTML 内の特定箇所を正規表現を使って置換できる
    • インストールについては下記サイトを参考のこと

 http://howto.ysn-jp.com/tor/privoxy_set.html
 http://www002.upp.so-net.ne.jp/areko/pc/privoxy.html

Googleトップページを題材に Privoxy 設定をいじってみる

 まずは簡単な画像ファイルのブロック設定から   ↓ ↓こんな感じ↓ ↓

Before After

デフォルトで用意されているのルールを使用します
インストールしたフォルダにある user.action 内に下記を追加

{                    \
  +block{Nasty ads.} \ 
}
.google.co.jp/logos/agedday08\.gif
.google.co.jp/intl/ja/images/jawh_prodiconl5\.png
    • { +block{Nasty ads.} } は block というアクションを有効(+)にし、その理由は Nasty ads. という意味
    • 無効にするには (-)
    • { と } の中で改行したい場合、¥エスケープする
    • 次の行から続くのはそのアクションの対象となる独自記法の URL (途中にコメント行は挟めないようだ)

そのアクション対象 URL の記法は、

  • http:// を削除
  • ドメイン名が必ずしも www 等で始まらないなら省略可。ただし、ホスト名を省略する場合は . で始めること(例:.example.com や www. とか .example.)
  • ドメイン名部分にはワイルドカード使用可(例:*ad*.example.com
  • 正規表現の文字クラス指定(例:[1-9a-z]のように文字範囲を指定する書き方)だけは使える
  • ドメイン名を省略し / だけにすると全てのURLを対象となる
  • ドメイン名に続くパスの指定には正規表現を使う(ドット文字 .¥エスケープするのを忘れずに)
  • 尚、正規表現は完全一致する必要はなく、部分一致でよい
動作確認

実際に http://www.google.co.jp/ にアクセスして設定が適用されていることを確認してみましょう(「予習」に書いてあった通り、プロキシ設定は IP: 127.0.0.1 Port: 8118 になってますね)
他のアクションについてはマニュアル8.5 にリストされているので同様に記述してみるといい

自分でフィルタリングのルールを書いてみる

Privoxy の特徴の1つとして HTMLのタグを書き換える機能を挙げることができる
書き換えには正規表現をバリバリ使用
例として広告リンクのブロックを紹介する

Before After
Before After
フィルタリング設定を書く
更新履歴 内容
2009-01-11 update ルール全般を見直した
● \b を使用するようにした
● パフォーマンス改善のためにルールを絞った
2009-01-13 update \b を使ったのはまずかった。URLエンコードで意図しない %ads とかに一致してしました...orz
● (?:_¦\b) (?: _ ¦ - ¦ / )
2009-01-23 update デリミタ(区切り文字)にシングルとダブルのコーテーション('")を追加した
● (?:_ ¦ - ¦ /) (?:_ ¦ - ¦ / ¦ " ¦ ')
2009-04-02 update デリミタ(区切り文字)にスペース相当とドット(¥s¥.)を追加した
● (?:_ ¦ - ¦ /) (?:_ ¦ - ¦ / ¦ " ¦ ' ¦ ¥s ¦ ¥. )
2009-04-02 update OR 条件を改行して羅列した場合、最後だけ ¦ を省く必要があるが忘れやすい。このミスを避けるため最後にダミー条件を設定した
● ____ending____condition____dammy____ ¥

インストールフォルダにある config.txt

filterfile user.filter

という記述がなければ追加し user.filter というファイルをインストールフォルダ内に作成する


user.filter ファイルに

################################################################################
#
# link-killer: Remove annoying anchor tags by attributes like href(Recursive a tag is NOT supported)
#
#################################################################################
FILTER: link-killer Remove annoying anchor tags by attributes like href
s@<a[^>]+(?:                                            \
    \.(?:link|sma)-trade\.net/                        | \
    \.accesstrade\.net/                               | \
    \.afl\.rakuten\.co\.jp/                           | \
    \.neweb\.ne\.jp/wb/                               | \
    \.nsk-sys\.com/track/                             | \
    \.p-advg\.com/adpCnt/r\?                          | \
    \?adv=                                            | \
    \bard\.yahoo\.co\.jp/                             | \
    \bcgi\.itmedia\.co\.jp                            | \
    \binfostore\.jp/dp\.do\?af=                       | \
    \bj-a-net\.jp/gateway/click\.cgi\?                | \
    \bvclick\.ameba\.jp/click\?                       | \
    (?:_|-|/|"|'|\s|\.)adcl\.japan\.(?:c|zd)net\.com/ | \
    (?:_|-|/|"|'|\s|\.)ads?(?:_|-|/|"|'|\s|\.)        | \
    (?:_|-|/|"|'|\s|\.)pr(?:_|-|/|"|'|\s|\.)          | \
    affiliate                                         | \
    sponsor                                           | \
    ____ending____condition____dammy____                \
)[^>]*>.+</a[^>]*>                                      \
@                                                       \
@igsUx

を追加する

  • シャープ記号 # がある行はコメント
  • FILTER: がフィルター定義の開始
  • link-killer がフィルター名
  • Remove annoying anchor tags by attributes like href はフィルターの説明
  • s@ から 2番目の @ までが置換する場所をマッチさせる(指定する)ための正規表現
  • 2番目の @ から 3番目の @igsUx までが置換後文字列の指定(無指定ならマッチした部分を削除)
  • 字下げ(インデント)されている条件部分の末尾に条件の OR を意味する | 、そして改行をエスケープする ¥ がある点に注意
  • \b は「単語境界」
  • \s は「スペースやタブ」
フィルタをアクションファイルへ登録

新たに作成したフィルタールールをインストールフォルダにあるアクションファイル user.action に追記して登録します

{ +filter{link-killer} }
.yahoo.co.jp
japan.cnet.com
    • link-killer というフィルタを有効化
    • .yahoo.co.jp や japan.cnet.com を含む URL でルール適用

という意味です。

動作確認

では、実際にブラウザで Yahoo!ニュースCNET Japan にアクセスして確認してみてください(「予習」に書いてあった通り、プロキシ設定は IP: 127.0.0.1 , Port:8118 になってますね)

正規表現部分を簡単に解説

s@microsoft@largesoft@

  • 先頭の s は置換
  • microsoftlargesoft に置換するという意味
  • 間に挟まってる @ はデリミタ(区切り文字)で、一般には / で説明されることが多い。

書式が違うだけで s/microsoft/largesoft/ とやってることは変わらない

  • デリミタに / を使うとパスの指定でいちいち ¥ を直前に置いてエスケープしなくちゃならないから替わりに @ を使っている

s@microsoft@largesoft@igsUx

igsUx(修飾子)は

  • i: 大文字小文字を区別しない
  • g: 該当する文字列を全て置換する
  • s: 対象を(改行を無視して)一行の文字列とみなす
  • U: 最短マッチに変更(正規表現に一致する部分の長さが短くなる)
  • x: 空白文字(スペース)を無視(途中改行を入れる場合は改行前に ¥ マーク)

ということで、もう少し詳しく見てみると

s@ ]+(?: ¥ <= アンカータグの開始から
  ard¥.yahoo¥.co¥.jp/ ¥ <= 消したいリンクの href に設定されているURLの一部
¦ <= OR(または)
  adcl¥.japan¥.cnet¥.com/ ¥ <= 消したいリンクの href に設定されているURLの一部
)[^>]*>.+]*> ¥ <= アンカータグの終わりまでマッチ
@ ¥ <= 置換先(対象を消したいから何も指定しない)
@igsUx <= もうわかりますね
    • 他にも消したいリンクがあれば、どんどん付け加え
    • 改行前の ' \' 、条件と条件の間に '|' を忘れずに


もしフィルターの書き方で迷ったら、インストールフォルダにある default.filter にデフォルトのフィルタが書いてあるので参考にするといいですね

最後に忘れちゃならない

  • Privoxy は設定値を変更毎に再起動する必要なし


正規表現については後日また...

もっと多くの具体的なフィルタの例