Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [skrypt][design] Statystyki internetowe, w oparciu o serwery WHOIS
toolmaniak
post
Post #1





Grupa: Zarejestrowani
Postów: 77
Pomógł: 0
Dołączył: 29.05.2006
Skąd: /dev/null

Ostrzeżenie: (0%)
-----


Witam. Chciałem oddać do ogólnej oceny mój projekt statystyk internetowych. Niestety jak narazie mogę jedynie przekazać do wglądu screenshoty, oraz część struktury bazy danych i kodu PHP. Projekt z założenia miał raportować w miarę jak to tylko możliwe, szczegółowe informacje o odwiedzającyh witrynę, w tym poza zwykłą geolokalizacją miał również pozwalać na rozpoznanie kim dokładnie jest przeglądający, w czym pomocne okazały się zapytania do serwerów WHOIS zarówno dla adresów IP jak i dla domen.

Adres do galerii statystyk:http://toolmaniak.dtfoto.net/index.php?pageid=4&lang=pl

Do najważniejszych zalet systemu należą więc:
  • zapisywanie podstawowych informacji o odwiedzającym
  • raportowanie jak użytkownik dotarł na naszą stronę ( skąd nastąpiło przekierowanie).
  • Jakiego otoczenia systemowego używa tzn. jakiej przeglądarki, jaki OS, jakia głębia kolorów, rozdzielczość ekranu,obsługa JAVY, jaki typ połączenia
  • informacje szczegółowe z zapytań whois min.: pula adresowa, nazwa sieciowa,opis właściciela adresu IP, adres, osoba odpowiedzialna, kraj , email, domena, adres DNS, właściciel domeny itp.
  • informacje o odwiedzanych lokalizacjach na witrynie z dokładną datą i czasem (możliwe jest pokazywanie pełnych URI lub ucięcie do podkatalogu w którym dana podstrona się znajduje, co pomoże przy analizach popularności różnych tematów naszego serwisu po nazwie folderu)
  • podział odwiedzających na nowych i powracającyh
  • rozróżnienie również oglądalności strony na wizyty i odsłony
  • mapka geolokalizacyjna z google maps, umożłiwiająca graficzne przedstawienie lokalizacji odwiedzającego (domyślnie kraj/państwo) ,ale jeśli to możliwe, również co do miasta i ulicy (w zależności od zapytań whois).
  • generator wykresów oparty o klasę jpgraph
  • wyszukiwarka według dowolnych danych, po nazwie, adresie itp.
  • narzędzia sieciowe takie jak whois (wyświetlający pełne rekordy z zapytań), ping, traceroute
  • export wyników do excela lub csv, teraz również w toku jest export do PDF.
Część struktury bazy statystyk:
  1. DROP TABLE IF EXISTS `ROOT`;
  2. CREATE TABLE `ROOT` (
  3. `ID` int(21) NOT NULL AUTO_INCREMENT,
  4. `IP_ADDR_32` varchar(16) NOT NULL DEFAULT '000000000000',
  5. `HOST_NAME` varchar(110) DEFAULT NULL,
  6. `WHOI_VERIFY` enum('Y','N') DEFAULT 'N',
  7. PRIMARY KEY (`ID`),
  8. UNIQUE KEY `ID` (`IP_ADDR_32`)
  9. ) ENGINE=InnoDB DEFAULT CHARSET=latin1;
  10.  
  11. --
  12. -- Table structure for table `EXTENSION`
  13. --
  14.  
  15. DROP TABLE IF EXISTS `EXTENSION`;
  16. CREATE TABLE `EXTENSION` (
  17. `ID` int(30) NOT NULL AUTO_INCREMENT,
  18. `ID_IP_ADDR_32` int(21) DEFAULT '0',
  19. `VISIT_DATA` date DEFAULT '0000-00-00',
  20. `SYS_ENVIROMENT` varchar(255) DEFAULT NULL,
  21. `HTTP_REFFERER` varchar(255) DEFAULT NULL,
  22. `LOCATION` varchar(255) DEFAULT NULL,
  23. PRIMARY KEY (`ID`),
  24. UNIQUE KEY `ID` (`ID`)
  25. ) ENGINE=InnoDB DEFAULT CHARSET=latin1;
  26.  
  27. --
  28. -- Table structure for table `ENVIRON`
  29. --
  30.  
  31. DROP TABLE IF EXISTS `ENVIRON`;
  32. CREATE TABLE `ENVIRON` (
  33. `VISIT_ID` int(30) NOT NULL DEFAULT '0',
  34. `BROWSER` varchar(50) DEFAULT NULL,
  35. `CODE_NAME` varchar(20) DEFAULT NULL,
  36. `OS_PLATFORM` varchar(30) DEFAULT NULL,
  37. `RES_WIDTH` int(5) DEFAULT NULL,
  38. `RES_HEIGHT` int(5) DEFAULT NULL,
  39. `DEPTH` int(3) DEFAULT NULL,
  40. `JAVA_ENABLED` enum('TAK','NIE') DEFAULT NULL,
  41. PRIMARY KEY (`VISIT_ID`),
  42. UNIQUE KEY `VISIT_ID` (`VISIT_ID`)
  43. ) ENGINE=InnoDB DEFAULT CHARSET=latin1;
  44. /*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */;



Kod głównego modułu działającego w tle:
  1. <?
  2.  
  3.  
  4. (...)
  5. require_once();
  6.  
  7.  
  8.  
  9. $hours = date("H");
  10. $mins = date("i");
  11. $seconds = date("s");
  12. $hours = $hours*3600;
  13. $mins = $mins*60;
  14. $seconds = $seconds;
  15. $expire_zone = 86400 - $hours - $mins - $seconds;
  16.  
  17. $visited_count++;
  18. setcookie("visited_count",$visited_count,time()+$expire_zone);
  19. //error_reporting(0);
  20. //funkcja detekcji adresu IP
  21. function getClientIP()
  22. {
  23.  $ip = 0;
  24.  
  25.  if (!empty($_SERVER['HTTP_CLIENT_IP']))
  26.  $ip = $_SERVER['HTTP_CLIENT_IP'];
  27. //wykrywa również połączenia przez serwery PROXY
  28.  if (!empty($_SERVER['HTTP_X_FORWARDED_FOR'])) {
  29.  $ipList = explode (", ", $_SERVER['HTTP_X_FORWARDED_FOR']);
  30.  if ($ip) {
  31. array_unshift($ipList, $ip);
  32. $ip = 0;
  33.  }
  34.  foreach ($ipList as $v);
  35.  if (!eregi("^(192.168|172.16|10|224|240|127|0).", $v))
  36. return $v;
  37.  
  38.  }
  39.  return $ip ? $ip : $_SERVER['REMOTE_ADDR'];
  40. }
  41. getClientIP();
  42. $ip= sprintf("%u",ip2long(getClientIP())); 
  43.  /* $ip = ip2long(getClientIP());
  44. $ip = sprintf("%u",$ip); */
  45.  
  46. mysql_connect($db_server,$stat_user,$password) or die (mysql_error());
  47. mysql_select_db('stat');
  48. //konwertuje IP do postaci czterooktetowej IPv4
  49. $ip_get_32=mysql_query("SELECT INET_NTOA('".$ip."')");
  50. $result_ip=mysql_fetch_row($ip_get_32);
  51. $target=$result_ip[0];
  52.  
  53. //Pobierz nazwe domeny z DNS
  54. $target_domainame = gethostbyaddr($target);
  55.  
  56. function reverse_strrchr ($haystack,$needle,$trail) {
  57. return strrpos($haystack,$needle) ? substr($haystack,0,strrpos($haystack,$needle)+$trail) : false;
  58. }
  59. $uri_mode = (reverse_strrchr($_SERVER['HTTP_REFERER'], "/", 1));
  60.  
  61. print htmlspecialchars($_GET['browser']);
  62. @mysql_query("INSERT INTO ROOT (IP_ADDR_32,HOST_NAME) values ('".$result_ip[0]."','".$target_domainame."')");
  63.  
  64. $table_root = mysql_query("SELECT ID FROM ROOT where IP_ADDR_32='".$result_ip[0]."'");
  65. $id_table_root = MYSQL_FETCH_ARRAY($table_root);
  66. print $visited_count;
  67. if ($visited_count == 1 ) {
  68.  
  69. mysql_query("SET AUTOCOMMIT=0");
  70. mysql_query("START TRANSACTION");
  71. mysql_query("SAVEPOINT OpenDB");
  72. $extension_q=mysql_query("INSERT INTO EXTENSION (ID_IP_ADDR_32,VISIT_DATA,SYS_ENVIROMENT,HTTP_REFFERER,LOCATION) values  ('".$id_table_root[0]."','".date('Y-m-d')."','".htmlspecialchars($_SERVER['HTTP_USER_AGENT'])."','".htmlspecialchars($_GET['referer'])."','".htmlspecialchars($_SERVER['HTTP_REFERER'])."')");
  73. if (!$extension_q) 
  74. {
  75. mysql_query("ROLLBACK TO SAVEPOINT OpenDB");
  76. }
  77. else if ($extension_q)
  78. {
  79. $environ_q=mysql_query("INSERT INTO ENVIRON (VISIT_ID,BROWSER,CODE_NAME,OS_PLATFORM,RES_WIDTH,RES_HEIGHT,DEPTH,JAVA_ENAB
    L
  80. D) values ('".mysql_insert_id()."' , '".htmlspecialchars($_GET['browser'])."','".htmlspecialchars($_GET['code_name'])."','".htmlspecialchars($_GET['os_platform'])."','".htmlspecialchars($_GET['res_width'])."','".htmlspecialchars($_GET['res_height'])."','".htmlspecialchars($_GET['depth'])."','".htmlspecialchars($_GET['java'])."')");
  81. if (!$environ_q) 
  82. {
  83. mysql_query("ROLLBACK TO SAVEPOINT OpenDB"); 
  84. }
  85. else if ($environ_q)
  86. {
  87. mysql_query("COMMIT");
  88. mysql_query("RELEASE OpenDB");
  89. mysql_query("SET AUTOCOMMIT=1");
  90. $visit_q=mysql_query("SELECT max(ENVIRON.VISIT_ID) FROM ROOT,EXTENSION,ENVIRON WHERE ENVIRON.VISIT_ID = EXTENSION.ID AND EXTE
    N
  91. ION.ID_IP_ADDR_32 = ROOT.ID AND ROOT.ID = ".$id_table_root[0]);
  92.  
  93. $visited_ident = MYSQL_FETCH_ARRAY($visit_q);
  94. $ident = $visited_ident[0];
  95.  
  96. setcookie("visited_id",$ident,time()+$expire_zone);
  97.  
  98. mysql_query("INSERT INTO URLS (VISIT_ID,VISIT_URL) VALUES (".$ident.",'".$uri_mode."')"); 
  99.  
  100. }
  101. }
  102. }
  103. mysql_query("INSERT INTO URLS (VISIT_ID,VISIT_URL) VALUES (".$visited_id.",'".$uri_mode."')");
  104.  
  105. ?>


Pobiera on dane z wejściowego skryptu JSCript znajdującego się w stopce każdego dokumentu który ma być raportowany po czym umieszcza takie informacje jak adres IP, nazwa DNS, użyta przeglądarka, system operacyjny,rozdzielczość, obsługa maszyny wirtualnej Javy, strona referująca i jeszcze pare innych w odpowiednich tabelach mysql. Po tym zależnie od ustawień w pliku konfiguracyjnym demona Crontab odpalany jest co jakiś czas (domyślnie co 15 minut) proces sprawdzania rekordów oznaczonych jako niezweryfikowane poprzez zapytania do serwerów WHOIS na podstawie fsockopen().

Ten post edytował toolmaniak 13.08.2007, 00:45:53
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 4)
toolmaniak
post
Post #2





Grupa: Zarejestrowani
Postów: 77
Pomógł: 0
Dołączył: 29.05.2006
Skąd: /dev/null

Ostrzeżenie: (0%)
-----


Chciałem tylko dołączyć do oceny designu statystyk, ostatnio dodany nowy API wykresów oparty na Open Flash Chart. poniżej zamieszczam dwa screenshoty.




Go to the top of the page
+Quote Post
phpion
post
Post #3





Grupa: Moderatorzy
Postów: 6 072
Pomógł: 861
Dołączył: 10.12.2003
Skąd: Dąbrowa Górnicza




Wow, całość wygląda bardzo imponująco. Gdybyś tylko całość napisał obiektówką używając abstrakcji bazy danych byłby wypas. Ale tak czy srak naprawdę kapitalna robota, najszczersze gratulacje!
Go to the top of the page
+Quote Post
envp
post
Post #4





Grupa: Zarejestrowani
Postów: 359
Pomógł: 1
Dołączył: 16.04.2006
Skąd: Łódź

Ostrzeżenie: (0%)
-----


Wygląda, wygląda - ale gdzie można "dotknąć" ? ocenianie samych obrazków i kawałku kodu, czy też struktury bazy danych - średnio...
Go to the top of the page
+Quote Post
toolmaniak
post
Post #5





Grupa: Zarejestrowani
Postów: 77
Pomógł: 0
Dołączył: 29.05.2006
Skąd: /dev/null

Ostrzeżenie: (0%)
-----


Wiem, wiem ocenianie czegoś czego nie można samemu przetestować nie jest cool. Niestety narazie projekt (jakkolwiek działający i to bez najmniejszych problemów) jest w fazie ciągłego dostrajania. Powstał on jako inicjatywa jednej z firm dla których pracuje, dlatego tymczasowo nie mam gdzie postawić jakiegoś ogólniedostępnego demo. Pozatym jeszcze trzeba parę rzeczy załatać, może nie tak poważnych ale zawsze coś się znajdzie. Kiedyś napewno przyjdzie pora na zaprezentowanie go ogółowi, i napewno nie omieszkam rozpocząć od tego forum smile.gif. Być może brakuje tu rzeczywiście obiektowości, bo poza klasą do wykresów wszystko idzie strukturalnie, ale jakoś narazie tak wyszło, być może w przyszłości to poprawie. W każdym razie dzięki wielkie za odzew na ten projekt. Wkrótce zamierzam też oddać do oceny mój CRM. Pozdrówka
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 21.08.2025 - 23:25