Hatena::ブログ(Diary)

digital 千里眼 @abp_jp このページをアンテナに追加 RSSフィード

Feed Meter TopHatenar Matrix

2008-09-16

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

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

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

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

特徴は...

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

 404 Not Found

 404 Not Found

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

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

BeforeAfter
f:id:k2jp:20080916014625j:imagef:id:k2jp:20080916014626j:image

デフォルトで用意されているのルールを使用します

インストールしたフォルダにある 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を対象となる
  • ドメイン名に続くパスの指定には正規表現を使う(ドット文字 .¥ でエスケープするのを忘れずに)
  • 尚、正規表現は完全一致する必要はなく、部分一致でよい
    • .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のタグを書き換える機能を挙げることができる

書き換えには正規表現をバリバリ使用

例として広告リンクのブロックを紹介する

BeforeAfter
f:id:k2jp:20080917000910j:imagef:id:k2jp:20080917000911j:image
BeforeAfter
f:id:k2jp:20080917000912j:imagef:id:k2jp:20080917000913j:image

フィルタリング設定を書く
更新履歴内容
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 updateOR 条件を改行して羅列した場合、最後だけ ¦ を省く必要があるが忘れやすい。このミスを避けるため最後にダミー条件を設定した
● ____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@ <a[^>]+(?: ¥<= アンカータグの開始から
  ard¥.yahoo¥.co¥.jp/ ¥<= 消したいリンクの href に設定されているURLの一部
¦<= OR(または)
  adcl¥.japan¥.cnet¥.com/ ¥<= 消したいリンクの href に設定されているURLの一部
)[^>]*>.+</a[^>]*> ¥<= アンカータグの終わりまでマッチ
@ ¥<= 置換先(対象を消したいから何も指定しない)
@igsUx<= もうわかりますね
    • 他にも消したいリンクがあれば、どんどん付け加え
    • 改行前の ' \' 、条件と条件の間に '|' を忘れずに

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

最後に忘れちゃならない

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

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

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

hobo_kinghobo_king 2010/01/02 20:00 始めまして。
こちらの設定内容を参考にさせて頂きまして、Linux版のPrivoxyを現在テスト使用しています。
正規表現やWebで広告が表示される仕組みについて不勉強な事もあって色々と苦労していますが、このサイトの懇切丁寧な説明があるお陰でなんとか使えています。

>Privoxy は設定値を変更毎に再起動する必要なし
私はLinuxで使用していますが、確かに再起動する必要は無いようです。設定値に変更を加えた直後にその変更が反映されるのを確認しました。
Windows版をお使いという事ですので無関係かも知れませんが、何かの役に立つかと思いこちらに報告させて頂きました。

k2jpk2jp 2010/01/04 23:31 > id:hobo_king さん
お役に立てて幸いです
Linux の再起動不要報告ありがとうございました
 
正規表現は確かに面倒です
読みにくいし実装依存でソフト毎に動作が微妙に異なります...笑うしかないですね

お礼に1つ
Privoxy の問題点の1つにデバッグが難しいことがあって
私の場合はデバッグ用に以下のような置換後文字列を設定してうまく効いているか確認しています
 
@<div style="color:gray;font-size:small;background-color:\#eeeeee;height:1.1em;">"$1"</div>\
 
ご参考まで

投稿したコメントは管理者が承認するまで公開されません。

スパム対策のためのダミーです。もし見えても何も入力しないでください
ゲスト


画像認証