openclaw-feishu-media-fixer es una utilidad diseñada para solucionar un problema conocido en la integración de OpenClaw con Feishu (Lark), donde el framework no logra transmitir archivos multimedia como imágenes a través del canal de mensajes.
Descripción del Problema
La raíz del fallo se encuentra en el módulo de despacho de respuestas de la extensión de Feishu. La función encargada de enviar mensajes (deliver) únicamente procesa la propiedad text del payload, ignorando por completo el array mediaUrls que contiene las rutas a los archivos multimedia.
// Fragmento del código original con el fallo
async function despacharRespuesta(
parametros: ParametrosDespacho,
identificadorChat: string,
respuestaAId?: string,
): Promise<void> {
const { configuracion, cuenta, idCuenta } = parametros;
const { payload } = parametros.solicitud;
// Solo se gestiona el texto, la lógica multimedia está ausente.
if (payload.text) {
await enviarMensajeFeishu({
configuracion,
destino: identificadorChat,
texto: payload.text,
respuestaAId,
idCuenta,
});
}
// El array payload.mediaUrls es completamente omitido.
}
Solución Implementada
La corrección implica inyectar lógica adicional en el flujo de despacho para reconocer y transmitir los recursos multimedia antes de enviar el texto adjunto.
Modificaciones Clave
Se incorpora la importación de la función enviarMediaFeishu desde el módulo de medios. Luego, dentro de la función despacharRespuesta, se itera sobre el array payload.mediaUrls, invocando la función de envío para cada URL y manejando errores de forma aislada.
import { enviarMediaFeishu } from "./medios.js";
async function despacharRespuesta(
parametros: ParametrosDespacho,
identificadorChat: string,
respuestaAId?: string,
): Promise<void> {
const { configuracion, cuenta, idCuenta } = parametros;
const { payload } = parametros.solicitud;
// Nuevo bloque para el envío de archivos multimedia
if (payload.mediaUrls?.length) {
for (const urlMedia of payload.mediaUrls) {
try {
await enviarMediaFeishu({
configuracion,
destino: identificadorChat,
urlMedia,
respuestaAId,
idCuenta,
});
} catch (fallo) {
parametros.registro?.error(`Error al enviar medio: ${urlMedia}`, fallo);
}
}
}
// Lógica original para el texto
if (payload.text) {
await enviarMensajeFeishu({
configuracion,
destino: identificadorChat,
texto: payload.text,
respuestaAId,
idCuenta,
});
}
}
Instalación y Uso
La herramienta proporciona un script de instalación automatizado que localiza la instalación de OpenClaw, crea una copia de seguridad del archivo a modificar, aplica el parche y reinicia el servicio de la puerta de enlace (gateway).
# Descarga y ejecución del script de instalación
curl -fsSL https://raw.githubusercontent.com/xixiluo95/openclaw-feishu-media-fixer/main/install.sh | bash
El script está diseñado para ser idempotente: si detecta que la corrección ya ha sido aplicdaa, no realizará cambios. En caso de un fallo durante el reinicio del servicio, intentará restaurar automáticamente la copia de seguridad creada.
Revertir los Cambios
Para deshacer la corrección manualmente:
- Identifique el archivo de copia de seguridad más reciente en
~/.openclaw-feishu-fixer/backups/. - Cópielo sobre el archivo objetivo en la instalación de OpenClaw, ubicado típicamente en
~/.npm-global/lib/node_modules/openclaw/extensions/feishu/src/reply-dispatcher.ts. - Reinicie el serivcio:
systemctl --user restart openclaw-gateway.service.
Estructura del Proyecto
El repositorio sigue una arquitectura modular para facilitar el mantenimiento:
- src/commands/fix.ts: Punto de entrada para el comando de corrección.
- src/core/detector.ts: Módulo responsable de localizar la instalación de OpenClaw y analizar el estado del archivo objetivo.
- src/core/patcher.ts: Contiene la lógica para aplicar la transformación de código necesaria.
- src/core/backup.ts: Gestiona la creación y restauración de copias de seguridad con marcas de tiempo.
- src/cli.ts: Interfaz de línea de comandos principal.
Compatibilidad
| Componente | Versión Soportada |
|---|---|
| OpenClaw | 2026.2.x |
| Node.js | 18+ |
| Sistema Operativo | Linux (requiere systemd) |
Ha sido probado en distribuciones como Ubuntu 22.04 LTS, Debian 12 y CentOS Stream 8.