SteamBadges/code.js

91 lines
2.6 KiB
JavaScript
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/**
* Скрипт для парсинга значков Steam
* @version 1.0.0
* @license Unlicense
* @author Alexander Popov <iiiypuk@fastmail.fm>
*/
/**
* Получает данные из элемента `div.badge_row`
* @param {Array} value - div.badge_row
* @returns {Object}
*/
function getData(value) {
/*
* Sctruct of Badge
* id: int - steam app id
* url: str - game url in store
* card_url: str - card page url
* name: str - steam app name
* dropLeft: int - cards left drops
*/
// check left cards
// для карточек, у которых нет параметра 'карточек выпадет'
let cardsDropLeft = 0;
if (value.getElementsByClassName('progress_info_bold').length > 0) {
cardsDropsNumber = value.getElementsByClassName('progress_info_bold')[0].innerText.match(/\d/g);
if (cardsDropsNumber !== null) { cardsDropLeft = [0]; }
}
let badgeItem = {
id: parseInt(value.childNodes[1].href.split('/')[6]),
url: `https://store.steampowered.com/app/${value.childNodes[1].href.split('/')[6]}/`,
card_url: value.childNodes[1].href,
name: value.getElementsByClassName('badge_title')[0].childNodes[0].textContent.replace(/[\r\n\t]/g, '').trim(),
dropLeft: parseInt(cardsDropLeft),
};
return badgeItem;
}
/**
* Преобразовывает массив данных в JSON и возвращает к консоль
* @param {Array} badgesArray - массив данных о значках
*/
function exportJson(badgesArray) {
const byteSize = str => new Blob([str]).size;
json = JSON.stringify(badgesArray);
console.log(json);
console.log(`Total records: ${badgesArray.length}.`);
console.log(`Size: ${byteSize(json)} bytes.`)
}
/**
* Функция main()
*/
function getBadges() {
let badges = [];
let currentPage = 1;
// get total pages
const [baseURI, totalPages] = (function(element) {
return [
element[0].baseURI,
element[element.length - 1].text
];
})(document.getElementsByClassName('pagelink'));
while (currentPage <= totalPages) {
fetch(`${baseURI}?p=${currentPage}`)
.then((response) => { return response.text(); })
.then((html) => {
let parser = new DOMParser();
let doc = parser.parseFromString(html, 'text/html');
const collection = doc.getElementsByClassName('badge_row');
for (const value of Object.entries(collection)) {
badges.push(getData(value[1]));
}
})
.catch((err) => console.warn('Something went wrong.', err));
currentPage++;
}
setTimeout(() => { exportJson(badges); }, 10000); // FIX IT
}
getBadges();