#!/usr/local/bin/perl ### this script is not 100% effective because most browsers will cache the picture.gif used to count. ### sending an expires header might solve it, but it does give a fairly accurate count of unique visitors ### since it only counts each person once then the .gif is cached &ReadParse; &GetName("\t","/home/kevin/public_html/kstats"); &ServeImage("/home/kevin/public_html/dot.gif"); sub GetName { my($delimiter,$logfile) = @_; $logfile ||= "./logfile.txt"; $delimiter ||= "\t"; my $page = $in{'page'} || $ENV{'REQUEST_URI'}; my $ip = $ENV{'REMOTE_ADDR'}; my $ref = $ENV{'HTTP_REFERER'}; my $agent = $ENV{'HTTP_USER_AGENT'}; my $user = $ENV{'HTTP_FROM'}; open(WRITINGNAME,">>$logfile"); flock(WRITINGNAME, 2); my($date) = scalar(localtime(time)); my $headers = join ("$delimiter", ("DATE","PAGE VIEWED","REFERRER","IP ADDRESS","BROWSER/AGENT") ); my $fields = join ("$delimiter", ($date,$page,$ref,$ip,$agent) ); print WRITINGNAME "$headers\n" if (-s $logfile < 4); print WRITINGNAME "$fields\n"; flock(WRITINGNAME, 8); close WRITINGNAME; } ########################################### ## ServeImage - sends image out to page ########################################### sub ServeImage{ my ($image_name) = @_; $image_name ||= "pixel.gif"; print "Content-Type:image/gif\n\n"; open(IMAGE,"$image_name"); $\ = 0; print (); close IMAGE; } ########################################### ## ReadCookie - reads cookie info ########################################### sub ReadCookie { my($cdelimit) = @_; $cdelimit ||= "::"; @read_cookie = split(/;/,$ENV{HTTP_COOKIE}); @cookie = split(/$cdelimit/,$read_cookie[0]); foreach $cookie (@cookie){ ($key, $val)=split(/=/,$cookie); $key =~ s/ //g; $cookie{$key}=$val; } } sub ReadParse { local(*in) = @_ if @_; local ($i, $loc, $key, $val); # Read in text if ($ENV{'REQUEST_METHOD'} eq "GET") { $in = $ENV{'QUERY_STRING'}; } elsif ($ENV{'REQUEST_METHOD'} eq "POST") { read(STDIN, $in, $ENV{'CONTENT_LENGTH'}); } @in = split(/&/, $in); foreach $i (0..$#in) { # Convert plus's to spaces $in[$i] =~ s/\+/ /g; # Split into key and value (split on the first "=") ($key, $val) = split(/=/, $in[$i],2); # Convert %XX from hex numbers to alphanumeric $key =~ s/%(..)/pack("c", hex($1))/ge; $val =~ s/%(..)/pack("c", hex($1))/ge; # Associate key and value $in{$key} .= "\0" if (defined ($in{$key})); $in{$key} .= $val; } return 1; }