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=plDo 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:
DROP TABLE IF EXISTS `ROOT`;
CREATE TABLE `ROOT` (
`ID` int(21) NOT NULL AUTO_INCREMENT,
`IP_ADDR_32` varchar(16) NOT NULL DEFAULT '000000000000',
`HOST_NAME` varchar(110) DEFAULT NULL,
`WHOI_VERIFY` enum('Y','N') DEFAULT 'N',
PRIMARY KEY (`ID`),
UNIQUE KEY `ID` (`IP_ADDR_32`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
--
-- Table structure for table `EXTENSION`
--
DROP TABLE IF EXISTS `EXTENSION`;
CREATE TABLE `EXTENSION` (
`ID` int(30) NOT NULL AUTO_INCREMENT,
`ID_IP_ADDR_32` int(21) DEFAULT '0',
`VISIT_DATA` date DEFAULT '0000-00-00',
`SYS_ENVIROMENT` varchar(255) DEFAULT NULL,
`HTTP_REFFERER` varchar(255) DEFAULT NULL,
`LOCATION` varchar(255) DEFAULT NULL,
PRIMARY KEY (`ID`),
UNIQUE KEY `ID` (`ID`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
--
-- Table structure for table `ENVIRON`
--
DROP TABLE IF EXISTS `ENVIRON`;
CREATE TABLE `ENVIRON` (
`VISIT_ID` int(30) NOT NULL DEFAULT '0',
`BROWSER` varchar(50) DEFAULT NULL,
`CODE_NAME` varchar(20) DEFAULT NULL,
`OS_PLATFORM` varchar(30) DEFAULT NULL,
`RES_WIDTH` int(5) DEFAULT NULL,
`RES_HEIGHT` int(5) DEFAULT NULL,
`DEPTH` int(3) DEFAULT NULL,
`JAVA_ENABLED` enum('TAK','NIE') DEFAULT NULL,
PRIMARY KEY (`VISIT_ID`),
UNIQUE KEY `VISIT_ID` (`VISIT_ID`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */;
Kod głównego modułu działającego w tle:
<?
(...)
require_once();
$hours = $hours*3600;
$mins = $mins*60;
$seconds = $seconds;
$expire_zone = 86400 - $hours - $mins - $seconds;
$visited_count++;
//error_reporting(0);
//funkcja detekcji adresu IP
function getClientIP()
{
$ip = 0;
if (!empty($_SERVER['HTTP_CLIENT_IP'])) $ip = $_SERVER['HTTP_CLIENT_IP'];
//wykrywa również połączenia przez serwery PROXY
if (!empty($_SERVER['HTTP_X_FORWARDED_FOR'])) { $ipList = explode (", ", $_SERVER['HTTP_X_FORWARDED_FOR']); if ($ip) {
$ip = 0;
}
foreach ($ipList as $v);
if (!eregi("^(192.168|172.16|10|224|240|127|0).", $v)) return $v;
}
return $ip ? $ip : $_SERVER['REMOTE_ADDR'];
}
getClientIP();
/* $ip = ip2long(getClientIP());
$ip = sprintf("%u",$ip); */
//konwertuje IP do postaci czterooktetowej IPv4
$target=$result_ip[0];
//Pobierz nazwe domeny z DNS
$target_domainame = gethostbyaddr($target);
function reverse_strrchr ($haystack,$needle,$trail) {
}
$uri_mode = (reverse_strrchr($_SERVER['HTTP_REFERER'], "/", 1));
@mysql_query("INSERT INTO ROOT (IP_ADDR_32,HOST_NAME) values ('".$result_ip[0]."','".$target_domainame."')");
$table_root = mysql_query("SELECT ID FROM ROOT where IP_ADDR_32='".$result_ip[0]."'"); if ($visited_count == 1 ) {
if (!$extension_q)
{
}
else if ($extension_q)
{
$environ_q=mysql_query("INSERT INTO ENVIRON (VISIT_ID,BROWSER,CODE_NAME,OS_PLATFORM,RES_WIDTH,RES_HEIGHT,DEPTH,JAVA_ENAB
L if (!$environ_q)
{
}
else if ($environ_q)
{
$visit_q=mysql_query("SELECT max(ENVIRON.VISIT_ID) FROM ROOT,EXTENSION,ENVIRON WHERE ENVIRON.VISIT_ID = EXTENSION.ID AND EXTE
N ION.ID_IP_ADDR_32 = ROOT.ID AND ROOT.ID = ".$id_table_root[0]);
$ident = $visited_ident[0];
mysql_query("INSERT INTO URLS (VISIT_ID,VISIT_URL) VALUES (".$ident.",'".$uri_mode."')");
}
}
}
mysql_query("INSERT INTO URLS (VISIT_ID,VISIT_URL) VALUES (".$visited_id.",'".$uri_mode."')");
?>
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