Motori visitano il mio sito e il db segna il conteggio

Shyson

Utente Attivo
19 Ago 2012
1.145
1
38
Questo codice memorizza il numero di visite che fanno gli utenti al mio sito, però mi sono accorto che nel database si memorizzano anche le visite che fanno i motori di ricerca e anche Facebook. Vorrei modificare il codice in modo che il db registri solo gli utenti.

PHP:
<?php
//Mette i dati nel DB e aumenta il contatore ad ogni visita
function contatore($pagina) { 
//RICORDA di memorizzare l'url http://gruppoalveo.altervista.org/cookie.php +invio IN TUTTI I BROWSERs
if (empty($_COOKIE["contavisite"])) { //Richiama il cookie che c'è in cookie.php
  $continua = false; 
  if (isset($_SERVER['HTTP_REFERER']) != "") {
  $from = parse_url($_SERVER['HTTP_REFERER']);
  $from = $from['host'];
}
else {
  $from = "";
} 
$whitelist = array( 
/*Qui scrivi l'url del sito in modo che quando l'utente vi arriva DA TERZI, anche se digita con le pagine, il contatore non sale.
Se poi è nel mio sito e ci clicca su, ovviamente il contatore nel db sale*/
"www.gruppoalveo.altervista.org", //Scrivi gli url senza http://
"gruppoalveo.altervista.org",
"www.gruppoalveo.it",
"gruppoalveo.it"
  ); 
  foreach ($whitelist as $sito) { 
    if ($from == $sito) $continua = true; 
  } 
 if ($continua) { 
    $data_localeS=time();
    $mysqli = new mysqli("localhost", "gruppoalveo", "pwd", "my_gruppoalveo");    
    $giorno=array('Dom','Lun','Mar','Mer','Gio','Ven','Sab'); 
    $mese=array('gen','feb','mar','apr','mag','giu','lug','ago','set','ott','nov','dic');
    $dataGmtS=$giorno[date('w')].' '.date('d').' '.$mese[date('m')-1].' '.date('Y - H:i:s');
    $ip=$_SERVER['REMOTE_ADDR']; 
    $url = $_SERVER['PHP_SELF']; 
    $esiste = $mysqli->query ("SELECT * FROM visitate WHERE url='$url'"); 
    if ($esiste->num_rows == 0) { 
       $visite = 1;  
       $mysqli->query ("INSERT INTO visitate(data_localeS, dataGmtS, pagina, url, visite, ip) 
                                VALUES ('$data_localeS', '$dataGmtS', '$pagina', '$url', '$visite', '$ip')");       
       }
       else { 
      $old = $esiste->fetch_array(MYSQLI_ASSOC);   
      $visite = $old['visite'] + 1; 
      $mysqli->query("UPDATE visitate SET data_localeS='$data_localeS', dataGmtS='$dataGmtS', pagina='$pagina', visite='$visite', ip='$ip' WHERE url='$url'"); 
    } 
  } 
}   
}
//Estrae i dati dal DB e crea la sequenza delle pagine più viste  
$mysqli = new mysqli("localhost", "gruppoalveo", "pwd", "my_gruppoalveo");  
   $pag_viste = $mysqli->query("SELECT * FROM visitate ORDER BY visite DESC LIMIT 0,7"); //Visualizza il numero di items
  if ($pag_viste->num_rows > 0) {
    echo "<div class=\"menuVisti\">";
    while ($link = $pag_viste->fetch_array(MYSQLI_ASSOC)) {  
    echo "<div class=\"numeroVisite\">".$link["visite"]." volte</div>";  
    echo "<a class=\"visti\" href='".$link['url']."'>&bull;&nbsp;&nbsp;&nbsp;".$link['pagina']."</a>";
    }
  echo "</div>";
  }

error_reporting (E_ALL); 
?>
 

criric

Super Moderatore
Membro dello Staff
SUPER MOD
MOD
21 Ago 2010
5.607
54
48
TN
Ciao, puoi verificare il contenuto della variabile $_SERVER["HTTP_USER_AGENT"] per identificare se appartiene ad un motore di ricerca
questo è uno degli agent che rilasciano gli spider di google
Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)
PHP:
    if (strpos($_SERVER["HTTP_USER_AGENT"], "bot")) {
     // non fai l'insert
    }
In genere trovi sempre all'interno la parola bot ( forse c'è qualche eccezione )
 

Shyson

Utente Attivo
19 Ago 2012
1.145
1
38
Ciao, puoi verificare il contenuto della variabile $_SERVER["HTTP_USER_AGENT"] per identificare se appartiene ad un motore di ricerca
questo è uno degli agent che rilasciano gli spider di google

PHP:
    if (strpos($_SERVER["HTTP_USER_AGENT"], "bot")) {
     // non fai l'insert
    }
In genere trovi sempre all'interno la parola bot ( forse c'è qualche eccezione )
Così va bene per tutti i motori?

PHP:
?php
//Mette i dati nel DB e aumenta il contatore ad ogni visita
function contatore($pagina) { 
//RICORDA di memorizzare l'url http://gruppoalveo.altervista.org/cookie.php +invio IN TUTTI I BROWSERs
if (empty($_COOKIE["contavisite"])) { //Richiama il cookie che c'è in cookie.php
  $continua = false; 
  if (isset($_SERVER['HTTP_REFERER']) != "") {
  $from = parse_url($_SERVER['HTTP_REFERER']);
  $from = $from['host'];
}
else {
  $from = "";
} 
$whitelist = array( 
/*Qui scrivi l'url del sito in modo che quando l'utente vi arriva DA TERZI, anche se digita con le pagine, il contatore non sale.
Se poi è nel mio sito e ci clicca su, ovviamente il contatore nel db sale*/
"www.gruppoalveo.altervista.org", //Scrivi gli url senza http://
"gruppoalveo.altervista.org",
"www.gruppoalveo.it",
"gruppoalveo.it"
  ); 
  foreach ($whitelist as $sito) { 
    if ($from == $sito) $continua = true; 
  } 
  if (strpos($_SERVER["HTTP_USER_AGENT"], "bot")) {
     // non fai l'insert
    }  
...
 

criric

Super Moderatore
Membro dello Staff
SUPER MOD
MOD
21 Ago 2010
5.607
54
48
TN
No, devi analizzare il loro agent e vedere se contengono le parole bot o crawler
 

criric

Super Moderatore
Membro dello Staff
SUPER MOD
MOD
21 Ago 2010
5.607
54
48
TN
Potresti creare una funzione cosi
PHP:
function is_spider($agent) {

    $spider = array("bot", "spider", "crawler");

    foreach ($spider as $value) {
        if (strpos(strtolower($agent), $value) !== false) {
            return true;
        }
    }
    return false;
}
Nell'array puoi aggiungere tutte le parole che ti fanno capire che la stringa dell'agent appartiene ad uno spider
la richiami in questo modo
PHP:
$agent = $_SERVER["HTTP_USER_AGENT"];
if (is_spider($agent)) {
    echo "Questo Agent appartiene ad uno spider";
} else {
    echo "Questo Agent NON appartiene ad uno spider";
}
Io di solito registro tutte le visite e memorizzo anche gli agent, poi faccio la distinzione quando mostro i risultati
 

Shyson

Utente Attivo
19 Ago 2012
1.145
1
38
Potresti creare una funzione cosi
PHP:
function is_spider($agent) {

    $spider = array("bot", "spider", "crawler");

    foreach ($spider as $value) {
        if (strpos(strtolower($agent), $value) !== false) {
            return true;
        }
    }
    return false;
}
Nell'array puoi aggiungere tutte le parole che ti fanno capire che la stringa dell'agent appartiene ad uno spider
la richiami in questo modo
PHP:
$agent = $_SERVER["HTTP_USER_AGENT"];
if (is_spider($agent)) {
    echo "Questo Agent appartiene ad uno spider";
} else {
    echo "Questo Agent NON appartiene ad uno spider";
}
Io di solito registro tutte le visite e memorizzo anche gli agent, poi faccio la distinzione quando mostro i risultati
A me non interessa memorizzarli, io li voglio escludere a priori, ho trovato anche questa lista però non trovo quello di facebook. http://www.useragentstring.com/pages/useragentstring.php

Così può andare?

PHP:
if (strpos($_SERVER["HTTP_USER_AGENT"], "bot, sistrix, slurp, bingbot")) { 
}
 

criric

Super Moderatore
Membro dello Staff
SUPER MOD
MOD
21 Ago 2010
5.607
54
48
TN
La funzione strpos() lavora solo su una stringa, devi usare un ciclo come ti ho mostrato nella funzione
 

criric

Super Moderatore
Membro dello Staff
SUPER MOD
MOD
21 Ago 2010
5.607
54
48
TN
Il mio è un esempio, logicamente devi adattarlo al tuo script
 

Shyson

Utente Attivo
19 Ago 2012
1.145
1
38
Il mio è un esempio, logicamente devi adattarlo al tuo script
L'ho messo così però non so se va bene, eppoi che me ne faccio di quegli echo?

PHP:
<?php
//Mette i dati nel DB e aumenta il contatore ad ogni visita
function contatore($pagina) { 
if (empty($_COOKIE["contavisite"])) { //Richiama il cookie che c'è in cookie.php
  $continua = false; 
  if (isset($_SERVER['HTTP_REFERER']) != "") {
  $from = parse_url($_SERVER['HTTP_REFERER']);
  $from = $from['host'];
}
else {
  $from = "";
} 
$whitelist = array( 
/*Qui scrivi l'url del sito in modo che quando l'utente vi arriva DA TERZI, anche se digita con le pagine, il contatore non sale.
Se poi è nel mio sito e ci clicca su, ovviamente il contatore nel db sale*/
"www.gruppoalveo.altervista.org", //Scrivi gli url senza http://
"gruppoalveo.altervista.org",
"www.gruppoalveo.it",
"gruppoalveo.it"
  ); 
  foreach ($whitelist as $sito) { 
    if ($from == $sito) $continua = true; 
  } 
//Riconosce che è uno spider e non conteggia le sue visite 
function is_spider($agent) {
$spider = array("bot", "spider", "crawler", "sistrix", "slurp", "bingbot");
foreach ($spider as $value) {
 if (strpos(strtolower($agent), $value) !== false) {
return true;
  }
}
return false;
}  

$agent = $_SERVER["HTTP_USER_AGENT"];
if (is_spider($agent)) {
    echo "Questo Agent appartiene ad uno spider";
} else {
    echo "Questo Agent NON appartiene ad uno spider";
}  
if ($continua) { 
...
 

Shyson

Utente Attivo
19 Ago 2012
1.145
1
38
Mi vien da pensare una cosa: non è più semplice mettere una funzione con questi 2 items? Nel robot.text da accesso a tutti gli spider in tutti i file e directory del sito, noi invece nella nostra funzione li blocchiamo tutti

User-agent: *
Disallow:
 
Ultima modifica:

criric

Super Moderatore
Membro dello Staff
SUPER MOD
MOD
21 Ago 2010
5.607
54
48
TN
Gli echo puoi toglierli
PHP:
if (is_spider($agent)) {
    // non fai niente
} else {
    if ($continua) {
        $data_localeS = time();
        $mysqli = new mysqli("localhost", "gruppoalveo", "pwd", "my_gruppoalveo");
        $giorno = array('Dom', 'Lun', 'Mar', 'Mer', 'Gio', 'Ven', 'Sab');
        $mese = array('gen', 'feb', 'mar', 'apr', 'mag', 'giu', 'lug', 'ago', 'set', 'ott', 'nov', 'dic');
        $dataGmtS = $giorno[date('w')] . ' ' . date('d') . ' ' . $mese[date('m') - 1] . ' ' . date('Y - H:i:s');
        $ip = $_SERVER['REMOTE_ADDR'];
        $url = $_SERVER['PHP_SELF'];
        $esiste = $mysqli->query("SELECT * FROM visitate WHERE url='$url'");
        if ($esiste->num_rows == 0) {
            $visite = 1;
            $mysqli->query("INSERT INTO visitate(data_localeS, dataGmtS, pagina, url, visite, ip) 
                                VALUES ('$data_localeS', '$dataGmtS', '$pagina', '$url', '$visite', '$ip')");
        } else {
            $old = $esiste->fetch_array(MYSQLI_ASSOC);
            $visite = $old['visite'] + 1;
            $mysqli->query("UPDATE visitate SET data_localeS='$data_localeS', dataGmtS='$dataGmtS', pagina='$pagina', visite='$visite', ip='$ip' WHERE url='$url'");
        }
    }
}
 

criric

Super Moderatore
Membro dello Staff
SUPER MOD
MOD
21 Ago 2010
5.607
54
48
TN
Non ho capito la domanda del #14 ma prova a leggere questo articolo
Non sapevo che facebook avesse degli spider, forse ti basta aggiungere nell'array la parola "facebook"
 

Shyson

Utente Attivo
19 Ago 2012
1.145
1
38
Non ho capito la domanda del #14 ma prova a leggere questo articolo
Non sapevo che facebook avesse degli spider, forse ti basta aggiungere nell'array la parola "facebook"
Riguardo al post #14: io nella directory ho un robot.txt che permette a tutti gli spider di indicizzare tutti i miei file

User-agent: * //L'asterisco User-agent* significa "Qualunque spider può accedere", altrimenti metti solo il nome dello spider che vuoi che acceda, es: User-agent: googlebot

Disallow: //Se vuoto, vuol dire che tutte le directory ed i file saranno indicizzati dallo spider.

Disallow: / //(con la barra) vuol dire che IMPEDISCE di indicizzare qualunque cosa,
è il contrario di Disallow: (vuoto)


Perciò, se noi usiamo questo principio e lo mettiamo nel codice, tutti gli spider vengono bloccati dal contavisite
 
Ultima modifica:

criric

Super Moderatore
Membro dello Staff
SUPER MOD
MOD
21 Ago 2010
5.607
54
48
TN
Non saprei come convertire quei comandi in php