import ctypes import subprocess import sys import re import os import json import time from win10toast import ToastNotifier # Definir una constante para la ruta del directorio DIR = "D:\\Proyectos\\Scripts\\IPChanger" IP_HISTORY_FILE = os.path.join(DIR, "ip_history.json") def is_admin(): """Verifica si el script se está ejecutando con privilegios de administrador.""" try: return ctypes.windll.shell32.IsUserAnAdmin() except: return False def run_as_admin(argv=None, debug=False): """Ejecuta el script como administrador.""" shell32 = ctypes.windll.shell32 if argv is None and shell32.IsUserAnAdmin(): # Ya estamos ejecutando como administrador, no es necesario hacer nada return True if argv is None: argv = sys.argv if hasattr(sys, "_MEIPASS"): # Soporte para PyInstaller arguments = map(str, argv[1:]) else: arguments = map(str, argv) argument_line = " ".join(arguments) executable = str(sys.executable) if debug: print(f"Command line: {executable} {argument_line}") ret = shell32.ShellExecuteW(None, "runas", executable, argument_line, None, 1) if int(ret) <= 32: return False return None def set_static_ip(ip_address, gateway): """Establece una dirección IP estática para el adaptador Ethernet.""" try: subprocess.run( f'netsh interface ip set address "Ethernet" static {ip_address} 255.255.255.0 {gateway}', shell=True, ) return f"Dirección IP establecida en {ip_address}" except Exception as e: return f"Error al establecer la dirección IP: {e}" def set_dhcp(): """Configura el adaptador Ethernet para obtener la dirección IP automáticamente a través de DHCP.""" try: subprocess.run('netsh interface ip set address "Ethernet" dhcp', shell=True) return "Adaptador Ethernet configurado para DHCP" except Exception as e: return f"Error al configurar DHCP: {e}" def save_current_ip(): """Guarda la dirección IP actual del adaptador Ethernet en un archivo.""" try: ip_config_output = subprocess.check_output("ipconfig", shell=True).decode( "cp850" ) current_ip = re.search( "Adaptador de Ethernet Ethernet:[\s\S]*?Dirección IPv4. . . . . . . . . . . . . . : (\d+\.\d+\.\d+\.\d+)", ip_config_output, ) if current_ip: update_ip_history(current_ip.group(1)) return f"Dirección IP actual guardada: {current_ip.group(1)}" else: return "No se encontró la dirección IP actual." except Exception as e: return f"Error al guardar la dirección IP actual: {e}" def update_ip_history(current_ip): """Actualiza el historial de las últimas 10 IPs usadas, excluyendo 'auto'.""" if current_ip.lower() == "auto": return if os.path.exists(IP_HISTORY_FILE): with open(IP_HISTORY_FILE, "r") as file: ip_history = json.load(file) else: ip_history = [] ip_history.insert(0, current_ip) ip_history = ip_history[:10] with open("ip_history.json", "w") as file: json.dump(ip_history, file) def restore_last_ip(): """Restaura la última dirección IP guardada para el adaptador Ethernet.""" if os.path.exists(IP_HISTORY_FILE): with open(IP_HISTORY_FILE, "r") as file: ip_history = json.load(file) if ip_history: last_ip = ip_history[0] # Obtener la última IP del historial gateway = last_ip.rsplit(".", 1)[0] + ".1" return set_static_ip(last_ip, gateway) else: return "No hay direcciones IP guardadas en el historial." else: return "No se encontró el archivo de historial de IPs." def get_input_parameter(): """Solicita al usuario un parámetro por línea de comandos.""" return input( "Ingrese la dirección IP, 'auto' para DHCP, o 'last' para la última IP: " ) def display_ip_history(ip_history): """Muestra el historial de las últimas 10 IPs y permite al usuario seleccionar una.""" if ip_history: for i, ip in enumerate(ip_history): print(f"{i}: {ip}") choice = input( "Seleccione una IP del historial (0-9), o presione Enter para continuar: " ) if choice.isdigit() and 0 <= int(choice) < len(ip_history): return ip_history[int(choice)] return None def main(): if not is_admin(): # Si no se está ejecutando como administrador, solicitar elevación result = run_as_admin() if result is True: print("Ejecutando como administrador.") elif result is False: print("No se pudo obtener privilegios de administrador.") return else: # El script se reinició con privilegios de administrador return if os.path.exists(IP_HISTORY_FILE): with open(IP_HISTORY_FILE, "r") as file: ip_history = json.load(file) argument = sys.argv[1] if len(sys.argv) > 1 else None if not argument: chosen_ip = display_ip_history() if chosen_ip: argument = chosen_ip else: argument = get_input_parameter() # Guardar la dirección IP actual solo si no es 'auto' if argument.lower() != "auto": message = save_current_ip() if argument == "auto": message = set_dhcp() elif argument == "last": message = restore_last_ip() else: ip_parts = argument.split(".") if len(ip_parts) == 3: argument += ".249" gateway = ".".join(ip_parts[:3]) + ".1" message = set_static_ip(argument, gateway) update_ip_history(argument) # Actualizar el historial solo con IPs estáticas # Aquí asumimos que 'message' contiene el mensaje que quieres mostrar try: toaster = ToastNotifier() toaster.show_toast("Cambio de IP", message, duration=10) except Exception as e: print( f"Se produjo un error al mostrar la notificación, pero la operación se completó con éxito: {e}" ) if __name__ == "__main__": main()