Автор Тема: Счётчик посещений  (Прочитано 7464 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн IVM

  • Заглянувший
  • Новичок
  • *
  • Сообщений: 7
  • +0/-0
  • 0
    • Просмотр профиля
    • http://
Счётчик посещений
« : 11 Июня 2002, 18:42:10 »
Подскажите, плз подробнее как сделать счётчик посещений (или готовый CGI скрипт), счётчик должен работать в локальной сети 192.168.*.* не имеющей выхода в инет.

Кроме того, увеличение значения должно блокироваться, если посещение страницы было выполнено повторно с одного IP в течение заданного времени.

Оффлайн Evgeny

  • Фанат форума
  • Старожил
  • ****
  • Сообщений: 272
  • +0/-0
  • 0
    • Просмотр профиля
Счётчик посещений
« Ответ #1 : 11 Июня 2002, 18:48:50 »


#!/usr/bin/perl
use Time::Local;

$minLen=1;                           # minimum number of digits in bigmap
%adrr=(\'addr1\'                    => \'file1.dat\',
       \'addr2\'                    => \'file2.dat\'
      );
                         
$client=$ENV{HTTP_REFERER};
$client=~s/\\/[^\\/]*$//;
$counterFile=$adrr{$client};
exit unless $counterFile;

@digits = ("3c 66 66 66 66 66 66 66 66 3c",  # 0
           "30 38 30 30 30 30 30 30 30 30",  # 1
           "3c 66 60 60 30 18 0c 06 06 7e",  # 2
           "3c 66 60 60 38 60 60 60 66 3c",  # 3
           "30 30 38 38 34 34 32 7e 30 78",  # 4
           "7e 06 06 06 3e 60 60 60 66 3c",  # 5
           "38 0c 06 06 3e 66 66 66 66 3c",  # 6
           "7e 66 60 60 30 30 18 18 0c 0c",  # 7
           "3c 66 66 66 3c 66 66 66 66 3c",  # 8
           "3c 66 66 66 66 7c 60 60 30 1c"); # 9

&incrementCount;
&generateBitmap;
&writeBitmap;

sub writeBitmap
{  print "Content-type: image/x-xbitmap\\n\\n";
   printf ("#define count_width %d\\n#define count_height 10\\n", $len*8);
   printf STDOUT "static char count_bits[] = {\\n";
   for($i=0; $i<($#bytes+1); $i++)
   {  print("0x$bytes[$i]");
      if ($i != $#bytes)
      {  print(",");
         if (($i+1) % 7 == 0)
         {  print("\\n");
         }
      }
   }
   print("};\\n");
}

sub generateBitmap
{  $count = $totalReads;
   @bytes = ();
   $len = length($count) > $minLen ? length($count) : $minLen;
   $formattedCount = sprintf("%0${len}d",$count);
   for ($y=0; $y < 10; $y++)
   {  for ($x=0; $x<$len; $x++)
      {  $digit=substr($formattedCount,$x,1);
         $byte=substr(@digits[$digit],$y*3,2);
         push(@bytes,$byte);
      }
   }
}

sub incrementCount
{  my (@a,$time,$remoteAdr,$limit);
   $time=timelocal((localtime)[0..5]);
   $remoteAdr=$ENV{REMOTE_ADDR};
   $limit=300;
   if (open(F,"<$counterFile"))
   {  flock(F,1);
      chomp  ($totalReads=);
      while ()
      {  chomp;
         @a=split(/;/,$_);
         $lastClient{$a[0]}=$a[1];
      }
      close(F);
   }
   $totalReads++ if (!$lastClient{$remoteAdr} || $time-$lastClient{$remoteAdr}>$limit);
   $lastClient{$remoteAdr}=$time;
   if (open(F,">$counterFile"))
   {  flock(F,2);
      print F "$totalReads\\n";
      foreach (keys %lastClient)
      {  print F "$_;$lastClient{$_}\\n" if ($time-$lastClient{$_}<$limit);
      }
      close(F);
   }
}


Скрипт можно использовать для нескольких адресов.
В хэше %adrr заносится \'адресс страницы\' на которой установлен счётчик и файл для этой страницы.
При первом использовании файлы должны существовать, права для них - 6Х6. Для скрипта - как обычно 7Х5.

Оффлайн Evgeny

  • Фанат форума
  • Старожил
  • ****
  • Сообщений: 272
  • +0/-0
  • 0
    • Просмотр профиля
Счётчик посещений
« Ответ #2 : 11 Июня 2002, 19:02:33 »
Забыл сказать счётчик не увеличивается в течении 5 минут (переменная $limit=300 в ф-ции incrementCount) для данного айпи-адреса.
Удачи.

Оффлайн IVM

  • Заглянувший
  • Новичок
  • *
  • Сообщений: 7
  • +0/-0
  • 0
    • Просмотр профиля
    • http://
Счётчик посещений
« Ответ #3 : 11 Июня 2002, 19:10:59 »
Сорри, но я в Perl ламер полный.

поставил я Perl5 под винды, как задать права?
и как создать файлы для первого испольования и в каком формате?

Оффлайн Evgeny

  • Фанат форума
  • Старожил
  • ****
  • Сообщений: 272
  • +0/-0
  • 0
    • Просмотр профиля
Счётчик посещений
« Ответ #4 : 11 Июня 2002, 19:28:38 »
Файлы данных - просто пустые файлы создай, 0 байт длинной, никакой формат тебе не нужен.
В юниксе права задать - chmod.
chmod 606 file1.dat
Смысл в том, чтоб пользователям разрешить читать и писать в файл, а скрипт читать и выполнять. Для себя - какие хочешь, логично предположить, что для скрипта все - читать, писать и выполнять, а для файлов данных - читать и писать. Группе - не важно.
Забыл ещё сказать, что в html-коде страницы счётчик присоединяется так:

Страница посещена раз.
« Последнее редактирование: 11 Июня 2002, 19:42:09 от Evgeny »

Оффлайн IVM

  • Заглянувший
  • Новичок
  • *
  • Сообщений: 7
  • +0/-0
  • 0
    • Просмотр профиля
    • http://
Счётчик посещений
« Ответ #5 : 11 Июня 2002, 19:50:34 »
В Юниксе????.... дык я всё это под WinXP+Апач+Перл делать собрался.

Текст скрипта положить в файл *.pl?
Слышал както, что вроде возникают какието проблемы с окончанием строк (т.е. в Юниксе и Виндах они разные).
Т.е. можно выделить текст скрипта и через буфер поместить его как текст в файл "name_fale.pl", не внося никаких изменение в окончания строк, так?

Оффлайн Evgeny

  • Фанат форума
  • Старожил
  • ****
  • Сообщений: 272
  • +0/-0
  • 0
    • Просмотр профиля
Счётчик посещений
« Ответ #6 : 11 Июня 2002, 20:19:16 »
Цитировать
В Юниксе????.... дык я всё это под WinXP+Апач+Перл делать собрался.

Текст скрипта положить в файл *.pl?
Слышал както, что вроде возникают какието проблемы с окончанием строк (т.е. в Юниксе и Виндах они разные).
Т.е. можно выделить текст скрипта и через буфер поместить его как текст в файл "name_fale.pl", не внося никаких изменение в окончания строк, так?


Всё правильно.

А если в виндах, то не знаю, web-серверу нужно указать те права, что я выше тебе написал.

Оффлайн glebushka

  • студент
  • Ветеран
  • *****
  • Сообщений: 944
  • +0/-0
  • 2
    • Просмотр профиля
    • http://www.intellectuals.ru
Счётчик посещений
« Ответ #7 : 12 Июня 2002, 00:53:52 »
Какие там проблемы концов строк????
Открывай блокнот, копируй туда буфер обмена, но даже если ты вдруг решишь набрать всё вручную (дабы не перегружать оперативку:-)))))))))))) то какие могут быть проблемы, тебе надо воспользоваться специальным навороченным редактором, который умеет кодировать в юникс-кодировку, тогда может проблему и получишь, но надо для этого постараться...
Теперь насчёт прав, забей на них, в виндах их нет, если ты правильно устанавливал веб-сервер, по инструкции:-) то там не должен быть обойдён момент указания папки для скриптов, туда этот скрипт и помести...
кстати убедись в том, что путь к Перл у тебя совпадает. Подробнее про апачи + Перл и др... читай доку: http://userguide.webservis.ru/homeserver-apache-forprint.shtml
Вот...
Ну к чему все это, лучше бы водки выпили...

Оффлайн IVM

  • Заглянувший
  • Новичок
  • *
  • Сообщений: 7
  • +0/-0
  • 0
    • Просмотр профиля
    • http://
Счётчик посещений
« Ответ #8 : 14 Июня 2002, 20:10:40 »
Установил Perl522 на C:/usr
создал файл st.pl, скопировал в него приведённый Evgeny код.

В коде вместо %adrr=(\'addr1\'   вставил %adrr=(\'../main.html\'   (в main.html вставил строку: )

...ничего не работает, размер файлов *.dat остаётся нулевым.
Счетчик отображается пустым квадратиком. :-(
Запускал: "Perl -c st.pl" - открывается и сразу гаснет окно DOS, сообщений об ошибках нет...

Оффлайн IVM

  • Заглянувший
  • Новичок
  • *
  • Сообщений: 7
  • +0/-0
  • 0
    • Просмотр профиля
    • http://
Счётчик посещений
« Ответ #9 : 15 Июня 2002, 18:51:12 »
Так, а для того, чтобы скрипты заработали надо Апач обязательно установить и настроить, да?

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

Ну ламер я, ЛАААМЕР!!!!

Оффлайн Evgeny

  • Фанат форума
  • Старожил
  • ****
  • Сообщений: 272
  • +0/-0
  • 0
    • Просмотр профиля
Счётчик посещений
« Ответ #10 : 17 Июня 2002, 12:45:05 »
Не правильно %adrr задал.
Если счётчик установтен на странице ../main.html, то нужно адрес так писать: http://tvoi_adress.ru/main.html

Оффлайн Evgeny

  • Фанат форума
  • Старожил
  • ****
  • Сообщений: 272
  • +0/-0
  • 0
    • Просмотр профиля
Счётчик посещений
« Ответ #11 : 17 Июня 2002, 12:46:24 »
Или напиши сюда адрес страницы, на которой счётчик установить хочешь и имя dat-файла, который с ней связать нужно, я тебе напишу, как должен выглядеть хэш %addr.

Оффлайн Garret

  • Заглянувший
  • Новичок
  • *
  • Сообщений: 2
  • +0/-0
  • 0
    • Просмотр профиля
    • http://
Счётчик посещений
« Ответ #12 : 29 Ноября 2004, 23:28:47 »
Evgeny не подскажешь как мне быть?
Мне нужна служба счётчиков, которая регистрирует обращения по определённому id, а не по хосту, т.е. мне надо чтобы обращения с разных хостов (у меня так сайт расположен) регистрировались одним счётчиком...

Оффлайн NeoNox

  • Координатор
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 3012
  • +0/-0
  • 0
    • Просмотр профиля
Счётчик посещений
« Ответ #13 : 30 Ноября 2004, 13:14:57 »
Еще одна поднятая тема счетчиков - получиш бан.
По теме, или пишеш сам (будут вопросы - обращайся), не умееш - пишеш вот сюда http://forums.webscript.ru/forumdisplay.php?s=&forumid=22
Тема закрыта.
The documentations is your friend

 

Sitemap 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28