from telethon import events, utils, Button, TelegramClient import asyncio, os, time, re, sys, threading, random, subprocess, json, base64, requests, shutil, zipfile from bs4 import BeautifulSoup from FastTelethon import download_file, upload_file import subprocess api_id = 9024532 api_hash = "131b576240be107210aace99a5f5c5b0" token = "7829277186:AAGZKtL06JxT5yp0FVNMjFy9yBKJiRpM-Y0" client = TelegramClient("AutoD", api_id, api_hash) class Timer: def __init__(self, time_between=2): self.start_time = time.time() self.time_between = time_between def can_send(self): if time.time() > (self.start_time + self.time_between): self.start_time = time.time() return True return False def execute_command(command): try: result = subprocess.run(command, shell=True, capture_output=True, text=True) if result.stdout: return str(result.stdout) if result.stderr: return str(result.stderr) except Exception as e: return str(f"Error: {e}") def folder_size(folder_path): total_size = 0 for dirpath, dirnames, filenames in os.walk(folder_path): for f in filenames: fp = os.path.join(dirpath, f) total_size += os.path.getsize(fp) return total_size def split_ext(file=None, dir="./",size=3): size = size * 1024 * 1024 files = [] tamano_archivo = os.path.getsize(file) if tamano_archivo < size: files.append(file) else: with open(file, 'rb') as archivo_original: parte = 1 totalparte = (tamano_archivo//size)+1 while True: contenido_parte = archivo_original.read(size) if not contenido_parte: break nombre_parte = f"{file.split('/')[-1].split('.')[0]}.7z.{str(parte).zfill(3)}" with open(dir+"/"+nombre_parte, 'wb') as archivo_parte: archivo_parte.write(contenido_parte) files.append(nombre_parte) parte += 1 os.unlink(file) return files def sizeof_fmt(num, suffix='B'): for unit in ['', 'Ki', 'Mi', 'Gi', 'Ti', 'Pi', 'Ei', 'Zi']: if abs(num) < 1024.0: return "%3.2f%s%s" % (num, unit, suffix) num /= 1024.0 return "%.2f%s%s" % (num, 'Yi', suffix) if not os.path.exists("./files"): os.mkdir("./files") client.start(bot_token=token) users = [] process = [] basedata = {} cdpaths = [] @client.on(events.NewMessage()) async def mybot(event): global basedata global process global cdpaths if len(cdpaths) > 0: cd = "/"+"/".join(cdpaths) else: cd = "/" text = event.raw_text user_id = event.message.chat.id msg_id = event.message.id user_name = event.message.chat.username mode = "auto" try: mode = basedata[f"{user_id}_mode"] except: None if len(users) == 0: users.append(user_id) if not user_id in users: await event.reply("¡Acceso no autorizado!", parse_mode="HTML") raise ValueError(f"({user_id}) No es un usuario autorizado") if not os.path.exists(f"./files"): os.mkdir(f"./files") if not os.path.exists(f"./files_temp"): os.mkdir(f"./files_temp") directorio = f'./files'+cd files = [(archivo, os.path.getmtime(os.path.join(directorio, archivo))) for archivo in os.listdir(directorio)] file = sorted(files, key=lambda x: x, reverse=True) files = [] for f in file: x,y = f files.append(x) if "/start" == text: basedata[f"{user_id}_username"] = user_name await event.reply(f"AUTOD • TechDev", parse_mode="HTML", buttons=[[Button.inline('?', b'')]]) elif "/add " in text: user = int(text.replace("/add", "")) users.append(user) await event.reply("Usuario añadido") elif "/ban " in text: user = int(text.replace("/ban", "")) users.append(user) await event.reply("Usuario borrado") elif "/ls" in text: msg = f"#LISTDIR #GOOD\n{'/'.join(cdpaths)}\nLÍMITE - {sizeof_fmt(folder_size('./files'))}/100.0GiB\n\n" for f in files: if os.path.isfile("./files"+cd+"/"+f): msg += f" 📃 {f}\n" else: msg += f" 📁 {f}\n" if len(files) == 0: msg += "No hay archivos" await event.reply(msg, parse_mode="HTML") elif "/rm " in text: path = text.replace("/rm ", "") try: if os.path.isfile("./files"+cd+"/"+path): os.unlink("./files"+cd+"/"+path) else: shutil.rmtree("./files"+cd+"/"+path) msg = "#REMOVE #GOOD\n\n✓ ¡Directorio Eliminado!" except: msg = "#REMOVE #ERROR\n\nNo existe el directorio" await event.reply(msg, parse_mode="HTML") elif "/cd " in text: path = text.replace("/cd ", "") if not os.path.isdir("./files/"+cd+"/"+path): cdpaths = [] msg = "#CHANGEDIR #ERROR\n\nNo existe el directorio" else: cdpaths = path.split("/") msg = "#CHANGEDIR #GOOD\n\n✓ ¡Directorio abierto!" directorio = f'./files/'+"/".join(cdpaths) files = [(archivo, os.path.getmtime(os.path.join(directorio, archivo))) for archivo in os.listdir(directorio)] file = sorted(files, key=lambda x: x, reverse=True) files = [] for f in file: x,y = f files.append(x) msg = f"\n\n{'/'.join(cdpaths)}\nLÍMITE - {sizeof_fmt(folder_size('./files'))}/100.0GiB\n\n" for f in files: if os.path.isfile("./files"+cd+"/"+f): msg += f" 📃 {f}\n" else: msg += f" 📁 {f}\n" if len(files) == 0: msg += "No hay archivos" await event.reply(msg, parse_mode="HTML") elif "/mkdir " in text: dir = text.replace("/mkdir ", "") os.mkdir("./files"+cd+"/"+dir) msg = "#MAKEDIR #GOOD\n\n✓ ¡DIRECTORIO CREADO!" cdpaths.append(dir) directorio = f'./files/'+"/".join(cdpaths) files = [(archivo, os.path.getmtime(os.path.join(directorio, archivo))) for archivo in os.listdir(directorio)] file = sorted(files, key=lambda x: x, reverse=True) files = [] for f in file: x,y = f files.append(x) msg = f"\n\n{'/'.join(cdpaths)}\nLÍMITE - {sizeof_fmt(folder_size('./files'))}/100.0GiB\n\n" for f in files: if os.path.isfile("./files"+cd+"/"+f): msg += f" 📃 {f}\n" else: msg += f" 📁 {f}\n" if len(files) == 0: msg += "No hay archivos" await event.reply(msg, parse_mode="HTML") elif event.document and user_id in users: code = str(random.randint(100000,999999)) process.append(code) while not code == process[0]: await asyncio.sleep(3) msging = "PREPARANDO" msg = await event.reply(msging, parse_mode="HTML",buttons=[Button.inline("CANCELAR",b'del|'+code.encode('utf-8'))]) await msg.edit("DESCARGANDO", parse_mode="HTML",buttons=[Button.inline("CANCELAR",b'del|'+code.encode('utf-8'))]) basedata[code] = "down:0/0"+"|CARGANDO..." basedata[code+"auto-act"] = True caption = event.message.message mime_type = str(event.media.document.mime_type) extension = mime_type.split("/")[1] if event.file.name: name = event.file.name else: if caption: name = str(caption).split("\n")[0]+"."+extension else: name = "document_"+str(time.strftime("%d_%H_%M_%S"))+"."+extension if os.path.exists("./files/"+name): name = name.replace(".", f"_{str(time.strftime('%d%H%M%S'))}.") timer = Timer() async def progress_bar(current, total): if not code in process: raise ValueError(f"Se detuvo el proceso {code}") basedata[code] = "down:"+str(current)+"/"+str(total) if basedata[code+"auto-act"]: text1 = "DESCARGANDO" bar = f"{round((current/total)*100,1)}% [" prog = round(int(15*(current/total)),0) deprog = 15-prog bar += ("-"*prog)+"|" bar += ("-"*deprog)+"]" if len(process) > 1: infopro = f"\n+{len(process)-1} procesos..." else: infopro = "" if timer.can_send(): await msg.edit(f"{text1}\n\nNombre: {name}\nProgreso: {bar}\nTamaño: {sizeof_fmt(total)}\n\n{infopro}", parse_mode="HTML", buttons=[Button.inline("CANCELAR", b'del|'+code.encode("utf8"))]) with open("./files_temp/"+name, "wb") as out: await download_file(event.client, event.document, out, progress_callback=progress_bar) os.rename("./files_temp/"+name, "./files"+cd+"/"+name) upmsg = await event.reply(f"#DOWNLOAD #GOOD\n\n✓ ¡Proceso completado!", parse_mode="HTML") await client.delete_messages(user_id, msg.id) basedata[code] = None process.remove(code) @client.on(events.CallbackQuery) async def callback_query(event): global basedata global process user_id = event.query.user_id msg_id = event.query.msg_id data = event.query.data.decode("utf-8") orden = str(data).split("|")[0] if orden == "del": code = str(data).split("|")[1] try: process.remove(code) except: None await client.delete_messages(user_id, msg_id) print("CONECTADO") client.run_until_disconnected()