Volver al inicio

Limpieza de Metadatos del Portapapeles en Python

Servicio de Python en Segundo Plano para Windows limpia automáticamente metadatos de archivos en el portapapeles al copiar. Soporta imágenes, DOCX, PDF con protección contra ataques y sobrescritura atómica. Análisis de arquitectura, código y errores típicos de Win32 API.

Demonio de Python: limpieza de metadatos en portapapeles
Advertisement 728x90

Limpieza Automática de Metadatos para Archivos en el Portapapeles con Python

Un demonio en segundo plano para Windows intercepta archivos en el portapapeles inmediatamente después de copiarlos y elimina sus metadatos antes de pegarlos. Esto elimina la necesidad de procesar manualmente imágenes, documentos y videos usando ExifTool o utilidades del sistema. El procesamiento ocurre localmente sin transferencia de datos externa, con protección contra corrupción y ataques de enlaces simbólicos.

Trabajando con el Portapapeles a través de la API Win32

La monitorización del portapapeles se implementa mediante un hilo ClipboardMonitor que sondea el portapapeles cada 500 ms. El formato clave es CF_HDROP, que contiene una lista de rutas de archivos.

Problemas con pywin32:

Google AdInline article slot
  • En versiones antiguas, GetClipboardData(CF_HDROP) devuelve un puntero a DROPFILES, requiriendo DragQueryFileW desde shell32.dll a través de ctypes.
  • En versiones más recientes, devuelve una lista de cadenas, pero PyInstaller o incompatibilidades de DLL pueden romper este comportamiento.

Código de verificación:

if win32clipboard.IsClipboardFormatAvailable(win32clipboard.CF_HDROP):
    file_list = win32clipboard.GetClipboardData(win32clipboard.CF_HDROP)

Validación de Rutas para Seguridad

Antes del procesamiento, las rutas pasan por comprobaciones estrictas en validate_path:

  • Ruta absoluta.
  • Comparación del inodo original y resolved_path (para bloquear enlaces simbólicos).
  • Exclusión de directorios en WINDIR.
  • Límite en el número de archivos (protección contra procesamiento masivo).

Esto previene ataques de enlaces simbólicos y el procesamiento de directorios del sistema. Adicionalmente, se verifica resolved_path.is_file() para excluir carpetas.

Google AdInline article slot

Arquitectura de Procesamiento: Sobrescritura In Situ

Los archivos se sobrescriben en su ruta original sin sustitución en el portapapeles—esto simplifica el manejo de bloqueos de memoria de Windows. Secuencia:

  • Copiar un archivo al portapapeles.
  • Detectar CF_HDROP.
  • Validación y paso a MetadataScrubber.
  • Sobrescritura con la versión limpia.

Limpieza de Imágenes: Reemplazo Atómico

Soporte para JPEG, PNG, TIFF, BMP. Elimina datos EXIF incluyendo geolocalización, dispositivo e información de software.

Estrategia—archivo temporal para atomicidad:

Google AdInline article slot
with Image.open(file_path) as img:
    data = list(img.getdata())
    image_without_exif = Image.new(img.mode, img.size)
    image_without_exif.putdata(data)
    
    temp_path = file_path.with_suffix(file_path.suffix + '.temp')
    image_without_exif.save(temp_path, format=format_name)
    
    shutil.move(str(temp_path), str(file_path))

Garantiza integridad: al pegar se recibe el archivo original o el limpio.

DOCX: Edición Directa de XML

python-docx cambia propiedades pero no Cambios Realizados y comentarios. Solución—analizar partes _blob:

xml = part._blob.decode('utf-8')
if 'w:revision' in xml or 'w:ins' in xml or 'w:del' in xml:
    xml = xml.replace('w:revision', 'w:revision_removed')\
             .replace('w:ins ', 'w:p ')\
             .replace('w:del ', 'w:p ')
    part._blob = xml.encode('utf-8')

Un truco con replace elimina etiquetas de revisión en la raíz, haciendo el documento final para Word. Riesgo—tablas complejas.

PDF y Video: Soporte Básico

PDF a través de pypdf:

writer = PdfWriter()
for page in reader.pages:
    writer.add_page(page)
writer.add_metadata({})

Reconstrucción sin metadatos. Video (MP4, MKV, MOV)—limpieza básica de átomos; limpieza completa requiere ffmpeg.

Problemas con la Bandeja del Sistema

Evitando notificaciones debido a errores de Shell_NotifyIcon:

  • Ciclo de vida incorrecto de HWND conduce a fallos de DestroyWindow.
  • Objetos COM se bloquean al cerrar Tkinter.

Solución—eliminado el módulo para estabilidad en segundo plano. Sondeo a 500 ms resulta en 0% de uso de CPU en inactividad.

Puntos Clave

  • Limpieza automática de metadatos (EXIF, Cambios Realizados, geolocalización) al copiar al portapapeles.
  • Protección contra ataques de enlaces simbólicos y rutas del sistema mediante validación.
  • Sobrescritura atómica de archivos sin riesgo de corrupción.
  • Procesamiento local en Python (PIL, pywin32, pypdf) sin servidores externos.
  • Monitorización optimizada del portapapeles con sobrecarga mínima.

— Editorial Team

Advertisement 728x90

Leer después