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
- Versión compatible de WeChat (actualmente probado con 3.9.8.12 y 3.9.8.15)
- Python 3.8+ (arquitectura 32 o 64 bits según la instalación de WeChat)
- 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.