#!/usr/bin/perl -w
#
#HTMLを取得するための関数群
use Socket; # Socketモジュールを使う
##################################################
#初期設定
sub ginit {
$user_agent = 'Mozilla/4.6 [ja] (Win95; I)'; #適当
$method = 'GET'; #GETのみ。POST等は未対応
$timeout_sec = 30; #タイムアウト秒
}
##################################################
#接続処理。単に指定したホストの指定したポートに接続するだけ
sub make_connection {
my($sock_addr,$host,$port);
($host,$port) = @_;
#ホスト名をIPアドレスの構造体に変換
$iaddr = inet_aton($host) || return -1;
#portとIPアドレスを構造体に変換
$sock_addr = sockaddr_in($port,$iaddr);
#ソケット生成
socket(SOCKET,PF_INET,SOCK_STREAM,0) || return -1;
#指定のホストの指定のportに接続
connect(SOCKET,$sock_addr) || return -1;
#ファイルハンドルSOCKETをバッファリングしない
select(SOCKET); $|=1; select(STDOUT);
#シグナル処理の定義
#$SIG{'ALRM'} = \&timeout_error;
#alarm( $timeout_sec );
return 0;
}#make_connection END
##################################################
#HTTPリクエスト送信&HTML受信
sub get_html {
my($thost,$tpath,$proxy,$referer,$result);
$result = 0;
@htmllines = ();
($thost,$tpath,$referer,$proxy) = @_;
if ($proxy ne ''){
print SOCKET "$method http://$thost/$tpath HTTP/1.0\r\n"; #Proxyサーバに接続
} else {
print SOCKET "$method /$tpath HTTP/1.0\r\n"; #直接WWWサーバに接続
}
#リクエスト送信。内容は適当
print SOCKET "Referer: $referer\r\n";
print SOCKET "User-Agent: $user_agent\r\n";
print SOCKET "Connection: close\r\n";
print SOCKET "Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, image/png, */*\r\n";
print SOCKET "Accept-Language: en, ja\r\n";
print SOCKET "Accept-Encoding: gzip\r\n";
print SOCKET "Accept-Charset: iso-8859-1,*,utf-8\r\n";
print SOCKET "Host: $thost\r\n";
print SOCKET "Range: bytes=0-\r\n";
print SOCKET "\r\n";
#サーバからのデータを受信
while (){
if($_ =~ /HTTP\/[\d\.]+\s+(\d+)\s+/){ #サーバーの応答コードを取得
$result = $1;
}
last if($_ eq "\r\n");
}
#HTMLファイルの内容を取得する
@htmllines = ;
&write_lines("./tmp.htm",@htmllines);
close(SOCKET);
return (int($result/100) != 2); #200台の応答コードなら成功とする
}#get_html END
##################################################
#make_connection と get_html をまとめてやる。成功すれば 0
sub get_html_direct {
my($thost,$tpath,$proxy,$proxyport,$referer,$result);
($thost,$tpath,$proxy,$proxyport) = @_;
if($proxy ne ''){
return -1 if(make_connection($proxy,$proxyport));
}
else {
return -1 if(make_connection($thost,80));
}
$referer = "http://$thost/$tpath"; #これは適当
if(get_html($thost,$tpath,$referer,$proxy)){
return -1;
}
return 0;
}#get_html_direct END
##################################################
#ファイルへの出力。引数はファイル名と書く内容
sub write_lines {
my($file,@lines);
($file,@lines) = @_;
open(DB,">$file") || &err("ファイルに書き込めません");
print DB @lines;
close(DB);
}#write_lines END
##################################################
#配列をファイルに出力。引数はファイル名と書く内容
sub write_array {
my($file,@lines,$ln);
($file,@lines) = @_;
open(DB,">$file") || &err("ファイルに書き込めません");
foreach $ln (@lines){
print DB "$ln\n";
}
close(DB);
}#write_array END
##################################################
#配列をファイルから読み込む。引数はファイル名
sub read_array {
my($file,@array);
($file) = @_;
open(DB, $file) || &err("Can't open $file.");
@array = ;
close(DB);
chomp(@array);
return @array;
}#write_lines END
##################################################
1; # RETURN TRUE
__END__