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

i-bbsの場合は比較的素直なので「見れば分かる」かもしれませんが、結構ひねくれた対応関係になる場合もあるので、その場合はいくつか画像を開いて自分が頭に描いた対応関係が本当に正しいかどうか確認しておきましょう。

何でこんなことをするのか、という理由はこの連載の最後DLのためのProxomitron(7)で解説しますんで今はとりあえず気にせずに。
「*」だけでなく、このように「自身」を表さず「特殊な意味」を持ってしまう文字が何種類かあるので、そうした文字の前には「\」を付けます(「\」は英語フォントだとバックスラッシュになりますが同じ意味)。「\*」にすれば「*」自身を表す。こういうのを「エスケープ」というんで、まぁ、プログラマー気分に浸るために「エスケープ」という言い方を覚えておいても損はないかな、と。

この段階で「テスト中〜」ウインドウの「テスト」を押した時、下部に「[合致なし]」と表示されてしまった場合はエスケープが出来ていないので見直し。恥ずかしながら、僕もたまに「=」とかの前に「\」を付け忘れて、フィルタを書き終えてから「何で動かないんだ」と悩むことがあるので、この段階で一度テストをすることを強くオススメします。
「(*)\N」は「その部分を\Nという変数に代入する」の意味です。つまり、今の作業によって

また、何故この行程が必要なのか(□4の後□6を行っては何故まずいのか)はDLのためのProxomitron(6)まで読めば分かると思いますんで今はとりあえず気にせずに(ある程度慣れてくれば□5は不要ですが、慣れるまでに□5を飛ばすと「意図しない変数代入」が行われていた時、そのことに気付かず、上手く動かない原因の切り分けが出来なくなる)。

これが成功すればあと一息です。

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

何でこんなことをするのか、という理由はこの連載の最後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-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">
- Match:<a href\="/imageDisp.jsp\?id=(*)\1\&file\=(*)\2o.(*)\3" target\="_blank">
「(*)\N」は「その部分を\Nという変数に代入する」の意味です。つまり、今の作業によって
- 「\1」に「test」など掲示板ID
- 「\2」に「1112975244921」などファイル名の連番
- 「\3」に「jpg」などファイルの拡張子

- Replace:1:\1 2:\2 3:\3
また、何故この行程が必要なのか(□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:<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に限らず様々なサイトに関して「そのサイト用」のフィルタを書くことが出来るでしょう。次回からはターゲットを変えて、一歩レベルを上げたフィルタの書き方を解説します。

TrackBack
この記事へのトラックバック