トップページに戻る
tokix.netはネットワーク・セキュリティ周辺から半径rな雑文を垂れ流す不定期更新個人サイト>>このサイトについて

DLのためのProxomitron

<<トップカテゴリー「ScriptKiddies」に戻る

DLのためのProxomitron(1) (>>この記事のみを表示)

Proxomitron」というツールにどのようなイメージを持っているだろうか。

・・・何か最初からツールの存在や概要を前提にした書き方をしていますが、「何そのツール?」という人も大丈夫なように書きます。

  • ウェブサイト上の広告を除去してくれるツール
  • ついでにブラクラとか右クリック禁止とかも除去してくれる
  • 何か「フィルタ」というのを入れると機能が増えるというかそんな感じ
  • ただ割と設定が面倒ぽい
  • そもそも入れなくても広告なんかそう気になるものでもないし、危険なタグなんかそう遭遇するものでもない(or「ブラウザで防げる」)

と、いうことで、その他の各ツールと同程度に「セキュリティに異常に関心を持つならマストなんだろうけど俺には関係ないや」感をまき散らすProxomitronな訳ですが、このツールは「セキュリティを高めるためのツール」という訳ではない。何をするかというと

という具合に、ブラウザとウェブサーバーの間に入り込み、通信を監視して書き換えるツール。

ブラウザはサーバーに不要な(かつ送ることが望ましくない)情報を送信する場合があり、また、ウェブサーバーはブラウザに「必要のない」或いは「危険な」情報を送信する場合がある。それを監視し「フィルタ」というルールに従って書き換えれば「セキュリティを高める」ことができる。

何が言いたいかというと、Proxomitronはあくまで「ブラウザとウェブサーバーの間に入り込み、通信を監視して書き換えるツール」であり、その活用法の一つが「セキュリティを高める」である、と。この順序を大事にして欲しいのです。逆ではない(「Proxomitronはセキュリティを高めるためのツール、具体的にはブラウザとウェブサーバーの間に入り込み〜」なんて説明に魅力を感じなかったからといって「俺にはProxomitronは不要だ」という結論に達するのは勿体ない)。


で、長い前置きをした上で、「Proxomitronをダウンロードのために使う」という連載を始めます。

別に、これであっても全く同じことなんだ。


基本的に「初心者向け」として解説しますが、前提知識として

  • いわゆる「インストールが不要なオンラインソフト」を導入し使うことができる
  • ブラウザのプロクシ設定を弄れる
  • ワイルドカード(「*」で「あらゆる文字列」を意味する)くらいは分かる
  • プログラミングの知識は不要だが「変数」の意味くらいは分かる(例えばPCの世界で「a=10」は「aに10を代入」の意味です)

程度の知識はないと辛いかもしれません。

DLのためのProxomitron(2) (>>この記事のみを表示)

ということでProxomitronをセキュリティ目的でなくダウンロードのために使う、という連載なんですが、導入部分に関しては他サイトへのリンクで詳細省略しますんで、すみませんが自力でどうにかして下さい。

Proxomitron-J

The Proxomitron 日本語サポートページ内「The Proxomitronのダウンロードとインストール」

MYCOM PC WEB内「Webブラウジングを快適にする『The Proxomitron』」

で、導入が終わったらタスクトレイのProxomitronアイコンをクリックすればメインウインドウが表示されるんだけど、最初にやって欲しいことは、ずばり全てのフィルタを無効にすること。


メインウインドウで「Webページ」「ヘッダ」をクリックし、それぞれの設定ウインドウで全てのチェックを外して「OK」をクリックして下さい。

理由なんですが、Proxomitronはデフォルトフィルタが充実しすぎているからです。「充実している」というのは別に「あえて不便な道を選べ」とかそういう意味ではない。今回は一回分使って本筋の前にProxomitronの具体的な動作とフィルタの基本的な書き方を解説します。


Proxomitronの「Webページ」「ヘッダ」というのは、前回書いた「ウェブサーバー→ブラウザの通信内容」「ブラウザ→ウェブサーバーの通信内容」を意味します。「Webページフィルタ」というのは、サーバーがブラウザに送ってくる通信内容(ウェブソース)を書き換えるルール。これは無意味に並んでいる訳ではなくて、上から下に処理順番になっている。このSSで言うなら

  1. まず「Add Link 4.2 beta2」というフィルタによってページソースが書き換えられる
  2. 次に「Kill all Images on selected pages」というフィルタによってページソースが書き換えられる
  3. 次に「Un-Prefix URLs」というフィルタによってページソースが書き換えられる
  4. 次に「Embedded MIDI Silencer」というフィルタによってページソースが書き換えられる
  5. (以下略)

これが故に、今から「ダウンロードのためのフィルタ」を作成していく訳ですが、その「ダウンロードのためのフィルタ」を何処に置こうが、「他のフィルタとの相性」という問題が常にあるのです。

  • 「ダウンロードのためのフィルタ」を最上位に置いた場合→せっかく書き換えたのにデフォルトフィルタで再び書き換えられてしまう可能性がある
  • 「ダウンロードのためのフィルタ」を最下位に置いた場合→「ダウンロードのためのフィルタ」によってページを書き換えようとした時点で既にウェブソースが本来のものと異なっている(上位のフィルタによって書き換えられている)可能性がある

結論を先に書いておくと、この連載で作成するフィルタ群は上位に置くべきです。ただ、「何をしているのか分からないフィルタによってソースが書き換えられている」ということを「気持ち悪い」と感じて欲しいんです。なぜなら、それをされると問題が発生した場合に原因が「自分が書いたフィルタ」なのか「他のフィルタ」なのかの切り分けが難しくなるから。

  • まず「ダウンロードのためのフィルタ」を作成する
  • それが動作していることを確認して他のフィルタも有効にする
  • そこで問題が起きたら「他のフィルタ」を吟味する(一個ずつ外してチェックする、とか)

初心者にはこの順序を推奨します。別に無意味に脅している訳ではなくて、デフォで入ってる某フィルタが実際にダウンロードを阻害するケースが多いからです。なので、「ここで全無効にしておかないと後で悩みますよ」と、脅しておきます。


全てのフィルタを無効にしたら、「Webページ」「新規」からとりあえず新しいフィルタを作ってみましょう。

フィルタエディタウインドウなんですが、最初に覚えて欲しいのは「Match」と「Replace」。フィルタを作る前にこのページを見て下さい。「a cat is cute」とか書いてある訳ですが

  • 「Match」に「a cat is cute」
  • 「Replace」に「a dog is cute」

と入力し「OK」をクリックする。さらに「HTML Webページフィルタ」のウインドウで「更新」をクリックし「OK」で閉じる。この作業で今作ったフィルタが有効になります。この後、ブラウザの再読込とかを行って再びページを開くと文字が書き換えられているはずです。


これが、Proxomitronというツールの基本的な役割。一言で言えば、「ウェブページの中で『Match』に一致する部分を『Replace』に書き換える」。書き換えは別に一カ所に限らず、さっきのページにしても二カ所で書き換えが発生していたはずです。また、「Match」の文字が大文字でも小文字でも問答無用で書き換えられたはずです(「A cat〜」も書き換えられている)。


と、いうことで、Proxomitronの基本的な動作原理が分かったら、今作った謎のフィルタは邪魔なので消しておきましょう。「HTML Webページフィルタ」のウインドウでフィルタを選択し「切取」し、先ほどと同様に「更新」「OK」で変更を反映させる。


まだ「何故このツールによってダウンロードが楽になるのか」とか「そもそもこのツールで現実的に役立つことができるのか」とか様々な疑問が残っているかもしれませんが次回から本格的に話を始めます。

なお、最後に書き足しておきますが、次回以降は「上のフィルタを実際に作成しページが書き換えられる様子を確認している」という前提で書きます。「フィルタを自分で作成し有効にして、有効になった状態でウェブページを開き直す」という一連の作業が出来ていないと、書いたフィルタが上手く動いていない時に原因の切り分けが出来なくなります(フィルタは正しいのに有効になっていない・フィルタは正しいし有効になっているけどブラウザがキャッシュからページを読んでいる、等)。なので「バカバカしい」と思わずに上の作業を実際に手を動かして行っておくことをオススメします。

DLのためのProxomitron(3) (>>この記事のみを表示)

前回でProxomitronの基本的な使い方と動作原理が分かったと思うので、今回から具体的に「ダウンロードのためのフィルタ」を作成していきます。そのための「ターゲット」をどうするか考えたんですが、とりあえず「i-bbs」を狙うことにします。最初のターゲットに関してはじっくり解説をするので「別にそのサイトに用はない」という人も読んでください。同じ考え方は大半の掲示板で利用可能です。
なお、別に僕は「ストーキング」を行うつもりはないので、i-bbsが今後の仕様変更で「このフィルタ」を殺してきても「それに対応する新フィルタ」を公開する気はありません。故に、ここで書くのはあくまで「現在のi-bbsのダウンローダー規制を破る方法」であり、それ以上ではありません。一応そうなった後でも「読んでも意味不明」ということがないようにSSを多めにしますんで、「どのような考え方をして何をするのか」「どのようにフィルタを書くのか」という読み物としてご覧下さい。

で、i-bbsなんですが、いわゆるレンタル掲示板です。こんな感じで利用されてるみたいですね
サンプルも実際の掲示板もURL構造が変わらないのでサンプルを見てみますが、まず掲示板に表示されているサムネイルにマウスを乗せて気づくことは、ステータスバーのURL(リンク先)が「〜.jsp?〜」であること。

フルサイズ画像に直接リンクが張られていない。「JSP」ってのは、何というか、CGIみたいなもんです(本筋と関係ないので超いい加減説明ですが)。このため、Irvineでサムネイル画像の右クリックメニューからフルサイズ画像を落とそうとしても落とせない。「このページのリンクを抽出」とかで一気に落とそうとしてもフルサイズ画像のURLを抽出できない。

サムネイル画像をクリックすると「画像表示」というページが開かれる。この「画像表示」ページのURLが先ほどの「〜.jsp?〜」。 その「〜.jsp?〜」というページ内に表示されているフルサイズ画像のURLが「〜.jpg」。

ということで、まとめるとi-bbsは下記のような仕組みでダウンローダーを規制しています。

まぁ、ふたばなどでも利用されている典型的なダウンローダー規制(間に中継ページを挟むことで、掲示板本体にフルサイズ画像のURLを記述しなくても良いようにしてダウンローダーを規制する方法)なんですが、こういうモノを見たとき、僕らには二つの選択肢が存在する。
  • ダウンローダーにこのサイトの構造を解析させればいい(例えば「まずJSPページを落とさせ、JSP内にimgタグで記述されているフルサイズ画像URLを取得させ、そのURLを落とさせる」など)
  • サイトを、ダウンローダーが解析できる構造に書き換えてしまえばいい
何故i-bbsからはダウンローダーで画像を落としにくいのか。それは、掲示板にフルサイズ画像のURLが埋め込まれていないからだ。埋め込まれていないなら、埋め込んでしまえばいい。Proxomitronを使って書き換えてしまえばいい。

上記の「選択子」は別に「どちらが正しい」という訳ではなくケースバイケースです。ケースバイケースですが、この連載は、つまり「様々なサイトで後者の方針を使いダウンローダー規制突破を行う」というものです。この程度のダウンローダ規制ならば前者の方針で突破することも可能ですし、正直言えば「○○というツールを使えば何も考えなくても前者の方法で突破できます」と書いちゃった方が「手っ取り早い」んですが、「後者の方が圧倒的に楽」というケースも結構あります(&後半で「例」として紹介します)んで、まぁ、「連載の最初のターゲット」ということで。

ということで、i-bbsの掲示板ソースを開いてみてください。サムネイル部分のリンク(中継ページに飛ばすリンク)部分は下記のようになっています。
<a href="/imageDisp.jsp?id=test&file=1112975244921o.jpg" target="_blank">
<img src="http://image.i-bbs.sijex.net/bbs/test/1112975244921m.jpg" border="0">
</a>
まぁ、癖のないソースですね。Aタグに「中継ページのURL」、IMGタグに「サムネイル画像のURL」が記述されている。フルサイズ画像のURL
http://image.i-bbs.sijex.net/bbs/test/1112975244921o.jpg
です。では、もしも、このソースが
<a href="http://image.i-bbs.sijex.net/bbs/test/1112975244921o.jpg" target="_blank">
<img src="http://image.i-bbs.sijex.net/bbs/test/1112975244921m.jpg" border="0">
</a>
であったなら?サムネイル画像をクリックするだけで(中継ページを経由することなく)フルサイズ画像が表示される。従ってサムネイルを右クリックしフルサイズ画像を落とすことが出来るし、ページ内のリンク抽出で落とすことも出来る。Aタグのリンク先さえ書き換えてしまえばi-bbsは「ダウンローダーで落としやすいサイト」に変貌する。
Proxomitronは「Match」にかかれた文字列を「Replace」に置換しますから
  • Match: <a href="/imageDisp.jsp?id=test&file=1112975244921o.jpg" target="_blank">
  • Replace: <a href="http://image.i-bbs.sijex.net/bbs/test/1112975244921o.jpg" target="_blank">
単純に言ってしまえばこういうことです。ただ、実際このようなフィルタを書いても動作しないはずです。何故動作しないのか。また、仮に動作しても、これでは「その画像」を落としやすくなるだけで、「他の画像」を落とすことが出来ない。「他のIDの掲示板の画像」も落とすことも出来ない。
ここで、「フィルタの書き方」という多少面倒な話が始まります。ただ、初心者が特定サイト用のフィルタを書くためなら「フィルタの書き方」ってのは結構簡単に説明できる(Proxomitronを既に使える人はここ見てないと思いますがもしいたら、ということで言い訳しておきますが、そのために「DLのための」なんですよ)ので、次回一回で「初心者向けフィルタの書き方」を解説します。

DLのためのProxomitron(4) (>>この記事のみを表示)

前回で「何故Proxomitronを使いウェブページソースを書き換えるとダウンロードが楽になるのか」という考え方を解説したので、今回は具体的にi-bbsをターゲットにして「初心者向けフィルタ作成法」を解説します。下記の手順で作業を進めれば動作するフィルタが書けます。完全に「手順」として書きますし、この「手順」ならばプログラミングだとか正規表現だとかに関する知識が無くても十分に可能だと思います。

ということで実際の手順。
□1:作業前に対応関係を確認する
DLのためのProxomitron(3)の最後に書いた「Match」「Replace」
  • Match: <a href="/imageDisp.jsp?id=test&file=1112975244921o.jpg" target="_blank">
  • Replace: <a href="http://image.i-bbs.sijex.net/bbs/test/1112975244921o.jpg" target="_blank">
を見て、どこがどこに対応しているのかしっかり確認してから作業に入る。

i-bbsの場合は比較的素直なので「見れば分かる」かもしれませんが、結構ひねくれた対応関係になる場合もあるので、その場合はいくつか画像を開いて自分が頭に描いた対応関係が本当に正しいかどうか確認しておきましょう。
□2:「バイト制限」の設定
前回書いた「Match」を見て文字数を数えます。
  • Match:<a href="/imageDisp.jsp?id=test&file=1112975244921o.jpg" target="_blank">
は74文字。念のため少し余裕を見て(「test」でなくもっと長いIDの場合・将来連番の桁数が変わった場合などに備える程度)、文字数をProxomitronの「Webページ・フィルタエディタ」の「バイト制限」に設定します。とりあえずここでは「80」にしておきます。

何でこんなことをするのか、という理由はこの連載の最後DLのためのProxomitron(7)で解説しますんで今はとりあえず気にせずに。
□3:特殊文字のエスケープ
この連載の最初に軽く書いたんですが、ProxomitronのMatchではワイルドカード「*」が使用可能です。「*」は「あらゆる文字列」を意味します。
「*」だけでなく、このように「自身」を表さず「特殊な意味」を持ってしまう文字が何種類かあるので、そうした文字の前には「\」を付けます(「\」は英語フォントだとバックスラッシュになりますが同じ意味)。「\*」にすれば「*」自身を表す。こういうのを「エスケープ」というんで、まぁ、プログラマー気分に浸るために「エスケープ」という言い方を覚えておいても損はないかな、と。
特殊な意味を持ってしまう文字:「*」「?」「[」「]」「(」「)」「+」「=」「&」
ということで、「<a href="/imageDisp.jsp?id=test&file=1112975244921o.jpg" target="_blank">」自身を表すためには
  • Match:<a href\="/imageDisp.jsp\?id=test\&file\=1112975244921o.jpg" target\="_blank">
とする必要があります。Proxomitronの「Webページ・フィルタエディタ」から「テスト」を開き、とりあえずここまでが正しく動作しているか試してみると良いでしょう。「Replace」に前回書いたReplaceを記入して「テスト」をクリックし、「テスト」ウインドウの上部にソースの一部(前回書いたMatch)を記入し「テスト」をクリック。

この段階で「テスト中〜」ウインドウの「テスト」を押した時、下部に「[合致なし]」と表示されてしまった場合はエスケープが出来ていないので見直し。恥ずかしながら、僕もたまに「=」とかの前に「\」を付け忘れて、フィルタを書き終えてから「何で動かないんだ」と悩むことがあるので、この段階で一度テストをすることを強くオススメします。
※参考
Proxomitron-J内「検索表現テストウィンドウ
□4:可変要素を*に置換
「<a href\="/imageDisp.jsp\?id=test\&file\=1112975244921o.jpg" target\="_blank">」なんですけど、「id=test」の「test」は掲示板IDによって変わりますし、「file\=1112975244921o.jpg」の「1112975244921」はファイルによって変わります。また、「jpg」もアップされたファイルの拡張子によって変わります。こういう部分をワイルドカード「*」に書き換えます。
  • Match:<a href\="/imageDisp.jsp\?id=*\&file\=*o.*" target\="_blank">
こんな感じですね。
□5:Replaceで利用したい可変部分を変数に設定
前回書いたReplaceは
  • Replace: <a href="http://image.i-bbs.sijex.net/bbs/test/1112975244921o.jpg" target="_blank">
です。先ほどワイルドカードに置換した「test」「1112975244921」「jpg」はReplaceにも登場している。このように、Replaceで利用したい可変部分は「*」でなく「(*)\N」に置換する(N=1,2,3,4,・・・,9)。
  • Match:<a href\="/imageDisp.jsp\?id=(*)\1\&file\=(*)\2o.(*)\3" target\="_blank">
この場合は全てのワイルドカードを置換した訳ですが、場合によっては「可変部分だけどReplaceでは使わない」という場所が出てくることもあるので、その場合は「*」のまま残しておきましょう。また、同じ情報が複数回出てくるケース(連番部分がMatchに二回出てくる等)もあるので、その場合二度目以降は「*」のままで構いません。
「(*)\N」は「その部分を\Nという変数に代入する」の意味です。つまり、今の作業によって
  • 「\1」に「test」など掲示板ID
  • 「\2」に「1112975244921」などファイル名の連番
  • 「\3」に「jpg」などファイルの拡張子
がそれぞれ代入された。Replaceにも「\1」等と書けば代入された文字列が表示されるので

  • Replace:1:\1 2:\2 3:\3
こんな風に再びテストを行い、正しく代入されているか確認しておきましょう。(□4までは意図通りの動作が行われていたのに)この段階で意図通りの変数代入が行われていない場合はDLのためのProxomitron(6)を参考に。
また、何故この行程が必要なのか(□4の後□6を行っては何故まずいのか)はDLのためのProxomitron(6)まで読めば分かると思いますんで今はとりあえず気にせずに(ある程度慣れてくれば□5は不要ですが、慣れるまでに□5を飛ばすと「意図しない変数代入」が行われていた時、そのことに気付かず、上手く動かない原因の切り分けが出来なくなる)。
□6:Replaceを設定
前回書いたReplace
  • Replace: <a href="http://image.i-bbs.sijex.net/bbs/test/1112975244921o.jpg" target="_blank">
になるようにReplaceを設定します。□5でIDや連番や拡張子を変数に代入しているので
  • Replace:<a href="http://image.i-bbs.sijex.net/bbs/\1/\2o.\3" target="_blank">
としてテスト。

これが成功すればあと一息です。
□7:「URLのマッチ」を設定
今書いたフィルタはi-bbs用であり、他のサイトでは発動して欲しくない類のフィルタです。i-bbsのURLは「http://i-bbs.sijex.net/〜」なので「http://」部分を抜いて、「URLのマッチ」に「i-bbs.sijex.net/」と入れておく。これでフィルタが完成です。「フィルタ名」に「i-bbs.sijex.net DirectDL」とでも入れて「OK」をクリックし、DLのためのProxomitron(2)と同様にフィルタを有効化すればi-bbs全体で働くはずです。

こんな風に、サムネイル画像のリンク先が(JSPの中継ページでなく)フルサイズ画像になったはず。この状態ならばサムネイルを右クリックしIrvineで落とすことも出来ますし、リンク抽出などで一気にページ内のフルサイズ画像を全て落とすことも出来る。
今回解説した方法は、ぶっちゃけ「一番簡単で一番レベルの低いフィルタの書き方」なんですが、それでも十分実用性はあります。同じようにフィルタを組めば、i-bbsに限らず様々なサイトに関して「そのサイト用」のフィルタを書くことが出来るでしょう。次回からはターゲットを変えて、一歩レベルを上げたフィルタの書き方を解説します。

DLのためのProxomitron(5) (>>この記事のみを表示)

前回でi-bbsをターゲットとした最初の解説が終わったんですが、無事手順通りに「動く」フィルタを書けましたかね?
何か最初の例題が模範解答無しってのも酷い気がしたので、僕がDLのためのProxomitron(4)で紹介した「手順」通りに書いたフィルタを公開しておきます。もし「手順通りに書いたのに動かなかった」という人がいたら何処がおかしいのか確認しておいて下さい。DLのためのProxomitron(3)で書いたような仕様のサイト(これを読む頃既にi-bbsの仕様が変わってるかもなのでこういう表現です)向けのフィルタを、DLのためのProxomitron(4)の通りに書けばこうなります。

i-bbs.sijex.net DirectDL [05/04/13]

・・・あと、すみませんが「CFGファイルって何?」的な疑問がある人はProxomitron-J内の「Proxomitron のメインスクリーン」と「フィルタマージの手順」で自力でどうにかして下さい。

ということで今回からターゲットを変えます。今度のターゲットはAvi-Ban。こういうのとかこういうのとかが充実してますね。
何故このサイトをターゲットにしたかというと、ダウンローダー規制が非常に厳しいから。つまり、
ダウンローダーにこのサイトの構造を解析させればいい(例えば「まずJSPページを落とさせ、JSP内にimgタグで記述されているフルサイズ画像URLを取得させ、そのURLを落とさせる」など)
この方針でフルサイズ画像を落とすのが非常に難しい構造になっているから。そして、それにも関わらず、
サイトを、ダウンローダーが解析できる構造に書き換えてしまえばいい
こちらの方針でフルサイズ画像を落とそうと思うと、i-bbsとほぼ同じ難易度に過ぎないから。
上記の「選択子」は別に「どちらが正しい」という訳ではなくケースバイケース
という時の、Proxomitronを使った方が明らかに易しいケースとして紹介します。

で、例によってサンプル掲示板もURL構造が変わらないのでスクリーンショット付きで紹介します。

サムネイル画像にマウスを乗せたとき、ステータスバーに一切URLが表示されません。ここで勘の良い人は「JavaScriptでステータスバーを殺してるのか」と思いJSを無効にしてリロードするんですが、それでも何も表示されない。
にも関わらず、サムネイル画像をクリックすると「〜.php?〜」という画像表示ページ(i-bbsの場合と同じく「中継ページ」)が開く。

そのPHP(画像表示ページ)の中に表示されているフルサイズ画像のURLは下。

そして、掲示板本体のサムネイル画像表示部分のソースを見るとこんな感じ。

何が起きているのか分かりましたかね?実は、サムネイル画像はIMGタグで表示される画像ではなく、画像型のボタンだった。formのボタンって通常はですが、ここに画像を使うことって可能じゃないですか。

Yahoo!のトップページの検索formもボタンは画像です。マウスを乗せるとマウスカーソルは変化しますがステータスバーには何も表示されない。
Avi-Banのサムネイルも、これと同じ「画像ボタン」だったのです。そしてformのsend先(Yahoo!の場合は「検索結果表示ページ」)が、先ほどのPHPファイル(画像表示ページ)。
これをダウンローダーに解釈させるのは難しい。よくある「サイト全体の構造を自動解析しサイト内ファイルを全てダウンロード」というタイプのツールを使えばi-bbsのようなサイトならフルサイズ画像まで落とせますが、ああいうツールでもformは無視されることが多い(分かりやすく言うと、formに対するsend結果のページまで落とすということは、例えばうちのサイトの「サイト内検索結果」や、場合によっては「掲示板投稿結果」まで落とすということです。そんなダウンローダーは見たことないはず)。
そして、にも関わらず、HTMLを書き換えてしまえば簡単にこの規制を突破することができる。
Avi-Ban掲示板ソースのサムネイル画像表示部分を抜き出します。
<input type="image" src="http://photo1.avi.jp/photo/1/1/1-5677638-0-18252981.jpg" alt="無料レンタル掲示板 Avi-Ban" name="submit">
この前後にformがあるんですが、そんなことはどうでもいい。何故なら、上のソースを
<a href="http://photo1.avi.jp/photo/1/1/1-5677638-0-18252981-pc.jpg"><img src="http://photo1.avi.jp/photo/1/1/1-5677638-0-18252981.jpg"></a>
に書き換えてしまえば、サムネイル画像は「画像ボタン」ではなく「(フルサイズ画像へのリンクを行う)Aタグに囲まれたIMG画像」になるから。それがformに囲まれていようが何の関係もない(formを使った「手の込んだ」ダウンローダー規制でも、Proxomitronによるウェブページ書き換えの前では全くといって良いほど意味がない)。

具体的な書き方は次回。

DLのためのProxomitron(6) (>>この記事のみを表示)

前回から引き続いてAvi-Banなんですが、基本的な書き方はDLのためのProxomitron(4)と変わりません。変わらないんですが、以前書いた話だけでは「動く」フィルタを書けないと思うので一歩(だけ)レベルを上げて解説します。

まず素直にフィルタを書いてみましょう。
  • サムネイル画像のURL:http://photo1.avi.jp/photo/1/1/1-5677638-0-18252981.jpg
  • フルサイズ画像のURL:http://photo1.avi.jp/photo/1/1/1-5677638-0-18252981-pc.jpg
ということで、素直に考えれば
  • http://photo1.avi.jp/photo/1/1/1-5677638-0-18252981」を「(*)\1」に
  • jpg」を「(*)\2」に
それぞれ代入させ、「\1-pc.\2」で「フルサイズ画像のURL」を表す、というのがDLのためのProxomitron(4)で書いた方法です。

また、今回のメインテーマとは関係ないんですけど
<input type="image" src="http://photo1.avi.jp/photo/1/1/1-5677638-0-18252981.jpg" alt="無料レンタル掲示板 Avi-Ban" name="submit">
「無料レンタル掲示板」みたいな全角文字をProxomitronフィルタに書くと文字化けするので「可変部分」と見なして「*」にしておきます。

と、いう、上の方針を使ってDLのためのProxomitron(4)の□5まで作業を進めたスクリーンショットが下。

何が起きてしまったか分かりますか?「*」を使い
  • サムネイル画像のURL:http://photo1.avi.jp/photo/1/1/1-5677638-0-18252981.jpg
というように分割しようとしたつもりだったのに、実際には
  • サムネイル画像のURL:http://photo1.avi.jp/photo/1/1/1-5677638-0-18252981.jpg
というように分割されてしまった。

何故こんなことが起きてしまったのか、分析してみましょう。
  • サムネイル表示部分ソース:<input type="image" src="http://photo1.avi.jp/photo/1/1/1-5677638-0-18252981.jpg" alt="無料レンタル掲示板 Avi-Ban" name="submit">
  • Match:<input type\="image" src\="(*)\1.(*)\2" alt\="* Avi-Ban" name\="submit">
ということで
  1. サムネイル表示部分ソースの「<input type="image" src="」がMatchの「<input type\="image" src\="」に対応する
  2. サムネイル表示部分ソースの「http://photo1.avi.jp/photo/1/1/1-5677638-0-18252981.jpg」がMatchの「(*)\1.(*)\2」に対応する
  3. サムネイル表示部分ソースの「" alt="無料レンタル掲示板 Avi-Ban" name="submit">」がMatchの「" alt\="* Avi-Ban" name\="submit">」に対応する
ということですよね。「サムネイル画像のURL」が「(*)\1.(*)\2」という部分に対応している、というところまでは問題無いんです。

そして、問題はその次。「(*)\1.(*)\2」というのは、つまり「『.』によって分割し、前を\1に、後ろを\2に代入する」ということなんですけど、「http://photo1.avi.jp/photo/1/1/1-5677638-0-18252981.jpg」には「.」が複数含まれている。つまり、これだけでは「何処で\1と\2を分割するのか」という点が不明確なのです。
  • サムネイル画像のURL:http://photo1avi.jp/photo/1/1/1-5677638-0-18252981.jpg
  • サムネイル画像のURL:http://photo1.avi.jp/photo/1/1/1-5677638-0-18252981.jpg
  • サムネイル画像のURL:http://photo1.avi.jp/photo/1/1/1-5677638-0-18252981.jpg
「サムネイル画像のURLを『.』で分割し、前を\1に、後ろを\2に代入する」というだけでは分割の方法が3通りも「あり得てしまう」(そして、理由は割愛しますが上のスクリーンショットでは一番上のパターンで分割が行われています)。

一言で言うと、これがワイルドカード「*」の限界であり、正規表現の必要性です。別にProxomitronに限らずプログラミングでも文章執筆でもファイル検索でも同じなんですけど、ワイルドカードは常にこういう限界を持っている。この連載では、いわゆる「分からない人には何を意味しているのか完全不明な正規表現」とか「Proxomitron独自ルール」とかには話を展開させず、下記三つの方法を紹介します。
□A:可変部分を細かく分割する
分割が一カ所しかないから問題なのです。細かく可変部分を区切っていけば問題が解決されることが多いです。
ただ、この場合は問題なかったんですけど、Proxomitronは変数の個数に上限がある(\10とかは無理)ので、この方針ではどうにもならない場合もあります。

本当のことを言うと、ここまで細かく分割する必要はありません。この場合「.」によって連番部分と拡張子が分割されているので、可変部分に「.」が含まれる(photo1.avi.jp)ことが問題なんです(だから区切れが不明確になって意図しない変数代入が行われる)。
ということで
  • サムネイル画像のURL:http://photo1.avi.jp/photo/1/1/1-5677638-0-18252981.jpg
のように分割すれば可変部分に「.」が含まれなくなりますから、変数の数を必要以上に増やすことなく問題を解決できます。
□B:変数に代入される文字列を限定する
実はこれも正規表現の一つなんですけど「正規表現って何?」という人でも分かりやすいと思うので紹介します。
ワイルドカード「*」は「あらゆる文字列」です。そして「あらゆる文字列を\Nに代入する」が「(*)\N」でした。「あらゆる」ではなくて、代入される文字列のパターンを限定してしまう。この場合「画像の拡張子」というのは「jpg」「png」「gif」のいずれかです。「(jpg|png|gif)\N」とすると、「jpgかpngかgifのどれかを\Nに代入する」の意味になります。

\2には「jpg」「png」「gif」のいずれかしか代入されない。
  • サムネイル画像のURL:http://photo1avi.jp/photo/1/1/1-5677638-0-18252981.jpg
  • サムネイル画像のURL:http://photo1.avi.jp/photo/1/1/1-5677638-0-18252981.jpg
  • サムネイル画像のURL:http://photo1.avi.jp/photo/1/1/1-5677638-0-18252981.jpg
avi.jp/photo/1/1/1-5677638-0-18252981.jpg」や「jp/photo/1/1/1-5677638-0-18252981.jpg」を\2に代入することはできず、「jpg」なら代入することができる。従って\2に「jpg」が代入され、残りが\1に代入される、と。
「サムネイル画像のURLを『.』で分割し、前を\1に、後ろを\2に代入する」というだけでは分割の方法が3通りも「あり得てしまう」
1通りしか「あり得ない」ように、条件(\2には「jpg」「png」「gif」のいずれかしか入らない)を設定した訳です。
また、DLのためのProxomitron(2)で書いたんですが、Proxomitronの「Match」は大文字でも小文字でも関係がないです(Matchを「a cat〜」にすると「A cat〜」も書き換えられる、という話を書きました)。なので「(jpg|Jpg|JPG|png|Png|PNG|gif|Gif|GIF)\2」とかする必要はないです。
□C:変数に代入される文字数を限定する
「*」は「あらゆる文字列」なんですけど、これってつまり
  • どんな文字でもいい
  • どんな文字数でもいい
という意味で、このために上で触れたような誤動作というか意図しない変数代入が行われてしまう場合がある。「あらゆる文字(一文字)」を意味する「?」を使って問題を解決してみます。「拡張子」ってのは常に三文字なので、「(???)\N」とすることで「あらゆる三文字の文字列を\Nに代入」になります。

\2には三文字しか入らない。だから(□2の場合と同じような仕組みなので詳細説明は省略しますが)残りの部分が\1に代入される、と。

□BとCの比較なんですけど、例えば「jpgかもしれないしjpegかもしれない」と考えると□Bの方が良いです。「jpgかもしれないしzipかもしれないしmp3かもしれないし・・・」と考えると□Cの方が良いです。まぁ、つまりケースバイケース、と。Avi-Banの場合は「jpg」「png」「gif」しかアップできないぽいので、正直「どちらでも良い」と思います。
文字数だけでなく文字種や文字列性質など様々な要素によって「代入される文字列」を限定する方法は他にもありますが、とりあえず□Bと併せて二つ覚えておけばほとんどのケースに対応可能だと思います。この連載では扱いませんが、いつか□A〜Cのどの方法を使っても解決できない問題に直面したとき「正規表現」というものを覚えてみれば良いんじゃないでしょうか。
これ以外は特にDLのためのProxomitron(4)と変わらないので省略します。ただ、今回のような考え方(問題が起こった場合にそれをどのように解決していくか)を身に付ければ、別にAvi-Banに限らず「DLのため」に限らずProxomitronに限らず様々な場面で解決能力が高まると思うので、何とか試行錯誤して「動く」フィルタを書いてみて下さい。

DLのためのProxomitron(7) (>>この記事のみを表示)

前回書いたような「ワイルドカードの限界性」というのは、フィルタ作成時に設定している「バイト制限」にも関係しています。これまでは「特に気にせず文字数を数えて設定すればOK」と書いてきたんですが(そして結論的にはそれで良いのですが)、この意味について。

「バイト制限」とは、「そのフィルタを(ウェブページソース内の)最大何文字(何バイト)に対して適用させるか」という制限です。何故これが重要なのか、DLのためのProxomitron(6)で書いたような「誤動作(意図しない変数代入)」のメカニズムを理解した上でなら簡単に理解できると思います。
例えば
(前略)
<a href="http://www.tokix.net/putimg.cgi?file=111.jpg"><img src="http://www.tokix.net/thumb111.jpg"></a>
<a href="http://www.tokix.net/putimg.cgi?file=112.jpg"><img src="http://www.tokix.net/thumb112.jpg"></a>
(後略)
こういうウェブページを
(前略)
<a href="http://www.tokix.net/img/111.jpg"><img src="http://www.tokix.net/thumb111.jpg"></a>
<a href="http://www.tokix.net/img/112.jpg"><img src="http://www.tokix.net/thumb112.jpg"></a>
(後略)
というように書き換えたい場合
  • Match: <a href\="http://www.tokix.net/putimg.cgi\?file\=(*)\1">
といったフィルタを書く訳ですが、仮に文字数制限が無いとすると、この「(*)\1」に代入される文字列が「一通りしかあり得ないように限定」されていないことが分かるでしょうか?
  • <a href="http://www.tokix.net/putimg.cgi?file=111.jpg">
  • <a href="http://www.tokix.net/putimg.cgi?file=111.jpg"><img src="http://www.tokix.net/thumb111.jpg">
  • <a href="http://www.tokix.net/putimg.cgi?file=111.jpg"><img src="http://www.tokix.net/thumb111.jpg"></a>
    <a href="http://www.tokix.net/putimg.cgi?file=112.jpg
    ">
  • <a href="http://www.tokix.net/putimg.cgi?file=111.jpg"><img src="http://www.tokix.net/thumb111.jpg"></a>
    <a href="http://www.tokix.net/putimg.cgi?file=112.jpg"><img src="http://www.tokix.net/thumb112.jpg
    ">
文字数制限が一切なければ、このように様々な代入のパターンがあり得てしまう。
明記しませんでしたが、「*」の「あらゆる文字列」の「文字」は改行コードをも含みます。つまり、改行コードを含む文字列(複数行の文字列)でも変数に代入され得る。上の例で後ろ二つは「改行コードを含む文字列が\1に代入されている」。
これを「一通りしかあり得ないように限定」するために、「全体が○○文字(バイト)以下」という条件を設定していた訳です。

そして、逆の言い方をすれば、「全体が○○文字(バイト)以下」という条件でしか「誤動作」を防いでいない以上、このような方針では、いわゆる「(『特定サイト向け』ではない)汎用的なフィルタ」を書くことができない。例えば「mailtoブラクラを防ぐ」というフィルタにしても、「mailtoブラクラの文字数は?」という問いに答えることが不可能だからです。それはサイトによって違うし、上記のような「誤動作」を「バイト制限」でしか防いでいない以上、「バイト制限」を設定しなければそのフィルタは「誤動作の多いフィルタ」になってしまう。
文字数だけでなく文字種や文字列性質など様々な要素によって「代入される文字列」を限定する方法は他にもあります
その時に使うべき「限定条件」こそが「正規表現」「Proxomitron独自ルール」であり、この連載が扱っていないポイントです。
初心者が特定サイト用のフィルタを書くためなら「フィルタの書き方」ってのは結構簡単に説明できる(Proxomitronを既に使える人はここ見てないと思いますがもしいたら、ということで言い訳しておきますが、そのために「DLのための」なんですよ)
当サイトが「初心者向け」として解説できるのはとりあえずここまでです。ここから先は、ここまでの内容を踏まえた上でどうやって「動く」フィルタを書くか考えるか、正規表現やProxomitron独自ルールを学ぶかして下さい。
※参考
【なかま】's HP
初心者向けに分かりやすい正規表現講座。ただしProxomitron用ではないので注意。
マッチングルール
Proxomitron用の正規表現(マッチングルール)解説。ただし「正規表現って何」という人が見て分かりやすいかと言えば「?」なので注意。
正規表現メモ
網羅的な内容。ただし初心者が最初に見て分かりやすいかと言えば「?」なので注意。「Proxomitronを使う上で必要な文献か?」と言うのも「?」なので、この連載的には「Proxomitronをある程度使えるようになった上で、CGIプログラムか何かで同じように正規表現を使いたくなったときにどうぞ」という感じです。その目的においては非常にまとまったページなので。
個人的には、「まず『正規表現』の基本的な仕組みを理解する、次にProxomitron用正規表現(マッチングルール)を覚える(その上でCGIプログラムとかに応用するかは人それぞれ)」という順序を推奨します。
なお、「特定サイト(別に必ずしも画像掲示板でなくても良いです)用にフィルタを書いてみたのだが動かない」という場合
  1. メールで対象サイトのURLと自分が書いたフィルタ、どのような問題が起きたかを送る(コメントだとタグ無効化とか色々でフィルタを書くのが大変だと思うので)
  2. 送った旨をこの記事になりコメントで残す(正直webmasterアドレスはあんまチェックしてないので一応お願いします)
を行って貰えればこちらで方針を作り記事にさせて頂きます(ただ「これこの連載の内容だけでフィルタ書けるじゃん」とか「あー正規表現使わないと無理ぽいな」という場合はそういう返信しか出来ません)ので、それで宜しければ連絡お待ちしています。
dammy

Credit

SeeAlso

OtherSubCategory

Footprint

Navigation