initial commit

This commit is contained in:
Kevin Muñoz 2024-03-05 09:49:16 -05:00
commit db6d71d4ff
No known key found for this signature in database
GPG Key ID: 3CA0B9DF1BE7CE09
6 changed files with 308 additions and 0 deletions

5
.env.example Normal file
View File

@ -0,0 +1,5 @@
TELEGRAM_BOT_TOKEN=AAAAAAAAAA:BBBBBBBBBBBBBBBBBBBBBBBBBBBB
MINIO_ENDPOINT=https://play.min.io
MINIO_ACCESS_KEY=
MINIO_SECRET_KEY=

7
.gitignore vendored Normal file
View File

@ -0,0 +1,7 @@
.env
venv/
.venv/
env/
.env/
ENV/

137
README.md Normal file
View File

@ -0,0 +1,137 @@
# 🤖 Botsito para Subir Archivos al S3 MinIO
Este bot de Telegram te permite subir archivos de forma sencilla a tu servidor MinIO S3. Utiliza una interfaz de chat amigable para seleccionar el bucket al que deseas cargar tus archivos y te proporciona información detallada sobre los archivos subidos, incluidos los metadatos asociados.
[![Arch linux](https://img.shields.io/badge/Arch%20Linux-1793D1?logo=arch-linux&logoColor=fff&style=flat-square)]()
## Variables de entorno
Para ejecutar este proyecto, deberá agregar las siguientes variables de entorno a su archivo .env
`TELEGRAM_BOT_TOKEN=AAAAAAAAAA:BBBBBBBBBBBBBBBBBBBBBBBBBBBB`
`MINIO_ENDPOINT=https://play.min.io`
`MINIO_ACCESS_KEY=`
`MINIO_SECRET_KEY=`
## 🚀 Caracteristicas
- **Interfaz Intuitiva**: Utiliza comandos simples y una interfaz de chat para interactuar con el bot.
- **Subida de Archivos**: Permite subir archivos directamente desde Telegram al servidor MinIO S3.
- **Selección de Bucket**: Elige el bucket de destino para tus archivos de una lista de opciones proporcionadas.
- **Metadatos Detallados**: Muestra información detallada sobre los archivos subidos, incluidos los metadatos.
## 📚 Comandos Disponibles:
- `/start`: Inicia el bot y muestra la lista de buckets disponibles para seleccionar.
- `/help`: Muestra la ayuda con información sobre cómo usar el bot y los comandos disponibles.
## 💼 Lista de Buckets Disponibles:
- Bancoppel
- Caja Dr.Arroyo
- Caja Oblatos
- Caja Popular Dolores
- Caja Solidaria
- Comomfort
- Bucket de contingencia
- Cooperativa Suljaa
- Caja Popular 15 de Mayo
- Caja Popular Merced
- Caja Popular Santuario Guadalupano
- Caja Solidaria Guachinango
- Caja Solidaria San Miguel Huimilpan
- Financiera Tamazula
- Imperialcc
- Lenocirochin
- Mario bro
- Mizuho
- Mufg
- Tepayac
- Test
- Walmart
- XHash
## 📝 Uso del Bot:
1. **Inicio**: Inicia el bot con el comando `/start`.
2. **Selección de Bucket**: Elige uno de los buckets de la lista proporcionada.
3. **Subida de Archivos**: Envía el archivo que deseas subir al bucket seleccionado.
4. **Confirmación y Metadatos**: El bot te informará una vez que el archivo haya sido subido correctamente y te mostrará los metadatos asociados.
## Deployment
Para implementar este proyecto, ejecute
```bash
$ python -m venv .venv
```
```bash
$ source .venv/bin/activate
```
```bash
$ pip install -r requirements.txt
```
```bash
$ deactivate
```
Modifique las lineas de archivo s3bot.service segun donde dejo la carpeta del bot y su entorno virtual
```
[Unit]
Description=Telegram Bot Service
After=network.target
[Service]
WorkingDirectory=/home/mrhacker/botS3
ExecStart=/home/mrhacker/botS3/venv/bin/python /home/mrhacker/botS3/bots3.py
Restart=always
RestartSec=3
[Install]
WantedBy=multi-user.target
```
Copie el archivo .service
```bash
# cp s3bot.service /etc/systemd/system/s3bot.service
```
Reinicie el servidor de demonios y active el servicio del BotS3
```bash
# systemctl daemon-reload
```
Inicie el demonio del bot
```bash
# systemctl start s3bot
```
Active el inicio automatico
```bash
# systemctl enable s3bot
```
## 🛠️ Tecnologías Utilizadas:
- Python
- Telebot (Wrapper de la API de Telegram)
- Boto3 (Cliente de AWS SDK para Python)
## Autor
- [@MrHacker]()

125
bots3.py Normal file
View File

@ -0,0 +1,125 @@
#!/usr/bin/env python
import telebot
import boto3
from dotenv import load_dotenv
from telebot import types
import os
load_dotenv()
TELEGRAM_BOT_TOKEN = os.getenv('TELEGRAM_BOT_TOKEN')
MINIO_ENDPOINT = os.getenv('MINIO_ENDPOINT')
MINIO_ACCESS_KEY = os.getenv('MINIO_ACCESS_KEY')
MINIO_SECRET_KEY = os.getenv('MINIO_SECRET_KEY')
bot = telebot.TeleBot(TELEGRAM_BOT_TOKEN)
BUCKETS = [
('bancoppel', 'Bancoppel'),
('cajadrarroyo', 'Caja Dr.Arroyo'),
('cajaoblatos', 'Caja Oblatos'),
('cajapopulardolores', 'Caja Popular Dolores'),
('cajasolidaria', 'Caja Solidaria'),
('comonfort', 'Comomfort'),
('contingency', 'Bucket de contingencia'),
('coopsuljaa', 'Cooperativa Suljaa'),
('cp15demayo', 'Caja Popular 15 de Mayo'),
('cpmerced', 'Caja Popular Merced'),
('cpsantuarioguadalupano', 'Caja Popular Santuario Guadalupano'),
('csguachinango', 'Caja Solidaria Guachinango'),
('cssmh', 'Caja Solidaria San Miguel Huimilpan'),
('financieratamazula', 'Financiera Tamazula'),
('imperialcc', 'Imperialcc'),
('lenocirochin', 'Lenocirochin'),
('mario', 'Mario bro'),
('mizuho', 'Mizuho'),
('mufg', 'Mufg'),
('tepeyac', 'Tepayac'),
('test', 'Test'),
('walmart', 'Walmart'),
('xhash', 'XHash'),
]
selected_buckets = {}
@bot.message_handler(commands=['start'])
def start(message):
bot.reply_to(message, """
**Hola! Este bot te permite subir archivos a tu servidor MinIO S3.**
**Selecciona un bucket para subir tu archivo:**
""", reply_markup=generar_teclado_buckets())
@bot.message_handler(commands=['help'])
def help_message(message):
bot.reply_to(message, """
**Bienvenido a la ayuda de este bot!**
Para subir un archivo:
- Simplemente envía el archivo que deseas subir y selecciona el bucket al que deseas subirlo.
Para ver la lista de comandos disponibles:
- Usa el comando /help
""")
@bot.callback_query_handler(func=lambda call: True)
def handle_callback(call):
bucket_name = call.data
chat_id = call.message.chat.id
selected_buckets[chat_id] = bucket_name
bot.answer_callback_query(callback_query_id=call.id, text=f'Selected bucket: {bucket_name}')
bot.send_message(chat_id, f"Bucket seleccionado: {bucket_name}\n\nAhora enviame el archivo que quieres almacenar en el nombre del bucket")
@bot.message_handler(content_types=['document'])
def handle_document(message):
try:
chat_id = message.chat.id
if chat_id not in selected_buckets:
bot.reply_to(message, "Por favor selecciona un bucket primero.")
return
file_info = bot.get_file(message.document.file_id)
file_buffer = bot.download_file(file_info.file_path) # Descargar archivo en memoria
file_bytes = bytes(file_buffer) # Convertir a bytes
filename = message.document.file_name
bucket_name = selected_buckets[chat_id]
s3 = boto3.client('s3', endpoint_url=MINIO_ENDPOINT,
aws_access_key_id=MINIO_ACCESS_KEY,
aws_secret_access_key=MINIO_SECRET_KEY) # Crear cliente de S3 con las claves de MinIO
# Define los metadatos que deseas adjuntar al archivo
metadata = {
'user': str(message.from_user.id),
'file_name': filename,
'content_type': message.document.mime_type
}
# Sube el archivo con los metadatos definidos
s3.put_object(Bucket=bucket_name, Key=filename, Body=file_bytes, Metadata=metadata)
bot.reply_to(message, f"Archivo {filename} subido exitosamente al bucket {bucket_name}")
# Muestra los metadatos del archivo subido
bot.send_message(chat_id, f"Metadatos del archivo {filename}:\n\n{metadata}")
except Exception as e:
bot.reply_to(message, f"Error al subir el archivo: {e}")
def generar_teclado_buckets():
keyboard = telebot.types.InlineKeyboardMarkup()
buckets_row = []
for bucket_name, bucket_text in BUCKETS:
buckets_row.append(telebot.types.InlineKeyboardButton(bucket_text, callback_data=bucket_name))
if len(buckets_row) == 3:
keyboard.row(*buckets_row)
buckets_row = []
if buckets_row:
keyboard.row(*buckets_row)
return keyboard
bot.polling()

21
requirements.txt Normal file
View File

@ -0,0 +1,21 @@
argon2-cffi==23.1.0
argon2-cffi-bindings==21.2.0
boto3==1.34.55
botocore==1.34.55
certifi==2024.2.2
cffi==1.16.0
charset-normalizer==3.3.2
configparser==6.0.1
idna==3.6
jmespath==1.0.1
pycparser==2.21
pycryptodome==3.20.0
pyTelegramBotAPI==4.16.1
python-dateutil==2.9.0.post0
python-dotenv==1.0.1
pytz==2024.1
requests==2.31.0
s3transfer==0.10.0
six==1.16.0
typing_extensions==4.10.0
urllib3==2.0.7

13
s3bot.service Normal file
View File

@ -0,0 +1,13 @@
[Unit]
Description=Telegram Bot Service
After=network.target
[Service]
WorkingDirectory=/home/mrhacker/botS3
ExecStart=/home/mrhacker/botS3/venv/bin/python /home/mrhacker/botS3/bots3.py
Restart=always
RestartSec=3
[Install]
WantedBy=multi-user.target