Entender una exportación de espacio de trabajo de Slack
Una exportación de Slack no es un archivo. Es un árbol de directorios: una carpeta por canal, dentro un archivo JSON por día, más un puñado de archivos de metadatos del espacio en la raíz. Abre cualquier archivo diario y encuentras un array de objetos mensaje donde el autor es un código como U04J8K2L9, el texto está trufado de marcado entre ángulos y la marca temporal es un tiempo Unix con microsegundos guardado como cadena.
Esta página vuelve a montar todo eso en transcripciones legibles, una por canal, en orden de fecha, con nombres reales. Suelta el .zip entero: se lee en esta pestaña y nunca se sube.
Los nombres están en otro archivo
Esto es lo único que hace ilegible una exportación de Slack sin herramientas. Los mensajes identifican a su autor mediante un identificador de usuario y nada más. La correspondencia entre esos identificadores y nombres humanos vive en users.json, en la raíz del paquete, separada de cada mensaje que la necesita.
Por eso users.json se lee primero, antes que cualquier archivo de canal, y la tabla resultante se arrastra durante todo el análisis. Cada usuario ofrece varios nombres posibles — nombre real, nombre visible, identificador de cuenta — y se prueban en ese orden, ya que el nombre real es el que reconoce quien lee y el visible es el que muestra Slack cuando está puesto. Algunas exportaciones incrustan además un objeto user_profile directamente en el mensaje; cuando está, se prefiere, porque registra el nombre tal como era entonces y no tal como es ahora.
Los mensajes de bots no tienen identificador de usuario en absoluto: llevan un identificador de bot y a veces un nombre de usuario. Se tratan aparte para que la salida de una integración quede atribuida en lugar de aparecer en blanco.
El marcado propio de Slack
El texto de los mensajes no es simple. Slack envuelve varios tipos de referencia entre ángulos y, si se dejan como están, hacen la transcripción difícil de leer:
- Las menciones de usuario aparecen como
<@U04J8K2L9>. Se resuelven con la misma tabla de usuarios y pasan a ser un@nombrelegible. - Las referencias a canales aparecen como
<#C01234ABC|general>, unas veces con el nombre tras la barra vertical y otras sin él. - Los enlaces tienen la forma
<https://example.com|texto visible>. El texto se conserva con la URL entre paréntesis justo después, de modo que no se pierde ni la redacción ni el destino. - Las menciones generales como
<!here>y<!channel>pasan a su equivalente simple. - Las entidades HTML. Los ampersands, los ángulos y las comillas van escapados en el origen y se descodifican de vuelta.
Ruido que conviene descartar
Slack registra los eventos como mensajes con un subtipo. Entradas y salidas de canal, cambios de propósito y de tema, avisos de archivado: todo está en el mismo array que la conversación real. En un espacio de cierto tamaño pueden superar en número a los mensajes reales, sobre todo en canales generales donde se añade a todo el mundo automáticamente. Se clasifican como mensajes del sistema y se descartan por defecto.
Está además el caso de un mensaje sin texto alguno: una subida de archivo, o una publicación de bot cuyo contenido vive enteramente en un bloque de adjunto. Los adjuntos se revisan en busca de texto antes de descartar el mensaje, de forma que una integración que publica su salida como adjunto sigue aportando su contenido en lugar de desaparecer.
Volver a montar los días
Como cada canal está repartido en un archivo por día, la historia de un canal hay que reunirla. Los archivos se procesan en orden alfabético, que para nombres con fecha equivale al orden cronológico, y los mensajes se van añadiendo a una única transcripción por canal. El resultado es una conversación continua bajo un título con el nombre del canal, en lugar de varios cientos de fragmentos.
Los archivos que no son datos de canal — la lista de canales, los registros de integraciones, los distintos índices de mensajes directos — se omiten. Cualquier cosa que no se pueda analizar se omite en lugar de hacer fracasar el paquete: un día corrupto no te cuesta el espacio de trabajo.
Para qué se usa esto
Preservar la historia antes de que un espacio gratuito alcance su límite de mensajes y las conversaciones antiguas dejen de ser accesibles. Migrar a otra herramienta dejando algo legible detrás. Responder a una petición legal o de cumplimiento con una transcripción y no con un directorio de JSON. Recuperar la discusión en torno a una decisión que no se anotó en ningún otro sitio. Darle un canal de proyecto a un modelo para reconstruir lo que pasó a lo largo de seis meses.
Conseguir la exportación
Quien sea propietaria o administradora del espacio puede generar una desde los ajustes del espacio, en Importar/Exportar datos, luego Exportar. La exportación estándar cubre los canales públicos. Los canales privados y los mensajes directos requieren otro nivel de exportación y, en la mayoría de jurisdicciones, un motivo documentado.
Se lee en local
Una exportación de espacio de trabajo es uno de los archivos más delicados que produce una organización. Contiene discusiones internas, nombres de clientes, credenciales que alguien pegó en canales donde no debía y las opiniones sinceras de todo el mundo. Subirla a un conversor de terceros es, para la mayoría de empresas, un incidente que hay que notificar.
Aquí no se transmite nada. El paquete lo abre y lo analiza JavaScript en esta pestaña, y solo se muestra la salida legible. Ningún servidor recibe el archivo, así que no hay pregunta de conservación que responder ni nada cuya eliminación haya que solicitar.
Las demás plataformas se atienden en la página general de exportaciones de chat.