Motori visitano il mio sito e il db segna il conteggio

Discussione in 'PHP' iniziata da Shyson, 4 Giugno 2014.

  1. Shyson

    Shyson Utente Attivo

    Registrato:
    19 Agosto 2012
    Messaggi:
    1.111
    Mi Piace Ricevuti:
    1
    Punteggio:
    38
    Sesso:
    Maschio
    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); 
    ?>

     
  2. criric

    criric Super Moderatore Membro dello Staff SUPER MOD MOD

    Registrato:
    21 Agosto 2010
    Messaggi:
    5.607
    Mi Piace Ricevuti:
    54
    Punteggio:
    48
    Sesso:
    Maschio
    Località:
    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
    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 )
     
  3. Shyson

    Shyson Utente Attivo

    Registrato:
    19 Agosto 2012
    Messaggi:
    1.111
    Mi Piace Ricevuti:
    1
    Punteggio:
    38
    Sesso:
    Maschio
    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
        
    }  
    ...
     
  4. criric

    criric Super Moderatore Membro dello Staff SUPER MOD MOD

    Registrato:
    21 Agosto 2010
    Messaggi:
    5.607
    Mi Piace Ricevuti:
    54
    Punteggio:
    48
    Sesso:
    Maschio
    Località:
    TN
    no, c'è anche questo
    in questo caso dovresti cercare crawler
    e probabilmente c'è ne sono altri, forse ti converrebbe memorizzare anche gli agent delle visite e tra un mese li analizzi
     
  5. Shyson

    Shyson Utente Attivo

    Registrato:
    19 Agosto 2012
    Messaggi:
    1.111
    Mi Piace Ricevuti:
    1
    Punteggio:
    38
    Sesso:
    Maschio
    Qui ne ho trovati tanti, li devo inserire tutti nel codice?

    http://it.wikipedia.org/wiki/Crawler
     
  6. criric

    criric Super Moderatore Membro dello Staff SUPER MOD MOD

    Registrato:
    21 Agosto 2010
    Messaggi:
    5.607
    Mi Piace Ricevuti:
    54
    Punteggio:
    48
    Sesso:
    Maschio
    Località:
    TN
    No, devi analizzare il loro agent e vedere se contengono le parole bot o crawler
     
  7. Shyson

    Shyson Utente Attivo

    Registrato:
    19 Agosto 2012
    Messaggi:
    1.111
    Mi Piace Ricevuti:
    1
    Punteggio:
    38
    Sesso:
    Maschio
    Qui ne ho trovati tanti, ora, come trovo lo spider da inserire nel mio codice?

    http://user-agent-string.info/list-of-ua/bots
     
  8. criric

    criric Super Moderatore Membro dello Staff SUPER MOD MOD

    Registrato:
    21 Agosto 2010
    Messaggi:
    5.607
    Mi Piace Ricevuti:
    54
    Punteggio:
    48
    Sesso:
    Maschio
    Località:
    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
     
  9. Shyson

    Shyson Utente Attivo

    Registrato:
    19 Agosto 2012
    Messaggi:
    1.111
    Mi Piace Ricevuti:
    1
    Punteggio:
    38
    Sesso:
    Maschio
    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")) { 
    }  
     
  10. criric

    criric Super Moderatore Membro dello Staff SUPER MOD MOD

    Registrato:
    21 Agosto 2010
    Messaggi:
    5.607
    Mi Piace Ricevuti:
    54
    Punteggio:
    48
    Sesso:
    Maschio
    Località:
    TN
    La funzione strpos() lavora solo su una stringa, devi usare un ciclo come ti ho mostrato nella funzione
     
  11. Shyson

    Shyson Utente Attivo

    Registrato:
    19 Agosto 2012
    Messaggi:
    1.111
    Mi Piace Ricevuti:
    1
    Punteggio:
    38
    Sesso:
    Maschio
    Si, però a me non serve mettere un eco, semplicemente non lo fa conteggiare
     
  12. criric

    criric Super Moderatore Membro dello Staff SUPER MOD MOD

    Registrato:
    21 Agosto 2010
    Messaggi:
    5.607
    Mi Piace Ricevuti:
    54
    Punteggio:
    48
    Sesso:
    Maschio
    Località:
    TN
    Il mio è un esempio, logicamente devi adattarlo al tuo script
     
  13. Shyson

    Shyson Utente Attivo

    Registrato:
    19 Agosto 2012
    Messaggi:
    1.111
    Mi Piace Ricevuti:
    1
    Punteggio:
    38
    Sesso:
    Maschio
    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) { 
    ...
     
  14. Shyson

    Shyson Utente Attivo

    Registrato:
    19 Agosto 2012
    Messaggi:
    1.111
    Mi Piace Ricevuti:
    1
    Punteggio:
    38
    Sesso:
    Maschio
    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: 6 Giugno 2014
  15. criric

    criric Super Moderatore Membro dello Staff SUPER MOD MOD

    Registrato:
    21 Agosto 2010
    Messaggi:
    5.607
    Mi Piace Ricevuti:
    54
    Punteggio:
    48
    Sesso:
    Maschio
    Località:
    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'");
            }
        }
    }
     
  16. Shyson

    Shyson Utente Attivo

    Registrato:
    19 Agosto 2012
    Messaggi:
    1.111
    Mi Piace Ricevuti:
    1
    Punteggio:
    38
    Sesso:
    Maschio
    Nel frattempo ti avevo mandato il post #14

    Ho notato tramite l'ip che uno spider frequente è quello di Facebook, come si fa a individuarlo per inserirlo nel codice?
     
  17. criric

    criric Super Moderatore Membro dello Staff SUPER MOD MOD

    Registrato:
    21 Agosto 2010
    Messaggi:
    5.607
    Mi Piace Ricevuti:
    54
    Punteggio:
    48
    Sesso:
    Maschio
    Località:
    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"
     
  18. Shyson

    Shyson Utente Attivo

    Registrato:
    19 Agosto 2012
    Messaggi:
    1.111
    Mi Piace Ricevuti:
    1
    Punteggio:
    38
    Sesso:
    Maschio
    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: 6 Giugno 2014
  19. criric

    criric Super Moderatore Membro dello Staff SUPER MOD MOD

    Registrato:
    21 Agosto 2010
    Messaggi:
    5.607
    Mi Piace Ricevuti:
    54
    Punteggio:
    48
    Sesso:
    Maschio
    Località:
    TN
    Non saprei come convertire quei comandi in php
     
  20. Shyson

    Shyson Utente Attivo

    Registrato:
    19 Agosto 2012
    Messaggi:
    1.111
    Mi Piace Ricevuti:
    1
    Punteggio:
    38
    Sesso:
    Maschio
    Ok, fai una prova adesso al mio sito così vedo se ti registra, perché con questo codice qui le visite sono calate a zero

    http://www.gruppoalveo.altervista.org/
     
Sto caricando...

Condividi questa Pagina