#!/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__