|
||
|
|
|
|||||||
| Tasker Para hablar de todo lo relacionado con la aplicación tasker |
![]() |
|
|
Herramientas |
|
#1
|
||||
|
||||
|
Extraer datos despues de hacer HTTP get
Hola, continuando este hilo: http://www.htcmania.com/showthread.php?t=1057026, he decidido abrir un nuevo tema para centrarme en la extracción de los datos que me devuelve un HTTP get.
He conseguido aislar lo que me interesa, que es una url, pero el primer problema que se me presenta es que es una cantidad de datos enorme, y como a mi lo que me interesa es sacar los datos de las últimas 24h, por ejemplo, la primera separación de variable va a ser todo lo que esté antes de la fecha de ayer, el problema es que la fecha en el documento esta en el formato: Fri, 14 Aug 2015, y aqui ya me quedo un poco en blanco, El feed al que le hago el http get solo tiene datos de la última semana, por lo que creo que sería buena idea separar la variable a partir del dia de la semana de ayer, pero el texto está en formato mon, tue, wed etc y aquí ya me pierdo del todo. La otra opción es la de por día del mes pero tenemos el mismo problema, el formato 14 Aug. En las pruebas que he hecho, metiendo la fecha manualmente en el separador, he conseguido aislar la url como he dicho, otra duda que me asalta es si puedo buscar por palabras claves la información que está dentro de la variable. Por favor, solo decirme si voy bien encaminado o si el planteamiento está totalmente errado, y si me podeis dar alguna pista para continuar. Muuuchas gracias!!! Última edición por Rbcheca Día 28/08/15 a las 10:47:51. |
|
|
|
#2
|
||||
|
||||
|
Yo diría que vas por buen camino si estás sacando algo de los que necesitas, ¿no?
![]() Tendrás que estudiar detenidamente ese feed. Ver si tiene bloques identificables. El orden de esos bloques. Una estructura típica del enlace que buscas. Todo eso ayuda. |
|
#3
|
||||
|
||||
|
Estoy tonto. Es un feed, claro que tiene estructuras identificables
Tendrá una pequeña cabecera con los datos de la web que origina el feed y luego bloques <item></item> con todos los datos de cada una de las series publicadas. Cada uno de esos bloques tendrá un <title></title> que seguramente tendrá el nombre de la serie y un <link></link> que llevará a su correspondiente página en la que tendrás los enlaces a los torrent. Seguro que tiene más cosas, pero creo que eso es todo lo que necesitas. Los bloques <item> los puedes sacar con una expresion regular de este tipo... <item>(.|\s)*?</item> ... en la acción "Buscar y reemplazar". En "Variable" pones "%HTTPD" (contiene el resultado de HTTP Get). Quita las marcas de "Multilínea" y de "Una sola coincidencia". Y en "Almacenar coincidencia en" pones el nombre de una variable local, por ejemplo "%items". Con eso tienes un array de tasker (%items1, %items2 ... &itemsXX) con todos los <item> del feed. Si haces un bucle que recorra ese array creo que podrás buscar los nombres de serie/peli que te interesan con una simple búsqueda con comodines (*<title>*nombre serie*</title>*). El bucle sería algo así... For %item en %items() << así haces referencia al array completo Si encuentras en un %item uno de los nombres que te interesa te sales del bucle y sigues con el proceso. Ahora toca sacar la URL de la página, que también se puede hace con una expresión regular, pero esta vez (gracias mlesir) es un poco diferente... (?<=<link>).*?(?=</link>) En variable pones "%item" y en almacenar resultado pones "%url". Y con eso ya puedes ir a la página de la serie a buscar tus codiciados enlaces .torrent ¿Hasta aquí todo está claro?
|
|
#4
|
||||
|
||||
|
Está muy claro, muy bien explicado, a ver si soy capaz de llevarlo a cabo, madre mia cuanto sabeis, eso no lo saco yo solo ni en un millon de años.
Me queda la duda de como hacer para que no se repitan resultados de una busqueda a otra, es decir si ma da el resultado que busco "A" y me lo notifica, como hago para que si a la siguiente vez sigue ahi "A" lo omita y no lo tenga en cuenta como resultado valido. Me pongo a ello enseguida, que pinta muy bien ![]() ![]()
|
|
#5
|
||||
|
||||
|
Podrías guardar en un archivo de texto el contenido de <pubDate> de cada <item> que te ha interesado seguir. Cuando proceses el feed por segunda vez tendrás que verificar que una coincidencia de nombre de serie no ha sido procesada antes comprobando que su <pubDate> no está en ese archivo de texto.
|
|
#6
|
||||
|
||||
|
He visto una posible causa de error
![]() Al buscar el título de la serie quita las etiquetas. Tal y como está no funcionará porque entre esas etiquetas existen retornos de carro. Lo deberías dejar como ... *nombre serie* |
|
#7
|
||||
|
||||
|
Bueno, me ha surgido un primer problema que viene por mi total desconocimiento de los elementos nuevos que me has enseñado, antes de nada aclarar que cuando pregunto algo así, es por que ya le he dado mil vueltas a los tutos y a google y no he sacado nada en claro, entiendo que el tiempo de los demás es tan importante como el mio.
Al hacer http get no se me guardan los datos en %HTTPD, por lo que he hecho un leer archivo (el que me ha creado http get) y guardar en la variable %HTPD, y el siguiente paso ok. Hasta el punto de sacar los bloques de <item> todo claro y funcionando, me ha dejado flipado lo de (.|\s)*?", que me gustaría entender que es, pero he buscado y no he encontrado nada Luego con lo de "El bucle sería algo así... For %item en %items() << así haces referencia al array completo" entiendo que es lo que en tasker está en "tarea-for" y que entre los parentesis de "%items()" tengoo que poner los terminos que quiero buscar. Ahí me asalta una duda, ¿tengo que poner el nombre de la serie completo, o vale con unas palabras clave) por ejemplo, ¿tengo que poner "perico el de los palotes hdtv 720p" o puedo buscar por "perico palotes 720p"? En la siguiente parte, la de "Si encuentras en un %item uno de los nombres que te interesa te sales del bucle y sigues con el proceso." ahi @WillyWeb, lo siento mucho si que no he entendido nada. Tampoco tengo claro si he hecho la tarea como tu me has dicho: 1.HTTP Get servidor: "puerto"el feed" "tipo mime: txt/xml" "archivo de salida: archivo.html" 2.leer archivo: archivo.html a %HTPD 3. buscar y reemplazar: variable %HTPD buscar <item>(.|\s)*?</item> "almacenar coincidencias en %items Luego hago un flash con %items2 y compruebo que me devuelve un resultado correcto de todo el contenido de un "<item></item>" A partir de ahi me hago la picha un lio y no se por donde seguir, al poner el For %item en %items(), suponiendo que como he dicho está bien, me sale la flechita y ya no se si el buscar y reemplazar va dentro o no. Cuanto trabajo te estoy dando Willy, si me mandas a freir esparragos lo entenderé perfectamente.
Última edición por Rbcheca Día 22/08/15 a las 19:23:57. |
|
#8
|
||||
|
||||
|
Bueno, me ha surgido un primer problema que viene por mi total desconocimiento de los elementos nuevos que me has enseñado, antes de nada aclarar que cuando pregunto algo así, es por que ya le he dado mil vueltas a los tutos y a google y no he sacado nada en claro, entiendo que el tiempo de los demás es tan importante como el mio.
![]() ![]() Y por cierto, si no necesitas conservar un valor para algo es mejor usar variables locales (nombre en completamente en minúsculas). Son más rápidas y no malgastas recursos. Cada asterisco equivale a poner "aquí entra cualquier cosa". Ten eso presente si el resultado no es el esperado. ![]() En la siguiente parte, la de "Si encuentras en un %item uno de los nombres que te interesa te sales del bucle y sigues con el proceso." ahi @WillyWeb, lo siento mucho si que no he entendido nada.
![]() ![]() Creo que sería mejor un "If" con su correspondiente "End If" que encerrase el proceso que pienses seguir cuando encuentres lo que buscas. Naturalmente la condición de ese If debería ser que dentro de %item se encuentre el nombre de la serie que buscas usando lo de los comodines. ... El proyecto no es complicado, pero el laborioso. De momento vas bien, pero te quedan muchas cosas por resolver que no te he querido contar para no asustarte ya que tienes pocas tablas con Tasker. Vamos poco a poco |
|
#9
|
||||
|
||||
|
Lo de %HTTPD he leído en un tuto de este foro que aveces falla pero ahora no lo encuentro, no se yo si es que son demasiados datos ya que en ayuda pone que %HTTPD máx 4K, no se si se referirá a eso.
Para lo demás... necesito procesarlo lentamente para entenderlo. Enviado desde mi Nexus 5 mediante Tapatalk |
|
#10
|
||||
|
||||
|
Lo he probado ahora mismo y he podido cargar los 251KB del feed en %HTTPD sin problemas. Es cierto que en la documentación dice que esa variable está limitada a 4KB, pero por lo que he podido comprobar eso no ya es cierto.
Una cosa que puede ocasionar que %HTTPD no tenga nada dentro es que HTTP Get no tenga tiempo de completar la descarga. Prueba subiendo el valor de "Cuenta atrás". Realmente es indiferente la forma en que llegues a tener el contenido del feed en una variable. Si copiarlo a un archivo y luego leerlo en una variable te funciona, pues perfecto. Eso sí, yo usaría una variable local para no desperdiciar más memoria. |
|
#11
|
||||
|
||||
|
Pues el motivo no era el tiempo, era que en tipo mime tenía puesto txt/xml, comprobado y recomprobado, ahora ya lo guarda correctamente.
|
|
#12
|
||||
|
||||
|
Si lo dejas en blanco también funciona
|
|
#13
|
||||
|
||||
|
Bueno, después de hacer los pasos que me indicó @WillyWeb, tasker tenía problemas para manejar el volumen de datos que había dentro de <item></item>, entonces en vez de eso hice buscar y reemplazar sobre <link>(.|\s)*?</link>, que guarda solo el enlace al torrent, en el mismo enlace están todos los datos que mas adelante usaré para filtrar lo buscado.
Una vez que tengo todos los enlaces del feed en la variable %items, los filtro por palabras clave de la siguiente manera: For variable %item Ítems %items() If condicción %item coincide *perico*palotes*720* O %item coincide *quien*madruga*dios*ayuda* ahora tengo en la variable %item los dos enlaces buscados pero con las etiquetas <link></link> 1.<link>Http://blablabla/perico-palotes-720/</link> 2.<link>Http://blablabla/a-quien-madruga-dios-le-ayuda/</link> Le quito las etiquetas con (?<=<link>).*?(?=</link>) Yo también te lo agradezco @mlesir ;) Buscar y reemplazar variable %item buscar (?<=<link>).*?(?=</link>) almacenar coincidencias en %link. Ahora escribo esos dos links en un archivo para ver como los trabajo luego: Escribir archivo link.txt Texto %link Mi intención es ejecutar esta tarea completa dos veces al día, para que compruebe si hay algo nuevo y me lo notifique, pero necesito que si me da un resultado, las siguientes veces que se ejecute no me devuelva un resultado que ya me dió. Tengo dos ideas para hacerlo, una es crear una variable global con cada busqueda coincidente, y que lo haga automaticamente, y cuando encuentre una coincidencia con mi búsqueda primero mire que no la ha encontrado antes, y en caso de que ya la tenga no me la devuelva, luego hacer que cada 10 días limpie esas variables para volver a ser usadas, 10 días por que el feed solo guarda la última semana. La otra opción que se me ocurre es que mire en el archivo de texto %link para ver si ya está ahí el enlace, creo que esta es mejor, pero la verdad que ahora mismo no tengo ni idea de como llevarlas a cabo... .....Pero estoy en ello
|
|
#14
|
||||
|
||||
|
Bueno, después de hacer los pasos que me indicó @WillyWeb, tasker tenía problemas para manejar el volumen de datos que había dentro de <item></item>, entonces en vez de eso hice buscar y reemplazar sobre <link>(.|\s)*?</link>, que guarda solo el enlace al torrent, en el mismo enlace están todos los datos que mas adelante usaré para filtrar lo buscado.
Una vez que tengo todos los enlaces del feed en la variable %items, los filtro por palabras clave de la siguiente manera: For variable %item Ítems %items() If condicción %item coincide *perico*palotes*720* O %item coincide *quien*madruga*dios*ayuda* ahora tengo en la variable %item los dos enlaces buscados pero con las etiquetas <link></link> 1.<link>Http://blablabla/perico-palotes-720/</link> 2.<link>Http://blablabla/a-quien-madruga-dios-le-ayuda/</link> Le quito las etiquetas con (?<=<link>).*?(?=</link>) Yo también te lo agradezco @mlesir ;) Buscar y reemplazar variable %item buscar (?<=<link>).*?(?=</link>) almacenar coincidencias en %link. Ahora escribo esos dos links (ya sin etiquetas) en un archivo para ver como los trabajo luego: Escribir archivo link.txt Texto %link1 (pensaba que sería %link, pero no se porque es %link1) Mi intención es ejecutar esta tarea completa dos veces al día, para que compruebe si hay algo nuevo y me lo notifique, pero necesito que si me da un resultado, las siguientes veces que se ejecute no me devuelva un resultado que ya me dió. Tengo dos ideas para hacerlo, una es crear una variable global con cada busqueda coincidente, y que lo haga automaticamente, y cuando encuentre una coincidencia con mi búsqueda primero mire que no la ha encontrado antes, y en caso de que ya la tenga no me la devuelva, luego hacer que cada 10 días limpie esas variables para volver a ser usadas, 10 días por que el feed solo guarda la última semana. La otra opción que se me ocurre es que mire en el archivo de texto %link para ver si ya está ahí el enlace, creo que esta es mejor, pero la verdad que ahora mismo no tengo ni idea de como llevarlas a cabo... .....Pero estoy en ello Última edición por Rbcheca Día 23/08/15 a las 17:11:59. |
|
#15
|
||||
|
||||
|
En el primer "Buscar y reemplazar", en lugar de usar "<link>(.|\s)*?</link>" utiliza esto otro "(?<=<link>).*?(?=</link>)". De esa forma la lista de %items ya te sale sin las etiquetas <link> y te ahorras tener que quitarlas después.
|
|
#16
|
||||
|
||||
|
lo hice, pero me daba error, tengo pendiente volver a hacerlo, pero quería avanzar un poco antes de mirarlo
Enviado desde mi Nexus 5 mediante Tapatalk |
|
#17
|
||||
|
||||
|
Hice algo mal por que ahora no me ha dado ningun error.
|
|
#18
|
||||
|
||||
|
Bueno, pues ahora que has llegado hasta aquí te enseño mi versión. Es algo muy básico que hace lo mismo que has hecho tú. Espero aportarte ideas nuevas...
Código:
BuscaEnFeed (666) A1: Establecer variable [ Nombre:%feed A:http://www.htcmania.com/external.php?forumids=969 Calcular:Apagado Añadir:Apagado ] A2: Establecer variable [ Nombre:%busca A:*javascript*/*blue* Calcular:Apagado Añadir:Apagado ] A3: HTTP Get [ Servidor:Puerto:%feed Ruta: Atributos: Cookies: User Agent: Cuenta atrás:10 Tipo Mime: Archivo de salida:feed.xml Confiar en cualquier Certificado:Apagado ] A4: Buscar y Reemplazar Contenido de Variable [ Variable:%HTTPD Buscar:(?<=<title>).*?(?=</title>) Ignorar Caso:Apagado Multilínea:Apagado Una sola coincidencia:Apagado Almacenar Coincidencias En:%titles Reemplazar Coincidencias:Apagado Reemplazar Con: ] A5: Buscar y Reemplazar Contenido de Variable [ Variable:%HTTPD Buscar:(?<=<link>).*?(?=</link>) Ignorar Caso:Apagado Multilínea:Apagado Una sola coincidencia:Apagado Almacenar Coincidencias En:%links Reemplazar Coincidencias:Apagado Reemplazar Con: ] A6: Establecer variable [ Nombre:%lista A:%titles(#?%busca) Calcular:Apagado Añadir:Apagado ] A7: Separar variable [ Nombre:%lista Separador:, Eliminar base:Apagado ] A8: Escribir archivo [ Archivo:feed.txt Texto:%lista Añadir:Apagado Añadir Nueva Línea:Encendido ] A9: For [ Variable:%num Ítems:%lista() ] A10: Escribir archivo [ Archivo:feed.txt Texto:%titles(%num) ... %links(%num) Añadir:Encendido Añadir Nueva Línea:Encendido ] A11: End For Con A2 he metido en una variable una lista de términos a buscar separados por una barra. He usado el asterisco para poder localizar las palabras clave en cualquier posición. Por cierto, yo he preferido hacer la búsqueda en el <title> del tema. Si tú prefieres hacerlo en el <link> tendrás que cambiar A6. Con A3 se descarga el feed y se guarda su contenido en %HTTPD. Lo del archivo lo he usado para depurar y se puede eliminar. Con A4 y A5 se crean dos array. Uno con los todos los <title> y otro con los <link>. Ojo porque el primero de la lista no corresponde a un <item> aunque eso no es demasiado importante en este caso. Con A6 se genera una lista separada por comas con los números de los elementos del array que contienen los términos de búsqueda guardados en A2. En mi caso el array que he usado es %titles pero puedes poner el otro y funcionará igual. Con A7 se crea un array con esa lista de números separados por comas. Con A8 escribo esa lista de números en un archivo de texto (sólo para comprobar). Con el bucle A9-A11 añado a ese mismo archivo el contenido de cada elemento del array de títulos y enlaces que corresponde a cada número localizado en A6. ... No es bonito, pero es muy rápido. Y además el uso de recursos se mantienen al mínimo, que ya sabes que en este caso es un factor crítico. |
|
#19
|
||||
|
||||
|
Ostras Willy, necesito horas para descifrar y comprender eso, hasta hace tres días usaba tasker para encender y apagar el wifi...
pero está muy chulo, me pongo ahora mismo.A10 llega hasta donde hemos llegado con la otra forma, la de escribir los enlaces ¿no? |
|
|
|
#20
|
||||
|
||||
|
Sí, se guarda el <link> y el <title> de cada <item>.
Y no creo que te cueste "días" entenderlo. Es básicamente lo mismo que has hecho hasta ahora, aunque puede que usando alguna acción diferente. |
![]() |
Estás aquí
|
||||||
|
||||||