josem138 escribió:@Aska me siento un poco tonto, porque entiendo que cosas habria que cambiar del codigo para hacer poner la sugerencia que indican (y ponerlo a contar a partir de la pagina 4), pero errores everywhere y no logro ejecutarlo. Pistas? uso la herramienta de desarrollador del firefox pero salta error sin devolver resultado :/
ozono sigue vivo? me suena haber leido a ese usuario hace eones
Tranqui, aquí te lo traigo:
const usersList = [ "2pac4ever", "Hispalense", "ELeK", "LLioncurt", "Nutne", "Tito_CO", "Sergetsu", "josem138", "^TxTeZ^", "danaang", "Whar", "Lestat25", "Eric Draven", "Dorigon", "amchacon", "NaN", "Deison", "ReivenFox", "dlabo", "Grifox", "Goncatin", "Aska" ];
const baseUrl = "https://www.elotrolado.net/hilo_villalobos-alien-vs-predator_2433694";
const startPage = 1;
const getSourceAsDOM = (url) => {
const xmlHttp = new XMLHttpRequest();
xmlHttp.open("GET", url, false);
xmlHttp.send();
const parser = new DOMParser();
return parser.parseFromString(xmlHttp.responseText, "text/html");
};
const getStartPage = (startPage) => 50 * --startPage;
const getUserTemplate = (name) => ({ name, count: 0 });
const initializeUsersArray = (usersList) => {
return usersList.reduce((acc, el) => {
acc.push(getUserTemplate(el));
return acc;
}, []);
};
const addUserCounting = (el, usersList, addNewUsers) => {
const nick = $(el).text().trim();
let user = usersList.find((el) => el.name === nick);
if (addNewUsers || user) {
if (!user) {
user = getUserTemplate(nick);
usersList.push(user);
}
user.count++;
}
};
const getPosts = (url, usersList, startPage) => {
page = getStartPage(startPage);
usersList = initializeUsersArray(usersList);
const addNewUsers = usersList.length === 0;
do {
const dom = $(getSourceAsDOM(`${url}_s${page}`));
const users = dom.find(".author.ellipsize");
if (!users.length) break;
users.each((i, el) => addUserCounting(el, usersList, addNewUsers));
} while ((page += 50));
return usersList.sort((el1, el2) => (el1.count > el2.count ? -1 : 1));
};
console.table(getPosts(baseUrl, usersList, startPage));
Aquí hay un par de cosas:
- Los objetos {} o arrays asociativos no garantizan orden en JS (ni en muchos otros lenguajes) por lo que se ha pasado a montar el resultado en un array para poder ordenarlo
- He añadido arriba del todo del script las 3 variables que os harán falta para configurarlo (usersList, baseUrl y startPage). La primera es la lista de usuarios para los que se quiere contar, la segunda la URL base del hilo (la del primer post) y el 3o la primera página para empezar a contar.
- Si se pasa vacía la lista de usuarios el script los recogerá todos y los irá añadiendo según los encuentre.
Ahora mismo la situación es:
Un saludo, majos xD
EDITO: Una vez hayáis declarado las funciones basta con ejecutar lo siguiente pero variando los parámetros de entrada para ver resultados distintos:
console.table(getPosts(baseUrl, usersList, 7));
console.table(getPosts(baseUrl, usersList, 1));
console.table(getPosts(baseUrl, [], 3));