パスワードを忘れた? アカウント作成
192793 journal

Yak!の日記: Privoxy ミニチュートリアルっぽいもの & Wiki 立てたよー 3

日記 by Yak!

また初っ端検索ネタかよって感じだが、"client-header-tagger" で日本語でぐぐるとこの日記しかヒットしない。いや、某所に書き込んでなかったっけ?と思ったらそっちは "server-header-tagger" の方で、しかし、やっぱり日記とそれにしかヒットしない。ということは日本語 Web 上でこれらについて語ったのはただ一人自分だけということで、いくら Privoxy がマイナーであるとしても、なんともはや。割と最近入った機能なのでみんな使ってないのだろうか。できることは飛躍的に拡大されるはずなのだが。

ということで、自分で設定した題材をもとに簡単なミニチュートリアルっぽいものをやってみる。対象はそれなりに自分で Privoxy の設定ができる人でこの時点で大分限定される気がしないでもない。ついでに題材がまたニッチかつ余計なものが混じっているのだが、とりあえずやりたいことだけ説明しておくと「特定のブラウザ(実際には Opera)で Google Reader にアクセス中にニコニコ動画へのリンクがあったらクリックで Firefox で開くようにする」である。ちなみに今までは右クリックで表示されるメニューに「Firefox で開く」を入れていた。一応、背景も説明しておくと、Plagger を使ってニコニコ動画のタグ検索を RSS 化している。で、Firefox は NicoCache_nl を経由するよう設定してあるのだが、常用ブラウザは Opera なので Google Reader は Opera で開くという状況設定である。この辺の設定が nlAutoLogin の製作動機だったりもする(Plagger でタグ検索するのにログインしているが、NicoCache_nl とセッションを共有していないので NicoCache_nl 経由の Firefox 側ではログアウト状態になってしまう。そして RSS から直接跳ぶので動画ページだけ自動ログインできれば十分)。今回の設定に関しては別に Google Reader 内に限定せず Opera でアクセスしている場合全てにしてもいいのだが、現状のユースケースではこれで十分だし置換する範囲を限定しておきたいのでこうなっている。

では、順に設定を作成していこう。まずは「特定のブラウザ(実際には Opera)で」「Google Reader にアクセス中に」である。これが今回のメイン、header-tagger を使うところになる。ここで「特定のブラウザ(実際には Opera)で」だけではなく「Google Reader にアクセス中に」も同時になってしまうところが、Privoxy の header-tagger による設定が非直感的に感じる理由のひとつだと思う。

# action ファイル
{+client-header-tagger{ua-tagger}}
www.google.com/reader/

# filter ファイル
CLIENT-HEADER-TAGGER: ua-tagger UserAgent tagger
s,^User-Agent:(?:.*(Opera).*|.*(Firefox|MSIE|Chrome).*)$,User-Agent:$1$2,
# Opera を判別するだけなら
# s,^User-Agent:.*Opera.*$,User-Agent:Opera,
# だけでも OK

header-tagger は filter のように正規表現を適用するのだが、置換結果はヘッダ側に影響を与えず TAG として有効になるだけである。今回は、User-Agent: ヘッダから Opera を判別する tagger を作成、これを action 側で Google Reader の URL に設定する。User-Agent は HTTP リクエスト側のヘッダ=クライアントが付与するヘッダなので client-header-tagger を使うことになる。上記 ua-tagger だと、Opera の場合 User-Agent:Opera という TAG が、Google Chrome の場合だと、User-Agent:Chrome という TAG が有効になる。filter の正規表現でどうして Opera だけ独立しているのかと思われるだろうが、Opera の場合、設定で「Firefox として認識させる」等といった形で、User-Agent を変更できる。このとき Firefox や MSIE という文字列が Opera よりも先行して出現してしまう。そのためとにかく Opera が出てくる場合を先に判別している。ちなみに CLIENT-HEADER-TAGGER にも FILTER 同様、複数の正規表現を書く事ができるが、これらは順番に適用されていき置換結果が次の正規表現に渡される事になる。

さて、これで User-Agent:Opera という TAG が有効なときに「ニコニコ動画へのリンクがあったらクリックで Firefox で開くようにする」ができればよい。

「クリックで Firefox で開くようにする」の部分は、「2ch へのリンクを Jane で開く」 と同様で URL scheme すり替えによって実現できる。ただし対象が Opera なのでレジストリは使わず Opera 内部で設定できるということと、(Jane で ttp: の場合と違って)Firefox 側ですり替えられた scheme を認識しないので JScript をかます部分が違う。とりあえず scheme は安易に ff-http としておく。後者のスクリプトは以下の通り。

var arg = WScript.Arguments;
var shell = WScript.CreateObject("WScript.Shell");
// パスは適宜修正
shell.Run('"C:\\Program Files\\Application\\Mozilla Firefox3\\firefox.exe" "' + arg(0).substr(3) +'"');

これを c:\path\to\wscript.exe ff-http.js のような形で起動してやればよい。Opera の設定手順は、ツール(T)→設定(R)→「詳細設定」タブ→プログラム→追加、で「プロトコル」に ff-http、「他のアプリケーションで開く」に c:\WINDOWS\system32\wscript.exe、パラメータに↑JScript のパスを指定すれば良い。他のブラウザの場合は、↑リンク先にある reg ファイルを適当に修正した reg ファイルを使えばいい。scheme のすり替えは普通に filter を使えばよく、

# action ファイル
{+filter{ff-http-enabler}}
TAG:^User-Agent:Opera$

# filter ファイル
FILTER: ff-http-enabler Enable ff-http: scheme
s,http://www.nicovideo.jp/,ff-http://www.nicovideo.jp/,g

となる。action 起動に TAG パターンを使用している点に注意。この場合、なくても誤爆しないだろうが一応 ^, $ をつけている。これで、Opera で Google Reader を開いてニコニコ動画の RSS を開き動画をクリックすると Firefox で開かれることになる。

これで目的は達成したわけだが、なんとなく設定が直感的ではない。この条件なら普通、「User-Agent が Opera で、かつ、URL が Google Reader 配下のとき」と記述したいところだろう。ついでに、User-Agent が Opera で(Google Reader ではない)別の URL に対してアクションを割り当てたい場合、内容が同じ別の header-tagger を作らなければならない。これに一応の解決を与えるのが拙作機能追加版である。機能追加版の必須タグ機能を使うと設定は次のような形になる。

# action ファイル
# 仮に全域で有効にしてみる
{+client-header-tagger{ua-tagger}}
/

# 必須 TAG 指定
# User-Agent が Opera で、かつ、
{{required}}
^User-Agent:Opera$

# Google Reader 配下である場合に、……
{+filter{ff-http-enabler}}
www.google.com/reader/

# ここまで必須 TAG 有効
{{required}}

# filter ファイル (変更なし)
CLIENT-HEADER-TAGGER: ua-tagger UserAgent tagger
s,^User-Agent:(?:.*(Opera).*|.*(Firefox|MSIE|Chrome).*)$,User-Agent:$1$2,
# Opera を判別するだけなら
# s,^User-Agent:.*Opera.*$,User-Agent:Opera,
# だけでも OK
FILTER: ff-http-enabler Enable ff-http: scheme
s,http://www.nicovideo.jp/,ff-http://www.nicovideo.jp/,g

{{required}} 以降のルールでは {{required}} の中に指定された TAG 群も(複数あれば全部)満たす必要がある。これで header-tagger 自体はルール間で共通化することが可能となる。

という感じでつらつら書いてきたわけだが、Privoxy の日本語リソースをまとめられるようにした方がいいんじゃないのということで Privoxy Wiki を立ててみた。何のことはない構成等は絶賛放置中の Afx Wiki の流用である。 自分の Blog 等でやると日ごろ見てるサイトがばればれで恥ずいというのも、ここなら匿名で書き込みできて安心である。ドキュメント日本語訳についてはちまちま進める気ではいるが、レシピの方はそんなに引き出しがないので、是非他の人に書き込んでほしい。もちろんドキュメント日本語訳や新規ページ(設定チュートリアルとか)なんかもばんばん編集、作成してもらえればいいので是非協力してほしい。

最新の日記

この議論は賞味期限が切れたので、アーカイブ化されています。 新たにコメントを付けることはできません。
  • Wiki化ありがとうございました。
    Yak!さんのこの記事をみて、Privoxyとその有用性について初めて知りました。

    Siteごとの設定は個人個人では作るのが難しいし、時間が経つと修正が必要になってくるので、設定情報のSocial化はできないでしょうか?
    あるいは、Filteringの方法を複数用意して、設定ファイルなどの変更なしに、ユーザが簡単に選択できるようなWebサービスというのはあるのでしょうか、それは、Privoxyとは別のものかもしれませんが。

    • 「Social化」に対して明確なイメージが持てていないのですが、とりあえずネットでの設定の共有化と仮定します。

      Privoxy 全体で言うとできることの幅が広すぎて、単純な共有化は難しいでしょうね。
      リストを取得できるようにしておいて、ユーザーに有効無効を選択させる、で、適当なタイミングで更新というのはできるかもしれませんけど、それでも各自にとって想定外の設定ばかり出てくるというのはありそうです。
      そういう意味で Wiki にレシピを挙げておいてそこから取捨選択してコピペ、というのは悪くない手段じゃないかと思っています。

      共有化が一番有望そうなのは広告除去でしょうか。
      どのくらいの除去を望むかというのは人によるかも知れませんが(うざい広告>広告>他記事へのリンク>etc)、広告除去自体は意見の一致を得やすそうですし。
      アンチウィルスソフトの定義ファイルとかと同じノリでいけそうです。

      が、FAQ の書きっぷりからすると自前設定を推奨している感じなので、Privoxy 本家にそんな機能が実装されることはなさそうです。
      実際、別レイヤーで実装した方が良さそうな気はします。
      妄想だけなら、はてブのコメントとか Twitter とか、ある URL に対して何かを付与できる仕組みから取ってくるとか面白そうですが、どんなものを仕込まれるか分からない訳で、誰かが検証する仕組みがないと実用的とは言えないでしょう。
      HTTP 全体に介入しちゃいますので、失敗しても後から誰かが直すだろ、というわけにはいかないですし。
      フィッシングサイトにリダイレクトされまくりとか目も当てられません。
      となると、信用できる誰かがそれだけのコストを払ってやってくれるかということになりますが、まぁ難しそうかと。
      そもそも現在主流の広告ビジネスモデルに真っ向から対立しちゃいますしね。

      親コメント
      • ありがとうございます。
        Social化というのは設定の共有ということでした。
        Privoxyは個別に設定することを前提にしている、とのこと、広告の除去の問題やセキュリティ的な問題も考え合わせれば、単純な共有は難しいのかもしれません。まずはPrivoxyの機能をもう少し理解してみたいと思います。

        親コメント
typodupeerror

Stay hungry, Stay foolish. -- Steven Paul Jobs

読み込み中...