74 lines
2.5 KiB
Python
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")
|
|
|
|
|