Skip to content

Instantly share code, notes, and snippets.

@ceekz
Last active Oct 7, 2015
Embed
What would you like to do?
Wget Wrapper for a Web Page Cache
#!/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