PDA

Zobacz pełną wersję : Blokowanie licznika



qbratek
27-06-2007, 12:02
Witam.

Potrzebuję zablokować licznik dla konkretnego użytkownika. Mam włączone mod_stats i mod_digit_counter. Niestety obydwa moduły odczytują dane z tabeli jos_stats_agents. Natomiast nie mogę znaleźć pliku, w którym dodawany jest wpis do tabeli. Może ktoś z was blokował kiedyś licznik i pamięta, w którym pliku jest instrukcja zwiększania statystyk, ewentualnie zna jakieś inne rozwiązanie?

qbratek
30-06-2007, 20:05
No cóż. Nie doczekałem się odpowiedzi, ale gdyby ktoś chciał przyblokować licznik dla jakiegoś użytkownika, to w katalogu includes jest plik joomla.php, a w nim funkcja detect(), która dodaje informacje o odwiedzającym stronę do tabeli jos_stats_agents. :)

Pozdrawiam
Bartek

zwiastun
01-07-2007, 14:02
Jak to nie doczekałeś? To raczej inni się nie doczekali, bo Twoje objaśnienie jest połowiczne.
To żartem. A serio - rzeczywiście, dopisz coś więcej dla ludzi, którzy być może będą potrzebować takiej sztuczki.

qbratek
02-07-2007, 10:30
Więc, aby zablokować licznik, żeby np. nie zliczał naszych wejść na stronę:

1. Z katalogu głównego Joomla wchodzimy do katalogu includes.

2. W pliku joomla.php szukamy funkcji detect().

3. Zabieramy się za blokowanie:

3.a). Najwygodniej blokować użytkownika przez jego adres IP.

function detect() {

global $mosConfig_enable_stats;
if ($mosConfig_enable_stats == 1) {
if (mosGetParam( $_COOKIE, 'mosvisitor', 0 )) {
return;
}
setcookie( 'mosvisitor', 1 );

if (phpversion() <= '4.2.1') {
$agent = getenv( 'HTTP_USER_AGENT' );
$domain = @gethostbyaddr( getenv( "REMOTE_ADDR" ) );
} else {
if ( isset($_SERVER['HTTP_USER_AGENT']) ) {
$agent = $_SERVER['HTTP_USER_AGENT'];
} else {
$agent = 'Unknown';
}

$domain = @gethostbyaddr( $_SERVER['REMOTE_ADDR'] );
}

$browser = mosGetBrowser( $agent );

$query = "SELECT COUNT(*)"
. "\n FROM #__stats_agents"
. "\n WHERE agent = '$browser'"
. "\n AND type = 0"
;
$this->_db->setQuery( $query );

if ($this->_db->loadResult()) {
$query = "UPDATE #__stats_agents"
. "\n SET hits = ( hits + 1 )"
. "\n WHERE agent = '$browser'"
. "\n AND type = 0"
;
$this->_db->setQuery( $query );
} else {
$query = "INSERT INTO #__stats_agents"
. "\n ( agent, type )"
. "\n VALUES ( '$browser', 0 )"
;
$this->_db->setQuery( $query );
}

$this->_db->query();


$os = mosGetOS( $agent );

$query = "SELECT COUNT(*)"
. "\n FROM #__stats_agents"
. "\n WHERE agent = '$os'"
. "\n AND type = 1"
;
$this->_db->setQuery( $query );
if ($this->_db->loadResult()) {



/************blokowanie**************/
/*tutaj wstawiamy IP użytkownika, którego chcemy zablokować - w tej chwili blokujemy adres 192.168.1.1*/
if($_SERVER['REMOTE_ADDR'] != '192.168.1.1'){


$query = "UPDATE #__stats_agents"
. "\n SET hits = ( hits + 1 )"
. "\n WHERE agent = '$os'"
. "\n AND type = 1"
;
$this->_db->setQuery( $query );

/********/
}
/*koniec blokowania*/
}

Uwaga. Resztę funkcji pomijam.

Niestety z tego sposobu nie będą mogli korzystać posiadacze np. Neostrady, ponieważ przy każdym połączeniu użytkownikowi nadawany jest inny adres IP.

3.b). Jeżeli chcemy zablokować zliczanie odwiedzin użytkownika z dynamicznym IP musimy wysłać mu ciasteczko i potem tylko sprawdzać, czy to ciasteczko jest na jego komputerze. Rozwiązanie ma ten minus, że aby się sprawdzało, użytkownik którego blokujemy nie może usuwać plików cookie z komputera.

Uwaga. Przyjmijmy, że chcemy, żeby licznik nie zliczał naszych wejść na stronę.

Zadanie to wykonujemy w dwóch krokach:
/* 1 */ Ustawiamy ciasteczko o dowolnej nazwie i wartości (tutaj IP i turn_off_counter), ustawiamy ważność ciasteczka na rok.

/* 2 */ Dodajemy warunek sprawdzania, czy istnieje plik cookie.

Teraz zapisujemy zmiany, otwieramy naszą stronę we wszystkich przeglądarkach, których używamy (każda przeglądarka musi pobrać ciasteczko). Dla pewności możemy przejrzeć zawartość ciasteczek, czy na pewno ciasteczko zostało pobrane. Dobrze zrobić to o takiej porze, żeby mieć pewność, że tylko my przeglądamy stronę, ponieważ w tym sposobie blokujemy wszystkich, którzy pobiorą to ciasteczko. Gdy juz pobierzemy ciacho, ponownie otwieramy plik joomla.php i bierzemy w komentarz lub usuwamy funkcję setcookie /* 1 */. Zapisujemy zmiany i mamy spokój na rok lub do najbliższego usunięcia plików cookie :)

function detect() {


/*moje ciacho*/
/* 1 */
setcookie("IP", "turn_off_counter", time() + 60*60*24*365);

/*koniec*/



global $mosConfig_enable_stats;
if ($mosConfig_enable_stats == 1) {
if (mosGetParam( $_COOKIE, 'mosvisitor', 0 )) {
return;
}
setcookie( 'mosvisitor', 1 );

if (phpversion() <= '4.2.1') {
$agent = getenv( 'HTTP_USER_AGENT' );
$domain = @gethostbyaddr( getenv( "REMOTE_ADDR" ) );
} else {
if ( isset($_SERVER['HTTP_USER_AGENT']) ) {
$agent = $_SERVER['HTTP_USER_AGENT'];
} else {
$agent = 'Unknown';
}

$domain = @gethostbyaddr( $_SERVER['REMOTE_ADDR'] );
}

$browser = mosGetBrowser( $agent );

$query = "SELECT COUNT(*)"
. "\n FROM #__stats_agents"
. "\n WHERE agent = '$browser'"
. "\n AND type = 0"
;
$this->_db->setQuery( $query );

if ($this->_db->loadResult()) {
$query = "UPDATE #__stats_agents"
. "\n SET hits = ( hits + 1 )"
. "\n WHERE agent = '$browser'"
. "\n AND type = 0"
;
$this->_db->setQuery( $query );
} else {
$query = "INSERT INTO #__stats_agents"
. "\n ( agent, type )"
. "\n VALUES ( '$browser', 0 )"
;
$this->_db->setQuery( $query );
}

$this->_db->query();


$os = mosGetOS( $agent );

$query = "SELECT COUNT(*)"
. "\n FROM #__stats_agents"
. "\n WHERE agent = '$os'"
. "\n AND type = 1"
;
$this->_db->setQuery( $query );
if ($this->_db->loadResult()) {

/* 2 */
/***********blokowanie***********/
if($_COOKIE['IP'] != 'turn_off_counter'){
/**************/

$query = "UPDATE #__stats_agents"
. "\n SET hits = ( hits + 1 )"
. "\n WHERE agent = '$os'"
. "\n AND type = 1"
;
$this->_db->setQuery( $query );

/********************/
}
/*koniec blokowania*/
}


Wystarczy zablokować tylko te wpisy do bazy jos_stats_agents, ponieważ mod_stats i mod_digit_counter aby określić wartość licznika odwiedzin sumują te rekordy tabeli, które w polu type mają wartość 1.

Mam nadzieję, że opisałem to w zrozumiały sposób.

Pozdrawiam
Bartek

alegorn
02-07-2007, 11:37
w setcookie ustaw jeszcze sciezke, bedzie dzialac w przypadku wywolania strony z linku, historii itp.(tzn nie odnoszacej sie do indexu), ja kiedys mialem z tym pewne problemy.
poza tym - ja jako admin przy testowaniu strony bardzo czesto zabijam sesje (wywalam wlasnie ciasteczka) wiec jesli to by mialo blokowac moje odwiedziny tylko - to sklanialbym sie do rozwiazan pomijajacych ciasteczka :)

zastanawiam sie (a przyznaje szczerze ze nie musialem na cale szczescie sie w to wglebiac) czy przy tym calym dynamizmie ip neo - nie jest zmieniane ostatni czlon nr... wtedy latwiej by bylo zablokowac ip dla przedzialu 000.000.000.xxx pomijajac cala zabawe z ciasteczkami..

pozdraw,Al.

qbratek
02-07-2007, 12:21
Myślałem o blokowaniu przedziału adresów, ale wtedy ciężko będzie blokować jednego konkretnego użytkownika, a właśnie takie życzenie miał mój klient. Poza tym sprawdzałem już wcześniej i dostałem takie adresy przy kolejnych połączeniach:

83.30.214.155
83.30.235.61
83.30.217.50

Trzeba by blokować wszystko z IP 83.30.xxx.xxx, czyli prawdopodobnie dużą część (jeżeli nie wszystkich) użytkowników neostrady, a nie o to chodzi. Sprawa jest o tyle prosta, że jeżeli blokujesz licznik dla klienta, to powinny wystarczyć cookies. Wrzucisz mu ciastko i tylko pilnujesz, żeby go nie usunął. :)

Pozdrawiam
Bartek