From 1cf4ac6138d23a3d5dd3b22088350ffb935f1743 Mon Sep 17 00:00:00 2001 From: imunnic Date: Sun, 16 Mar 2025 18:20:02 +0100 Subject: [PATCH] =?UTF-8?q?env=C3=ADo=20autom=C3=A1tico=20de=20=C3=ADndice?= =?UTF-8?q?s?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/indices.txt | 1 + app/main.py | 3 +- app/webscrapper.py | 58 +++++++++++++++++++ bot/build.gradle | 1 + .../inversionitasBot/IndiceRequest.java | 41 +++++++++++++ .../imunnic/inversionitasBot/TelegramBot.java | 6 +- .../inversionitasBot/TelegramController.java | 27 +++++++++ 7 files changed, 134 insertions(+), 3 deletions(-) create mode 100644 app/indices.txt create mode 100644 bot/src/main/java/es/imunnic/inversionitasBot/IndiceRequest.java create mode 100644 bot/src/main/java/es/imunnic/inversionitasBot/TelegramController.java diff --git a/app/indices.txt b/app/indices.txt new file mode 100644 index 0000000..a1a2e78 --- /dev/null +++ b/app/indices.txt @@ -0,0 +1 @@ +us-spx-500 \ No newline at end of file diff --git a/app/main.py b/app/main.py index 4ae7d81..748882c 100644 --- a/app/main.py +++ b/app/main.py @@ -3,7 +3,7 @@ from contextlib import asynccontextmanager from database import Base, engine from routes import router from apscheduler.schedulers.background import BackgroundScheduler -from webscrapper import search_from_keywords_file +from webscrapper import search_from_keywords_file, search_from_indices_file # Crear las tablas en MySQL si no existen Base.metadata.create_all(bind=engine) @@ -12,6 +12,7 @@ Base.metadata.create_all(bind=engine) scheduler = BackgroundScheduler() scheduler.add_job(search_from_keywords_file, "cron", hour=11, minute=0) #Ejecutar a las 01:00 scheduler.add_job(search_from_keywords_file, "cron", hour=18, minute=0) #Ejecutar a las 01:00 +scheduler.add_job(search_from_indices_file, "interval", minutes=1) @asynccontextmanager diff --git a/app/webscrapper.py b/app/webscrapper.py index 76b1311..4e55371 100644 --- a/app/webscrapper.py +++ b/app/webscrapper.py @@ -23,6 +23,8 @@ HEADERS = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36" } +TELEGRAM_BOT_URL = "http://telegrambot_app:8080/telegram/send" + def get_author_from_script(url): """ Llama a autorsearcher.py con la URL de la noticia y devuelve el autor encontrado. @@ -184,3 +186,59 @@ def search_from_keywords_file(): logging.info(f"Error al leer el archivo 'keywords.txt': {e}") # Ejecutar la búsqueda desde el archivo + +def search_from_indices_file(): + all_indices=[] + + try: + with open("app/indices.txt", "r", encondig="utf-8") as file: + indices = file.readlines() + indices = [indice.strip() for indice in indices] + + for indice in indices: + logging.info(f"\nAnalizando indice: {indice}") + search_indice(indice) + time.sleep(2) + except FileNotFoundError: + logging.info("No se encontró el archivo 'indices.txt'.") + except Exception as e: + logging.info(f"Error al leer el archivo 'indices.txt': {e}") + +def search_indice(indice): + base_url = f"https://www.investing.com/indices/{indice}" + + try: + response = requests.get(base_url, headers=HEADERS) + + if response.status_code != 200: + logging.info(f"Error al acceder a la página para la consulta '{indice}': {response.status_code}") + return + + soup = BeautifulSoup(response.content, 'html.parser') + + # Buscar los valores dentro del HTML + price = soup.find("div", {"data-test": "instrument-price-last"}) + price_change = soup.find("span", {"data-test": "instrument-price-change"}) + price_change_percent = soup.find("span", {"data-test": "instrument-price-change-percent"}) + + if price and price_change and price_change_percent: + data = { + "indice": indice, + "valorActual": float(price.text.replace(",", "").strip()), # Convertir a número + "cambio": float(price_change.text.replace(",", "").strip()), # Convertir a número + "porcentaje": price_change_percent.text.strip() + } + + # Enviar los datos al bot de Telegram + response_telegram = requests.post(TELEGRAM_BOT_URL, json=data) + + if response_telegram.status_code == 200: + logging.info(f"Mensaje enviado a Telegram correctamente para '{indice}'") + else: + logging.error(f"Error enviando mensaje a Telegram: {response_telegram.status_code} - {response_telegram.text}") + else: + logging.info(f"No se encontraron datos para el índice '{indice}'.") + + except requests.RequestException as e: + logging.error(f"Error en la solicitud: {e}") + \ No newline at end of file diff --git a/bot/build.gradle b/bot/build.gradle index dbcffca..958bf25 100644 --- a/bot/build.gradle +++ b/bot/build.gradle @@ -18,6 +18,7 @@ repositories { } dependencies { + implementation 'org.springframework.boot:spring-boot-starter-web' implementation 'org.telegram:telegrambots-spring-boot-starter:6.9.7.0' implementation 'org.telegram:telegrambots-abilities:6.9.7.0' implementation 'org.springframework.boot:spring-boot-starter-logging' diff --git a/bot/src/main/java/es/imunnic/inversionitasBot/IndiceRequest.java b/bot/src/main/java/es/imunnic/inversionitasBot/IndiceRequest.java new file mode 100644 index 0000000..7adffec --- /dev/null +++ b/bot/src/main/java/es/imunnic/inversionitasBot/IndiceRequest.java @@ -0,0 +1,41 @@ +package es.imunnic.inversionitasBot; + +public class IndiceRequest { + private String indice; + private double valorActual; + private double cambio; // Nuevo campo agregado + private String porcentaje; + + // Getters y Setters + public String getIndice() { + return indice; + } + + public void setIndice(String indice) { + this.indice = indice; + } + + public double getValorActual() { + return valorActual; + } + + public void setValorActual(double valorActual) { + this.valorActual = valorActual; + } + + public double getCambio() { + return cambio; + } + + public void setCambio(double cambio) { + this.cambio = cambio; + } + + public String getPorcentaje() { + return porcentaje; + } + + public void setPorcentaje(String porcentaje) { + this.porcentaje = porcentaje; + } +} diff --git a/bot/src/main/java/es/imunnic/inversionitasBot/TelegramBot.java b/bot/src/main/java/es/imunnic/inversionitasBot/TelegramBot.java index b8d5eef..300e86a 100644 --- a/bot/src/main/java/es/imunnic/inversionitasBot/TelegramBot.java +++ b/bot/src/main/java/es/imunnic/inversionitasBot/TelegramBot.java @@ -25,6 +25,8 @@ public class TelegramBot extends TelegramLongPollingBot { //@Value("${telegram.bot.token}") private String BOT_TOKEN = "7626026035:AAHEMp_iIN3y8AwywL0R6OTQvNi7EcJZ0iY"; + protected String CHAT_ID = "-1002289752202"; + @Override public String getBotUsername() { return BOT_USERNAME; @@ -49,7 +51,7 @@ public class TelegramBot extends TelegramLongPollingBot { } } - private void sendMessage(String chatId, String text) { + protected void sendMessage(String chatId, String text) { // Primero dividimos el mensaje si es necesario List partes = dividirMensaje(text); @@ -70,7 +72,7 @@ public class TelegramBot extends TelegramLongPollingBot { @Scheduled(cron = "0 0 13,20 * * ?", zone = "Europe/Paris") private void mensajeProgramado(){ - this.construirResumenNoticias("-1002289752202"); + this.construirResumenNoticias(this.CHAT_ID); } private void construirResumenNoticias(String chatid) { diff --git a/bot/src/main/java/es/imunnic/inversionitasBot/TelegramController.java b/bot/src/main/java/es/imunnic/inversionitasBot/TelegramController.java new file mode 100644 index 0000000..1aa9ce8 --- /dev/null +++ b/bot/src/main/java/es/imunnic/inversionitasBot/TelegramController.java @@ -0,0 +1,27 @@ +package es.imunnic.inversionitasBot; + +import org.springframework.web.bind.annotation.*; + +@RestController +@RequestMapping("/telegram") +public class TelegramController { + + private final TelegramBot telegramBot; + + public TelegramController(TelegramBot telegramBot) { + this.telegramBot = telegramBot; + } + + @PostMapping("/send") + public void sendMessage(@RequestBody IndiceRequest request) { + String mensaje = String.format( + "*📊 Índice:* `%s`\n" + + "*💰 Valor Actual:* `%,.2f`\n" + + "*📉 Cambio:* `%,.2f`\n" + + "*📈 Cambio(%):* `%s`", + request.getIndice(), request.getValorActual(), request.getPorcentaje() + ); + telegramBot.sendMessage(telegramBot.CHAT_ID, mensaje ); + } + +}