2008年10月26日日曜日

Proxomitronでよく使われる表現でクオートされた "<>" に誤爆する問題に対処する

元ネタは「Proxomitron フィルター作成スレッド Part10」の45氏。
(ISP規制で2chに投稿できないので、こちらに書きました。)

問題の概要

45氏が提起された問題を以下にまとめます。

  • Proxomitronでよく使われる表現「<a\s[^>]++href=」は「<a onclick="for(i=0;10>i;i++){...}">」に誤爆する
  • 「&;lt;a title="<test>">」は「&;lt;>」をHTMLエンティティ化すれば対処できる
  • JavaScriptコードはHTMLエンティティ化すると動作しない。どうしよう?

解決法:初めからクオートされた "&;lt;>" に対応できるフィルタにする

<a\s[^>]++href= を <a(\s[a-z]+(=$AV(*)|(^=)))++\shref= に置換することで、対応します。

[Patterns]
Name = "Kill <a> ad (anti quoted <>) [2008/10/26] test1"
Active = TRUE
URL = "$TYPE(htm)"
Limit = 256
Match = "$NEST(<a(^(^\s)),"
        "(\s[a-z]+(=$AV(*)|(^=)))++\shref=$AV(http://$LST(AdList)*)*"
        ",</a>)"

この記法、汎用性はありますが美しいコードではないのがネックです。

そもそも属性値に "&;lt;>" と書いているサイトはどれぐらいあるのか

「>」と書いているサイト、「&gt;」と書いているサイト、どちらも見たことがありますが、母数が少ないためにどちらが多いとは断定し難い状態です。
(どちらかといえば、しっかりしたHTMLが増えてきていて 「&gt;」と書いているサイトが多い印象はあります。)

JavaScriptに限定すれば、<a onclick="func();"> (関数埋め込み型) や <a id="TEST"> (外部スクリプトでイベントハンドラを割り当てる) と比べて、<a onclick="for(i=0;10>i;i++){...}"> が圧倒的に少ない、のは間違いないと思います。
JavaScriptライブラリの影響で、一昔前と比べて手打ちでコードを入力する機会が減っているのかも。

結論:結局どう対応すればいいのか

完全対応を目指すなら、既存のフィルタをクオートされた "&;lt;>" に対応できるフィルタに修正するのが一番。
ですが、すべてのフィルタを修正していくのは大変です。
経験上、クオートされた "<>" を見る機会がほとんどないので、問題が発生したときに原因となるフィルタを対処療法的に修正していくだけで十分だと思います。

ラベル: ,

2008年2月11日月曜日

右クリック禁止を解除するProxomitronフィルタ

右クリックメニューの表示を禁止しているサイトで右クリックメニューを表示させます。
以下の3つのフィルタで実現している機能全てを含んでおり、それ以上の対策も施してあります。

  • Allow right mouse click
  • Allow right mouse click 2
  • Allow right mouse click plus
[Patterns]
Name = "Allow contextmenu event [js] [2008/02/11] test2"
Active = TRUE
URL = "$TYPE(htm)"
Limit = 8
Match = "(^(^</head>))$STOP()"
Replace = "\r\n<script type='text/javascript'>\r\n"
          "function addLoadEvent(func) {"
          " if(typeof window.addEventListener == 'function'){"
          "  window.addEventListener('load', func, false);"
          "  return true;"
          " } else if(typeof window.attachEvent == 'object'){"
          "  window.attachEvent('onload', func);"
          "  return true;"
          " }"
          ""
          " var oldonload = window.onload;"
          " if (typeof window.onload != 'function') {"
          "  window.onload = func;"
          " } else {"
          "  window.onload = function() {"
          "   oldonload();"
          "   func();"
          "  }"
          " }"
          "}"
          "function killContextmenuEvent(){"
          " if(typeof document.oncontextmenu == 'function'){"
          "  document.oncontextmenu = null;"
          " }"
          ""
          " if(typeof document.onmousedown == 'function'){"
          "  document.onmousedown = null;"
          " }"
          ""
          " var tag = document.getElementsByTagName('*');"
          ""
          " for(i = 0, L = tag.length; i < L ; i++){"
          "  tag[i].oncontextmenu = null;"
          "  if(navigator.appName == 'Microsoft Internet Explorer'){"
          "   tag[i].onmousedown = null;"
          "  }"
          " }"
          "}"
          "addLoadEvent(killContextmenuEvent);"
          "\r\n</script>\r\n"

動作検証

実際に動作しているか確認するためのテストページも作ってみました。

onmousedown について

onmousedown はマウスボタンが押されたときに発動します。
このことから、onmousedown は右クリック禁止以外の用途で使われる事があると想像でき、onmousedownに関する処理を無効化すると、右クリック禁止以外の場面で使用している重要な機能を失ってしまう可能性があります。
私の検証した範囲ではonmousedown が右クリックに反応するのはIEのみという結果だったので、このフィルタではonmousedown の無効化処理をIE限定にしています。
(マウスイベントが右クリックによるものかの判定できなかったので、やむなくブラウザの名前で判定しました)

ただし、通常の使い方で表示領域全体を監視する document.onmousedown を使用する必要性はまずないと思いますので、こちらは機能が使えれる環境であれば有効になる処理にしてあります。
もっとも、documentオブジェクトからonmousedownへのアクセスはIEの独自拡張っぽいです。

addEventListenerへの対策

addEventListenerにどうやって対策したものか、考えあぐねています。
addEventListener で追加したイベントハンドラはremoveEventListenerで解除できるようですが、メソッド名がわからなければ手が出せません。
悩んだ末に考えついた対策は次の2通り。どちらも形になるところまで進んでいません。

  • addEventListener でデフォルトアクションを発生させる処理を追加する
  • removeEventListener ですべてのイベントハンドラを削除する

attachEvent対応

IE対応を謳うならattachEventにも対応しなくてはなりませんが、力尽きたのでいずれ。
希望があれば、声をかけてください。

ラベル: ,

2008年2月10日日曜日

Google、Yahoo特殊検索のリンク先に転送するProxomitronフィルタ

「Google: Jump special search」を更新および、YahooでWeb検索したときにYahoo ダイレクト検索のリンク先に転送するフィルタを作成しました。

更新点
  • Googleの仕様変更 (<p class=e> → <div class=e>) に対応
[Patterns]
Name = "Yahoo: Redirect direct search [2008/02/08] test2"
Active = TRUE
URL = "$TYPE(htm)search.yahoo.co.jp/search(\?|/dir\?)"
Limit = 4096
Match = "(^(^$NEST(<div\s,"
        "[^>]++id=$AV(yschDD)*"
        "<a\s[^>]++href=$AV((http://wrs.search.yahoo.co.jp/*/\*-http(%3A|:)//rd.yahoo.co.jp/search/direct/*)\0)"
        "*,</div>)))$STOP()"
Replace = "\k<meta http-equiv="refresh" content="0; url=\0" />"

Name = "Google: Jump special search [2008/02/07] test1"
Active = TRUE
URL = "$TYPE(htm) www.google.co(m|.jp)/search\?"
Limit = 1024
Match = "(^(^"
        "<div\sclass=$AV(e|g(^?)$STOP()(^(^?)))>[^<]+"
        "(<(^table[ >])[^>]+>[^<]+)+"
        "<table\s[^>]+><tr><td\s[^>]+><img\s[^>]+></td><td\s[^>]+>[^<]+"
        "(<(^a\s|/td>)[^>]+>[^<]+)+<a\s[^>]++href=$AV(((/url\?url\=|)http://*)\0)[ >]"
        "))$STOP()"
Replace = "\k<meta http-equiv="refresh" content="0; url=\0" />"

ラベル: ,

2ちゃんねるスレッドで長文コメントを折りたたむProxomitronフィルタ

2ちゃんねるスレッドに投稿されている長文コメントの4行目以降を隠します。
4行目以降は「-- 続きを読む --」をクリックすることで、展開されます。

[Patterns]
Name = "2ch: Collapse long comment (1/2) [2008/02/09] test3"
Active = TRUE
URL = "$TYPE(htm)[^.]+.(2ch.net/|bbspink.com/)"
Limit = 8
Match = "(^(^</head>))$STOP()"
Replace = "\r\n<script type='text/javascript'>"
          "function addLoadEvent(func) {"
          " var oldonload = window.onload;"
          " if (typeof window.onload != 'function') {"
          "  window.onload = func;"
          " } else {"
          "  window.onload = function() {"
          "   oldonload();"
          "   func();"
          "  }"
          " }"
          "}"
          "function readAfterMsg(){"
          " var div = document.getElementsByTagName('div');"
          " for(var i=0, L=div.length; i < L; i++){"
          "  if(div[i].className == 'read_after'){"
          "   div[i].onclick = function(){"
          "    if(this.nextSibling.style.display == 'none'){"
          "     this.style.display = 'none';"
          "     this.nextSibling.style.display = 'block';"
          "    }"
          "   }"
          "  }"
          " }"
          "}"
          "addLoadEvent(readAfterMsg);"
          "\r\n</script>\r\n"

Name = "2ch: Collapse long comment (2/2) [2008/02/09] test2"
Active = TRUE
URL = "$TYPE(htm)[^.]+.(2ch.net/|bbspink.com/)"
Limit = 4096
Match = "(<dd>"
        "(((^<(br /+>|dt>|/dd>))?)+<br /+>)+{3})\0"
        "(((^<(dt>|/dd>))?)+)\1"
Replace = "\0\r\n"
          "<div class='read_after'>-- &#x7d9a;&#x304d;&#x3092;&#x8aad;&#x3080; --</div><div style='display: none;'>\1</div>\r\n"

Name = "2ch: Collapse long comment (nyo) (2/2) [2008/02/09] test2"
Active = TRUE
URL = "$TYPE(htm)[^.]+.(2ch.net/|bbspink.com/)"
Limit = 4096
Match = "(<dd>"
        "(((^<(br /+>|dt>|/dd>))?)+<br /+>)+{3})\0"
        "(((^<(dt>|/dd>))?)+)\1"
Replace = "\0\r\n"
          "<div class='read_after'>-- &#x7d9a;&#x304d;&#x3092;&#x8aad;&#x3080;&#x306b;&#x3087; --</div><div style='display: none;'>\1</div>\r\n"

2つある (2/2) は「-- 続きを読む --」の表現が違います。
機能的には変わりませんので、お好みに合わせてお使いください。

ラベル: ,

2008年1月29日火曜日

リンク化フィルタ「http Text to Link」でstyle要素、script要素、pre要素、code要素のブロック内に誤爆する不具合を修正

Thinking Archive(仮)で公開しているフィルタ「http Text to Link [2007/07/08]」を元に、以下の更新を行いました。

  • style要素内でフィルタが動作しないようにした
  • script要素内でフィルタが動作しないようにした
  • pre要素内でフィルタが動作しないようにした
  • code要素内でフィルタが動作しないようにした
  • textarea要素の存在チェックを行うフィルタの名前を「check <textarea>」から「Global-Flag: inner textarea element」に変更

各要素の存在チェックは別フィルタにしており、それぞれのフィルタを無効化して「http Text to Link」を動作させることもできます。
例えば、pre要素内でリンク化を有効にしたかったら、「Global-Flag: inner pre element」を無効化してください。

[Patterns]
Name = "Global-Flag: inner style element [2008/01/29] test1"
Active = TRUE
URL = "$TYPE(htm)"
Limit = 256
Match = "(^(^<("
        "style[ >](^$TST(inStyle=1))$SET(inStyle=1)|"
        "/style>$TST(inStyle=1)$SET(inStyle=)"
        ")))"

Name = "Global-Flag: inner script element [2008/01/29] test2"
Active = TRUE
URL = "$TYPE(htm)"
Limit = 256
Match = "(^(^<("
        "script(\s[^>]+>|>)(^ </script>|$TST(inScript=1))$SET(inScript=1)|"
        "/script>$TST(inScript=1)$SET(inScript=)"
        ")))"

Name = "Global-Flag: inner pre element [2008/01/29] test1"
Active = TRUE
URL = "$TYPE(htm)"
Limit = 256
Match = "(^(^<("
        "pre[ >](^$TST(inPre=1))$SET(inPre=1)|"
        "/pre>$TST(inPre=1)$SET(inPre=)"
        ")))"

Name = "Global-Flag: inner code element [2008/01/29] test1"
Active = TRUE
URL = "$TYPE(htm)"
Limit = 256
Match = "(^(^<("
        "code[ >](^$TST(inCode=1))$SET(inCode=1)|"
        "/code>$TST(inCode=1)$SET(inCode=)"
        ")))"

Name = "Global-Flag: inner textarea element [2008/01/29] test1"
Active = TRUE
URL = "$TYPE(htm)"
Limit = 256
Match = "(^(^<("
        "textarea[ >](^$TST(inTextarea=1))$SET(inTextarea=1)|"
        "/textarea>$TST(inTextarea=1)$SET(inTextarea=)"
        ")))"

Name = "http Text to Link [2008/01/29] test4"
Active = TRUE
URL = "$TYPE(htm)"
Limit = 512
Match = ">(^$TST(inStyle=1)|$TST(inScript=1)|$TST(inPre=1)|$TST(inCode=1)|$TST(inTextarea=1))"
        "([^<>]++)\0(http(://|s://)\1|ttp(://|s://)\1)\2"
        "([0-9a-z_-]+{1,63}(.[0-9a-z_-]+{1,63})++{0,4}.[0-9a-z_-]+{2,6}(:[0-9]+{1,5}|(^[.0-9:a-z_-]))"
        "(/[!=#-&(-;?-[\]-~]+|(^/)))\3(^['"])"
        "(^(^"
        "(<br /+>[^<>]+)+{1,2}<(^/a>)|"
        "(^<br /+>)[^<>]+(<!--*-->[^<]+)+<"
        "(^/+[^a-z]|/("
        "((^a>)[^>]+> </)+a>|title>|style>|script>|textarea>|pre>|code>|samp>"
        "))))"
Replace = ">\0<a style="text-decoration: none" href="http\1\3">"
          "<span style="font-size: small">Linked:&#160;</span>\2\3</a>"

ラベル: ,

2007年11月23日金曜日

FirefoxのURI属性値における数値参照の解釈がおかしい

2chスレッド Proxomitron フィルター作成スレッド Part7 の書き込みを見て、気がついたFirefoxの動作メモです。

36 :名無しさん@お腹いっぱい。 < sage > :2007/11/02(金) 00:37:16 ID:l+Xvx/fa0
URIを「 &#十進数; 」の羅列で表記して隠してるページがあるんだけど
どうやったら普通の文字に変換できますか?
「 %十六進数 」は>>834みたいにすればいいのは解るんですが。

多分、数値参照文字を書くときに & までエスケープ (&amp;) して、数値参照表記を表示させているのだと思います。
この場合、ソースは以下のようなものが考えられます。
# リンクまで変なのは、不特定多数の掲示板に投稿された場合を考慮しての事。

<a href='http://prx.testing.com?test=&amp;#80;&amp;#114;&amp;#111;&amp;#120;&amp;#111;&amp;#109;&amp;#105;&amp;#116;&amp;#114;&amp;#111;&amp;#110;'>
http://prx.testing.com?test=&amp;#80;&amp;#114;&amp;#111;&amp;#120;&amp;#111;&amp;#109;&amp;#105;&amp;#116;&amp;#114;&amp;#111;&amp;#110;'>
<a>

こうなると、数値参照で使われているアンバサンド (&) がエスケープされているため、数値参照としては機能しない「はず」です。
が、Firefox 2.0.0.9 で動作確認をすると、内部動作で「 &amp;#十進数; 」と同等に解釈されるのか、正常なリンクとして機能してしまいます。
IE7 はエスケープ前の「 &amp;amp;#十進数; 」として解釈するため、不正なリンクとして動作します。
これはIE7の解釈の方が正しい気がするのですが……。

IE7で正常なリンクとして扱われるためには、&amp; を & に変換して、本来の数値参照に直す必要があります。
以下は、a要素のhref属性値限定で &amp; を & に置換するProxomitronのフィルタです。

[Patterns]
Name = "&#n; to char for URL Link [2007/11/23] test1"
Active = TRUE
URL = "$TYPE(htm)"
Limit = 256
Match = "(<a\s[^>]++href=)\#$AVQ(((*\&)\#amp;(#[#0:9999];)\#)+{1,*}\#)(^(^[ >]))"
Replace = "\@"

リンクが貼られていない文字列を置換するなら、URLテキストをリンク化するフィルタ http Text to Link で上のフィルタと同じことを行えば、実現できると思います。

ラベル: , , ,

2007年9月24日月曜日

URLリストに登録されていないサイトのJavaScriptを無効にするProxomitronフィルタ

動作内容は以下の通り。

  • script要素を削除 (後方にnoscript要素があれば、noscript要素を外して展開する)
  • a要素/href属性で指定されたjavascriptスキームを無効なスキーム「killjavascript」に置換
  • 要素埋め込み型のon****属性を無効な属性「killon****」に置換
[Patterns]
Name = "Disable JavaScript NoSafeList [2007/09/24] test2"
Active = TRUE
URL = "$TYPE(htm)(^$LST(JSEnable))"
Limit = 2048
Match = "$NEST(<script[ >],</script>)"
        "$SET(#=<script type='comment'> Disable JavaScript NoSafeList </script>)"
        "( $NEST(<noscript>,\0,</noscript>)"
        "$SET(#=\r\n<div class='view_noscript'>\0</div>)"
        "|)|"
        "(<a\s[^>]++href=)\#$AVQ((["']|)\#(javascript:*)\0)(^(^[ >]))"
        "$SET(#=kill\0)|"
        "(<[a-z]+{1,*}[0-9]+(^(^\s))[^>]++\s)\#(^(^on"
        "(abort|blur|change|click|dblclick|dragdrop|error|focus|key(down|press|up)|load|"
        "mouse(down|move|out|over|up)|move|reset|resize|select|submit|unload)=))"
        "$SET(#=kill)"
Replace = "\@"

今回は技術的な興味からフィルタを作成しましたが、JavaScriptの有効/無効はブラウザ側で制御した方が確実だと思います。
これ以外の方法でJavaScriptが使われたとしても、ブラウザがJavaScriptを許可しなければ無効となるので。

ラベル: ,

2007年9月3日月曜日

後述のa要素を含めてリンク化するProxomitronフィルタ

Thinking Archive(仮)で公開しているフィルタ「http Text to Link [2007/07/08]」は、以下のHTMLソースがあったとき、URLテキストからa要素の手前までをリンク化します。

<p>
http://www.nicovideo.jp/watch/<a href="http://www.nicovideo.jp/watch/sm111111" class="video">sm111111</a><br />
http://www.nicovideo.jp/<a href="http://www.nicovideo.jp/mylist/111111/1111111" class="video">mylist/111111/1111111</a>
</p>

下記フィルタは、URLテキスト後述のa要素を含めてリンク化します。

[Patterns]
Name = "NicoVideo: http Text to Link with anchor [2007/09/03] test3"
Active = TRUE
URL = "$TYPE(htm)www.nicovideo.jp/watch/?"
Limit = 512
Match = ">(^$TST(Textarea=y))"
        "([^<>]++)\#(http(://|s://)\1|ttp(://|s://)\1)\2"
        "([0-9a-z_-]+{1,63}(.[0-9a-z_-]+{1,63})++{0,4}.[0-9a-z_-]+{2,6}(:[0-9]+{1,5}|(^[.0-9:a-z_-]))"
        "(/[!=#-&(-;?-[\]-~]+|(^/)))\3(^['"])"
        "(<a\s[~>]++href=$AV(http$TST(\1)$TST(\3)\4)[^>]+>)\#"
        "(^(^$TST(\4)</a>))"
Replace = ">\@<span style="font-size: small">Linked:&#160;</span>\2\3"

上記はニコニコ動画限定ですが、このやり方なら汎用フィルタにすることも可能だと思います。 問題がなさそうなら、既存の「http Text to Link」と統合します。

ラベル: ,

2007年8月22日水曜日

JavaScriptを挿入するデフォルトのProxomitronフィルタ修正版

Proxomitron本体にデフォルトで付属しているフィルタは、誤爆を引き起こす要素をいくつか持っています。
以下に挙げるフィルタは、JavaScriptを挿入するタイプのフィルタで出来るだけ誤爆しないように工夫したものです。

HTML文書を読み込む前にJavaScriptを挿入するフィルタ修正版。

[Patterns]
Name = "Kill pop-up windows [2007/08/21] fixed"
Active = TRUE
URL = "$TYPE(htm)"
Limit = 8
Match = "(^(^<script[ >]|</head>))$STOP()"
Replace = "<script type='text/javascript' src='http://local.ptron/WindowOpen.js'></script>\r\n"

Name = "Suppress all JavaScript errors [2007/08/21] fixed"
Active = TRUE
URL = "$TYPE(htm)"
Limit = 8
Match = "(^(^<script[ >]|</head>))$STOP()"
Replace = "<script type='text/javascript'>\r\n"
          "function NoError(){return(true);} onerror=NoError;"
          "</script>\r\n"

Name = "Stop browser window resizing [2007/08/21] fixed"
Active = TRUE
URL = "$TYPE(htm)"
Limit = 8
Match = "(^(^<script[ >]|</head>))$STOP()"
Replace = "<script type='text/javascript'>\r\n"
          "function moveTo(){return true;} function resizeTo(){return true;}"
          "</script>\r\n"

HTML文書を読み終わった後にJavaScriptを挿入するフィルタ。

[Patterns]
Name = "Restore pop-ups after a page loads [2007/08/21] fixed"
Active = TRUE
URL = "$TYPE(htm)"
Limit = 8
Match = "(^(^</head>))$STOP()"
Replace = "<script type='text/javascript'>\r\n"
          "function addLoadEvent(func) {"
          "	var oldonload = window.onload;"
          "	if (typeof window.onload != 'function') {"
          "		window.onload = func;"
          "	} else {"
          "		window.onload = function() {"
          "			oldonload();"
          "			func();"
          "		}"
          "	}"
          "}"
          "addLoadEvent(PrxRST); "
          "</script>\r\n"

2007/05/22時点の修正版では、ページ読み込み後にJavaScript実行するために、(^(^</html>)) を使っていましたが、これは </html> の後ろにJavaScriptを挿入するHTMLに対応できていませんでした。
今回は、addLoadEvent でこの問題を解消しています。
でも、今となっては「addLoadEvent」も古い書き方で、window.addEventListener を使う のが適切なのでしょうね。
今の書き方でも実用上問題はないはずなので、イベントリスナ系統をまとめて覚えた後に対応しようと考えています。

Proxomitron-Jで配布されている「Allow right mouse click 3種セット」の修正版。

[Patterns]
Name = "Allow right mouse click [2007/05/23] fixed"
Active = TRUE
URL = "$TYPE(htm)"
Limit = 16
Match = ".(onmousedown=|captureEvents\()"
Replace = ".PrxOff_"

Name = "Allow right mouse click 2 [2007/08/21] fixed"
Active = TRUE
URL = "$TYPE(htm)"
Limit = 8
Match = "(^(^</head>))$STOP()"
Replace = "<script type='text/javascript'>\r\n"
          "function addLoadEvent(func) {"
          "	var oldonload = window.onload;"
          "	if (typeof window.onload != 'function') {"
          "		window.onload = func;"
          "	} else {"
          "		window.onload = function() {"
          "			oldonload();"
          "			func();"
          "		}"
          "	}"
          "}"
          "function onMousedownNull(){"
          "	document.onmousedown=null;"
          "}"
          "addLoadEvent(onMousedownNull);"
          "</script>\r\n"

Name = "Allow right mouse click plus [2007/05/23] fixed"
Active = TRUE
Multi = TRUE
URL = "$TYPE(htm)"
Limit = 512
Match = "(<[^>]++\s)oncontextmenu(^(^=))"
Replace = "ProxAllow"

依頼を受けたフィルタを修正しており、デフォルトのフィルタ全てを修正してはいません。
元のフィルタと修正版を比較すれば、修正内容の見当は付くと思います。
でも、リクエストを受け付けないというわけではないので、要望があれば、順次対応していくつもりです。

ラベル: , ,

2007年8月7日火曜日

不正な Content-Encoding ヘッダを削除するProxomitronフィルタ

Content-EncodingヘッダはHTTP通信時の符号化方式を指定するヘッダです。
Proxomitronは不正な Content-Encoding を検出すると、符号化内容がわからないために、フィルタの働きを止めてしまいます。
このフィルタは不正なContent-Encodingヘッダを削除することで、符号化内容をProxomitronに正しく認識させ、フィルタを有効にします。
(ついでに、古い名前の x-gzip, x-compress を新しい名前に訂正します)

[HTTP headers]
In = TRUE
Out = FALSE
Key = "Content-Encoding: Kill incorrect Encoding (In) [2007/08/07] test1"
Match = "(^gzip|deflate|compress)(x-(gzip|compress)\0|?)"
Replace = "\0"

改めて、RFC2616を確認してみたら、この content-coding 値は、Accept-Encoding ヘッダでのみ使用し、Content-Encoding ヘッダでは使用すべきではない とあったので、その修正版です。
フィルタ名が変わっているのは気分的なもので、特に意味はありません。

ラベル: ,

2007年8月5日日曜日

position:relative のブラクラに対抗するProxomitronフィルタ

ぼくはまちちゃん!(Hatena) - IEを華麗に撃墜する一行で紹介されているブラクラに対抗するためのProxomitronフィルタです。

[Patterns]
Name = "Anti Browser Crasher by position:relative [for IE6] [2007/08/05] test1"
Active = TRUE
URL = "$TYPE(htm)|$TYPE(css)"
Limit = 256
Match = "\* $NEST({,"
        "( ((^position)[^:]+:[^;]+; )+)\#"
        "position : [^;]+;+"
        "\#,})"
Replace = "* {\@}"

IE7ではブラクラそのものが効かず、IE6 Standaloneでブラクラが無効化されることを確認しました。

ラベル: ,

2007年8月4日土曜日

ニコニコ動画のメッセージサーバ系フィルタが効かなくなっていた問題に暫定対応

下記フィルタを適用すれば、今までのフィルタがそのまま動作するようになります。

[HTTP headers]
In = FALSE
Out = TRUE
Key = "Accept-encoding: Kill Nicovideo encoding (out) [2007/08/02] test1"
URL = "msg[0-9]+.nicovideo.jp/api/(^?)"
Match = "*"

ニコニコ動画のメッセージサーバはgzip圧縮したデータを送信するようになりましたが、Proxomitronはgzipを解凍せずに処理しようとします。
上のフィルタは、Webブラウザの通信リクエスト時に「gzip圧縮に対応していません」というヘッダを送信し、gzip圧縮していないデータを受け取ることで既存のフィルタを有効にします。
これを行うと、メッセージサーバのgzip圧縮(負荷対策)を無効化してしまうので、できればやりたくないのですが、他によい代替手段を思いつかないので。

Proxomitronはgzipに対応していないわけではなく、text/html, text/css などの「WebページフィルタでマッチするContent/Type」ではgzipを解凍して処理します。
ですので、Content/Typeを変更すれば、gzip圧縮したままでフィルタが効くようになりますが、汎用フィルタが誤爆する可能性を考えると、難しいものがあります。

Proxomitron等に関するWiki によると、

Content-Encoding: gzip で、Content-Type: が text/html、multipart/x-mixed-replace、text/css、text/javascript、 application/x-javascript、text/vbscript のどれか($TYPE(oth) 以外)の場合、Webページフィルタでは解凍された物が処理対象になる

とあり、multipart/x-mixed-replace というあまりお目にかかることのなさそうなヘッダもgzipの解凍処理対象となるようですが、multipart/x-mixed-replace自体がよくわからないヘッダだったので使用しませんでした。

ラベル: ,

2007年7月19日木曜日

ニコニコ動画フィルタ集テスト版を更新 (拡大表示からの復帰時の不具合修正)

更新点は以下の通り。

2007/07/19
・動画の拡大表示からの復帰時に隠していた動画下コンテンツが再表示されてしまう不具合を修正

restorePlayer() の問題を修正しただけです。 ダウンロードは filter_niconico_test_20070719 からどうぞ。

flvplayer_wrapper 2007/07/16と組み合わせる場合は、「動画上部のニワニュース広告を削除」を無効に設定すれば共存できます。 (有効にしても動作しますが、プレイヤー上部のボタンが見切れてしまうので、一部機能が使えなくなります。)

(2007/07/19 7:22追記) リンク先が誤っていたのを修正しました。

ラベル: ,

2007年7月18日水曜日

コメントが真っ白になる問題を解決したフィルタ (2007/07/19)

<chat> の内容削除に留めたフィルタ。 空白のコメントが残るので、683氏のフィルタの方が良いかもしれません。

[Patterns]
Name = "NicoVideo: Kill chat-item [NG command] [2007/07/16] test1"
Active = TRUE
URL = "$TYPE(oth)msg[0-9]+.nicovideo.jp/api/(^?)"
Limit = 512
Match = "$NEST((<chat\s[^>]++mail=$AV(([a-z]+\s)++$LST(NicoNico-NG_cmd)(\s*|(^?)))[^>]+>(^<))\0,</chat>)"
Replace = "\0</chat>"

Name = "NicoVideo: Kill chat-item [easiness] [2007/07/16] test1"
Active = TRUE
URL = "$TYPE(oth)msg[0-9]+.nicovideo.jp/api/(^?)"
Limit = 512
Match = "$NEST((<chat\s[^>]+>(^<))\0,"
        "([%e3][%80][%80]|\s)+"
        "((([%C0-%DF][%80-%BF]|[%E0-%EF][%80-%BF][%80-%BF]|[%F0-%F7][%80-%BF][%80-%BF][%80-%BF]|[^<>])\0"
        "($TST(\0))+)+{1,2})\1"
        "($TST(\1))+"
        "([!?%77]|[%e3]([%81][%a3]|[%83][%83])|[%ef]([%bc][%81%9f]|[%bd][%97]))+"
        ",</chat>)"
Replace = "\0</chat>"

Name = "NicoVideo: Kill chat-item [NGID] [2007/07/16] test1"
Active = TRUE
URL = "$TYPE(oth)msg[0-9]+.nicovideo.jp/api/(^?)"
Limit = 512
Match = "$NEST((<chat\s[^>]++user_id=$AV($LST(NicoNico-NGID))[^>]+>(^<))\0,</chat>)"
Replace = "\0</chat>"

Name = "NicoVideo: Kill chat-item [NGWord] [2007/07/16] test1"
Active = TRUE
URL = "$TYPE(oth)msg[0-9]+.nicovideo.jp/api/(^?)"
Limit = 512
Match = "$NEST((<chat\s([^>]++user_id=$AV(\9)|)[^>]+>(^<))\0,"
        "*$LST(NGWord-utf8)*"
        ",</chat>)"
Replace = "\0</chat>"

ラベル: ,

2007年7月17日火曜日

ニコニコ動画にユーザーJavaScriptを追加するProxomitronフィルタ

機能は以下の通り。

  • 動画上部の広告を隠す (見えなくするだけで、接続はなくなりません)
  • 動画閲覧ページで動画検索フォームに「現在の動画タイトル」をセットする
  • FLVのダウンロードリンクを挿入
動画タイトルの見出しをクリックすると、「動画名.flv」をクリップボードへコピーして、ダウンロードリンクが右側に表出します。 (もう一度、動画タイトルをクリックすると、ダウンロードリンクを隠します)
  • 「あなたのブログに動画を貼り付けよう」を隠す
  • 動画下のコンテンツ(対応ブラウザ、動画再生プレイヤー つかいかた、Amazonアソシエイト) を隠す
  • 「ページの先頭へ」の画像を隠す
  • ページフッタの表示形式を変更する (折りたたむ / 隠す)

Opera9,Firefox2,IE7で動作確認。 (Firefox2が主なので、他のブラウザで動かなかったら、報告を下さい)

[Patterns]
Name = "NicoVideo: add nicovideo_plus.js [2007/07/16] test1"
Active = TRUE
URL = "$TYPE(htm)www.nicovideo.jp/"
Limit = 8
Match = "(^(^&lt;/head&gt;))$STOP()"
Replace = "\t&lt;script type='text/javascript' charset='utf-8' src='http://local.ptron/js/nicovideo_plus.js'&gt;&lt;/script&gt;\r\n"

スクリプトがないと何も動作しないので、filter_niconico_test_20070717 からダウンロードして使用してください。

(2007/07/19 7:39追記) リンク先が誤っていたのを修正しました。

ラベル: ,