Разделы:

Главная

О проекте

Загрузки

Документация:

Linux

BSD

Другие Unix

Программинг

HTML, XML...

Сервера

"Окна Закрой!"

MANы

 


Статистика посещений





Введение

В этой статье я постараюсь рассказать как написать счетчик со сбором данных о посетителях. Выглядеть эта статистика как у SpyLog конечно не будет, но узнать кто, когда, каким браузером смотрел сайт вполне позволит.

Пишем счетчик

Вся система будет состоять из двух perl-скриптов: 1 - собственно сам счетчик, 2 - скрипт обработки статистических данных и html страницы для запроса пароля. Для начала разберемся со скриптом счетчика. Ниже я приведу его код, а в комментариях объясню что и как работает.



#!/usr/local/bin/perl
print "Content-type:text/html\n\n";
$file="counter.txt"; # Эта переменная определяет файл, хранящий значение счетчика
open (STAT,"$file"); # Открываем файл
$count=<STAT>; # Читаем в строку
close (STAT);# Закрываем файл

$count++; # Увеличиваем счетчик на 1

open (STAT,">$file"); # Открываем файл на запись
print STAT $count; # Записываем значение счетчика
close (STAT); # Закрываем файл
# Разбираемся со временем
($sec,$min,$hour,$day,$month,$year,$day2)=localtime(time);
if ($hour<10) {
$hour="0".$hour;
} else {
$hour=$hour;
}

if ($min<10) {
$min="0".$min;
} else {
$min=$min;
}

if ($hour<24) {
$time=$hour.":".$min." AM";
} else {
$time=($hour).":".$min." PM";
}
# Разбираемся с датой
if ($month<10) {
$month="0".($month+1);
} else {
$month=$month+1;
}
$date=$day."/".$month."/".($year+1900);

open (LOG,">>counter.log"); # Открываем на дозапись файл, где мы будем собирать данные о посетителях
$string=join(' ',$date,$time,$ENV {'REMOTE_ADDR'},$ENV {'HTTP_REFERER'} ); # Разделяем пробелом дату, время, ip, url
print LOG $string,"\n"; # Пишем в файл статистики данные с новой строки
close (LOG); # Закрываем файл

open (NOW,"today.txt"); # Открываем файл с сегодняшней статистикой
$today=<NOW>; # Читаем в файл
close (NOW); # Закрываем файл
#Выясняем сколько посетителей было сегодня
open (LOG,"counter.log");
@data=<LOG>;
close (LOG);

foreach $string(@data) {
@item=split(/&/,$string);

if ($item[0]=~/$date/i) {
push (@now,$item[0]);
$size=@now;
$today=$size;

} else {
$today=0;
}
}
open (NOW,">today.txt");
print NOW $today;
close (NOW);
# Выводим на экран код счетчика
print <<EOF;
<table width=100 height=31 cellspacing=0 cellpadding=0 border=0> <tr><td rowspan=2 width=30 bgcolor="#B4B400" bordercolor="0000ff"> <font size=1 color="ffffff"> <b>prolinux<br>nm.ru</b></a></font></td> <td align=right bgcolor="000000" bordercolor="000000" height=10> <font size=1 color="ffffff">$time</font></td></tr> <tr><td align=right valign=bottom bgcolor="000000"> <font size=1 color="ff0000"><b>сегодня $today<br> всего $count</b></font></td></tr> </table>
EOF


Назовем этот файл counter.cgi и поместим в каталог cgi-bin, назначив ему права на выполнение

Пишем скрипт обработки данных


#!/usr/local/bin/perl
print "Content-type:text/html\n\n";
if ($ENV{'REQUEST_METHOD'} eq 'GET'){
$buffer=$ENV{'QUERY_STRING'};
}# Пароль предполагается передать методом GET ( т.к. Особой важности в статистике нет)
else {
print "Error!"; }
@pairs=split(/&/, $buffer); # Удаляем символы, вставляемые сервером при общении с клиентом
foreach $pair (@pairs){
($name, $value)=split(/=/, $pair); # Удаляем "=" и получаем имя формы и её значение
$value=~tr/+/ /; # Заменяем + на пробелы
$value=~s/%([a-fA-F0-9][a-fA-F0-9])/chr(hex($1))/eg; # Преобразуем текст в киррилицу (при необходимости)
}
if ($value eq "111111"){ # Проверяем пароль (по умолчанию 111111)
print "<CENTER><H3>Страница статистики посещений</H3></CENTER>";
print"<table bgcolor=#DDDDDD border=1 width=100%><tr><td>time & date</td><td>IP adress</td><td>URL</td></tr>"; # выводим шапку таблицы
open (STAT , "counter.log"); # Открываем файл статистики
@statistic=<STAT>; # Читаем в массив
foreach $statistic (@statistic) # Циклом проходим по массиву
{
($t, $d, $am, $ip, $url)=split/ /,$statistic; # Разделяем по пробелу дату, время, ip ...
print "<tr><td>$t $d $am </td><td$ip</td><td>$url</td></tr>"; #Печатаем строку таблицы
}
print"</table>"; # Закрываем таблицу
close (STAT);
}
else{
print"<body bgcolor=#FF0000><h1>PASSWORD INCORRECT</h1>";
}# Если пароль не верен - сообщаем об этом


Называем этот файл stat.cgi

Ну и последнее: создаём html файл аутентификации
<Html>
<Body>
<Form Action="/cgi-bin/stat.cgi" Method="GET">
Пароль администратора: <Input Type="text" Name="1" Value="">
<Input Type="submit" Value="OK">
</Form>
</Body>
</Html>


Называем этот файл на свое усмотрение. Страница выглядит очень спартански, но при неоходимости её всегда можно украсить.

Ну и напоследок вставить счетчик на страницу можно, используя SSI.
Для этого вставьте следующий код: <!--#include virtual="cgi-bin/counter.cgi"-->

Заключене

Получившийся счетчик, конечно, можно многократно улучшать, но даже в таком состоянии он позволяет определить откуда и в какое время приходит большинство посетителей.

Дмитрий Пузанов


Вы можете размещать эту статью на своем сайте при условии
обязательной ссылки на сайт http://www.prounix.h12.ru


Партнёры и спонсоры проекта:

Все материалы сайта распространяются по лицензии GNU/GPL
© ProUNIX 2003-2009, UnixLib 2005-2009, SoftLib 2006-2009.