COVID19Gram: seguimiento de la evolución del coronavirus desde telegram


#1

Antonia Tugores, Biel Frontera, Jaume Perelló

Abstract

Presentamos un proyecto 100% Python desarrollado durante el confinamiento del mes de marzo y que han llegado a utilizar más de 1.000 usuarios de Telegram: un bot para seguir la evolución de la pandemia del coronavirus. El bot accede a diferentes fuentes de datos para ofrecer gráficas de la evolución epidemiológica a nivel mundial por países, a nivel español por comunidades autónomas, a nivel italiano por regiones y a nivel francés por departamentos."

Bio

Tres matemáticos formados en la UIB con perfiles profesionales bastante diferentes. Antònia ha sido programadora de videojuegos, de software de computación distribuida y ahora es especialista de datos en un centro de investigación. Biel ha sido programador en sector bancario y el de la admin. pública y ahora es programador web especializado en visualización de datos en un centro oceanográfico. Jaume ha sido profesor de secundaria y es diseñador gráfico. Actualmente cuida de su familia y se entretiene creando bots.


#2

Hola, muy buena iniciativa me ha encantado ¿Cómo habéis hecho el back, algún server en AWS o algo del estilo?


#3

Hola, me he perdido un poco, cómo soluciona el uso de Redis la limitación en la longitud de las callbacks?


#4

Genial, chicos. Ha quedado increible.

¿Habéis pensado en llevarlo a formato Web y usar algo más interactivo para revisar las visualizaciones y datos?


#5

Dadas las fuentes de datos existentes, ¿se podría hacer un bot que te pudieses suscribir a una localización y te avisase de las nuevas normas? A veces me cuesta seguir los cambios en las normativas. :S


#6

Es un daemon conectado a telegram, necesita nuy pocas prestaciones. Telegram le envía las peticiones.


#7

Cada CCAA tiene sus normas y lo publican en sus Boletines Oficiales, no sabemos de ninguna compilación de normas y que esté público.
Si existe, se podría hacer.
Si conocéis de su existencia, avisad :wink:


#8

Gracias!
Nos estás espiando? :roll_eyes:
No hemos tenido tiempo, se podría y en este caso la idea era probar los bots de Telegram.

En el próximo confinamiento haremos la web :stuck_out_tongue_closed_eyes:


#9

Hola, gracias por la charla! Tal y cómo han preguntado más arriba, ¿cómo soluciona Redis la limitación de callbacks?


#10

Si para hacer la versión web necesitáis otro confinamiento por mí lo podéis dejar tal cual…


#11

Hola @Carlos3dx,
en el caso de la acción de comparación, al principio íbamos concatenando las regiones en el callback_query, que solo puede ser un string. Nos encontramos que tiene una longitud muy limitada.

Así, que ahora vamos guardando las lista de regiones seleccionadas en un servidor redis que tenemos corriendo en la máquina. Como clave usamos el id del chat + el id del mensaje. De esta manera, cuando en el callback nos llega un compare + finish, buscamos en redis la lista de las regiones a comparar que se ha ido guardando y la pasamos a la generación de la gráfica.

Aquí tienes el código principal de la acción “compare”: https://github.com/atugores/covid19gram/blob/master/covid.py#L1182 (especial atención al cache.get y al cache.setex).


#12

Muchísimas gracias por responder, ahora me ha quedado claro. :slight_smile:

Por cierto, no lo había dicho en el anterior mensaje, me ha parecido muy interesante tanto la presentación como el proyecto.


#13

Hola @godiez,
completo la respuesta a @Carlos3dx, haciendo un copy/paste de algunas líneas del código y algunos comentarios:

# Inicializamos el cliente de redis
cache = redis.Redis(host='localhost', port=6379, db=0) 
CACHE_PREFIX = 'COVID'

@app.on_callback_query()
async def answer(client, callback_query):
  # en el callback_query tenemos los parámetros de la
  # acción a realizar y sus parámetros (por ejemplo, la región seleccionada)
  params = callback_query.data.split("_")
  region = params[2]
  
  # recuperamos de redis la lista de regiones ya seleccionadas en el mensaje actual
  cache_key = f"{CACHE_PREFIX}_{comm}_{chat}_{mid}"
  regions = cache.get(cache_key)
  regions = regions.decode("utf-8").split('_')

  # añadimos la nueva región
  regions.append(region)

  # y la guardamos en cache 
  cache.setex(cache_key,
              timedelta(minutes=60),
              value='_'.join(regions))

  # posteriormente, cuando la región es "finish", el programa llama a enviar el 
  # gráfico con la comparación


#14

Piensa que si hacemos la versión web, sólo utilizaríamos Python para exponer los datos vía un API. El resto sería javascript :wink: (que es cierto que podríamos tener gráficas y mapas dinámicos!)


#15

Siempre puedes usar Brython para conectarlo todo. Me comprometo a ayudaros con eso si seguís esa vía…


#16

Yo estoy usando python-telegram-bot para un servicio de notificaciones haciendo scrapping de una web. Pero suelo tener problemas con temas de timeouts y retries. ¿Qué tal estas cosas con pyrogram? Por lo que vi en el vídeo bastante mejor…


#17

No hemos tenido demasiados problemas con timeouts y retries con Pyrogram (solamente cuando telegram ha estado caído, si no recuerdo mal). Pero no se si eso está relacionado con el uso de Pyrogram o con la calidad de la conexión.


#18

Ok. Gracias. Intentaré migrar a Pyrogram a ver qué tal la experiencia!