// ==UserScript== // @name Unizar profesores - csv generator // @namespace Violentmonkey Scripts // @match https://estudios.unizar.es/estudio/asignaturas* // @icon data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAACn0lEQVR4Xu1a6ZrCIAxsvd7/eb1YWsWPRSCTAC228eeakMzkBHccdv4Zd45/UAI0A3bOgJbAzhNAm6CWgJbAzhlYuwSM5X9VHxY3Po6jsZ9U3k3+LErKUgQkEceYsCQNlqRFfGtphAWaaEXNMqM2ATVBf3HSIjOKCSBqeqkZI8bBUrxcLuZ6vbp0XAocZOedHZMsCxMi3DStIXRyIRJfUuB0Opn7/S433ZFmrnf4BPxypGG6QzIcAbsAH7A0Y9cMSOSO8boqnF6dC0b7Hdkl37t559i+3TscDsPz+STxkQLu6E4WHiQQMCbu0uA3yt6WIRZon0VUMQT/FYnj8WgejwcSoVoyqO9Ze8ghsRGZ05vlazdRtKa57CIETGf6oFCd2RfJRumWlXffYdmrToBl3thu+umFXAMR+ezS1SrSKb8RdnP1P39X4LTo+SvoNwiGZNwQ5SQBmdGInIsmkyMplzlie4iiMxyTTb9uvt71uKP2Hyng7oFgEGdACDA0xrpE2YY42Ct2fCV9vRZL9wsxCZQiNQJZBARhcGBtoLNP5VSpUBjEewBScyUEUMCg7wsa8Hw+udBEvOjxCi3OAjEBhWkLRZch1ISAzwYYqV33p9VLgMhikkOEOckeQBquLIDgiJqkFKkxmMqSyvjix+XGKupADQKmm1/uF1/UF5Zcafd3xrgESCcHCxwhTPnMspU9LBFZ1IGaD6uoTRZ4KprIFOAanC825/PZ3G63j65Xy6LbIdcJXz7JbPAOAOmUOLKWLpVa1F1gLb+r2ZVsgkjpVHOw9UFaAhmGo2turfnbOrLo+ZISoPoGarsLOaoEwhea0fs3mS4AlDqxqWhKyFACJKxtSUczYEvRlGDRDJCwtiUdzYAtRVOCRTNAwtqWdP4AcoDWQX0F8h4AAAAASUVORK5CYII= // @grant none // @version 1.0 // @author Abel // @description Para Miguel // ==/UserScript== (function() { // javascript thingies Array.prototype.groupBy = function(keyGetter, valueGrouper = (x => x)) { return Object.fromEntries(Object.entries(Object.groupBy(this, keyGetter)).map(([k, kv]) => [k, valueGrouper(kv)])); }; Object.prototype.entries = function(){return Object.entries(this);}; // global parser const parser = new DOMParser(); // download button const btn = document.createElement("button") btn.innerText = "Descargar csv con emails de profesores"; btn.className = "btn btn-primary"; btn.onclick = main; document.getElementById("pjax-main").insertAdjacentElement('beforebegin', btn); btn.insertAdjacentElement('afterend', document.createElement("hr")); function main(){ btn.disabled = true; _main() .catch(e=>{ console.log(e); btn.innerText += " - An error ocurred, press to try again"; }) .finally(e=> btn.disabled = false) } async function _main() { // get urls from all subjects const subjects = [...document.querySelectorAll(".table > tbody > tr > td:nth-child(4) > a")].map(a => [a.href, a.innerText]); btn.innerText = `Obteniendo profesores de ${subjects.length} asignaturas...`; console.log("Fetching subjects...", subjects); const htmls = await Promise.all(subjects.map(([url, subject]) => fetch(url).then(r => r.text()).then(t => [t, subject]))); console.log("...done", htmls); // parse subject documents and extract professors directories const directories = htmls.flatMap(([html, subject]) => [...parser.parseFromString(html, "text/html").querySelectorAll("#w0 > tbody > tr")] .filter(e => e.innerText.startsWith("Profesores")) .flatMap(e => [...e.querySelectorAll("td > a")]) .map(a => a.href) .map(a => a.replaceAll("https://janovas.unizar.es/sideral/CV/", '').replaceAll("?lang=es", '').replaceAll("-", '%20')) .map(u => ["https://directorio.unizar.es/rest/persona/persona_cadena?cadena=" + u, subject]) ).groupBy(d=>d[0], ds=>ds.map(d=>d[1]).join(", ")).entries(); btn.innerText = `Obteniendo correos de ${directories.length} profesores...`; console.log("Fetching directories...", directories) const professors = await Promise.all(directories.map(([url, subjects]) => fetch(url).then(r => r.json()).then(j=>[j, subjects]))) console.log("...done", professors) // generate csv table const table = "Nombre,Apellidos,Email,Asignaturas\n" + professors.map(([data, subjects]) => data.map(d => `${d.nombPersona || ''},${d.ape1Persona || ''} ${d.ape2Persona || ''},${d.email || ''},"${subjects}"`)).flatMap(l => [...new Set(l)]).join("\n"); console.log(table); btn.innerText = `Generada tabla con ${table.split("\n").length} profesores`; // download as file const link = document.createElement("a"); link.href = "data:text/csv;charset=utf-8,%EF%BB%BF" + encodeURI(table); link.download = [...document.querySelectorAll("#contenedor-principal > h1 , #contenedor-principal > h2 , #contenedor-principal > h3 , #contenedor-principal > h4")].map(e => e.innerText).join(" ") + ".csv"; link.click(); btn.innerText += " - Pulsa para re-descargar"; } })()