Files
inversionitasbot/app/telegrambot.py
2025-03-13 09:39:53 +01:00

104 lines
3.3 KiB
Python

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()