<jupyter_start><jupyter_text>Ciclo de talleres del Instituto Humai[Humai](https://ihum.ai/) es una organización independiente que busca desarrollar los últimos avances en Inteligencia Artificial y Ciencia de Datos en Argentina y América Latina. El objetivo es abrir el camino hacia la democratización de la tecnología por medio de una educación especializada y accesible. Buscamos colocar las nuevas tecnologías en función de un avance social por medio de la formación, investigación y divulgación colaborativa.  🤖 Taller de AutomatizaciónPor [<NAME>](http://mathigatti.com/)En este taller veremos cómo desarrollar un pequeño bot encargado de navegar por internet buscando novedades de nuestro interés. Aprenderemos cómo hacer que busque y nos notifique al encontrar información sobre, entre otras cosas, eventos, puestos de trabajo prometedores o alquileres económicos.Este evento es parte del [curso de Automatización](https://ihum.ai/cursos/auto) brindado por el Instituto Humai  🎟️ ¿Cómo consigo entradas antes de que se agoten?A veces querés conseguir entradas para ir a un show que te gusta pero cuando vas a reservar tu lugar ya no quedan entradas.La solución puede ser entrar todos los días al sitio web para enterarte de las novedades, pero esto es proclive a fallos si no tenés tiempo o se te olvida.Veamos como automatizar esta tarea.  ✨ Paso 1: Conseguir los datos Para este ejemplo intentaremos descargar los detalles sobre los shows disponibles en el [Centro Cultural Kirchner](https://cck.gob.ar/agenda/)<jupyter_code>from requests import get
import bs4 as bs

# Descargo el codigo HTML
result = get("https://cck.gob.ar/agenda/")

# Hago que la computadora lo vea y lo interprete para luego poder navegarlo facilmente
soup = bs.BeautifulSoup(result.content,'html.parser')


# Extraigo los valores que me interesan
values = soup.find_all("div",{"class":"mec-event-content"})

# Extraigo el texto de cada elemento
shows = [value.text for value in values]

# El comando set borra los titulos repetidos de la lista
shows = set(shows)

# Imprimo los resultados obtenidos
for show in shows:
  print(show)<jupyter_output><empty_output><jupyter_text>✨ Paso 2: Crear un robot notificadorPor su facilidad de uso vamos a utilizar [Telegram](https://telegram.org/) para esto, es un servicio de mensajeria similar a Whatsapp pero con un sistema de creación de bots mas amigable  🛠️ Creación y configuración del botPodés encontrar en internet varias guías como [esta](https://www.adslzone.net/como-se-hace/telegram/crear-bot/) para aprender a crear facilmente tu bot.Queremos que el bot nos envie mensajes, para hacer esto es necesario hablarle al bot (Ellos no pueden hablar si un humano no les habla primero). Luego, ejecutando el siguiente codigo visualizaremos todos los mensajes recibidos por el bot. Allí podremos encontrar el numero identificador (_ID_) de nuestro chat, lo cual será necesario para indicarle al bot a que chat enviar los mensajes.<jupyter_code>from requests import get

bot_token = "<PASSWORD>"
url = f"https://api.telegram.org/bot{bot_token}/getUpdates"
resultado = get(url)
mensajes = resultado.json()
mensajes<jupyter_output><empty_output><jupyter_text>📨 Todo listo para enviar mensajes!<jupyter_code>from requests import post

def send_msg(msg, chat_id, bot_token):
    resp = post(
        f"https://api.telegram.org/bot{bot_token}/sendMessage?"
        f"chat_id={chat_id}&parse_mode=Markdown&text={msg}"
    )
    return resp.json()

chat_id = 1234567 # COMPLETAR
send_msg("hola!", chat_id, bot_token)
# Envio los shows encontrados
for show in shows:
  send_msg(show, chat_id, bot_token)<jupyter_output><empty_output><jupyter_text>✨ Paso 3: Ponemos todo junto<jupyter_code>from time import sleep

from requests import get, post
import bs4 as bs

def send_msg(msg, chat_id, bot_token):
    resp = post(
        f"https://api.telegram.org/bot{bot_token}/sendMessage?"
        f"chat_id={chat_id}&parse_mode=Markdown&text={msg}"
    )
    return resp.json()

bot_token = "<PASSWORD>"
chat_id = 1234567 # COMPLETAR

while True: # Repetir esto por siempre:

  # Descargo el codigo HTML
  result = get("https://cck.gob.ar/agenda/")

  # Hago que la computadora lo vea y lo interprete para luego poder navegarlo facilmente
  soup = bs.BeautifulSoup(result.content,'html.parser')

  # Extraigo los valores que me interesan
  values = soup.find_all("div",{"class":"mec-event-content"})

  # Extraigo el texto de cada elemento
  shows = [value.text for value in values]

  # El comando set borra los titulos repetidos de la lista
  shows = set(shows)

  # Envio los shows encontrados
  for show in shows:
    send_msg(show, chat_id, bot_token)

  sleep(24*60*60) # Dormi 24 horas<jupyter_output><empty_output><jupyter_text>🏘️ ¿Cómo consigo alquileres económicos?Intenemos replicar lo que hicimos con otro ejemplo. Ahora con alquileres de departamentos. En particular utilizando el sitio [mercadolibre.com.ar](https://mercadolibre.com.ar)<jupyter_code># COMPLETAR
#@title SOLUCIÓN
#@markdown Doble click para verla

from requests import get
import bs4 as bs

result = get("https://inmuebles.mercadolibre.com.ar/departamentos/alquiler/sin-dormitorios/capital-federal/villa-urquiza/dueno-directo/departamento-alquiler_NoIndex_True#applied_filter_id%3DBEDROOMS%26applied_filter_name%3DDormitorios%26applied_filter_order%3D4%26applied_value_id%3D%5B0-0%5D%26applied_value_name%3DMonoambiente%26applied_value_order%3D1%26applied_value_results%3D10%26is_custom%3Dfalse")
soup = bs.BeautifulSoup(result.content,'lxml')

apartments = [apartment.text for apartment in soup.find_all('div',{"class":"ui-search-result__content-wrapper"})]
apartments<jupyter_output><empty_output><jupyter_text>💼 ¿Cómo consigo trabajo?Intenemos replicar lo que hicimos con otro ejemplo. Ahora con ofertas laborales. En particular utilizando el sitio [actopublico.bue.edu.ar](https://actopublico.bue.edu.ar/) donde se publican suplencias escolares de la Ciudad de Buenos Aires.<jupyter_code># COMPLETAR
#@title SOLUCIÓN
#@markdown Doble click para verla

from requests import get
import bs4 as bs

result = get("https://actopublico.bue.edu.ar/")
soup = bs.BeautifulSoup(result.content,'lxml')

jobs = [job for job in soup.find_all('div',{"class":"card-flex"})]
details_list = [job.text for job in jobs]
details_list<jupyter_output><empty_output>
{'fraction_non_alphanumeric': 0.08602999210734018, 'fraction_numerical': 0.009313338595106552, 'mean_word_length': 5.458715596330276, 'pattern_counts': {'":': 4, '<': 28, '<?xml version=': 0, '>': 28, 'https://': 14, 'lorem ipsum': 0, 'www.': 1, 'xml': 2}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'chain_length': '6', 'dir': 'jupyter-structured-clean-dedup', 'id': '272455', 'license': 'MIT', 'n_tokens_mistral': 2240, 'n_tokens_neox': 2181, 'n_words': 666, 'path': 'automatizacion.ipynb', 'repo_name': 'institutohumai/talleres', 'size': '6340'}