import telebot import threading from sqlalchemy.orm import Session from database import get_db from models import NewsItem from datetime import datetime import asyncio import logging LOG_FILE = "bot.log" logging.basicConfig( filename=LOG_FILE, # Archivo de logs level=logging.INFO, # Nivel de logging (DEBUG, INFO, WARNING, ERROR, CRITICAL) format="%(asctime)s - %(levelname)s - %(message)s", # Formato de los logs ) # Configura tu bot con el token de BotFather TOKEN = "7626026035:AAHEMp_iIN3y8AwywL0R6OTQvNi7EcJZ0iY" CHAT_ID = "-4731993289" # Reemplaza con el ID del grupo bot = telebot.TeleBot(token=TOKEN) @bot.message_handler(commands=["start", "help"]) def send_welcome(message): bot.reply_to(message, "Welcome to YourBot! Type /info to get more information.") async def enviar_mensaje(mensaje: str): try: await bot.send_message(chat_id=CHAT_ID, text=mensaje) logging.info("Mensaje enviado: %s", mensaje) except Exception as e: logging.error("Error al enviar mensaje: %s", e) def obtener_titulares_por_keyword(): """ Consulta la base de datos para obtener titulares agrupados por keywords del día actual. """ db: Session = next(get_db()) # Obtener la sesión de la DB try: hoy = datetime.now() # Obtener todas las keywords disponibles keywords = ( db.query(NewsItem.keyword) .filter(NewsItem.fecha == hoy.date()) .distinct() .all() ) keywords = [k[0] for k in keywords if k[0] is not None] # Extraer valores y filtrar None # Obtener titulares por keyword resumen = {} for keyword in keywords: resultados = ( db.query(NewsItem.titulo) .filter( NewsItem.keyword == keyword, NewsItem.fecha == hoy.date(), ) .all() ) resumen[keyword] = [r[0] for r in resultados] # Convertir en lista de strings logging.info("Titulares obtenidos: %s", resumen) return resumen except Exception as e: logging.error("Error al obtener titulares: %s", e) return {} finally: db.close() # Cerrar la conexión @bot.message_handler(commands=["resumen"]) def enviar_resumen_diario(): """ Construye el mensaje con los titulares por keyword y lo envía por Telegram. """ resumen = obtener_titulares_por_keyword() if not resumen: mensaje = "¡Hola! No se encontraron noticias relevantes hoy. ¡Mañana volvemos con más información!" else: mensaje = "¡Hola! Estos son los titulares más relevantes de las noticias de hoy:\n\n" for keyword, titulares in resumen.items(): mensaje += f"🔹 *{keyword}*:\n" for titulo in titulares: mensaje += f" - {titulo}\n" mensaje += "\n" mensaje += "📢 ¡Mañana volveremos con más información!" # Enviar mensaje de forma asíncrona asyncio.create_task(enviar_mensaje(mensaje)) # Función para correr el bot en un hilo separado def start_bot(): logging.info("Iniciando el bot") bot.infinity_polling() # Iniciar en un hilo separado (solo cuando se llame explícitamente) def run(): thread = threading.Thread(target=start_bot, daemon=True) thread.start()