GNU/Linux, Open Source, Cloud Computing, DevOps y más...

Cómo excluir tu propia IP [dinámica] de Google Analytics

No hay comentarios

En mi artículo 5 formas de excluir tus propias visitas de Google Analytics discutí los 5 métodos principales que existen para impedir que las visitas que hacemos nosotros mismos a nuestro propio sitio web dejen rastro en las estadísticas de Google Analytics, cada uno con sus pros y sus contras. Sin embargo, he creído necesario desarrollar un poco más el primero de dichos métodos, que a mi juicio es la mejor forma posible de excluir en Google Analytics nuestra propia actividad y la de todos los integrantes de nuestra empresa para que ésta no interfiera con los datos recolectados y éstos sean mucho más fiables.

Y digo Google Analytics porque es el actor principal en este mercado, pero este mismo método es perfectamente válido para cualquier otra herramienta de analítica web como Piwik, Clicky, OWA, Clicktale, StatCounter, Kissmetrics, Mouseflow y tantas otras.

Si no existe el código de seguimiento, es imposible rastrear la visita

Google Analytics tracking codePartimos de la premisa básica de que si el código de seguimiento no existe, entonces no es necesario aplicar ninguna regla de exclusión, ningún filtro ni ningún otro mecanismo que permita distinguirnos a nosotros mismos de cara a Google Analytics para que no tenga en cuenta nuestra actividad, que por lo general no tendrá nada que ver con la que desarrollan los usuarios reales de nuestro sitio web.

Por tanto, si conseguimos controlar a nuestra voluntad si se incluye el código de seguimiento de Google Analytics o no en el código HTML que devuelve nuestra web, entonces no encontraremos forma más segura y fiable de impedir que se tracen nuestros pasos y nuestra interacción con dicho sitio, impidiendo así que se alteren los datos no sólo del número de visitas y usuarios únicos, sino también las muy importantes estadísticas de páginas por visita, porcentaje de rebote, tiempo medio en el sitio, etc. etc.


Error: Your Requested widget " ai_widget-6" is not in the widget list.
  • [do_widget_area above-nav-left]
    • [do_widget_area above-nav-right]
      • [do_widget_area footer-1]
        • [do_widget id="wpp-4"]
      • [do_widget_area footer-2]
        • [do_widget id="recent-posts-4"]
      • [do_widget_area footer-3]
        • [do_widget id="recent-comments-3"]
      • [do_widget_area footer-4]
        • [do_widget id="archives-4"]
      • [do_widget_area logo-bar]
        • [do_widget id="oxywidgetwpml-3"]
      • [do_widget_area menu-bar]
        • [do_widget id="search-3"]
      • [do_widget_area sidebar]
        • [do_widget id="search-4"]
        • [do_widget id="ai_widget-2"]
        • [do_widget id="categories-5"]
        • [do_widget id="ai_widget-3"]
        • [do_widget id="ai_widget-4"]
        • [do_widget id="ai_widget-5"]
      • [do_widget_area sub-footer-1]
        • [do_widget id="text-4"]
      • [do_widget_area sub-footer-2]
        • [do_widget_area sub-footer-3]
          • [do_widget_area sub-footer-4]
            • [do_widget_area upper-footer-1]
              • [do_widget id="search-2"]
              • [do_widget id="recent-posts-2"]
              • [do_widget id="recent-comments-2"]
              • [do_widget id="archives-2"]
              • [do_widget id="categories-2"]
              • [do_widget id="meta-2"]
            • [do_widget_area upper-footer-2]
              • [do_widget_area upper-footer-3]
                • [do_widget_area upper-footer-4]
                  • [do_widget_area widgets_for_shortcodes]
                    • [do_widget id="search-5"]
                    • [do_widget id="ai_widget-6"]
                  • [do_widget_area wp_inactive_widgets]
                    • [do_widget id="wpp-2"]
                    • [do_widget id="text-1"]
                    • [do_widget id="recent-posts-3"]
                    • [do_widget id="categories-3"]
                    • [do_widget id="archives-3"]
                    • [do_widget id="icl_lang_sel_widget-3"]

                  Así, la clave está en hacer una pequeña modificación en el lado del servidor para que el código de nuestra aplicación analice la procedencia del usuario antes de devolver la página solicitada y sea capaz de distinguir si ese usuario somos nosotros o no. Y la mejor forma de distinguirlo es en función de la dirección IP de origen de las conexiones que se establecen con el servidor.

                  Excluir nuestra dirección IP de Google Analytics

                  A continuación muestro un sencillo ejemplo en PHP probado satisfactoriamente en WordPress, pero que se puede integrar en cualquier otro gestor de contenidos como Drupal, Joomla, Bolt, etc. u otro tipo de aplicación. De hecho no lo he creado como un plugin para WordPress precisamente para que se aprecie su simplicidad y sea fácilmente exportable a cualquier otra aplicación e incluso a cualquier otro lenguaje de programación.

                  Consiste en un único fichero check-user-ip.php que situamos en la raíz de la instalación de WordPress (DocumentRoot) y que tiene el siguiente contenido:

                  <?php 
                   
                  $isMyOwnIp = false; 
                  $ownIpAddresses = "37.11.156.11;37.11.168.194;81.52.64.111;37.12.156.43";
                   
                  if ($ownIpAddresses) { 
                      // Tratar de obtener la IP pública del usuario de varias formas con el fin de
                      // ser compatible con distintos servidores web y distintas versiones de éstos
                      if ($_SERVER) { 
                          if ( $_SERVER[HTTP_X_FORWARDED_FOR] ) { 
                              preg_match_all ('/\d+\.\d+\.\d+\.\d+/', $_SERVER[HTTP_X_FORWARDED_FOR], $ipArray); 
                          } else if ( $_SERVER["HTTP_CLIENT_IP"] ) { 
                              preg_match_all ('/\d+\.\d+\.\d+\.\d+/', $_SERVER["HTTP_CLIENT_IP"], $ipArray); 
                          } else { 
                              preg_match_all ('/\d+\.\d+\.\d+\.\d+/', $_SERVER["REMOTE_ADDR"], $ipArray); 
                          } 
                      } else { 
                          if ( getenv( "HTTP_X_FORWARDED_FOR" ) ) { 
                              preg_match_all ('/\d+\.\d+\.\d+\.\d+/', getenv( "HTTP_X_FORWARDED_FOR" ), $ipArray); 
                          } elseif ( getenv( "HTTP_CLIENT_IP" ) ) { 
                              preg_match_all ('/\d+\.\d+\.\d+\.\d+/', getenv( "HTTP_CLIENT_IP" ), $ipArray); 
                          } else { 
                              preg_match_all ('/\d+\.\d+\.\d+\.\d+/', getenv( "REMOTE_ADDR" ), $ipArray); 
                          } 
                      }
                   
                      // Comprobar si la IP pública del usuario coincide con alguna de la lista de exclusión 
                      foreach ($ipArray[0] as $userIp) { 
                          if (strpos($ownIpAddresses, $userIp) !== false) {
                              $isMyOwnIp = true; 
                          } 
                      } 
                  }

                  El script anterior simplemente comprueba si la IP pública del usuario coincide con alguna de las de la lista de exclusión, que consiste en una cadena de direcciones IP separadas por punto y coma (;). En caso afirmativo el valor de la variable $isMyOwnIp cambiará a true, en lugar del valor por defecto, que es false.

                  Ahora simplemente tenemos que incluir este script en la plantilla del footer de nuestro tema de WordPress o en aquel fichero de nuestra aplicación donde se incluya la etiqueta de cierra </body> de cada página, ya que será ahí donde normalmente se incluirá el código de seguimiento de Google Analytics o de cualquier otra aplicación de analítica web. En nuestro ejemplo simplemente lo añadimos al fichero wp-content/themes/lambda-child/footer.php (líneas 128 y 129) de nuestro tema Lambda de Oxygenna:

                  126         <?php $google_anal = oxy_get_option( 'google_anal' ); ?> 
                  127         <?php if( !empty( $google_anal ) ) : ?> 
                  128             <?php include ('check-user-ip.php'); ?> 
                  129             <?php if (!$isMyOwnIp) echo oxy_get_option( 'google_anal' ); ?> 
                  130             <?php //echo oxy_get_option( 'google_anal' ); ?> 
                  131         <?php endif; ?>

                  Y eso es todo. A partir de este momento, cualquier visita que hagamos a nuestro sitio web desde alguna de las direcciones IP de la lista de exclusión no contará en las estadísticas de Google Analytics. Lo mejor es que esto será así independientemente del dispositivos que elijamos para acceder, ya sea el ordenador, la tableta, el móvil, una Smart TV o la Play Station, y sin que tengamos que hacer nada más, ni acordarnos de instalar cookies, ni configurar filtros en Google Analytics, ni instalar extensiones en el navegador, ni nada de nada.


                  Error: Your Requested widget " ai_widget-6" is not in the widget list.
                  • [do_widget_area above-nav-left]
                    • [do_widget_area above-nav-right]
                      • [do_widget_area footer-1]
                        • [do_widget id="wpp-4"]
                      • [do_widget_area footer-2]
                        • [do_widget id="recent-posts-4"]
                      • [do_widget_area footer-3]
                        • [do_widget id="recent-comments-3"]
                      • [do_widget_area footer-4]
                        • [do_widget id="archives-4"]
                      • [do_widget_area logo-bar]
                        • [do_widget id="oxywidgetwpml-3"]
                      • [do_widget_area menu-bar]
                        • [do_widget id="search-3"]
                      • [do_widget_area sidebar]
                        • [do_widget id="search-4"]
                        • [do_widget id="ai_widget-2"]
                        • [do_widget id="categories-5"]
                        • [do_widget id="ai_widget-3"]
                        • [do_widget id="ai_widget-4"]
                        • [do_widget id="ai_widget-5"]
                      • [do_widget_area sub-footer-1]
                        • [do_widget id="text-4"]
                      • [do_widget_area sub-footer-2]
                        • [do_widget_area sub-footer-3]
                          • [do_widget_area sub-footer-4]
                            • [do_widget_area upper-footer-1]
                              • [do_widget id="search-2"]
                              • [do_widget id="recent-posts-2"]
                              • [do_widget id="recent-comments-2"]
                              • [do_widget id="archives-2"]
                              • [do_widget id="categories-2"]
                              • [do_widget id="meta-2"]
                            • [do_widget_area upper-footer-2]
                              • [do_widget_area upper-footer-3]
                                • [do_widget_area upper-footer-4]
                                  • [do_widget_area widgets_for_shortcodes]
                                    • [do_widget id="search-5"]
                                    • [do_widget id="ai_widget-6"]
                                  • [do_widget_area wp_inactive_widgets]
                                    • [do_widget id="wpp-2"]
                                    • [do_widget id="text-1"]
                                    • [do_widget id="recent-posts-3"]
                                    • [do_widget id="categories-3"]
                                    • [do_widget id="archives-3"]
                                    • [do_widget id="icl_lang_sel_widget-3"]

                                  Un momento, ¿y si mi dirección IP pública es dinámica?

                                  Si la IP pública de nuestra conexión a Internet es dinámica sería bastante tedioso tener que actualizar constantemente la lista de exclusión cada vez que la IP cambia, cosa que ocurre con una frecuencia impredecible y sin ningún aviso previo por parte de nuestro proveedor de acceso. De hecho, no llegaría probablemente ni a ser tedioso porque directamente descartarías este método y buscarías otro alternativo. Pero si continúas leyendo descubrirás que con algunas adaptaciones adicionales este método también es para ti aunque seas un nómada digital y cambies de IP constantemente.

                                  Utilizando un cliente de DNS dinámico en nuestro móvil que no apunta a ningún servidor DDNS

                                  Hoy en día nuestro smartphone nos acompaña a todas partes y con toda probabilidad lo conectaremos a la misma wifi del lugar en el que estemos trabajando, ya sea en casa, la oficina o un cibercafé. O si no quieres usar una wifi pública preferirás aprovechar la conexión de tu propio móvil para conectar otros dispositivos como la tablet o el portátil. En cualquiera de los dos casos la IP pública de nuestra conexión será perfectamente visible para nuestro móvil, por lo que si conseguimos que el solo se encargue automáticamente de añadir la IP de nuestra conexión a Internet a la lista de exclusiones de nuestro sitio web habremos solucionado el problema.

                                  Aquí es donde entra en escena una aplicación muy sencilla que instalaremos en nuestro smartphone: un cliente DDNS o de DNS dinámico. Lo normal es utilizar un cliente DDNS para conectarse a un servidor DDNS que nos ofrezca un proveedor como Dyn.com o NoIP.com, que suelen ser de pago si queremos usar nuestro propio dominio. En cualquier caso, para conseguir nuestro objetivo no será necesario utilizar ningún servicio DDNS, pues es suficiente con obtener la dirección IP pública de nuestra conexión a Internet sin necesidad de que ésta se tenga que mapear a un nombre. Por tanto, nos basta con instalar una app gratuita como Dynamic DNS Update en nuestro Android y nada más.Dynamic DNS Update Logo

                                  Esto es así porque los clientes DDNS comunican las actualizaciones de direcciones IP realizando llamadas HTTP al servidor DDNS en las que se pasa como parámetro la nueva IP que ha cambiado y algunas otras variables auxiliares.

                                  Así, en lugar de realizar la función habitual de actualizar nombres de dominio, vamos a capturar dichas llamadas HTTP en nuestro servidor web para extraer directamente la dirección IP que ha cambiado y añadirla automáticamente a nuestra lista de exclusión. Para ello es necesario que la app de cliente de DNS dinámico que elijamos permita seleccionar un proveedor DDNS personalizado que no sea ninguno de la lista habitual de proveedores de este tipo de servicio para que nos deje introducir la URL de actualización manualmente. La app Dynamic DNS Update que he mencionado como ejemplo permite hacer esto, por lo que es idónea en este sentido.

                                  Configuración de la app Dynamic DNS Update

                                  Básicamente tendremos que añadir un nuevo actualizador (updater) para nuestro sitio web que consistirá en una URL de actualización personalizada y unas credenciales de acceso para que sólo nosotros podamos realizar actualizaciones de IP desde nuestro móvil.

                                  La URL de actualización tendrá el siguiente aspecto:

                                  https://www.daniloaz.com/update-my-own-public-ip.php?hostname=%hostname%&username=%username%&password=%password%&ip=%ip%

                                  El resto de parámetros de configuración de la app se pueden ver en las siguientes capturas de pantalla:

                                  Dynamic DNS Update configuration: step 1
                                  Dynamic DNS Update configuration: step 2
                                  Dynamic DNS Update log file

                                  Configuración en el lado del servidor

                                  Una vez configurado el cliente DDNS ya sólo nos queda capturar las peticiones HTTP de actualización en nuestro servidor. Para ello añadiremos al DocumentRoot de nuestra instalación WordPress el siguiente script update-my-own-public-ip.php que extraiga la información necesaria y actualice la lista de exclusión:

                                  <?php 
                                   
                                  $newIpAddresses     = array(); 
                                  $ipAddressesToStore = 5; 
                                  $ownIpAddressesFile = 'own-ip-addresses.lst'; 
                                  $currentIpAddresses = file_get_contents($ownIpAddressesFile, false); 
                                  $myUsername         = 'daniloaz'; 
                                  $myPassword         = 'test'; 
                                  $myHostname         = 'www.daniloaz.com'; 
                                   
                                  // Obtener variables de la petición y sanearlas por seguridad 
                                  $username = filter_var($_REQUEST['username'], FILTER_SANITIZE_STRING); 
                                  $password = filter_var($_REQUEST['password'], FILTER_SANITIZE_STRING); 
                                  $hostname = filter_var($_REQUEST['hostname'], FILTER_SANITIZE_STRING); 
                                  $newIp    = filter_var($_REQUEST['ip'], FILTER_SANITIZE_STRING); 
                                   
                                  // Comprobación de seguridad antes de actualizar las direcciones IP del fichero 
                                  if ($username != $myUsername or $password != $myPassword or $hostname != $myHostname) { 
                                      echo "<h1>Forbidden</h1>"; 
                                      header("HTTP/1.0 403 Forbidden"); 
                                      die(); 
                                  } 
                                   
                                  // Si la nueva IP no está ya en la lista de exclusión actualizamos el fichero 
                                  if (strpos($currentIpAddresses, $newIp) === false) { 
                                      $currentIpAddresses = explode (';', $currentIpAddresses); 
                                      // Conservar únicamente las $ipAddressesToStore direcciones más recientes 
                                      array_unshift($currentIpAddresses, $newIp); 
                                      for($i=0;$i<$ipAddressesToStore;$i++) { 
                                          if ($currentIpAddresses[$i]) { 
                                              $newIpAddresses[] = $currentIpAddresses[$i]; 
                                          } 
                                      } 
                                      // Actualizar fichero 
                                      $newIpAddresses = implode(';', $newIpAddresses); 
                                      file_put_contents($ownIpAddressesFile, $newIpAddresses); 
                                      // Notificar el cambio por email 
                                      mail('daniloaz@gmail.com', 'Own public IP address updated', file_get_contents($ownIpAddressesFile, false)); 
                                  } 
                                   
                                  echo 'Own IP addresses: ' . file_get_contents($ownIpAddressesFile, false);

                                  Como se puede ver en el código, la lista de direcciones IP que no deben contar para Google Analytics se mantiene en un fichero aparte (own-ip-addresses.lst). Por tanto, será necesario modificar la línea 4 del script check-user-ip.php que puse al principio cuando trataba el caso de IP’s fijas:

                                  $ownIpAddresses = file_get_contents('own-ip-addresses.lst', false);

                                  La variable $ownIpAddresses contendrá en este caso una lista de direcciones IP que se comportará como una pila FIFO (First In, First Out) en la que las direcciones más recientes van desplazando a las más antiguas. El número de elementos almacenados en la pila vendrá determinado por el valor de la variable $ipAddressesToStore.

                                  Resumiendo…

                                  Nada más. Ahora cada vez que la app Dynamic DNS Update instalada en nuestro móvil detecte un cambio en la dirección IP pública de su conexión a Internet actualizará automáticamente el fichero own-ip-addresses.lst a través de una llamada HTTP al script update-my-own-public-ip.php. Este cambio hará a su vez que cuando accedamos a nuestro sitio y se ejecute el script check-user-ip.php, éste detecte que somos nosotros y no incluya el código de seguimiento de Google Analytics de modo que dicha visita no quedará registrada de ningún modo.

                                  Espero que este método te sea tan útil a ti como lo es para mi y a partir de ahora puedas acceder cuando quieras y desde donde quieras a tu web con cualquier dispositivo sin tener que preocuparte nunca más por alterar tus estadísticas de Google Analytics.

                                   

                                  Sobre el autor

                                  Daniel López Azaña
                                  Arquitecto de soluciones Cloud AWS & Linux Sysadmin Freelance

                                  Emprendedor, generador de ideas y mente inquieta. Apasionado de las nuevas tecnologías, especialmente de los sistemas Linux y del software libre. Me gusta escribir además sobre actualidad tecnológica, Cloud Computing, AWSi, DevOps, DevSecOps, seguridad, desarrollo web y programación, SEO, ciencia, innovación, emprendimiento, etc.

                                  DanielCómo excluir tu propia IP [dinámica] de Google Analytics

                                  Artículos relacionados

                                  Deja una respuesta

                                  Tu dirección de correo electrónico no será publicada.