WhatsApp: Convertir un historial de chat en Javascript

whatsapp

Convertir un historial de chat de WhatsApp en Javascript utilizable

Cuando comenzó el encierro y millones de personas se vieron obligadas a trabajar desde casa, un grupo de personas en Alemania iniciaron un grupo de WhatsApp para compartir mezclas de música de larga duración, generalmente instrumentales, el tipo de cosas que burbujean en el fondo, llamando su atención sin ser molesto o distraer. Este fue el momento en que Jamie Harding comenzó a codificar en serio, y estas mezclas de horas de duración fueron perfectas para leer documentos, jugar con las herramientas de desarrollo o tratar desesperadamente de centrar un div en un contenedor flexible.

Las recomendaciones fueron bien consideradas de manera confiable: por las mañanas un fondo de jazz suave ambiental o downtempo, algunas a mitad de semana algo de garage y dub techno y los viernes por la noche techno o house. Jamie se encontró volviendo a las publicaciones del fin de semana cuando necesitaba un ascensor. A finales de año, se habían publicado más de 1.000 enlaces, la mayoría acompañados de descripciones evocadoras y hashtags.

whatsapp
Las reglas según LockdownListens

En el primer aniversario de la creación de aquel grupo de WhatsApp, Harding exportó el chat a un archivo .txt y, en las últimas semanas de sus estudios en SPICED Academy, a menudo pasaba las pausas del almuerzo jugando con el archivo de la música de ese año. Lockdown Listens es ahora un sitio web vivo.

Hoy voy a explicarles cómo comenzó, traduciendo ese enorme bloque de texto en algo que podría existir en una base de datos y eventualmente asumir su forma.

whatsapp


Lo primero es lo primero, conviértalo en JSON

WhatsApp exporta el historial de chat como un archivo de texto con el mismo formato básico para cada línea. El formato es el siguiente:

[10.03.21, 15:45:04] J Harding: miccachu vibes, “only hi-fi” 👌

La forma más sencilla de convertir mil (o un millón) líneas de texto en JSON es utilizando un editor de texto y luego cambiando la extensión del archivo. Harding usó Sublime Text para este propósito, ya que tiene una funcionalidad similar a VSCode. Primero, hizo una búsqueda rápida + reemplazo, intercambiando las comillas dobles por simples. De lo contrario, las cadenas se dividirían (ver más arriba) y el JSON no sería confiable.

  1. Cmd + A (Seleccionar todo)
  2. Cmd + Shift + L (Agregar un cursor en cada línea)
  3. Cmd + → (Enviar cursores al final de cada línea)
  4. “, (Agregue la comilla y la coma al final de la línea)
  5. Cmd + ← (Ir al primer carácter de la línea)
  6. Cmd + ← (Ir al inicio de la línea, evitando pestañas y saltos de línea)
  7. “(Agregar corchetes de apertura)

Envuelva todas esas líneas en un conjunto de corchetes y tendrá una matriz JSON masiva, lista para trabajar.

Separar los ritmos del chat

Para LockdownListens, los únicos mensajes de mayor interés para Harding eran los que tenían enlaces. La mayoría de las mezclas compartidas eran de Soundcloud y Mixcloud, por lo que filtró todos los mensajes en busca de enlaces a esos sitios.

Vale la pena señalar en este punto que estaba usando Node.js para esto. El siguiente código estaba alojado en un archivo llamado populate.js. Mientras construía las funciones, las probaba regularmente en el terminal VSCode, para asegurarse de que los datos se movían a través de las funciones de la manera correcta. Esto significó console.logging 1,000 líneas de JSON una y otra vez para asegurarse de que los métodos de cadena funcionaran como se esperaba.

fs.readFile("chat.json", (err, data) => {
    if (err) {
        console.log(err);
    }
    const chatJSON = JSON.parse(data);
    const msgWithURL = chatJSON.filter((msg) => detectURLs(msg));
    const soundOrMix = msgWithURL.filter(
        (msg) => msg.indexOf("soundcloud") > 0 || msg.indexOf("mixcloud") > 0
    );

chat.JSON es una matriz de cadenas, por lo que soundOrMix será una matriz de cadenas que se ajustan a los criterios. Tienen URL y tienen instancias de “soundcloud” o “mixcloud”.


Justificar

La tabla de Postgres tiene columnas listas para aceptar fecha, hora, mensaje, enlace (s) y hashtag (s). Con algunas consultas creativas, desarmará el objeto y pondrá los valores relevantes en las columnas correctas.

Para separar los enlaces y los hashtags, utilicé un par de expresiones regulares. Los hashtags deben separarse en una matriz, naturalmente. La matriz de enlaces generalmente solo contiene un enlace, pero ocasionalmente arroja más de uno. En ese caso, la base de datos solo acepta enlaces [0], y los demás se pierden por la eternidad.

function detectURLs(message) {
    var urlRegex = /(((https?:\/\/)|(www\.))[^\s]+)/g;
    return message.match(urlRegex);
}

function parseHashtags(str) {
    var hashtagRegex = /(^|\s)(#[a-z\d-]+)/g;
    const hashArr = str.match(hashtagRegex);
    const trimmedHash = [];
    if (hashArr) {
        hashArr.forEach((hashtag) => {
            trimmedHash.push(hashtag.trim());
        });
    }
    return trimmedHash;
}

Con estas dos funciones definidas, todo lo que queda por hacer es crear el objeto de mensaje, utilizando algunos métodos de cadena simples para separar las fechas y horas. El resultado es una gran variedad de objetos, que pueden introducirse en las consultas para completar las bases de datos de PostGres (y más tarde, Heroku) de forma rápida y precisa. Jamie asegura que le gusta crear un archivo local de todos estos objetos, en caso de que algo salga mal cuando completa la base de datos.

    const msgArr = [];

    soundOrMix.forEach((message) => {
        const msgObj = {};
        const fullText = message.slice(20);
        msgObj.date = message.slice(1, 9);
        msgObj.time = message.slice(11, 16);
        msgObj.message = fullText
            .slice(fullText.indexOf(":") + 2)
            .replace(detectURLs(message), "")
            .trim();
        msgObj.links = detectURLs(message);
        msgObj.hashtags = parseHashtags(message);
        msgArr.push(msgObj);
    });

    fs.writeFileSync("messageObjects.js", JSON.stringify(msgArr));

El resultado final es una matriz de objetos de formato uniforme. Con todos los patos en fila, fue posible pasar a lo bueno, es decir, construir una interfaz que pueda llevar esta música al mundo.

   {
        date: "26/03/2020",
        time: "17:02",
        message: "#fanboymix #workingtechno #plodding",
        links: ["https://soundcloud.com/phonatic/donato-dozzy-dives-under-120"],
        hashtags: ["#fanboymix", "#workingtechno", "#plodding"],
    }

Y así fue cómo se hizo magía musical desde un “simple” grupo de WhatsApp…

Recent Post