広告やリンクを消したり変更できる Privoxy フィルタのカスタマイズ方法
- Privoxy は Google Chrome 登場時に lifehacker Google Chromeで広告ブロックする方法 で紹介されてた。さっそく導入したけど問題が...
-
- 自分が見たくない広告に限って表示される...
- lifehacker にはカスタマイズの説明が抜けてる... orz
−> 調べてカスタマイズしてみたので記録に残しておきます
予習しましょう(必要に応じて)
特徴は...
- キャッシング機能を持たない proxy(代理サーバ)
- ホームページのコンテンツをフィルタリングできる(HTMLファイルをブラウザが受信する前に UNIX や Linux でおなじみの 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
そのアクション対象 URL の記法は、
-
- .google.co.jp/logos/agedday08\.gif は http://*.google.co.jp/logos/agedday08.gif というファイルをブロックせよという意味
- 灰色の模様は代替イメージ。タグ削除によるレイアウト崩れを防ぐ
動作確認
実際に 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 は置換
- microsoft を largesoft に置換するという意味
- 間に挟まってる @ はデリミタ(区切り文字)で、一般には / で説明されることが多い。
書式が違うだけで 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 は設定値を変更毎に再起動する必要なし