Last active
October 7, 2015 03:37
-
-
Save ceekz/3099047 to your computer and use it in GitHub Desktop.
Wget Wrapper for a Web Page Cache
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/usr/bin/perl | |
# Wget のラッパー | |
# 任意の URL のページを画像込みで保存する | |
# $ wget_wrapper.pl Directory URL | |
# (Directory は URL ごとにユニークなものを指定する) | |
# | |
# .htaccess 設定例 | |
# AddType text/html .htmlwget | |
# DirectoryIndex index.htmlwget index.html index.htm | |
use strict; | |
use warnings; | |
my ($dir, $url) = @ARGV; | |
my @IP = qw( | |
203.0.113.1 | |
203.0.113.2 | |
203.0.113.3 | |
203.0.113.4 | |
203.0.113.5 | |
); | |
my $PROXY_HOST = '172.16.100.7'; # Proxy サーバのホスト名または IP アドレス | |
my @PROXY_PORT = (9170 ... 9177); # Proxy サーバの待ち受けポートのリスト(接続ポートごとに出口 IP アドレスが異なる) | |
my $cmd_timeout = 3600; # コマンドのタイムアウト(秒, 0 = タイムアウト無し), wget によるストリームファイル等の無限受信防止 | |
my @cmd = ( | |
'wget', | |
'-o/dev/stdout', # ログを FILE に出力する | |
'-t 5', # リトライ回数の上限を指定 (0 は無制限) | |
'--retry-connrefused', # 接続を拒否されてもリトライする | |
'--waitretry=30', # リトライ毎に 1〜SECONDS 秒待つ | |
# '--bind-address=' . $IP[rand(@IP)], # ローカルアドレスとして ADDRESS (ホスト名か IP) を使う | |
# '-e http_proxy=' . $PROXY_HOST . ':' . $PROXY_PORT[rand(@PROXY_PORT)], # HTTP Proxy | |
# '-e https_proxy=' . $PROXY_HOST . ':' . $PROXY_PORT[rand(@PROXY_PORT)], # HTTPS Proxy | |
'--restrict-file-names=nocontrol', # OS が許しているファイル名に制限する | |
'-nd', # ディレクトリを作らない | |
'-P' . $dir, # ファイルを PREFIX/ 以下に保存する | |
'-E', # HTML 文書は .html 拡張子で保存する | |
'-U Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.64 Safari/537.11', # User-Agent として Wget/VERSION ではなく AGENT を使う | |
'--no-check-certificate', # サーバ証明書を検証しない | |
'-k', # HTML 中のリンクをローカルを指すように変更する | |
'-K', # リンク変換前のファイルを .orig として保存する | |
'-p', # HTML を表示するのに必要な全ての画像等も取得する | |
'-H', # 再帰中に別のホストもダウンロード対象にする | |
'-erobots=off', # robots.txt を無視 | |
$url | |
); | |
my $cmd_out = cmd_system($cmd_timeout, @cmd); | |
my $file; | |
if ($cmd_out =~ m!`(.+)'!) { | |
$file = $1; | |
} | |
if ($file) { | |
local $ENV{'TZ'} = 'JST-9'; | |
my ($sec, $min, $hour, $day, $mon, $year) = localtime(time); | |
my $created = sprintf("%04d-%02d-%02d %02d:%02d:%02d (JST)", $year + 1900, $mon + 1, $day, $hour, $min, $sec); | |
my $html = << "__HTML__"; | |
<!-- $file --> | |
<div style="background:#eee;border:1px solid #999;color:#000;font:20px arial,sans-serif;font-weight:normal;margin:10px;padding:10px;text-align:left">This is a page cached by XXX. Created Date: $created<br />URL: <a href="$url">$url</a></div> | |
<div style="position:relative"> | |
__HTML__ | |
open(IN, $file); | |
while (<IN>) { | |
$html .= $_; | |
} | |
close(IN); | |
open(OUT, "> $dir/index.htmlwget"); | |
binmode OUT; | |
print OUT $html; | |
close(IN); | |
} | |
sub cmd_system { | |
my ($cmd_alarm, @cmd) = @_; | |
my $cmd_out; | |
my $pid; | |
eval { | |
local $SIG{'ALRM'} = sub { die 'timeout' }; | |
alarm $cmd_alarm if ($cmd_alarm > 0); | |
$pid = open (CMD, "-|", @cmd) or die "can't fork: $!"; | |
while (<CMD>) { | |
$cmd_out .= $_; | |
} | |
close (CMD); | |
alarm 0 if ($cmd_alarm > 0); | |
}; | |
if ($@) { | |
if ($@ =~ /^timeout/ && defined $pid) { | |
kill 'SIGKILL', $pid; | |
} else { | |
warn $@; | |
} | |
} | |
return $cmd_out; | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment