| |||
| Учебное пособие по CGI-программированию от Леши |
Примеры приложений:
![]()
#!/usr/bin/perl
#get_ip.cgi
$gif="../gifs/player.gif";
$data="ipdata.txt";
print "Content-Type: image/gif\n\n";
open(G,$gif);
print <G>;
close(G);
open(D,">>$data");
print D scalar localtime,' '.$ENV{'REMOTE_ADDR'}."\n";
close(D);



#!/usr/bin/perl
#guestbook.cgi
$myemail="paaa\@uic.nnov.ru";
$myname="lesha";
$mail="mail";
($sd,$sn)=($ENV{'SCRIPT_FILENAME'}=~/(.*)\/([^\/]*)/);
$datafile=$sd."\/guestbook.dat";
@Mailgifs=qw(../gifs/mood0.gif ../gifs/mood1.gif ../gifs/mood2.gif);
$Facetxt{$Mailgifs[0]}= ":)";
$Facetxt{$Mailgifs[1]}= ":|";
$Facetxt{$Mailgifs[2]}= ":(";
sub urldecode{
local($val)=@_;
$val=~s/\+/ /g;
$val=~s/%([0-9a-hA-H]{2})/pack('C',hex($1))/eg;
return $val;
}
sub strhtm{
local($val)=@_;
$val=~s/&/&/g;
$val=~s/</</g;
$val=~s/>/>/g;
$val=~s/(http:\/\/\S+)/<A href="$1">$1<\/A>/g;
return $val;
}
$cont_len=$ENV{'CONTENT_LENGTH'};
if($ENV{'REQUEST_METHOD'} eq 'GET'){$query=$ENV{'QUERY_STRING'};}
else {sysread(STDIN,$query,$cont_len);}
if($query eq ''){
print "Content-type: text/html\n\n";
print <<HTML_generating;
<HTML><HEAD><TITLE>Wellcome to my guestbook</TITLE></HEAD>
<BODY bgcolor="cyan">
<CENTER><H1>Wellcome to my guestbook</H1></CENTER>
<HR><FORM action="guestbook.cgi" METHOD="POST">
<TABLE border=0>
<TR><TD>Name:</TD><TD colspan=3><INPUT NAME="Name"></TD></TR>
<TR><TD>E-mail:</TD><TD colspan=3><INPUT NAME="Email"></TD></TR>
<TR><TD>URL:</TD><TD colspan=3><INPUT NAME="URL"></TD></TR>
<TR><TD>Message:</TD><TD colspan=3><TEXTAREA NAME="Message" rows=6 cols=64></TEXTAREA></TD></TR>
<TR><TD>Mood:</TD><TD><IMG src="$Mailgifs[0]"></TD><TD><IMG src="$Mailgifs[1]"></TD><TD><IMG src="$Mailgifs[2]"></TD></TR>
<TR><TD> </TD><TD><INPUT TYPE="radio" NAME="Mood" VALUE="$Mailgifs[0]"></TD>
<TD><INPUT TYPE="radio" NAME="Mood" VALUE="$Mailgifs[1]"></TD>
<TD><INPUT TYPE="radio" NAME="Mood" VALUE="$Mailgifs[2]"></TD></TR>
<TR><TD colspan=2><INPUT TYPE="submit" VALUE="Send"></TD>
<TD colspan=2><INPUT TYPE="reset" VALUE="Clean"></TD></TR>
</TABLE></FORM>
<HR><BR>
HTML_generating
open(DATAFILE,"$datafile")|| die "Cannot open $datafile $!\n";
@GUESTDATA=<DATAFILE>;
print @GUESTDATA;
close(DATAFILE);
print "</BODY></HTML>";
}
else{
foreach(@fields=split(/&/,$query)){
if(/^Name=(.*)/){$Name=&urldecode($1);}
if(/^Email=(.*)/){$Email=&urldecode($1);}
if(/^URL=(.*)/){$URL=&urldecode($1);}
if(/^Message=(.*)/){$Message=&urldecode($1);}
if(/^Mood=(.*)/){$Mood=&urldecode($1);}
}
$MESSAGE=&strhtm($Message);
if(-e $datafile){unless (-r $datafile && -w $datafile){die "Cannot access $datafile\n";}}
$Newmsg="<IMG src=\"$Mood\"><BR><A href =\"mailto:$Email\">$Name</A>".
"(<A href=\"$URL\">$URL</A>):<BR>\n$MESSAGE<HR>\n";
open(DATAFILE,"+<$datafile") || die "Cannot open $datafile $!\n";
@GUESTDATA=<DATAFILE>;
@GUESTDATA=($Newmsg,@GUESTDATA);
seek(DATAFILE,0,0);
print DATAFILE @GUESTDATA;
close(DATAFILE);
print "Content-type: text/html\n\n";
print "<HTML><HEAD><TITLE>Congratulations</TITLE></HEAD>\n";
print "<BODY bgcolor=\"cyan\">\n<CENTER><H1>Congratulations:you have successfully entered to $myname\'s";
print "guestbook.Thank you!</H1></CENTER><HR>$Newmsg</BODY></HTML>";
open(MAIL,"|$mail $Email");
print MAIL "Guestbook\n";
print MAIL "You have entered to $myname\'s guestbook\n";
print MAIL "Thank you.\n\t\t\t\t$myname";
close(MAIL);
format NOTIFYMAIL=
Guestbook
========================== Guestbook Entry =======================
| Time: |Name: |
| @<<<<<<<<<<<<<<<<<<<<<<<<|@<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< |
scalar localtime,$Name
+--------------------------+-------------------------------------+
| Email: |URL: |
| @<<<<<<<<<<<<<<<<<<<<<<<<|@<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< |
$Email,$URL
+--------------------------+-------------------------------------+
| ^<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< |
$Message
| ^<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< |
$Message
| ^<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< |
$Message
| ^<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< @<<<<< |
$Message,$Facetxt{$Mood}
==================================================================
.
open(NOTIFYMAIL,"|$mail $myemail");
write NOTIFYMAIL;
close(NOTIFYMAIL);
}
doom2 4 127.0.0.1 906992351 quake2 1 127.0.0.1 906992700 quake 3 127.0.0.1 906992668 doom 1 127.0.0.1 906991960Вы спросите,зачем столько информации? Чтобы отфильтровывать нажатия Reload. Если с одного IP-адреса между заходами промежуток меньше чем 30 секунд,то счетчик не инкрементируется (Так например поступает счетчик в Rambler'е).
#!/usr/bin/perl
#newcount.cgi
###############
$LOCK_EX=2;
$LOCK_UN=8;
$datafile="counter.dat";
###############
$Dig[0]=(
"\x01\x01\x01\x01\x01\x01\x01\x01".
"\x01\x02\x02\x02\x02\x02\x02\x01".
"\x01\x02\x01\x01\x01\x01\x02\x01".
"\x01\x02\x01\x01\x01\x01\x02\x01".
"\x01\x02\x01\x01\x01\x01\x02\x01".
"\x01\x02\x01\x01\x01\x01\x02\x01".
"\x01\x02\x02\x02\x02\x02\x02\x01".
"\x01\x01\x01\x01\x01\x01\x01\x01"
);
$Dig[1]=(
"\x01\x01\x01\x01\x01\x01\x01\x01".
"\x01\x01\x01\x01\x02\x01\x01\x01".
"\x01\x01\x01\x02\x02\x01\x01\x01".
"\x01\x01\x01\x01\x02\x01\x01\x01".
"\x01\x01\x01\x01\x02\x01\x01\x01".
"\x01\x01\x01\x01\x02\x01\x01\x01".
"\x01\x01\x02\x02\x02\x02\x02\x01".
"\x01\x01\x01\x01\x01\x01\x01\x01"
);
$Dig[2]=(
"\x01\x01\x01\x01\x01\x01\x01\x01".
"\x01\x01\x02\x02\x02\x02\x02\x01".
"\x01\x02\x01\x01\x01\x01\x02\x01".
"\x01\x01\x01\x01\x01\x01\x02\x01".
"\x01\x01\x01\x01\x02\x02\x02\x01".
"\x01\x01\x02\x02\x01\x01\x01\x01".
"\x01\x02\x02\x02\x02\x02\x02\x01".
"\x01\x01\x01\x01\x01\x01\x01\x01"
);
$Dig[3]=(
"\x01\x01\x01\x01\x01\x01\x01\x01".
"\x01\x01\x02\x02\x02\x02\x01\x01".
"\x01\x02\x01\x01\x01\x01\x02\x01".
"\x01\x01\x01\x01\x02\x02\x02\x01".
"\x01\x01\x01\x01\x01\x01\x02\x01".
"\x01\x02\x01\x01\x01\x01\x02\x01".
"\x01\x01\x02\x02\x02\x02\x01\x01".
"\x01\x01\x01\x01\x01\x01\x01\x01"
);
$Dig[4]=(
"\x01\x01\x01\x01\x01\x01\x01\x01".
"\x01\x01\x01\x02\x02\x01\x01\x01".
"\x01\x01\x02\x01\x02\x01\x01\x01".
"\x01\x02\x01\x01\x02\x01\x01\x01".
"\x01\x02\x02\x02\x02\x01\x01\x01".
"\x01\x01\x01\x01\x02\x01\x01\x01".
"\x01\x01\x02\x02\x02\x02\x01\x01".
"\x01\x01\x01\x01\x01\x01\x01\x01"
);
$Dig[5]=(
"\x01\x01\x01\x01\x01\x01\x01\x01".
"\x01\x02\x02\x02\x02\x02\x02\x01".
"\x01\x02\x01\x01\x01\x01\x01\x01".
"\x01\x01\x02\x02\x02\x02\x01\x01".
"\x01\x01\x01\x01\x01\x01\x02\x01".
"\x01\x02\x01\x01\x01\x01\x02\x01".
"\x01\x01\x02\x02\x02\x02\x01\x01".
"\x01\x01\x01\x01\x01\x01\x01\x01"
);
$Dig[6]=(
"\x01\x01\x01\x01\x01\x01\x01\x01".
"\x01\x01\x02\x02\x02\x02\x02\x01".
"\x01\x02\x01\x01\x01\x01\x01\x01".
"\x01\x02\x02\x02\x02\x02\x01\x01".
"\x01\x02\x01\x01\x01\x01\x02\x01".
"\x01\x02\x01\x01\x01\x01\x02\x01".
"\x01\x01\x02\x02\x02\x02\x02\x01".
"\x01\x01\x01\x01\x01\x01\x01\x01"
);
$Dig[7]=(
"\x01\x01\x01\x01\x01\x01\x01\x01".
"\x01\x02\x02\x02\x02\x02\x01\x01".
"\x01\x01\x01\x01\x01\x02\x01\x01".
"\x01\x01\x01\x01\x02\x01\x01\x01".
"\x01\x01\x01\x02\x01\x01\x01\x01".
"\x01\x01\x01\x02\x01\x01\x01\x01".
"\x01\x01\x02\x02\x02\x01\x01\x01".
"\x01\x01\x01\x01\x01\x01\x01\x01"
);
$Dig[8]=(
"\x01\x01\x01\x01\x01\x01\x01\x01".
"\x01\x01\x02\x02\x02\x02\x01\x01".
"\x01\x02\x01\x01\x01\x01\x02\x01".
"\x01\x01\x02\x02\x02\x02\x01\x01".
"\x01\x02\x01\x01\x01\x01\x02\x01".
"\x01\x02\x01\x01\x01\x01\x02\x01".
"\x01\x02\x02\x02\x02\x02\x02\x01".
"\x01\x01\x01\x01\x01\x01\x01\x01"
);
$Dig[9]=(
"\x01\x01\x01\x01\x01\x01\x01\x01".
"\x01\x02\x02\x02\x02\x02\x02\x01".
"\x01\x02\x01\x01\x01\x01\x02\x01".
"\x01\x02\x02\x02\x02\x02\x02\x01".
"\x01\x01\x01\x01\x01\x01\x02\x01".
"\x01\x02\x01\x01\x01\x01\x02\x01".
"\x01\x01\x02\x02\x02\x02\x02\x01".
"\x01\x01\x01\x01\x01\x01\x01\x01"
);
###############
sub urldecode{
local($val)=@_;
$val=~s/\+/ /g;
$val=~s/%([0-9A-H]{2})/pack('C',hex($1))/ge;
return $val;
}
sub gifcompress{
local($bmp)=@_;
local(@Tbl);
local($rootsize)=(8); #bits per pixel
local($i,$bmp_i,$c,$k,$ck,$code,$tbl_i,$comp_size);
local($cc,$eoi);
local($bits)=('');
local($RV)=('');
$bmp_i=0;
foreach $i(0..2**$rootsize-1){$Tbl[$i]=pack('C',$i);}
$tbl_i=2**$rootsize+2;
$cc=2**$rootsize;
$eoi=2**$rootsize+1;
$comp_size=$rootsize+1;
$c='';
$bits.=substr(unpack('b16',pack('S',$cc)),0,$comp_size);
if($cc==(2**$compsize -1)){$comp_size++;}
while($bmp_i<length($bmp)){
$k=substr($bmp,$bmp_i,1);
$ck=$c.$k;
$code=-1;
for($i=0;$i<$tbl_i;$i++){if($Tbl[$i] eq $ck){$code=$i;}}
if($code!=-1){
$c=$ck;
}
else{
$Tbl[$tbl_i]=$ck;$tbl_i++;#add
$code=-1;for($i=0;$i<$tbl_i;$i++){if($i!=$eoi&&$i!=$cc){if($Tbl[$i] eq $c){$code=$i;}}}
$bits.=substr(unpack('b16',pack('S',$code)),0,$comp_size);
if($code==(2**$compsize -1)){$comp_size++;}
if($code==4095){$bits.=substr(unpack('b16',pack('S',$cc)),0,$comp_size);foreach $i(0..2**$rootsize-1){$Tbl[$i]=pack('C',$i);};$tbl_i=2**$rootsize+2;$comp_size=$rootsize+1;$c='';}
$c=$k;
}
$bmp_i++;
}
$code=-1;for($i=0;$i<$tbl_i;$i++){if($i!=$eoi&&$i!=$cc){if($Tbl[$i] eq $c){$code=$i;}}}
$bits.=substr(unpack('b16',pack('S',$code)),0,$comp_size);
if($code==(2**$compsize -1)){$comp_size++;}
if($code==4095){$bits.=substr(unpack('b16',pack('S',$cc)),0,$comp_size);foreach $i(0..2**$rootsize-1){$Tbl[$i]=pack('C',$i);};$tbl_i=2**$rootsize+2;$comp_size=$rootsize+1;$c='';}
$bits.=substr(unpack('b16',pack('S',$eoi)),0,$comp_size);
local($bytes)=('');
for($i=0;$i<length($bits)/8;$i++){
$bytes.=pack('b8',substr($bits,$i*8,8));
}
$RV=pack('C',$rootsize);
for($i=0;$i<length($bytes)/255;$i++){
$block=substr($bytes,$i*255,255);
$RV.=pack('C',length($block));
$RV.=$block;
}
$RV.=pack('C',0);
return $RV;
}
sub gengif2{
local($Number,$digits,$c_r,$c_g,$c_b)=@_;
local($Ascii_Num,$Zeropad);
$Ascii_Num=''.$Number;
$digits=($digits>length($Ascii_Num)?$digits:length($Ascii_Num));
$Zeropad='0' x $digits;
substr($Zeropad,- length($Ascii_Num),length($Ascii_Num))=$Ascii_Num;
$Ascii_Num=$Zeropad;
local($sym,$pos,$i);
local($bmp)="\x00" x ($digits * 8 * 8);
foreach $pos(0..length($Ascii_Num)-1){
$sym=substr($Ascii_Num,$pos,1);
foreach $i(0..7){
substr($bmp,$i*$digits*8 + $pos*8,8)=substr($Dig[$sym],$i*8,8);
}
}
local($g_x,$g_y);
$g_x=$digits*8;
$g_y=8;
local($transp_index)=(1);
local($RV)=('GIF89a');
local($lscr)=(pack('SS',$g_x,$g_y).pack('B8','11110111').pack('C',0).pack('C',0));
local($pal)=(pack('CCC',0x0,0x0,0x0).pack('CCC',0x7f,0x7f,0x7f).pack('CCC',$c_r,$c_g,$c_b).
pack('CCC',0x7f,0x0,0x0).pack('CCC',0x0,0x7f,0x0).pack('CCC',0x0,0x0,0x7f));
local($tmp)=(pack('C',0) x 768);
substr($tmp,0,length($pal))=$pal;
$pal=substr($tmp,0,768);
local($gr_ext)=(pack('C',0x21).pack('C',0xf9).pack('C',4).pack('B8','00001001').pack('S',0).pack('C',$transp_index).pack('C',0));
local($imgdescr)=(pack('C',0x2c).pack('SSSS',0,0,$g_x,$g_y).pack('B8','00000000'));
local($gifdata)=(&gifcompress($bmp));
local($gifend)=(pack('C',0x3b));
$RV=$RV.$lscr.$pal.$gr_ext.$imgdescr.$gifdata.$gifend;
return $RV;
}
######################
binmode(STDOUT);
$|=1;
#print "Content-Type: image/gif\n\n";
#print &gengif2($Number,$digits,$c_r,$c_g,$c_b);
#print &gengif2(1234567890,9,100,0,0);
$query=$ENV{'QUERY_STRING'};
if($query eq ''){print "Content-Type: image/gif\n\n";print &gengif2(1234567890,10,100,0,0);}
else{
@fields=split(/&/,$query);
foreach(@fields){
if(/^id=(.*)/){$id=&urldecode($1);}
if(/^dig=(.*)/){$dig=&urldecode($1);}
}
$digits=$dig;
$digits=9 unless($dig);
$cur_ip=$ENV{'REMOTE_ADDR'};
$cur_time=time;
open(DATA,"+<$datafile");
flock(DATA,$LOCK_EX);
@Dat=<DATA>;
chop(@Dat);
%Counters=@Dat;
($count,$ip,$t)=split(/\s+/,$Counters{$id});
$count++ if(($ip!=$cur_ip)||($cur_time-$t>30));
$ip=$cur_ip;
$t=$cur_time;
$Counters{$id}=join(' ',$count,$ip,$t);
seek(DATA,0,0);
foreach(keys %Counters){
print DATA "$_\n";
print DATA "$Counters{$_}\n";
}
truncate(DATA,tell(DATA));
flock(DATA,$LOCK_UN);
close(DATA);
print "Content-Type: image/gif\n\n";
print &gengif2($count,$dig,100,0,0);
}
Если вам циферки не понравились вы их легко сможете заменить.
![]()
[
Предыдущая |
Содержание |
Следующая
]