Monitorización automática de emojis en WeChat mediante Python

Funcionalidad principal

Este sistema permite intercpetar mensajes de WeChat en tiempo real, tanto en chats individuales como grupales, y descargar automáticamente los emojis recibidos. La implementación incluye un mecanismo de almacenamiento local que facilita su posterior organización y búsqueda.

Para la recuperación de emojis, se requiere la integración de modelos de reconocimiento óptico de caracteres (OCR) y generación de descripciones de imáganes. El OCR extrae texto visible en los emojis, mientras que las descripciones generadas por IA sirven para emojis sin elementos textuales. Actualmente, la búsqueda avanzada no está implementada debido a la falta de modelos de código abierto adecuados, pero está prevista para futuras versiones.

Principios de implementación técnica

El sistema se basa en la inyección de código Python en el proceso de WeChat para monitorizar el tráfico de mensajes. Los emojis se identifican por su tipo de mensaje específico (0x2F) y se extraen de sus URLs CDN incluidas en el contenido XML. La arquitectura utiliza una cola de mensajes y un sistema de plugins para procesar cada mensaje de forma modular.

Optimizaciones respecto a versiones anteriores incluyen:

  • Cola de mensajes para procesamiento asíncrono
  • Sistema de plugins extensible para diferentes tipos de mensaje
  • Inicio automático del monitoreo tras la inyección

Requisitso previos

  1. Versión compatible de WeChat (actualmente probado con 3.9.8.12 y 3.9.8.15)
  2. Python 3.8+ (arquitectura 32 o 64 bits según la instalación de WeChat)
  3. Instalación del paquete: pip install wechat_pyrobot==1.1.1

Para fuentes de paquetes internacionales, usar: pip install wechat_pyrobot==1.1.1 -i https://pypi.org/simple/

Configuración básica del monitor

Crear un archivo iniciar_monitoreo.py con el siguiente código:

from py_process_hooker import inyectar_y_supervisar
from wechat_pyrobot import obtener_startup
from wechat_pyrobot.msg_plugins import MostrarMsg, DescargarEmojis

if __name__ == "__main__":
    nombre_proceso = "WeChat.exe"
    mostrar_consola = True
    startup = obtener_startup(plugins_mensajes=[MostrarMsg, DescargarEmojis])
    
    inyectar_y_supervisar(
        nombre_proceso, 
        __file__, 
        consola=mostrar_consola, 
        startup=startup
    )

Implementación del plugin de descarga

El plugin DescargarEmojis procesa mensajes de tipo emoji:

import os
import xml.etree.ElementTree as ET
import requests

class DescargarEmojis:
    def __init__(self, ruta_base):
        self.carpeta_emojis = os.path.join(ruta_base, "emojis_guardados")
        os.makedirs(self.carpeta_emojis, exist_ok=True)
    
    def procesar_mensaje(self, datos_mensaje):
        if datos_mensaje["tipo"] != 0x2F:
            return
        
        contenido_xml = datos_mensaje["contenido"]
        raiz = ET.fromstring(contenido_xml)
        elemento_emoji = raiz.find('.//emoji')
        
        if elemento_emoji is not None:
            url_cdn = elemento_emoji.get("cdnurl", "").replace("&", "&")
            nombre_archivo = datos_mensaje.get("id_mensaje", "desconocido")
            ruta_guardado = os.path.join(self.carpeta_emojis, f"{nombre_archivo}.gif")
            
            contenido = self._descargar_recurso(url_cdn)
            if contenido:
                with open(ruta_guardado, 'wb') as archivo:
                    archivo.write(contenido)
    
    def _descargar_recurso(self, url, reintentos=0):
        if reintentos > 2:
            return None
        
        headers = {
            "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36"
        }
        
        try:
            respuesta = requests.get(url, headers=headers, timeout=8)
            return respuesta.content
        except Exception as e:
            print(f"Error en descarga: {e}")
            time.sleep(1)
            return self._descargar_recurso(url, reintentos + 1)

Desarrollo de plugins personalizados

Los plugins deben heredar de PlantillaPlugin e implementar el método procesar_mensaje. Ejemplo de plugin que guarda mensajes en archivos JSON:

import json
from wechat_pyrobot.clases_plugin import PlantillaPlugin

class GuardarMensajes(PlantillaPlugin):
    def __init__(self, ruta_base):
        self.directorio = os.path.join(ruta_base, "mensajes_json")
        os.makedirs(self.directorio, exist_ok=True)
    
    def procesar_mensaje(self, mensaje):
        nombre_archivo = f"{mensaje['id_mensaje']}.json"
        ruta_completa = os.path.join(self.directorio, nombre_archivo)
        
        with open(ruta_completa, 'w', encoding='utf-8') as f:
            json.dump(mensaje, f, ensure_ascii=False, indent=2)

Para integrar el plugin, modificar el archivo principal incluyéndolo en la lista de plugins:

from mi_guardador import GuardarMensajes

plugins = [MostrarMsg, DescargarEmojis, GuardarMensajes]
startup = obtener_startup(plugins_mensajes=plugins)

El sistema procesa los plugins en orden secuencial, permitiendo que los plugins anteriores modifiquen el diccionario de mensaje antes de pasar al siguiente procesador.

Etiquetas: Python WeChat emojis plugins monitoreo_mensajes

Publicado el 6-3 19:01