Skip to content

Instantly share code, notes, and snippets.

@s-nt-s
Last active January 24, 2022 07:43
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save s-nt-s/36b5c9a589075c39115fd2ad87406f53 to your computer and use it in GitHub Desktop.
Save s-nt-s/36b5c9a589075c39115fd2ad87406f53 to your computer and use it in GitHub Desktop.
Te avisa cuando hay una cita libre en https://autocitavacuna.sanidadmadrid.org/ohcitacovid
/*
RECOMENDACION: 1º reserva manualmente la primera cita que veas que te valga para tener algo seguro,
y luego ve a 'modificar cita' y lanza este script para intentar encontrar algo mejor (no perderas la cita previa hasta que selecciones una nueva)
1- Ve a https://autocitavacuna.sanidadmadrid.org/ohcitacovid y navega hasta la pantalla de seleccion de hospital
2- Pulsa F12
3- Ve a la pestaña consola
4- Pega el código y dale a ejecutar
5- Cuando encuentre una cita sonara "beep" tres veces y dejara de buscar
6- Si te convence lo que ha encontrado, seleccionalo y termina manualmente el proceso de reserva
Nota: Incrementa el número pasado como argumento en las llamadas a `sleep` si ves que necesitas que vaya mas lento.
Esto solo ha sido probado en Firefox.
Echale un vistazo al resto de comentarios (más abajo) para adaptarlo a tus necesidades.
*/
function sleep(s) {
return new Promise(resolve => setTimeout(resolve, s*1000));
}
async function beep(i) {
if (i==null) i=1;
var snd = new Audio("data:audio/wav;base64,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qJrx4KOQjahZxWbcZgztj2c49nKmkId44S71j0c8eV9yDK6uPRzx5X18eDvjvQ6yKo9ZSS6l//8elePK/Lf//IInrOF/FvDoADYAGBMGb7FtErm5MXMlmPAJQVgWta7Zx2go+8xJ0UiCb8LHHdftWyLJE0QIAIsI+UbXu67dZMjmgDGCGl1H+vpF4NSDckSIkk7Vd+sxEhBQMRU8j/12UIRhzSaUdQ+rQU5kGeFxm+hb1oh6pWWmv3uvmReDl0UnvtapVaIzo1jZbf/pD6ElLqSX+rUmOQNpJFa/r+sa4e/pBlAABoAAAAA3CUgShLdGIxsY7AUABPRrgCABdDuQ5GC7DqPQCgbbJUAoRSUj+NIEig0YfyWUho1VBBBA//uQZB4ABZx5zfMakeAAAAmwAAAAF5F3P0w9GtAAACfAAAAAwLhMDmAYWMgVEG1U0FIGCBgXBXAtfMH10000EEEEEECUBYln03TTTdNBDZopopYvrTTdNa325mImNg3TTPV9q3pmY0xoO6bv3r00y+IDGid/9aaaZTGMuj9mpu9Mpio1dXrr5HERTZSmqU36A3CumzN/9Robv/Xx4v9ijkSRSNLQhAWumap82WRSBUqXStV/YcS+XVLnSS+WLDroqArFkMEsAS+eWmrUzrO0oEmE40RlMZ5+ODIkAyKAGUwZ3mVKmcamcJnMW26MRPgUw6j+LkhyHGVGYjSUUKNpuJUQoOIAyDvEyG8S5yfK6dhZc0Tx1KI/gviKL6qvvFs1+bWtaz58uUNnryq6kt5RzOCkPWlVqVX2a/EEBUdU1KrXLf40GoiiFXK///qpoiDXrOgqDR38JB0bw7SoL+ZB9o1RCkQjQ2CBYZKd/+VJxZRRZlqSkKiws0WFxUyCwsKiMy7hUVFhIaCrNQsKkTIsLivwKKigsj8XYlwt/WKi2N4d//uQRCSAAjURNIHpMZBGYiaQPSYyAAABLAAAAAAAACWAAAAApUF/Mg+0aohSIRobBAsMlO//Kk4soosy1JSFRYWaLC4qZBYWFRGZdwqKiwkNBVmoWFSJkWFxX4FFRQWR+LsS4W/rFRb/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////VEFHAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAU291bmRib3kuZGUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMjAwNGh0dHA6Ly93d3cuc291bmRib3kuZGUAAAAAAAAAACU=");
while (i-->0) {
snd.play();
if (i>0) await sleep(1);
}
}
function franja() {
const f = Array.from(new Set(Array.from(arguments).filter(function (n) {
if (n==null || isNaN(n)) return false;
return n>=0 && n<=24;
}).map(function(n) {
if (n<8) n=n+24;
n = n-8;
return Math.floor(n/2);
})));
f.sort((a,b) => a-b);
return f;
}
jQuery.fn.txt = function() {
return this.map(function(){
return this.textContent.trim();
}).get();
}
jQuery.fn.in = function() {
let args = Array.from(arguments);
let arg0 = args[0];
if (args.length == 1 && typeof arg0 == "object") args = {"includes": function (num) {
return (num>=arg0.min && num<=arg0.max);
}};
return this.filter(function(){
let txt = this.textContent.trim();
txt = parseFloat(txt.replace(":", "."), 10);
return args.includes(txt);
});
};
async function buscaCita() {
// Lanza window.stoploop = true si quieres abortar el bucle
// Solo mira el mes en curso, pero seria facil modificarlo para que mire más meses
let ctr=null;
const args = Array.from(arguments).map(x => x.toLowerCase());
while (!window.stoploop) for (const c of args) {
if (window.stoploop) return;
if (ctr==null || arguments.length>1) {
jQuery("select:eq(0)").click();
await sleep(1);
ctr = jQuery("ul.ui-dropdown-items li").filter(function(){
return this.textContent.toLowerCase().indexOf(c)>=0;
}).click().text().trim();
console.log(ctr);
await sleep(1);
}
// Si se pone solo un hospital, sera necesario poner al menos 2 franjas horarias
// Horarios desde 8am a 2am del día siguiente (cambiar si se quiere otras horas)
for (const i of franja(8, 10, 12, 14, 16, 18, 20, 22, 0)) {
if (window.stoploop) return;
jQuery("select:eq(1)").click();
await sleep(1);
const hr = jQuery("ul.ui-dropdown-items li").eq(i).click().text().trim();
console.log(ctr+" "+hr);
await sleep(2);
let ok=jQuery("table.ui-datepicker-calendar a.ng-star-inserted:not(.ui-state-disabled)");
// Filtrar los días encontrados si se quiere acotar por fecha, ej:
// ok = ok.in(1, 2, 3, 4);
if (ok.length) {
// Se ha encontrado al menos un día con citas libres
beep(3);
return;
}
}
}
}
window.stoploop = false;
// Poner los nombres (no hace falta que esten completos) de los hospitales que te interesen
buscaCita("12 de octubre", "niño jesus", "cruz roja", "wizink", "villaverde", "alcorcon", "princesa", "carlos", "gregorio", "jimenez diaz", "santa cristina", "zendal");
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment