Files
inversionitasbot/app/main.py

74 lines
2.5 KiB
Python

from fastapi import FastAPI
from contextlib import asynccontextmanager
from database import Base, engine
from routes import router
from apscheduler.schedulers.background import BackgroundScheduler
from apscheduler.triggers.cron import CronTrigger
from webscrapper import search_from_keywords_file, search_indice
import csv
from datetime import datetime, time
# Crear las tablas en MySQL si no existen
Base.metadata.create_all(bind=engine)
# Configurar el scheduler (solo una instancia)
scheduler = BackgroundScheduler()
# Agregar tareas fijas
scheduler.add_job(search_from_keywords_file, "cron", hour=11, minute=0) # Ejecutar a las 11:00 AM
scheduler.add_job(search_from_keywords_file, "cron", hour=18, minute=0) # Ejecutar a las 6:00 PM
def cargar_tareas_desde_csv(indices):
"""Lee el CSV y agrega tareas al scheduler"""
try:
with open(indices, mode='r', encoding='utf-8') as file:
reader = csv.reader(file, delimiter=';')
for row in reader:
if len(row) < 4: # Verifica que haya suficientes columnas
print(f"❌ Línea incorrecta en CSV: {row}")
continue
url, nombre, horaInicio, horaFin = row # Extrae los valores
try:
horaInicio = datetime.strptime(horaInicio.strip(), "%H:%M").time()
horaFin = datetime.strptime(horaFin.strip(), "%H:%M").time()
except ValueError:
print(f"❌ Formato de hora incorrecto en línea: {row}")
continue
obj = {"url": url.strip(), "nombre": nombre.strip(), "horaInicio": horaInicio, "horaFin": horaFin}
# Programar ejecución solo dentro del rango de horas permitido
for hora in range(horaInicio.hour, horaFin.hour + 1):
scheduler.add_job(
search_indice,
trigger=CronTrigger(hour=hora, minute=0),
args=[obj]
)
print("✅ Tareas programadas correctamente.")
except Exception as e:
print(f"❌ Error al leer el archivo CSV: {e}")
@asynccontextmanager
async def lifespan(app: FastAPI):
scheduler.start()
yield
scheduler.shutdown()
# Inicializar FastAPI con lifespan
app = FastAPI(lifespan=lifespan)
# Incluir rutas
app.include_router(router)
# Cargar tareas desde el CSV al iniciar
cargar_tareas_desde_csv("indices.csv")