2023-01-04 14:35:18 +03:00
|
|
|
|
/**
|
|
|
|
|
* Скрипт для парсинга значков Steam
|
2023-01-04 23:16:07 +03:00
|
|
|
|
* @version 1.0.0
|
2023-01-04 14:35:18 +03:00
|
|
|
|
* @license Unlicense
|
|
|
|
|
* @author Alexander Popov <iiiypuk@fastmail.fm>
|
2023-01-04 14:22:06 +03:00
|
|
|
|
*/
|
|
|
|
|
|
2023-01-04 14:35:18 +03:00
|
|
|
|
/**
|
|
|
|
|
* Получает данные из элемента `div.badge_row`
|
2023-01-04 23:16:07 +03:00
|
|
|
|
* @param {Array} value - div.badge_row
|
2023-01-04 14:35:18 +03:00
|
|
|
|
* @returns {Object}
|
|
|
|
|
*/
|
|
|
|
|
function getData(value) {
|
|
|
|
|
/*
|
2023-01-04 23:31:32 +03:00
|
|
|
|
* 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
|
2023-01-04 14:35:18 +03:00
|
|
|
|
*/
|
2023-01-04 14:22:06 +03:00
|
|
|
|
|
|
|
|
|
// check left cards
|
2023-01-04 23:21:24 +03:00
|
|
|
|
// для карточек, у которых нет параметра 'карточек выпадет'
|
2023-01-04 14:22:06 +03:00
|
|
|
|
let cardsDropLeft = 0;
|
2023-01-04 23:24:03 +03:00
|
|
|
|
if (value.getElementsByClassName('progress_info_bold').length > 0) {
|
|
|
|
|
cardsDropsNumber = value.getElementsByClassName('progress_info_bold')[0].innerText.match(/\d/g);
|
2023-01-04 23:16:07 +03:00
|
|
|
|
if (cardsDropsNumber !== null) { cardsDropLeft = [0]; }
|
2023-01-04 14:22:06 +03:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
let badgeItem = {
|
2023-01-04 23:24:03 +03:00
|
|
|
|
id: parseInt(value.childNodes[1].href.split('/')[6]),
|
2023-01-04 23:31:32 +03:00
|
|
|
|
url: `https://store.steampowered.com/app/${value.childNodes[1].href.split('/')[6]}/`,
|
|
|
|
|
card_url: value.childNodes[1].href,
|
2023-01-04 23:35:30 +03:00
|
|
|
|
name: value.getElementsByClassName('badge_title')[0].childNodes[0].textContent.replace(/[\r\n\t]/g, '').trim(),
|
2023-01-04 23:16:07 +03:00
|
|
|
|
dropLeft: parseInt(cardsDropLeft),
|
2023-01-04 14:22:06 +03:00
|
|
|
|
};
|
|
|
|
|
|
2023-01-04 14:35:18 +03:00
|
|
|
|
return badgeItem;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Преобразовывает массив данных в JSON и возвращает к консоль
|
2023-01-04 23:16:07 +03:00
|
|
|
|
* @param {Array} badgesArray - массив данных о значках
|
2023-01-04 14:35:18 +03:00
|
|
|
|
*/
|
|
|
|
|
function exportJson(badgesArray) {
|
2023-01-04 23:53:14 +03:00
|
|
|
|
const byteSize = str => new Blob([str]).size;
|
|
|
|
|
|
|
|
|
|
json = JSON.stringify(badgesArray);
|
|
|
|
|
console.log(json);
|
2023-01-04 23:57:33 +03:00
|
|
|
|
console.log(`Total records: ${badgesArray.length}.`);
|
2023-01-04 23:53:14 +03:00
|
|
|
|
console.log(`Size: ${byteSize(json)} bytes.`)
|
2023-01-04 14:35:18 +03:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Функция main()
|
|
|
|
|
*/
|
2023-01-04 23:16:07 +03:00
|
|
|
|
function getBadges() {
|
2023-01-04 14:35:18 +03:00
|
|
|
|
let badges = [];
|
2023-01-04 16:56:10 +03:00
|
|
|
|
let currentPage = 1;
|
2023-01-04 14:35:18 +03:00
|
|
|
|
|
2023-01-04 16:56:10 +03:00
|
|
|
|
// get total pages
|
|
|
|
|
const [baseURI, totalPages] = (function(element) {
|
|
|
|
|
return [
|
|
|
|
|
element[0].baseURI,
|
|
|
|
|
element[element.length - 1].text
|
|
|
|
|
];
|
|
|
|
|
})(document.getElementsByClassName('pagelink'));
|
|
|
|
|
|
|
|
|
|
while (currentPage <= totalPages) {
|
2023-01-04 23:16:07 +03:00
|
|
|
|
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');
|
2023-01-04 16:56:10 +03:00
|
|
|
|
|
2023-01-04 23:16:07 +03:00
|
|
|
|
for (const value of Object.entries(collection)) {
|
2023-01-04 23:24:03 +03:00
|
|
|
|
badges.push(getData(value[1]));
|
2023-01-04 23:16:07 +03:00
|
|
|
|
}
|
|
|
|
|
})
|
|
|
|
|
.catch((err) => console.warn('Something went wrong.', err));
|
2023-01-04 16:56:10 +03:00
|
|
|
|
|
|
|
|
|
currentPage++;
|
2023-01-04 14:35:18 +03:00
|
|
|
|
}
|
|
|
|
|
|
2023-01-04 23:31:32 +03:00
|
|
|
|
setTimeout(() => { exportJson(badges); }, 10000); // FIX IT
|
2023-01-04 14:22:06 +03:00
|
|
|
|
}
|
|
|
|
|
|
2023-01-04 23:16:07 +03:00
|
|
|
|
getBadges();
|