Extraer actividades de mapmytracks

2 Febrero 2017 por juan.cortes en Desarrollo

¿Qué es esto?

Quiero compartir con vosotros algo que me suele pasar un par de veces al mes como mínimo. Una tarea, ya sea online o en mi propio portátil, que por mal diseño, por falta de desarrollo o por lo que sea, lleva más tiempo del que me costaría hacer un pequeño script que lo automatice todo.

En este caso concreto trataba de exportar todas las actividades que tenía registradas en mapmytracks que me ha servido para ver lo lento que corro durante bastante tiempo. La página es muy funcional y me permite exportar todas mis actividades, pero solo una por una o, en caso de que sea posible exportar todo a la vez, no he sido capaz.

Mi objetivo es tener todos los archivos .gpx de las actividades que registré en esa plataforma para poder importarla en otra que estoy utilizando actualmente.

Problema

Realmente no son muchas actividades, cerca de 50, pero ir una por una, cargando la pagina de la actividad, pulsando en exportar, eligiendo el formato .gpx, podría llevarme un buen rato.

Pistas

Viendo la url que me devuelve el archivo, encuentro que sigue el siguiente formato: http://www.mapmytracks.com/assets/php/gpx.php?tid=ID_ACTIVIDAD&mid=832955&uid=ID_SESION

Donde 832955 no tengo ni idea de qué es ni me ha hecho falta averiguarlo.

Una vez que sé que teniendo el ID de la actividad y la sesión, puedo abrir una pestaña que directamente me descarga el archivo de dicha actividad, solo queda extraer los ids de todas mis actividades.

Solución

Esto es algo de lo que no me siento muy orgulloso, podría hacerse en vanilla javascript sin necesidad de cargar jQuery, pero soy débil y me gusta no tener que pensar demasiado.

Si abrimos el panel de desarrollador del navegador y pegamos (si, si, tal cual) el contenido del archivo de jQuery minimizado, y le damos a enter, esa pestaña tendrá desde ese momento la librería cargada y podremos realizar consultas al DOM y extraer datos.

Si vamos a la pagina de nuestra actividad (mapmytracks.com/NOMBREDEUSUARIO) y hacemos scroll, nos dará la opción de cargar más actividades. Hacemos eso hasta que todas las actividades están presentes en la página y en ese momento (tras haber cargado jQuery) pegamos el siguiente código, con cuidadito:

  1. var ids = [];
  2. var baseUrl = "http://www.mapmytracks.com/assets/php/gpx.php?tid=ACTIVITYID&mid=832955&uid=VUESTRAUID";
  3. $("a[href*='explore/activity']").each(function(i,e){ids.push($(e).attr('href').substr(18));});
  4. for(i=0;i<ids.length;i++){
  5.    window.open(baseUrl.replace('ACTIVITYID',ids[i]), '_blank');
  6. }

Teniendo en cuenta que el navegador probablemente bloquee la apertura de decenas de pestañas al mismo tiempo y tengamos que permitirlo para que funcione.

El código, explicado por encima hace lo siguiente:

  • Extrae los ids de los enlaces de la página de actividad y los guarda en un array
  • Recorre ese array y abre una pestaña sustituyendo ACTIVITYID por el id de la actividad que corresponda
  • FIN

Espero que os sea de utilidad.