#!/usr/bin/perl # #navi.cgi #アンケートナビゲーター require './jcodeLE.pl'; require './prei.cgi'; require './getres.cgi'; $| = 1; &winit;&noaxschk; &ginit; &init;&decode;&jikan; if (($make ne 'on') && ($delete ne 'on')){ $page = 0 if ($page < 0); $page2 = $page*$lmax; &html; }else{ $page = 0;$page2 = 0; &html; } exit; ################################################## sub init{ $limax = 50; #1ページあたりのタイトル表示数 $getmax = 10; #取得する箱の数 $thiscgi = 'navi.cgi'; $title = 'アンケートナビゲーター'; $display = 4; #箱の最大表示数 @targetsites = ('バトルアンケート','バトルアンケート2000', 'アンケートボード','何アン','何アン2', '生首自動アンケート飛来','亜流:総合','いかがアンケート'); $targeturl{'バトルアンケート'} = 'http://www.mediawars.ne.jp/~tm67s/cgi-bin/an/list.cgi'; $targeturl{'バトルアンケート2000'} = 'http://www.mediawars.ne.jp/~tm67s/cgi-bin/new/list.cgi'; $targeturl{'ねこアン'} = 'http://cgi.linkclub.or.jp/~babara/vote/list.cgi'; $targeturl{'こねこアン'} = 'http://cgi.linkclub.or.jp/~babara/koneko/list.cgi'; $targeturl{'アンケートボード'} = 'http://cgi.members.interq.or.jp/www1/q-mail/ank/list.cgi'; $targeturl{'何アン'} = 'http://www4.vc-net.ne.jp/~internet/cgi-bin/nanian/list.cgi'; $targeturl{'何アン2'} = 'http://www4.vc-net.ne.jp/~internet/cgi-bin/nanian2/list.cgi'; $targeturl{'アンケート野郎'} = 'http://person1.rocketbeach.com/~bokura/list.cgi'; $targeturl{'生首自動アンケート飛来'} = 'http://namakubi.virtualave.net/cgi-bin/enquete/list.cgi'; $targeturl{'亜流:総合'} = 'http://www.jks.is.tsukuba.ac.jp/~akaho/board/list.cgi'; $targeturl{'いかがアンケート'} = 'http://www.jks.is.tsukuba.ac.jp/~akaho/board/ikaga/list.cgi'; #現在の時刻を覚えておく ($now_sec,$now_min,$now_hour,$now_day,$now_month,$now_year,$_,$_,$_) = localtime(time); $now_month++; #月毎の日数データ $monthdays[1] = 31; $monthdays[2] = 28; #閏年はコードで対応 $monthdays[3] = 31; $monthdays[4] = 30; $monthdays[5] = 31; $monthdays[6] = 30; $monthdays[7] = 31; $monthdays[8] = 31; $monthdays[9] = 30; $monthdays[10] = 31; $monthdays[11] = 30; $monthdays[12] = 31; }#init END ################################################## sub html { my($bbslink); $bbslink = "[$bbsname]" if($bbscgi); print "Content-type: text/html\n\n"; print <<"_HTML_"; $title $metacode $bodys $title

[インデックス] $bbslink 参照回数(1/19〜):$acou
_HTML_ &listing;#普通のリスト作成 print <<"_HTML_";
$original _HTML_ }#html END ################################################## sub listing{ my($site,$url,$boxes,$boxmes,$boxdate,$blue,$bl); print <<"_HTML_"; _HTML_ print "
\n"; foreach $site (@targetsites) { $url = $targeturl{$site}; next if($url eq ''); ($boxes,$boxdate,$blue) = &get_boxlist($url); print "
\n"; print "\n"; $boxmes = ''; if($boxes > 0){ if($boxes < $getmax){ $boxmes = "$boxes箱"; }else{ $boxmes = "$boxes箱以上"; } } if(($boxmes ne '') && $blue){ print "$site $boxmes $boxdate
\n"; }else{ print "$site $boxmes $boxdate
\n"; } print "
\n"; $bl = @boxlines-1; if($bl >= 0){ print "
\n"; $bl = $display-1 if($bl > $display-1); foreach $i (0 .. $bl){ print "$boxlines[$i]"; } print "
\n"; } } print "
\n"; }#listing END ################################################## sub decode { my($brnum,$cou_file); if ($ENV{'REQUEST_METHOD'} eq "POST"){ read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'}); }else{ $buffer = $ENV{'QUERY_STRING'}; } &decodearg($buffer); $page = $FORM{'page'};$page = int($page); $make = $FORM{'make'}; $root = $FORM{'root'};$delete = $FORM{'delete'}; $hotlist = $FORM{'h'};$hotlist = '0' if($hotlist eq ''); $rev = $FORM{'r'};$rev = 'on' if($rev eq ''); $lmax = $FORM{'lm'};$lmax = $limax if($lmax < 1);$lmax = int($lmax); $eraseword = $FORM{'eraseword'}; $cou_file = "./$coudir/navicnt.dat"; #カウンタ制御 if(!$detail){ if(open(DB,"+<$cou_file")){ $acou = 1 + ; }else{ open(DB,"+>>$cou_file"); #無ければ新しく作る $acou = 1; } $acou = 0 if($acou > 999999); seek(DB,0,0); print DB "$acou\n"; close(DB); } }#decode END ################################################## #箱リストを取得する #引数はURL(例えば "http://www.jks.is.tsukuba.ac.jp/~akaho/board/list.cgi") sub get_boxlist { my($host,$path,$line,$count,$lns,$boxdate,$blue,$url2,$i,$j,$bl,$room,$logcgi,$ln); ($url) = @_; #URLからホスト名とパスを取り出す if($url =~ /http:\/\/([^\/]+)\/(.+)/){ $host = $1; $path = $2; }else{ return; } $url2 = $1 if($url =~ /(http:\/\/.+)\/[^\/]+/); $path = "$path?lm=$getmax&h=0&r=off&s=new"; #新規発言順を指定 @boxlines = (); #接続に失敗した時のため初期化 if(make_connection($host,80)){ $boxdate = "Connect failed."; return (0,$boxdate,0); } if(get_html($host,$path,$url,'')){ $boxdate = "Not found or Forbidden."; return (0,$boxdate,0); } $lns = @htmllines-1; $boxes = 0; foreach $count (0 .. $lns){ #箱へのリンクがある行を取り出す $line = $htmllines[$count]; if($line =~ /
.*/){ $count += 2; push(@boxlines,$htmllines[$count]); $boxes++; } } if($boxes > 0){ $line = $boxlines[0]; #最新の箱(一番上)の更新時刻を取得 # $blue = ($line =~ /FONT\sCOLOR="blue"/g); if($line =~ //){ $line =~ /(\d+\/\d+\s\d+時\d+分)/; $boxdate = $1; }else{ $boxdate = "Can't find date."; } }else{ $boxdate = "Room not found."; } $blue = &dateisblue($boxdate); $bl = @boxlines-1; foreach $i (0 .. $bl){ #箱のリンクを絶対URLに書き換える $boxlines[$i] =~ //; $logcgi = $1; $room = $2; if($room ne ''){ $boxlines[$i] =~ s/\"\.\/(\w+.cgi\?room=\d+)\"/\"$url2\/$logcgi.cgi\?room=$room\"/i; $boxlines[$i] =~ s/.*<\/FONT>/<\/A>/i; $_ = $boxlines[$i]; $j = s/の数を数える $_ = $boxlines[$i]; $j -= s/<\/FONT//ig; #の数を数えて引く $boxlines[$i] =~ s/[\r\n]//g; for(; $j>0; $j--){ #が足りない分足す $boxlines[$i] = "$boxlines[$i]"; } $boxlines[$i] = "$boxlines[$i]\n"; } } return ($boxes,$boxdate,$blue); }#get_otherlist END ################################################## #更新日時が一日以内か?(一年以上前だと判断できない) sub dateisblue { my($datestr,$month,$mday,$hour,$min,$d,@monthdays); ($datestr) = @_; if($datestr =~ /(\d+)\/(\d+)\s(\d+)時(\d+)分/){ $month = int($1); $mday = int($2); $hour = int($3); $min = int($4); }else{ return 0; } #同じ月の場合 if($month==$now_month){ return 1 if($mday == $now_day); if($now_day - $mday == 1){ return 1 if($hour>$now_hour); return 1 if($hour==$now_hour && $min>$now_min); } } if($now_day == 1){ #月の変わり目にまたがる場合 if(($now_month-$month == 1) || ($month==12 && $nowmonth==1)){ if($monthdays[$month] <= $mday){ #不等号なのは閏年のため return 1 if($hour>=$now_hour || $min>$now_min); } } } return 0; }#dateisblue END ################################################## __END__