w3m

Unnamed repository; edit this file to name it for gitweb.
git clone https://logand.com/git/w3m.git/
Log | Files | Refs | README

2ch.cgi (4694B)


      1 #!/usr/bin/perl
      2 
      3 $WGET = "wget";
      4 $SCRIPT_NAME = $ENV{'SCRIPT_NAME'} || $0;
      5 $CGI = "file://$SCRIPT_NAME";
      6 $_ = $QUERY_STRING = $ENV{"QUERY_STRING"};
      7 $UserAgent = "Monazilla/1.00 (w3m/2ch.cgi)";
      8 
      9 if (/subback.html$/) {
     10 	&subback();
     11 	exit;
     12 }
     13 
     14 s@/(\d+)(/([^/]*))?$@/$1@ || exit;
     15 my $datnum = $1;
     16 $label = $3;
     17 $cgi = "$CGI?$_";
     18 
     19 s@^http://([^/]+)/test/read.cgi/([^/]+)/@$1/$2/dat/@ || exit;
     20 $subback = "$CGI?http://$1/$2/subback.html";
     21 $bbs = $2;
     22 if ($ENV{REQUEST_METHOD} eq "POST") {
     23 	&post();
     24 	exit;
     25 }
     26 
     27 $_ .= ".dat";
     28 $dat = "http://$_";
     29 $tmp = $ENV{"HOME"} . "/.w3m2ch/$_";
     30 $dat =~ s/([^\w\/.\:\-])/\\$1/g;
     31 $tmp =~ s/([^\w\/.\:\-])/\\$1/g;
     32 ($dir = $tmp) =~ s@/[^/]+$@@;
     33 $cmd = "mkdir -p $dir; $WGET -c -U \"$UserAgent\" -O $tmp $dat >/dev/null 2>&1";
     34 system $cmd;
     35 $lines = (split(" ", `wc $tmp`))[0];
     36 $lines || exit;
     37 
     38 @ARGV = ($tmp);
     39 if ($label =~ /^l(\d+)/) {
     40 	$start = $lines - $1 + 1;
     41 	if ($start < 1) {
     42 		$start = 1;
     43 	}
     44 	$end = $lines;
     45 } elsif ($label =~ /^(\d+)-(\d+)/) {
     46 	$start = $1;
     47 	$end = $2;
     48 } elsif ($label =~ /^(\d+)-/) {
     49 	$start = $1;
     50 	$end = $start + 100 - 1;
     51 } elsif ($label =~ /^(\d+)/) {
     52 	$start = $1;
     53 	$end = $1;
     54 } else {
     55 	$start = 1;
     56 	$end = $lines;
     57 }
     58 $head = "<a href=\"$subback\">■掲示板に戻る■</a>\n";
     59 $head .= "<a href=\"$cgi/\">全部</a>\n";
     60 for (0 .. ($lines - 1) / 100) {
     61 	$n = $_ * 100 + 1;
     62 	$head .= "<a href=\"$cgi/$n-\">$n-</a>\n";
     63 }
     64 $head .= "<a href=\"$cgi/l50\">最新50</a>\n";
     65 print <<EOF;
     66 Content-Type: text/html
     67 
     68 EOF
     69 $i = 1;
     70 while (<>) {
     71 	s/\r?\n$//;
     72 	($name, $mail, $date, $_, $title) = split(/\<\>/);
     73 	if ($i == 1) {
     74 		if (!$title) {
     75 			print <<EOF;
     76 このスレッドは過去ログ倉庫に格納されています。
     77 <p>
     78 <a href="$QUERY_STRING">$QUERY_STRING</a>
     79 EOF
     80 			unlink($tmp);
     81 			exit
     82 		}
     83 		print <<EOF;
     84 <title>$title</title>
     85 $head
     86 <p>$title</p>
     87 <dl>
     88 EOF
     89 	}
     90 	if ($mail) {
     91 		$name = "<a href=\"mailto:$mail\">$name</a>";
     92 	}
     93 	s@http://ime.nu/@http://@g;
     94 	s@(h?ttp:)([#-~]+)@"<a href=\"" . &link("http:$2") .  "\">$1$2</a>"@ge;
     95 	s@(ftp:[#-~]+)@<a href="$1">$1</a>@g;
     96 	s@<a href="../test/read.cgi/\w+/\d+/@<a href="$cgi/@g;
     97 	if ($i == 1 || ($i >= $start && $i <= $end)) {
     98 		print <<EOF;
     99 <dt><a name="$i">$i</a> :$name:$date
    100 <dd>
    101 $_
    102 <p>
    103 EOF
    104 	}
    105 	$i++;
    106 }
    107 print <<EOF;
    108 </dl>
    109 <hr>
    110 <form method=POST action="$cgi"><input type=submit value="書き込む" name=submit> 名前: <input name=FROM size=19> E-mail<font size=1> (省略可) </font>: <input name=mail size=19><br><textarea rows=5 cols=70 wrap=off name=MESSAGE></textarea><input type=hidden name=bbs value=$bbs><input type=hidden name=key value=$datnum><input type=hidden name=time value=@{[time]}></form></body></html>
    111 EOF
    112 
    113 sub link {
    114 	local($_) = @_;
    115 	if (m@/test/read.cgi/@) {
    116 		return "$CGI?$_";
    117 	}
    118 	return $_;
    119 }
    120 
    121 sub subback {
    122 	$dat = $_;
    123 	s@http://@@ || exit;
    124 	$tmp = $ENV{"HOME"} . "/.w3m2ch/$_";
    125 	$dat =~ s/([^\w\/.\:\-])/\\$1/g;
    126 	$tmp =~ s/([^\w\/.\:\-])/\\$1/g;
    127 	($dir = $tmp) =~ s@/[^/]+$@@;
    128 	$cmd = "mkdir -p $dir; $WGET -O $tmp $dat >/dev/null 2>&1";
    129 	system $cmd;
    130 print <<EOF;
    131 Content-Type: text/html
    132 
    133 EOF
    134 	@ARGV = ($tmp);
    135 	while (<>) {
    136 		if (/<base href="([^"]+)"/) {
    137 			$base = $1;
    138 		} elsif ($base) {
    139 			s@^<a href="@<a href="$CGI?$base@;
    140 		}
    141 		print;
    142 	}
    143 	unlink($tmp);
    144 }
    145 
    146 sub post {
    147 	my $debug = 0;
    148 
    149 	$| = 1;
    150 	use IO::Socket;
    151 	my @POST = <>;
    152 	$QUERY_STRING =~ m@^http://([^/]+)@;
    153 	my $host = $1;
    154 	my $sock = IO::Socket::INET->new("$host:80") or die;
    155 	# retrieve posting cookie; this may not work
    156 	print "Content-Type: text/html\n\n";
    157 	print $sock
    158 	    "HEAD /test/bbs.cgi HTTP/1.1\n",
    159 	    "Host: $host\n",
    160 	    "Connection: keep-alive\n",
    161 	    "\n";
    162 	my $posting_cookie = undef;
    163 	while (<$sock>) {
    164 		print if ($debug);
    165 		s/[\n\r]+$//;
    166 		last if (/^$/);
    167 		if (/^set-cookie:.*(PON=[^;]+)/i) {
    168 			$posting_cookie = $1;
    169 		}
    170 	}
    171 	#$sock = IO::Socket::INET->new("$host:80") or die;
    172 	my $submit =
    173 	    "POST /test/bbs.cgi HTTP/1.1\n" .
    174 	    "Host: $host\n" .
    175 	    "Accept-Language: ja\n" .
    176 	    "User-Agent: $UserAgent\n" .
    177 	    "Referer: $QUERY_STRING\n" .
    178 	    "Cookie: $posting_cookie; NAME=nobody; MAIL=sage\n" .
    179 	    "Content-Length: " . length(join("", @POST)) . "\n" .
    180 	    "\n@POST";
    181 	print $sock $submit or die;
    182 	print "\n-- POSTed contents --\n${submit}\n-- POSTed contents --\n"
    183 	    if ($debug);
    184 	my $chunked = 0;
    185 	while (<$sock>) {
    186 		s/[\n\r]*$//;
    187 		last if (/^$/);
    188 		$chunked = 1 if (/^transfer-encoding:\s*chunked/i);
    189 	}
    190 	my $post_response = "";
    191 	while (<$sock>) {
    192 		if ($chunked) {
    193 			s/[ \r\n]*$//;
    194 			my $len = hex($_);
    195 			$len > 0 or last;
    196 			read($sock, $_, $len);
    197 			<$sock>;	#skip empty line at the end of chunk.
    198 		}
    199 		$post_response .= $_;
    200 	}
    201 	$post_response =~ s/<META content=(\d+);URL=(\S+) http-equiv=refresh>/<META content=$1;URL=$cgi http-equiv=refresh>/im;
    202 	print $post_response;
    203 	exit;
    204 }