Automatización de tareas con Javascript: autorecomendador de LinkedIn

javascript

Desde hace un tiempo, ando preocupado por “mi tiempo”, así que, he decidido automatizar algunas tareas cotidianas utilizando Javascript. Y para ejemplificar, nada mejor que crear un autorecomendador de entradas en LinkedIn. Lo que aquí explico es bastante técnico, y no es recomendable utilizar para recién llegados, ni me hago responsable de su uso (bueno o malo). Tampoco me hago responsable de la modificación del mismo ni de su mala utilización, ni de sus consecuencias.

Pero sobre todo, lo que sí deberías, si crees que es de utilidad lo que cuento, es invitarme a una cerveza para que siga encontrando inspiración para este blog.

El objetivo: autorecomendador en LinkedIn

El objetivo es reducir el tiempo empleado en Redes Sociales, en este caso, LinkedIn, y automatizar la tarea de darle a “Recomendar” a las publicaciones de mi feed.

Requisitos iniciales

Los requisitos hay dos tipos: el básico, y el avanzado. El básico es la consola de depuración del navegador, que está a tiro de F12, y el segundo, es conocimientos de Javascript para que sepas lo que va haciendo en cada momento.

El código se va a llamar bot:

const bot = {
    __app: 'LinkedInBot by @manejandodatos',
    __donate: 'https://www.paypal.com/donate?hosted_button_id=U3NVZKCYKTJJS',
    __version: '2.0.3',
    url_li: "www.linkedin.com",
}

Ahora empezamos a incluir varias funcionalidades necesarias.

Algunas consideraciones importantes a la hora de la automatización

Si has trabajado en automatizar cosas desde el navegador, o bien has hecho algo de webscrapping, sabrás que es básico poner retrasos o pausas. Esto se consigue con 3 funciones, y dos propiedades:

  • Selección de un número aleatorio entre dos cifras.
  • Pausa la ejecución del código el tiempo que te diga.
  • Ejecución de la pausa personalizada.

Las dos propiedades incluidas son el tiempo mínimo y máximo de la pausa, que yo he puesto mínimo 1 segundo (1000 milisegundos) y un máximo de 6.

Para el caso de la entrada de hoy, nada de esto será necesario, pero te lo dejo, por si te fuera necesario.

    limit_delay_min: 1000,
    limit_delay: 6000,
    
    _delay: ms => new Promise(res => setTimeout(res, ms)),
    _getDelay: (min, max) => Math.random() * (max - min) + min,
    getDelay: () => bot._delay(bot._getDelay(bot.limit_delay_min, bot.limit_delay)),

Sí es importante, y de hecho se ha incluido, una propiedad running que permite conocer si el script está en ejecución o no. Siempre se puede ejecutar bot.stop() para obligar al script a parar la ejecución. De esta forma es posible controlar el script.

running: false, 
stop: () => bot.running = false,

La función de iniciar

Se ha creado una función de _start para que se ejecuten varias cosas. Por un lado, se verifica que la URL dónde estamos es la correcta, según se indica en bot.url, y en caso de que todo esté correcto, se cambiar la propiedad running a true, además que se mostrará información sobre el bot.

    _start: () => {
            console.warn(`${bot.__app} ${bot.__version}`);
            console.warn(`Donate me at: ${bot.__donate}`);
            const can_run = window.location.host === url;
            bot.running = can_run;
            if (!can_run) {
                console.error(`URL esperada incorrecta: ${url}`);
            }
    },
    __app: 'LinkedInBot by @manejandodatos',
    __version: '2.0.3',
    url: "www.linkedin.com",

La función de AutoRecomendador: ar

Es la función que realiza el trabajo, y que pone todo en marcha hasta que se cumplen las condiciones para su finalización. Para ello, se han definido varias variables, para poner límites o hacer de contador, o las clases a seleccionar. De esta forma es más ordenado todo, y en caso de que algo falle, tenerlo todo preparado al principio de la función.

Después se define la función _auto, que es una función que se ejecuta cada X tiempo (el que le pongamos), y que consistirá en:

  • Selección de botones
  • Para cada botón, verificar si el texto es el esperado, o sea, Recomendar
  • En caso de que sea el botón esperado y cumpla todas las condiciones:
  • Se hace una pausa aleatoria y se pulsa click
  • Se agrega la recomendación a la lista de publicaciones
  • Se hace scroll de página hacia abajo
  • Se suma uno al contador, y vuelta a comenzar

Cuando el número de clicks llega al límite objetivo, se concluye la ejecución, se muestra el número de Likes que se ha hecho, y se muestra el resumen de las publicaciones que se han “Recomentado” mediante el autorecomendador.

El código de autorecomendador es:

ar: limit_numclicks => { // AutoRecomendar
        let numero = 50;
        let numclicks = 0;
        let i = 0;
        const search_like = ".react-button__trigger";
        const ynmg = 'Recomendar';
        const rlp = 'Recomendar la publicación';
        const bloques = "feed-shared-update-v2";
        const url = "https://www.linkedin.com/feed/";
        const publicaciones = [];

        let _auto = setInterval(() => {
            x = document.querySelectorAll(search_like);
            x.forEach(async megusta_btn => {
                if (megusta_btn.innerText.indexOf(ynmg) >= 0) {
                    let reco = megusta_btn.getAttribute("aria-label");
                    if (reco.indexOf(rlp) >= 0 && !publicaciones.includes(reco) && reco.clientHeight == 48) {
                        await bot.getDelay();
                        megusta_btn.click();
                        numclicks++;
                        publicaciones.push(reco);
                    }
                    } 
                });
                window.scrollTo(0, window.innerHeight * i );
                i++;
            if(i >= numero || numclicks > limit_numclicks){
                clearInterval(_auto);
                alert(`He hecho ${numclicks} Likes!!`);
                console.log(publicaciones);
            }
    }, 3000);
},

Ejecución del Autorecomentador

Para la ejecución, debes estar en tu feed, y una vez allí, es necesario que abras la consola de depuración con F12:

LinkedIn
LinkedIn

En la consola, incluimos el bot:

Preparando LinkedIn

Nuestro objetivo es hacer click en los botones Recomendar, sabiendo que hay de 2 tipos.

Botones de Recomendar
Botones de Recomendar

El que incluye el icono 👍 y el que no lo incluye (porque es relativo a comentarios.) La diferencia entre un tipo y otro se localiza en la propiedad clientHeight, que en el caso del que nos interesa, su altura es 48 y así lo indicamos en las condiciones. Lo tenemos todo listo!!

Ejecutamos el script mediante bot.ar(10), en la consola, siendo 10 el número de clicks a hacer, y esperamos a que haga su función.

Versión 2, del autorecomendación

Tras varias versiones de prueba y error, la versión inicial queda totalmente obsoleta, y se propone un nuevo concepto, que es el que actualmente estoy utilizando. Se trata de hacer X auto scrolls hacia abajo, para ir cargando contenido, y una vez alcanzado el número, se procede a seleccionar los botones de “Recomendar” para hacer click, Al final, un mensaje te indicará cuantas recomendaciones has efectuado.

Cómo restricción adicional, he creído conveniente no dar nada más que un click por persona.

No he publicado el código de esta versión 2, que aún está en fase experimental, pero sin duda, los progresos obtenidos con su uso han sido múltiples. Si estás interesado, escribeme un email o DM por instagram.

Happy coding!