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

Posty w temacie


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: 19.08.2025 - 11:32