PDA

Ver la Versión Completa : Obtener precio combustibles de tu ciudad desde la página de Minetur


dj_janker
31/01/16, 21:10:33
Hola,
estoy intentando usar el plugin Restask de Tasker para obtener el precio del combustible de mi ciudad actualizado cada día, desde la web del Ministerio:
La web del servicio Rest donde se actualizan a diario de todas las gasolineras de España es esta:
https://sedeaplicaciones.minetur.gob.es/ServiciosRESTCarburantes/PreciosCarburantes/EstacionesTerrestres/

Desde el navegador se accede a un xlm con todos los datos. La idea es aprovechando el plugin Restask hacer un "Post" a esa url y filtrar los datos que necesite para, en mi caso almacenarlos en una bbdd local.

El problema es que no se como funciona Restask y no hay ninguna INFO ni tutoriales que me sirva de guía.
Alguien que sepa como va el tema de Rest y que haya tocado Restask me puede ayudar?

Muchas gracias.

Saludos

Enviado desde mi JY-S3 mediante Tapatalk

Caravantes
31/01/16, 23:17:17
La web del servicio Rest donde se actualizan a diario de todas las gasolineras de España es esta:
https://sedeaplicaciones.minetur.gob...nesTerrestres/

Nunca he utilizado RESTask y no sé cómo funciona, aunque me da la impresión de que es bastante prescindible. Con esa URL que has aportado ya tienes todo lo necesario. Es fácil pasar todo eso a una variable, y luego seleccionar (en esa variable) los fragmentos que te interesan. Primero te recomiendo que te leas Nuestra guía de cabecera para principiantes, pues hay un capítulo (el cuarto) que está enfocado en esa dirección que comentas.
http://www.htcmania.com/showthread.php?t=614108
Esa lección del tutorial ya incluye varios ejemplos de tareas que realizan labores similares.

Luego, en este foro ya hemos comentado y explicado algunas otras tareas que resuelven problemas de ese tipo, como...
http://www.htcmania.com/showthread.php?t=567903

WillyWeb
01/02/16, 00:27:50
El problema es que no se como funciona Restask y no hay ninguna INFO ni tutoriales que me sirva de guía. Alguien que sepa como va el tema de Rest y que haya tocado Restask me puede ayudar?

En la página de "RESTask for Taske"r de "Google Play" tienes estas instrucciones...

*README*
Variables can be set synchronously or asynchronously.

With the default sync setting, the task will wait until the request is finished or is timed-out before executing the next task and you will be able to set the return code/response to local variables. Note that in synced mode you can only set local variables, i.e., variables with all lower-cased letters, this is a limitation of tasker API.

However, in async mode, the task will finish immediately and work in the background so you will not be able to set local variables in it (you can still use local variables for the parameters and stuff). With this mode, you can only set global variables as local variables will not be accessible to other tasks. Following is how to enable setting global variables in async mode:

1. To enable global variable set, you have to enable 'Allow External Access' in Tasker ( menu -> preference -> misc -> Allow External Access')

2. Return variables name should be global (with at least one capital letter) because it is set asynchronously in a different task and will not be accessible if it is set as a local variable.

3. Since the request is performed asynchronously, returned code/response might not be available immediately. If you want to capture the returned code/response, you can set an action to 'Wait Until' the variable 'is set'. But remember to clear the variable beforehand because these variables are global and will remain after tasks finished..
---
Cookies

The cookies will be found in the %hdr_set_cookie variable if your response header variable prefix is set to %hdr. If there are multiple Set-Cookie headers they will stored in the same variable separated by newlines.

Como te dice Caravantes teniendo los datos que te interesan en un archivo de texto (un XML en este caso) es relativamente sencillo cargarlo en una variable y procesarlo, aunque con las dimensiones que tiene este no esperes que sea una tarea fácil.

dj_janker
01/02/16, 11:09:42
Gracias Caravantes y WillyWeb,
no me había planteado que se pudiera hacer directamente por variables desde Tasker, por lo que con un poco de paciencia y bastante curro puede salir...
Me pongo con ello y os planteo las dudas que vayan saliendo.

Saludos

Enviado desde mi JY-S3 mediante Tapatalk

WillyWeb
01/02/16, 13:37:10
Por si te vale de ayuda aquí tienes la estructura de ese XML...

https://sedeaplicaciones.minetur.gob.es/ServiciosRESTCarburantes/PreciosCarburantes/help/operations/PreciosEESSTerrestres

Pero después de mirarlo un poco más despacio creo que lo de cargarlo en una variable y procesarlo es una locura. El archivo pesa casi 10MB y está todo en una sola línea de texto. :loco:

Curioseando en la web del MINETUR he visto que esa información se ofrece en varios formatos...

https://sede.minetur.gob.es/es-ES/datosabiertos/catalogo/precios-carburantes

Tienes una web que te permite hacer búsquedas. Y la versión para móvil es muy manejable...

http://geoportalgasolineras.es/geoportalmovil/eess/index.jsp

Una vez realizada la búsqueda puedes guardar la URL del resultado en tus favoritos y consultarla en un plis-plas. :D

Y tienes otra página desde la que puedes descargar un ZIP (contiene un CSV) para cada tipo de combustible que te interese...

http://geoportalgasolineras.es/descargas.do?tipoBusqueda=0

Ese CSV es más manejable que el XML original y tiene la información justa (lat/lon, estación, precio). Veo mucho más factible procesar ese CSV y, teniendo en cuenta tu posición GPS, buscar las gasolineras que se encuentren en un radio X. :ok:

dj_janker
01/02/16, 15:18:13
Efectivamente, por otro lado había encontrado esto: https://github.com/kbsali/gasolineras-espana

para poder descargar en .json el precio diario por cada tipo de combustible. Cada entrada del .json te da la {latitud, longitud, precio, nombre}

He estado probando con el archivo del gasóleo A que es el que me interesa, pero lo consigo.
En este caso tengo que buscar alguna manera de conseguir filtrar las entradas de dicho archivo correspondientes a mi ciudad. Para ello tengo que generar o buscar una tarea que en función de las coordenadas me de el nombre de la ciudad y luego filtrarlas para poder quedarme con unas variables que contengan nombre y precio solamente.

Edito: he encontrado esta tarea de Caravantes http://www.htcmania.com/showthread.php?t=703855, espero que me sirva para lo que busco.

WillyWeb
01/02/16, 16:50:37
Efectivamente, por otro lado había encontrado esto: https://github.com/kbsali/gasolineras-espana

En esa URL lo que tienes es un script en Pyton que descarga la misma información que publica el MINETUR en la web que te he comentado antes (http://geoportalgasolineras.es/).

Y si lees el código de "open_gasolineras.py" podrás ver que descarga los mismos ZIP que tienes aquí...

http://geoportalgasolineras.es/descargas.do?tipoBusqueda=0

Antes de seguir tengo unas preguntas...

¿Qué motivo tienes para querer procesar los datos con Tasker?

¿No te vale con el resultado que te proporciona la versión web para móvil?

¿Te valdría con una consulta automática a esa web basada en tu posición?

dj_janker
01/02/16, 19:39:03
En esa URL lo que tienes es un script en Pyton que descarga la misma información que publica el MINETUR en la web que te he comentado antes (http://geoportalgasolineras.es/).

Y si lees el código de "open_gasolineras.py" podrás ver que descarga los mismos ZIP que tienes aquí...

http://geoportalgasolineras.es/descargas.do?tipoBusqueda=0

Antes de seguir tengo unas preguntas...

¿Qué motivo tienes para querer procesar los datos con Tasker?

¿No te vale con el resultado que te proporciona la versión web para móvil?

¿Te valdría con una consulta automática a esa web basada en tu posición?

Si ese archivo python lo vi. Quizás se podría usar para automatizar la descarga de los archivos, para procesarlos, una vez que consiga las tareas necesarias para hacer lo que busco.
Respecto a tu pregunta, lo que pretendo es enviar los precios del gasóleo de las diferentes gasolineras de mi ciudad a mi sistema domótico, para que me lo lea cada mañana antes de salir, para saber donde repostar. Un frikada más...

Intenté hacerlo con alguna de las aplicaciones Android que te dan esos datos, pero no he encontrado manera de procesar sus resultados para poder utilizarlos con Tasker y enviarlos al sistema domótico. Por eso me planteé irme a la web del ministerio que es de donde se surten de datos todas estas apps.

WillyWeb
01/02/16, 21:38:25
Quizás se podría usar para automatizar la descarga de los archivos...

Pues después de leer más detenidamente ese script en Python creo que no te soluciona gran cosa porque lo único que hace es descargar el ZIP de cada tipo de combustible de la web del MITYC, lo descomprime y convierte el CSV que lleva dentro en un archivo con formato JSON.

Y no te olvides de que si quieres usar el script tienes que tener instalado el interprete de Python. :rolleyes:

Sigo pensando que la versión web para móvil te puede hacer un buen servicio...

Usando HTTPGet descargas la página de resultados de una URL de consulta compuesta a medida de tus necesidades. Digamos que así...

http://geoportalgasolineras.es/geoportalmovil/eess/search.do?tipoCarburante=4&codPostal=28000

Si miras el código de esa página verás que tiene una estructura muy sencilla. Una tabla muy fácil de localizar (<table class="tableResults">) con tantas filas (<tr>) como gasolineras y por cada una tres columnas (<td>) con los datos básicos (enlace a Maps, dirección y precio).

Procesar eso con Tasker es sencillo si usas expresiones regulares. ;-)

j0d3
01/03/16, 00:08:04
No se si sigue en pie está idea pero ne gusta, mañana le pego un vistazo

Sent from my LG-D802 using Tapatalk

dj_janker
02/03/16, 08:31:51
Perfecto!
A ver si tu puedes avanzar algo. Yo lo tengo aparcado por falta de tiempo.... :(

Enviado desde mi JY-S3 mediante Tapatalk

dj_janker
13/04/16, 17:07:21
Pues después de leer más detenidamente ese script en Python creo que no te soluciona gran cosa porque lo único que hace es descargar el ZIP de cada tipo de combustible de la web del MITYC, lo descomprime y convierte el CSV que lleva dentro en un archivo con formato JSON.

Y no te olvides de que si quieres usar el script tienes que tener instalado el interprete de Python. :rolleyes:

Sigo pensando que la versión web para móvil te puede hacer un buen servicio...

Usando HTTPGet descargas la página de resultados de una URL de consulta compuesta a medida de tus necesidades. Digamos que así...

http://geoportalgasolineras.es/geoportalmovil/eess/search.do?tipoCarburante=4&codPostal=28000Si miras el código de esa página verás que tiene una estructura muy sencilla. Una tabla muy fácil de localizar (<table class="tableResults">) con tantas filas (<tr>) como gasolineras y por cada una tres columnas (<td>) con los datos básicos (enlace a Maps, dirección y precio).

Procesar eso con Tasker es sencillo si usas expresiones regulares. ;-)

Hola @WillyWeb (http://www.htcmania.com/member.php?u=68214),
tras entender un poco mejor como funcionan los Http Get y el trabajo con variables, en mi consulta: http://www.htcmania.com/showthread.php?t=1167799

He decidido retomar esta y el caso es que he avanzado bastante, aunque me falta pulirla. Por ahora, siguiendo tus directrices, he conseguido aislar los datos de la primera gasolinera del listado que se filtra de mi ciudad, de la web comentada en tu post anterior. Para ello he generado la siguiente tarea:

Precio Combustible3 (90)
A1: HTTP Get [ Servidor:Puerto:http://geoportalgasolineras.es Ruta:/geoportalmovil/eess/search.do?tipoCarburante=4&rotulo=&venta=T&provincia=41&localidad=&calle=&SEVILLAnumero=&codPostal= Atributos: Cookies: User Agent: Cuenta atrás:10 Tipo Mime: Archivo de salida: Confiar en cualquier Certificado:Apagado ]
A2: Separar variable [ Nombre:%HTTPD Separador:href="./map.do?tipoCarburante= Eliminar base:Apagado ]
A3: Sección de Variable [ Nombre:%HTTPD2 Desde:28 Longitud:10 Encajar:Encendido Almacenar Resultado en:%rotulo ]
A4: Separar variable [ Nombre:%rotulo Separador:< Eliminar base:Apagado ]
A5: Separar variable [ Nombre:%HTTPD2 Separador:</td> Eliminar base:Apagado ]
A6: Sección de Variable [ Nombre:%HTTPD22 Desde:13 Longitud:58 Encajar:Encendido Almacenar Resultado en:%direccion ]
A7: Sección de Variable [ Nombre:%HTTPD23 Desde:19 Longitud:58 Encajar:Encendido Almacenar Resultado en:%precio ]
A8: Separar variable [ Nombre:%precio Separador:< Eliminar base:Apagado ]
A9: Flash [ Texto:Rotulo:%rotulo1 Direccion:%direccion Precio: %precio1 € Largo:Apagado ]
Con esto hago que se muestre en un flash el Rótulo, la Dirección y el Precio, en mi caso para Gasoleo A, de la primera, por precio más bajo, gasolinera de mi Ciudad.
El caso es que me gustaría que este proceso se repitiera para las 15 primeras opciones.
Para ello sé que hay que hacer un loop con For - End For, para items que vayan desde 2:16, y que el For deberá incluirse entre los pasos A2 y A3, pero tras intentarlo todo, no lo consigo..... :cry:

Una ayudita, por favor??

WillyWeb
13/04/16, 22:20:36
El primer problema para conseguir lo que quieres es el sistema que has usado para "sacar" los datos de la página. Mejor que "separar variable" yo usaría expresiones regulares que, entre otras ventajas, te dan los resultados en un array que luego puedes recorrer fácilmente con un bucle.

No debería ser muy complicado :silbando:

WillyWeb
13/04/16, 22:43:20
Venga vale, he hecho una prueba rápida y me ha salido esto...

Geoportal (14)
A1: Establecer variable [ Nombre:%url A:http://www.geoportalgasolineras.es/geoportalmovil/eess/search.do?tipoCarburante=4&economicas=on&venta=P&provincia=41&localidad=UTRERA ]
A2: HTTP Get [ Servidor:Puerto:%url ]
A3: Buscar y Reemplazar Contenido de Variable [ Variable:%HTTPD Buscar:<tr>(.|\s)*?</tr> Almacenar Coincidencias En:%fila ]
A4: For [ Variable:%num Ítems:2:%fila(#) ]
A5: Buscar y Reemplazar Contenido de Variable [ Variable:%fila(%num) Buscar:(?<=">).*?(?=</a>) Una sola coincidencia:Encendido Almacenar Coincidencias En:%rot ]
A6: Buscar y Reemplazar Contenido de Variable [ Variable:%fila(%num) Buscar:(?<=<td>).*?(?=</td>) Una sola coincidencia:Encendido Almacenar Coincidencias En:%dir ]
A7: Buscar y Reemplazar Contenido de Variable [ Variable:%fila(%num) Buscar:(?<=<span>).*?(?=</span>) Una sola coincidencia:Encendido Almacenar Coincidencias En:%pre ]
A8: Flash [ Texto:%rot1 / %dir1 / %pre1 ]
A9: End For

La RegEx de A3 crea el array %fila con todas las filas de la tabla de resultados.

El bucle A4-A9 recorre ese array desde el elemento 2 (saltando la cabecera) hasta el final.

La RegEx de A5 saca el rótulo.

La RegEx de A6 saca la dirección.

La RegEx de A7 saca el precio.

Con muy pocos cambios se le podría dar otro enfoque y que las RegEx generasen directamente tres arrays con esos mismos tres datos. Con eso evitarías el bucle y la RegEx de A3 ... ya tienes tarea :silbando:

*Mucho ojo con meter espacios en blanco en las RegEx, que te pueden dejar Tasker frito.