夢幻交錯世界。の2007年11月16日の記事「ノイエ・2chでの画像一括ダウンロード…方法」で、えらい大昔に書いたime.nu消しブックマークレットが紹介されていました。ime.nu消しブックマークレットってのは簡単に言えば、ウェブブラウザで開いた2chのスレッドでリンクがime.nuなんかに飛ばされてしまうのを、直接開けるように書き換えるブックマークレットですな。あー……今書くと正規表現使って複数まとめるよなーと思ってちと書き直してみる。replaceの第一引数を正規表現にしてしまうのがミソですな。これで、1スクリプトでime.nu, ime.st, pinktower.comに対応。
javascript: var L=document.links; for (i=0;i<L.length;i++) { L[i].setAttribute('href',L[i].href.replace(/(ime\.(nu|st)|pinktower\.com)\//,'')); }
スクリプトの右下のリンクを右クリックでブックマークに登録するか、ドラッグでツールバーに置いてやってください。なお、2006/6/7の日記に同様のスクリプトのGreasemonkey版があったりもします。
……ちょっと過去のスクリプトを見直してみたのだけど、Bookmarkletその4が動かないな? つか、最後の行がどう見てもおかしいんだが。ちゃちゃっと直したいのだけど、JavaScriptはいまいちわかってないからなー。
少し調べてみると、Bookmarklet - ブックマークレットを作成する際のポイントというページがあった。値を返さない、無名ファンクションのインスタンスを生成する、って辺りに気をつけないといけないのか。でも、逆に値を返してページ書き換えちゃうのもありだな。
今日は仕事で、とあるIDを与えて開かれるURLから特定のリンクを抽出して、そのリンク先から情報を抽出するperlスクリプトを作ってました。そんなわけで、そいつを応用して2chのスレから画像ファイルっぽいものをDLするperlスクリプトを作ってミタ。まあ、最近はファイルのDLはもっぱらcurlを使うし、Mac OS Xならコマンド叩いてみるのもまたヨシってことで。
#!/usr/bin/perl # 2chのスレにある画像ファイルっぽいURLからファイルをDLするスクリプト。 # スクリプトは適当なディレクトリを作ってその中で実行すること。 # 実行したディレクトリに画像ファイルがDLされます。 # 引数は2chのスレのURL, レス番号を指定する場合は○○番以降(/100-とか)の形で。 $url = $ARGV[0];
# datファイルのURLに変換 $url =~ s/test\/read\.cgi\/([^0-9][^\/]+)\/([0-9]+)/\1\/dat\/$2.dat/;
# レス番号指定がある場合、番号を取得 if ($url =~ s/\/([0-9]+)-$//) { $count = $1; }
# datファイルを取得 system("curl -o tempfile '$url'");
# datファイルから画像のURLっぽいものを抽出 open FILE, './tempfile'; $count = $count - 1 if $count; while (<FILE>) { # レス番号指定がある場合、その番号まで空回りさせる。 if ($count) { $count = $count - 1; next; } ($dummy1, $dummy2, $dummy3, $res) = split /<>/, $_; while ($res =~ /:\/\/.*?\.(jpe*g|png|bmp)/i) { $res =~ /(:\/\/.*?\.(jpe*g|png|bmp))/i; $url = $1; push(@url, $url); $res =~ s/:\/\/.*?\.(jpe*g|png|bmp)//i; } } close FILE;
# 抽出した画像ファイルをDLする。 @url = sort @url; $last_url = ''; foreach $url (@url) { # 同じURLがあった場合はスルー。 next if $url eq $last_url; $url2 = 'http' . $url; $url2 =~ /([^\/]+\.(jpe*g|png|bmp))/i; $file_name = $1;
# 同じファイル名があった場合、拡張子の前に_を付加して別名にする。 while (-e $file_name) { $file_name =~ s/\.(jpe*g|png|bmp)/_.\1/i; } system("curl -o $file_name '$url2'"); $last_url = $url; }
以下、ざっと作業手順。
あまり動作チェックしてないから、ひょっとすると妙な動作をすることがあるかもしれません。まあ、実行ディレクトリ外に何かすることはないので、スクリプトを実行するディレクトリに気を付ければダイジョーブ。404でもかまわずファイルが保存されてしまうのはご愛敬w use strict;付いてないとかいろいろあるけど気にスンナ。