Add bots telegram
This commit is contained in:
parent
71d0a3c4d8
commit
62d0ec78b5
7
.gitignore
vendored
7
.gitignore
vendored
@ -177,3 +177,10 @@ cython_debug/
|
|||||||
# Ignore binary files of mitmproxy
|
# Ignore binary files of mitmproxy
|
||||||
|
|
||||||
mitmproxy/
|
mitmproxy/
|
||||||
|
|
||||||
|
|
||||||
|
# Logs del bot telegram
|
||||||
|
bot.log*
|
||||||
|
logs/
|
||||||
|
|
||||||
|
|
||||||
|
16
catch-all/06_bot_telegram/01_id_bot/id_bot.py
Normal file
16
catch-all/06_bot_telegram/01_id_bot/id_bot.py
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
import telebot
|
||||||
|
import os
|
||||||
|
from dotenv import load_dotenv
|
||||||
|
|
||||||
|
load_dotenv('.env')
|
||||||
|
BOT_TOKEN = os.getenv('BOT_TOKEN')
|
||||||
|
bot = telebot.TeleBot(BOT_TOKEN)
|
||||||
|
|
||||||
|
|
||||||
|
@bot.message_handler(commands=['get_group_id'])
|
||||||
|
def get_group_id(message):
|
||||||
|
chat_id = message.chat.id
|
||||||
|
bot.reply_to(message, f"El ID de este grupo es: {chat_id}")
|
||||||
|
|
||||||
|
|
||||||
|
bot.polling()
|
43
catch-all/06_bot_telegram/02_pruebas_bot/bot.py
Normal file
43
catch-all/06_bot_telegram/02_pruebas_bot/bot.py
Normal file
@ -0,0 +1,43 @@
|
|||||||
|
"""
|
||||||
|
Pruebas con un bot de Telegram
|
||||||
|
Doc: https://github.com/eternnoir/pyTelegramBotAPI
|
||||||
|
"""
|
||||||
|
# bot.py
|
||||||
|
# Este es el script principal que ejecuta el bot de Telegram.
|
||||||
|
|
||||||
|
import signal
|
||||||
|
from termcolor import colored
|
||||||
|
from handlers import bot
|
||||||
|
from logger import logger
|
||||||
|
|
||||||
|
|
||||||
|
def def_handler(sig, frame):
|
||||||
|
"""
|
||||||
|
Manejador de señal para cerrar el programa de forma segura.
|
||||||
|
|
||||||
|
Args:
|
||||||
|
sig: Señal recibida.
|
||||||
|
frame: Frame actual.
|
||||||
|
"""
|
||||||
|
|
||||||
|
print(colored(
|
||||||
|
f"\n\n[!] Saliendo del programa...\n", "red", attrs=["bold"]
|
||||||
|
))
|
||||||
|
logger.info("Bot detenido por el usuario.")
|
||||||
|
bot.stop_polling()
|
||||||
|
exit(1)
|
||||||
|
|
||||||
|
|
||||||
|
# Configurar el manejador de señal para SIGINT (Ctrl+C)
|
||||||
|
signal.signal(signal.SIGINT, def_handler)
|
||||||
|
|
||||||
|
|
||||||
|
# Iniciar el bot
|
||||||
|
if __name__ == "__main__":
|
||||||
|
try:
|
||||||
|
logger.info("Bot iniciado.")
|
||||||
|
bot.infinity_polling()
|
||||||
|
except Exception as e:
|
||||||
|
logger.error(f"Error en la ejecución del bot: {str(e)}")
|
||||||
|
except KeyboardInterrupt:
|
||||||
|
def_handler(None, None)
|
19
catch-all/06_bot_telegram/02_pruebas_bot/config.py
Normal file
19
catch-all/06_bot_telegram/02_pruebas_bot/config.py
Normal file
@ -0,0 +1,19 @@
|
|||||||
|
# config.py
|
||||||
|
# Este módulo gestiona la configuración y la carga de variables de entorno.
|
||||||
|
|
||||||
|
import os
|
||||||
|
from dotenv import load_dotenv
|
||||||
|
|
||||||
|
# Cargar las variables de entorno desde el archivo .env
|
||||||
|
load_dotenv('.env')
|
||||||
|
|
||||||
|
# Obtener el token del bot y el ID del chat de grupo desde las variables de entorno
|
||||||
|
BOT_TOKEN = os.getenv('BOT_TOKEN')
|
||||||
|
GROUP_CHAT_ID = os.getenv('GROUP_CHAT_ID')
|
||||||
|
|
||||||
|
# Validar que las variables de entorno estén configuradas
|
||||||
|
if not BOT_TOKEN or not GROUP_CHAT_ID:
|
||||||
|
raise AssertionError("Por favor, configura las variables de entorno BOT_TOKEN y GROUP_CHAT_ID")
|
||||||
|
|
||||||
|
# Convertir GROUP_CHAT_ID a entero
|
||||||
|
GROUP_CHAT_ID = int(GROUP_CHAT_ID)
|
89
catch-all/06_bot_telegram/02_pruebas_bot/handlers.py
Normal file
89
catch-all/06_bot_telegram/02_pruebas_bot/handlers.py
Normal file
@ -0,0 +1,89 @@
|
|||||||
|
# handlers.py
|
||||||
|
# Este módulo contiene los manejadores de mensajes del bot.
|
||||||
|
|
||||||
|
from telebot import TeleBot
|
||||||
|
from logger import logger
|
||||||
|
import config
|
||||||
|
|
||||||
|
# Mensajes de texto del bot en español
|
||||||
|
text_messages = {
|
||||||
|
'welcome':
|
||||||
|
u'¡Por favor denle la bienvenida a {name}!\n\n'
|
||||||
|
u'Este chat está destinado a preguntas y discusión sobre la pyTelegramBotAPI.\n'
|
||||||
|
u'Para permitir que los miembros del grupo respondan a tus preguntas de forma rápida y precisa, asegúrate de '
|
||||||
|
u'estudiar la documentación del proyecto (https://github.com/eternnoir/pyTelegramBotAPI/blob/master/README.md) '
|
||||||
|
u'y los ejemplos (https://github.com/eternnoir/pyTelegramBotAPI/tree/master/examples) primero.\n\n'
|
||||||
|
u'¡Espero que disfrutes tu estadía aquí!',
|
||||||
|
|
||||||
|
'info':
|
||||||
|
u'Mi nombre es TeleBot,\n'
|
||||||
|
u'Soy un bot que asiste a estas maravillosas personas que crean bots en este chat del grupo de la librería.\n'
|
||||||
|
u'Además, todavía estoy en desarrollo. ¡Por favor, mejora mi funcionalidad haciendo una solicitud de pull! '
|
||||||
|
u'Las sugerencias también son bienvenidas, solo déjalas en este chat del grupo!',
|
||||||
|
|
||||||
|
'wrong_chat':
|
||||||
|
u'¡Hola!\nGracias por probarme. Sin embargo, este bot solo puede usarse en el chat del grupo pyTelegramAPI.\n'
|
||||||
|
u'¡Únete a nosotros!\n\n'
|
||||||
|
u'https://telegram.me/joinchat/067e22c60035523fda8f6025ee87e30b'
|
||||||
|
}
|
||||||
|
|
||||||
|
# Crear una instancia del bot con el token de configuración
|
||||||
|
bot = TeleBot(config.BOT_TOKEN)
|
||||||
|
|
||||||
|
# Manejador para cuando un nuevo participante se une al chat
|
||||||
|
@bot.message_handler(func=lambda m: True, content_types=['new_chat_participant'])
|
||||||
|
def on_user_joins(message):
|
||||||
|
try:
|
||||||
|
# Obtener el nombre del nuevo participante
|
||||||
|
name = message.new_chat_participant.first_name
|
||||||
|
if hasattr(message.new_chat_participant, 'last_name') and message.new_chat_participant.last_name is not None:
|
||||||
|
name += f" {message.new_chat_participant.last_name}"
|
||||||
|
|
||||||
|
if hasattr(message.new_chat_participant, 'username') and message.new_chat_participant.username is not None:
|
||||||
|
name += f" (@{message.new_chat_participant.username})"
|
||||||
|
|
||||||
|
# Enviar mensaje de bienvenida
|
||||||
|
bot.reply_to(message, text_messages['welcome'].format(name=name))
|
||||||
|
except Exception as e:
|
||||||
|
logger.error(f"Error en on_user_joins: {str(e)}")
|
||||||
|
|
||||||
|
# Manejador para los comandos /info y /help
|
||||||
|
@bot.message_handler(commands=['info', 'help'])
|
||||||
|
def on_info(message):
|
||||||
|
try:
|
||||||
|
bot.reply_to(message, text_messages['info'])
|
||||||
|
except Exception as e:
|
||||||
|
logger.error(f"Error en on_info: {str(e)}")
|
||||||
|
|
||||||
|
# Manejador para el comando /ping
|
||||||
|
@bot.message_handler(commands=["ping"])
|
||||||
|
def on_ping(message):
|
||||||
|
try:
|
||||||
|
bot.reply_to(message, "¡Sigo vivo y pateando!")
|
||||||
|
except Exception as e:
|
||||||
|
logger.error(f"Error en on_ping: {str(e)}")
|
||||||
|
|
||||||
|
|
||||||
|
# Manejador para el comando /tq
|
||||||
|
@bot.message_handler(commands=["tq"])
|
||||||
|
def on_ping(message):
|
||||||
|
try:
|
||||||
|
bot.reply_to(message, "¡Te quiero princesa!")
|
||||||
|
except Exception as e:
|
||||||
|
logger.error(f"Error en on_tq: {str(e)}")
|
||||||
|
|
||||||
|
|
||||||
|
# Manejador para el comando /start
|
||||||
|
@bot.message_handler(commands=['start'])
|
||||||
|
def on_start(message):
|
||||||
|
try:
|
||||||
|
bot.reply_to(message, "¡Bienvenido! Usa /info para más información.")
|
||||||
|
except Exception as e:
|
||||||
|
logger.error(f"Error en on_start: {str(e)}")
|
||||||
|
|
||||||
|
# Listener para registrar todos los mensajes recibidos
|
||||||
|
def listener(messages):
|
||||||
|
for m in messages:
|
||||||
|
logger.info(f"Mensaje recibido: {str(m)}")
|
||||||
|
|
||||||
|
bot.set_update_listener(listener)
|
23
catch-all/06_bot_telegram/02_pruebas_bot/logger.py
Normal file
23
catch-all/06_bot_telegram/02_pruebas_bot/logger.py
Normal file
@ -0,0 +1,23 @@
|
|||||||
|
# logger.py
|
||||||
|
# Este módulo configura el logging con rotación de archivos.
|
||||||
|
|
||||||
|
import logging
|
||||||
|
from logging.handlers import RotatingFileHandler
|
||||||
|
|
||||||
|
# Ruta del archivo de log
|
||||||
|
log_file = 'logs/bot.log'
|
||||||
|
|
||||||
|
# Formato de los mensajes de log
|
||||||
|
log_formatter = logging.Formatter('%(asctime)s - %(levelname)s - %(message)s')
|
||||||
|
|
||||||
|
# Configurar RotatingFileHandler
|
||||||
|
# maxBytes: tamaño máximo del archivo de log en bytes (5MB en este caso)
|
||||||
|
# backupCount: número máximo de archivos de respaldo
|
||||||
|
file_handler = RotatingFileHandler(log_file, maxBytes=5*1024*1024, backupCount=5)
|
||||||
|
file_handler.setFormatter(log_formatter)
|
||||||
|
file_handler.setLevel(logging.INFO)
|
||||||
|
|
||||||
|
# Configurar el logger
|
||||||
|
logger = logging.getLogger()
|
||||||
|
logger.setLevel(logging.INFO)
|
||||||
|
logger.addHandler(file_handler)
|
15
catch-all/06_bot_telegram/02_pruebas_bot/utils.py
Normal file
15
catch-all/06_bot_telegram/02_pruebas_bot/utils.py
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
# utils.py
|
||||||
|
# Este módulo contiene funciones utilitarias.
|
||||||
|
|
||||||
|
def is_api_group(chat_id, group_chat_id):
|
||||||
|
"""
|
||||||
|
Verifica si el chat_id proporcionado es el mismo que el ID del grupo API.
|
||||||
|
|
||||||
|
Args:
|
||||||
|
chat_id (int): El ID del chat a verificar.
|
||||||
|
group_chat_id (int): El ID del grupo API.
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
bool: True si chat_id es igual a group_chat_id, de lo contrario False.
|
||||||
|
"""
|
||||||
|
return chat_id == group_chat_id
|
16
catch-all/06_bot_telegram/README.md
Normal file
16
catch-all/06_bot_telegram/README.md
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
# Bots de Telegram
|
||||||
|
|
||||||
|
| Nombre | Descripción | Nivel |
|
||||||
|
| ---------------------------------------------------- | ----------------------------------------- | ---------- |
|
||||||
|
| [Bot que devuelve id del bot](./01_id_bot/id_bot.py) | Bot que devuelve el id del bot | básico |
|
||||||
|
| [Bot pruebas](./02_pruebas_bot/bot.py) | Bot que devuelve mensajes básicos | básico |
|
||||||
|
| **Bot de traducción** (próximamente) | Bot que traduce mensajes a varios idiomas | intermedio |
|
||||||
|
| **Bot de clima** (próximamente) | Bot que devuelve el clima de una ciudad | intermedio |
|
||||||
|
| **Bot de noticias** (próximamente) | Bot que devuelve noticias de última hora | intermedio |
|
||||||
|
| **Bot de mareas** (próximamente) | Bot que devuelve información de mareas | avanzado |
|
||||||
|
| **Bot de juegos** (próximamente) | Bot con juegos de adivinanzas y preguntas | avanzado |
|
||||||
|
| **Bot de películas** (próximamente) | Bot que devuelve información de películas | avanzado |
|
||||||
|
| **Bot de series** (próximamente) | Bot que devuelve información de series | avanzado |
|
||||||
|
| **Bot de libros** (próximamente) | Bot que devuelve información de libros | avanzado |
|
||||||
|
| **Bot de recetas** (próximamente) | Bot que devuelve recetas de cocina | avanzado |
|
||||||
|
| **Bot de deportes** (próximamente) | Bot que devuelve información de deportes | avanzado |
|
@ -13,3 +13,4 @@ Aquí iré dejando scripts y ejercicios que se me ocurran, con lo que no hay un
|
|||||||
| [Clima España](./03_clima/) | Script conectado a API AEMET | intermedio |
|
| [Clima España](./03_clima/) | Script conectado a API AEMET | intermedio |
|
||||||
| [acortador de enlaces](./04_acortador_url/) | Script para acortar enlaces y redirigirlos con app Flask | intermedio |
|
| [acortador de enlaces](./04_acortador_url/) | Script para acortar enlaces y redirigirlos con app Flask | intermedio |
|
||||||
| [API Caching](./05_redis_flask_docker) | App Flask con caché en Redis y con una bbdd | intermedio |
|
| [API Caching](./05_redis_flask_docker) | App Flask con caché en Redis y con una bbdd | intermedio |
|
||||||
|
| [bots Telegram](./06_bots_telegram/README.md) | Bots de Telegram con Python | avanzado |
|
||||||
|
Loading…
Reference in New Issue
Block a user