Cómo trabajar con Yandex Metrica y Logs API

Aunque Yandex Metrica permite crear segmentos, informes y dashboards personalizados, es posible que en algunos proyectos necesitemos más libertad a la hora de trabajar con los datos que registra Metrica.

Hay que recordar que Yandex Metrica no aplica muestreo y tenemos acceso a los datos en bruto de nuestros contadores.

La API de Yandex Metrica es bastante potente. He hablado sobre ella en algún evento de analítica web, está muy bien documentada y es sencilla de usar. Pero últimamente he estado probando Logs API con contadores de Metrica, y creo que las posibilidades son increíbles, ya que básicamente te llevas los datos que quieres para hacer luego lo que necesites con ellos.

Y con este artículo quiero hacerte una introducción a Logs API para que puedas realizar peticiones para generar un log con los datos que quieras. Yandex te sugiere, obviamente, que una vez tengas los datos conectes con ClickHouse, pero lo cierto es que puedes llevártelos donde quieras.

Paso 1: registra una aplicación con Yandex OAuth

Esto es obligatorio, aunque muy sencillo. Sin registrar una aplicación, no podremos obtener un token de acceso y sin el token de acceso, las llamadas a la API de Yandex (sea la de Metrica o la de Logs) nos dirán que el acceso no está autorizado.

Empieza en la página de Yandex OAuth y registra una aplicación

https://oauth.yandex.com/

Rellena todos los datos, selecciona Web services como plataforma en la que usarás la aplicación que estás registrando. Indica que la URL de retorno (Callback URL) será la de desarrollo, y marca los permisos que necesites. Para el objetivo de lo que estoy contando, basta con los permisos de acceso a las estadísticas de los contadores de Yandex Metrica.

Cuando tengas registrada la aplicación, verás que te muestra tres datos:

  • ID
  • Password
  • Callback URL

Necesitarás el ID para obtener el token con el que harás luego las llamadas a la API.

Para obtener el token, ve a esta dirección, cambiando ID por el ID de la aplicación que acabas de registrar:

https://oauth.yandex.com/authorize?response_type=token&client_id=<ID>

Con esto, obtenemos lo que Yandex llama el Debugging token, aunque si lo que vas a hacer depende únicamente de tu lado, este token de desarrollo puede valer sin más.

Al visitar esa URL, te devolverá el token de acceso, una cadena alfanumérica que nos servirá para autenticar las llamadas que haremos a la API.

Y así, ya podemos continuar preparando la parte en la que recuperaremos los datos de nuestros contadores de Metrica.

Paso 2: consulta los logs que has solicitado

Además del token de acceso, vamos a necesitar el ID del contador de Yandex Metrica del que vamos a recuperar datos. Lo tienes en el listado de códigos que tienes creados en Yandex Metrica.

https://api-metrica.yandex.net/management/v1/counter/<contadorID>/logrequests

Donde:

  • <contadorID>: identificador del código de Yandex Metrica del que quieres recuperar los datos

La llamada a la API:

$metrica_url = "https://api-metrica.yandex.net/management/v1/counter/<CONTADORID>/logrequests";

$ch = curl_init();
curl_setopt ($ch, CURLOPT_URL,$metrica_url);
curl_setopt ($ch, CURLOPT_HTTPHEADER, array("Authorization: OAuth <DEBUGGINGTOKEN>"));
curl_setopt ($ch, CURLOPT_USERAGENT, "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.6) Gecko/20070725 Firefox/2.0.0.6");
curl_setopt ($ch, CURLOPT_TIMEOUT, 60);
curl_setopt ($ch, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt ($ch, CURLOPT_RETURNTRANSFER, 1);
$metrica_result = curl_exec ($ch);
curl_close($ch);

$metrica_output = json_decode($metrica_result);
print_r($metrica_output);

El resultado:

stdClass Object
(
    [requests] => Array
        (
            [0] => stdClass Object
                (
                    [request_id] => <REQUESTID>
                    [counter_id] => <CONTADORID>
                    [source] => hits
                    [date1] => 2019-09-01
                    [date2] => 2019-09-21
                    [fields] => Array
                        (
                            [0] => ym:pv:dateTime
                            [1] => ym:pv:URL
                            [2] => ym:pv:lastTrafficSource
                        )

                    [status] => processed
                    [size] => 59621
                    [parts] => Array
                        (
                            [0] => stdClass Object
                                (
                                    [part_number] => 0
                                    [size] => 59621
                                )

                        )

                )

        )

)

Paso 3: consulta la viabilidad de una solicitud

Antes de solicitar formalmente que se procesen los datos que necesitemos, podemos consultar la viabilidad de nuestra petición. En el resultado de la llamada a la API encontraremos si es posible o no, y si no hay problemas, le mandaremos la solicitud en el paso siguiente.

https://api-metrica.yandex.net/management/v1/counter/<contadorID>/logrequests/evaluate? date1=<FECHA>&date2=<FECHA>&fields=<DIMENSIONES>&source=<DATOS>

Donde:

  • contadorID: identificador del código de Yandex Metrica del que quieres recuperar los datos
  • date1: desde qué día quieres los datos
  • date2: hasta qué día quieres los datos
  • fields: las dimensiones que quieres recuperar (documentación)
  • source: si quieres recuperar hits o sesiones (en función de lo que necesites, tienes a tu disposición diferentes dimensiones).

Puedes consultar la sintaxis de los campos a recuperar en la documentación de Logs API para Hits o la documentación de Logs API para Sesiones.

La llamada a la API:

$metrica_url = "https://api-metrica.yandex.net/management/v1/counter/<CONTADORID>/logrequests/evaluate?date1=2019-09-01&date2=2019-09-15&fields=ym:pv:dateTime,ym:pv:title,ym:pv:URL,ym:pv:lastTrafficSource&source=hits";

$ch = curl_init();
curl_setopt ($ch, CURLOPT_URL,$metrica_url);
curl_setopt ($ch, CURLOPT_HTTPHEADER, array("Authorization: OAuth <DEBUGGINGTOKEN>"));
curl_setopt ($ch, CURLOPT_USERAGENT, "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.6) Gecko/20070725 Firefox/2.0.0.6");
curl_setopt ($ch, CURLOPT_TIMEOUT, 60);
curl_setopt ($ch, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt ($ch, CURLOPT_RETURNTRANSFER, 1);
$metrica_result = curl_exec ($ch);
curl_close($ch);

$metrica_output = json_decode($metrica_result);
print_r($metrica_output);

El resultado:

stdClass Object
(
    [log_request_evaluation] => stdClass Object
        (
            [possible] => 1
            [max_possible_day_quantity] => 1848612
        )

)

Paso 4: realiza la solicitud para crear un log

Una vez que hayamos comprobado que nuestra solicitud de datos se puede procesar, ya podemos enviar la solicitud formal para que se prepare nuestro log.

https://api-metrica.yandex.net/management/v1/counter/<contadorID>/logrequests?date1=<FECHA>&date2=<FECHA>&fields=<DIMENSIONES>&source=<DATOS>

Donde:

  • contadorID: identificador del código de Yandex Metrica del que quieres recuperar los datos
  • date1: desde qué día quieres los datos
  • date2: hasta qué día quieres los datos
  • fields: las dimensiones que quieres recuperar
  • source: si quieres recuperar hits o sesiones (en función de lo que necesites, tienes a tu disposición diferentes dimensiones).

Puedes consultar la sintaxis de los campos a recuperar en la documentación de Logs API para Hits o la documentación de Logs API para Sesiones.

La llamada a la API (ojo, esta tiene que ir como POST):

$metrica_url = "https://api-metrica.yandex.net/management/v1/counter/<CONTADORID>/logrequests?date1=2019-09-01&date2=2019-09-21&fields=ym:pv:dateTime,ym:pv:title,ym:pv:URL,ym:pv:lastTrafficSource&source=hits";

$ch = curl_init();
curl_setopt ($ch, CURLOPT_URL,$metrica_url);
curl_setopt ($ch, CURLOPT_HTTPHEADER, array("Authorization: OAuth <DEBUGGINGTOKEN>"));
curl_setopt ($ch, CURLOPT_USERAGENT, "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.6) Gecko/20070725 Firefox/2.0.0.6");
curl_setopt ($ch, CURLOPT_TIMEOUT, 60);
curl_setopt ($ch, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt ($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt ($ch, CURLOPT_POST, true);
$metrica_result = curl_exec ($ch);
curl_close($ch);

$metrica_output = json_decode($metrica_result);
print_r($metrica_output);

El resultado:

stdClass Object
(
    [log_request] => stdClass Object
        (
            [request_id] => <REQUESTID>
            [counter_id] => <CONTADORID>
            [source] => hits
            [date1] => 2019-09-01
            [date2] => 2019-09-21
            [fields] => Array
                (
                    [0] => ym:pv:dateTime
                    [1] => ym:pv:title
                    [2] => ym:pv:URL
                    [3] => ym:pv:lastTrafficSource
                )

            [status] => created
        )

)

Ahora tendríamos dos logs solicitados / creados si hacemos la petición del paso 1, cada uno con un requestID diferente (obviamente).

Paso 5: consulta el estado de tu solicitud

Si hemos solicitado muchos datos, es posible que tarde un tiempo en procesar la solicitud. Con esta llamada a la API podemos comprobar si la solicitud está procesada y los datos están disponibles.

https://api-metrica.yandex.net/management/v1/counter/<contadorID>/logrequest/<requestId>

Donde:

  • contadorID: identificador del código de Yandex Metrica del que quieres recuperar los datos
  • requestID: identificador de la solicitud de log que quieres consultar

La llamada a la API:

$metrica_url = "https://api-metrica.yandex.net/management/v1/counter/<CONTADORID>/logrequest/<REQUESTID>";

$ch = curl_init();
curl_setopt ($ch, CURLOPT_URL,$metrica_url);
curl_setopt ($ch, CURLOPT_HTTPHEADER, array("Authorization: OAuth <DEBUGGINGTOKEN>"));
curl_setopt ($ch, CURLOPT_USERAGENT, "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.6) Gecko/20070725 Firefox/2.0.0.6");
curl_setopt ($ch, CURLOPT_TIMEOUT, 60);
curl_setopt ($ch, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt ($ch, CURLOPT_RETURNTRANSFER, 1);
$metrica_result = curl_exec ($ch);
curl_close($ch);

$metrica_output = json_decode($metrica_result);
print_r($metrica_output);

El resultado:

stdClass Object
(
    [log_request] => stdClass Object
        (
            [request_id] => <REQUESTID>
            [counter_id] => <CONTADORID>
            [source] => hits
            [date1] => 2019-09-01
            [date2] => 2019-09-21
            [fields] => Array
                (
                    [0] => ym:pv:dateTime
                    [1] => ym:pv:title
                    [2] => ym:pv:URL
                    [3] => ym:pv:lastTrafficSource
                )

            [status] => processed
            [size] => 81420
            [parts] => Array
                (
                    [0] => stdClass Object
                        (
                            [part_number] => 0
                            [size] => 81420
                        )

                )

        )

)

Paso 6: descarga el log de tu solicitud

Una vez que tengamos procesada la solicitud de log, podemos disponer de los datos. Los puedes guardar en un fichero de texto, meterlos en base de datos…

https://api-metrica.yandex.net/management/v1/counter/<contadorID>/logrequest/<requestId>/part/<partNumber>/download

Donde:

  • contadorID: identificador del código de Yandex Metrica del que quieres recuperar los datos
  • requestID: identificador de la solicitud de log que quieres recuperar
  • partNumber: identificador numérico de la parte del log que quieres recuperar

La llamada a la API:

$metrica_url = "https://api-metrica.yandex.net/management/v1/counter/<CONTADORID>/logrequest/<REQUESTID>/part/0/download";

$ch = curl_init();
curl_setopt ($ch, CURLOPT_URL,$metrica_url);
curl_setopt ($ch, CURLOPT_HTTPHEADER, array("Authorization: OAuth <DEBUGGINGTOKEN>"));
curl_setopt ($ch, CURLOPT_USERAGENT, "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.6) Gecko/20070725 Firefox/2.0.0.6");
curl_setopt ($ch, CURLOPT_TIMEOUT, 60);
curl_setopt ($ch, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt ($ch, CURLOPT_RETURNTRANSFER, 1);
$metrica_result = curl_exec ($ch);
curl_close($ch);

echo($metrica_result);

El resultado:

He pixelado la imagen, pero básicamente ya te lo imaginas… texto separado por tabuladores que puedes importar fácilmente a Excel o una base de datos tipo MySQL. A partir de aquí, imaginación para exprimir los datos.

Limitaciones

Tienes que usar el token de acceso en todas las peticiones que hagas a la API.

El volumen máximo de datos que se puede transmitir en cada solicitud es de 10 GB por cada contador de Metrica.

Los datos del día actual pueden no estar completos. Además, en algunas solicitudes puedes recibir un mensaje de error que la fecha (date2) debe ser anterior al día actual. Yandex recomienda en la documentación que user el día anterior como límite para recuperar los datos.

Más información

Metrica API
https://tech.yandex.com/metrika/

Documentación de la API de Metrica
https://tech.yandex.com/metrika/doc/api2/concept/about-docpage/

Autorización y token de acceso OAuth
https://tech.yandex.com/metrika/doc/ref/concepts/authorization-docpage/

Introducción a Logs API
https://tech.yandex.com/metrika/doc/api2/logs/intro-docpage/