uploaderbot / bot.py
rastroberto's picture
Update bot.py
d1d90bc verified
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# (c) Shrimadhav U K (Modded by Optima 🫦)
import os
import subprocess
import logging
import asyncio
from flask import Flask
from threading import Thread
from dotenv import load_dotenv
import pyrogram
import uvloop
# ----------------------------------------
# 1. PARCHE ARIA2C Y ENTORNO
# ----------------------------------------
if not os.path.exists("aria2c"):
print("Mami está bajando tu juguetito para Render/HF...")
link = "https://github.com/asdo92/aria2-static-builds/releases/download/v1.37.0/aria2-1.37.0-linux-gnu-64bit-build1.tar.bz2"
os.system(f"curl -L {link} -o aria2.tar.bz2")
os.system("tar -jxvf aria2.tar.bz2 --wildcards '*/aria2c' --strip-components=1")
if os.path.exists("aria2c"):
os.chmod("aria2c", 0o755)
os.system("rm aria2.tar.bz2")
print("✅ aria2c está listo para la acción.")
# ----------------------
# 2. CONFIGURACIÓN LOGGING
# ----------------------
logging.basicConfig(
level=logging.INFO,
format='%(asctime)s - %(name)s - %(levelname)s - %(message)s'
)
logger = logging.getLogger(__name__)
# ----------------------
# 3. SERVIDOR FLASK (LA CARA PÚBLICA)
# ----------------------
server = Flask(__name__)
@server.route('/')
def home():
return "I'm alive and kicking! 🚀 - Optimus Prime Edition"
def run_server():
# Hugging Face necesita el puerto 7860 sí o sí
port = int(os.environ.get("PORT", 7860))
logger.info(f"🌐 Iniciando Flask en el puerto {port}")
server.run(host='0.0.0.0', port=port)
def keep_alive():
t = Thread(target=run_server)
t.daemon = True
t.start()
# ----------------------
# 4. CONFIGURACIÓN DEL BOT
# ----------------------
load_dotenv()
# Intentamos cargar la configuración
try:
if os.environ.get("WEBHOOK"):
from sample_config import Config
else:
from config import Config
except ImportError:
logger.error("❌ No se encontró el archivo de configuración (config.py).")
class Config:
DOWNLOAD_LOCATION = "./downloads"
TG_BOT_TOKEN = os.environ.get("TG_BOT_TOKEN")
APP_ID = int(os.environ.get("APP_ID", 0))
API_HASH = os.environ.get("API_HASH")
# ----------------------
# 5. FUNCIÓN PRINCIPAL
# ----------------------
async def main():
# Crear carpeta de descargas
if not os.path.isdir(Config.DOWNLOAD_LOCATION):
os.makedirs(Config.DOWNLOAD_LOCATION)
# IMPORTANTE: Cargamos el String de 271 bytes que generamos con Optima
SESSION = os.environ.get("BOT_SESSION_STRING")
app = pyrogram.Client(
name=":memory:",
session_string=SESSION if SESSION else None,
bot_token=Config.TG_BOT_TOKEN,
api_id=Config.APP_ID,
api_hash=Config.API_HASH,
plugins=dict(root="plugins"),
in_memory=True, # Vital para Hugging Face
ipv6=False # Evita Timeouts en la red de HF
)
async with app:
me = await app.get_me()
logger.info(f"🚀 Bot @{me.username} iniciado con éxito.")
# Mantener vivo el loop asíncrono
await asyncio.Event().wait()
# ----------------------
# 6. EJECUCIÓN
# ----------------------
if __name__ == "__main__" :
# Instalamos el loop de alta velocidad
uvloop.install()
# PASO CLAVE: Arrancamos la web ANTES que el bot
keep_alive()
try:
asyncio.run(main())
except KeyboardInterrupt:
logger.warning("Bot detenido por el usuario.")
except Exception as e:
logger.critical(f"Error fatal: {e}")