Анализ вашей библиотеки лицензий и подписок Steam
(async () => {
console.log("⏳ Запуск скрипта. Начинаем фоновый сбор лицензий...");
// Функция паузы для защиты от блокировки за спам запросами
const sleep = (ms) => new Promise(resolve => setTimeout(resolve, ms));
// Функция парсинга с вашей проверенной структурой
const extractDataFromDoc = (doc) => {
// Находим все строки таблицы с атрибутом data-panel
const rows = doc.querySelectorAll('tr[data-panel]');
const licenses = [];
rows.forEach(row => {
const dateEl = row.querySelector('.license_date_col');
const methodEl = row.querySelector('.license_acquisition_col');
const tds = row.querySelectorAll('td');
// Проверяем, что нужные элементы существуют и колонок не меньше трех
if (dateEl && methodEl && tds.length >= 3) {
const date = dateEl.innerText.trim();
// Название всегда во второй колонке.
// replace(/\s+/g, ' ') убирает гигантские пробелы, которые Steam иногда ставит в коде
const name = tds[1].innerText.trim().replace(/\s+/g, ' ');
const method = methodEl.innerText.trim();
licenses.push({
date: date,
name: name,
method: method
});
}
});
return licenses;
};
let allLicenses = [];
let pageCount = 1;
// 1. Собираем данные с первой (текущей) страницы
console.log(`📄 Парсинг страницы ${pageCount}...`);
allLicenses.push(...extractDataFromDoc(document));
// 2. Ищем ссылку на следующую страницу
let nextButton = document.querySelector('.license_paginator_next');
// 3. Цикл фоновой загрузки следующих страниц
while (nextButton && nextButton.href) {
pageCount++;
console.log(`➡️ Фоновая загрузка страницы ${pageCount}...`);
try {
// Скачиваем следующую страницу в фоне
const response = await fetch(nextButton.href);
if (!response.ok) {
console.error(`❌ Ошибка сети при загрузке страницы ${pageCount}:`, response.statusText);
break;
}
// Превращаем текст ответа в DOM-объект
const html = await response.text();
const parser = new DOMParser();
const doc = parser.parseFromString(html, "text/html");
// Собираем данные и добавляем в общий массив
const newData = extractDataFromDoc(doc);
allLicenses.push(...newData);
// Ищем кнопку на новой странице
nextButton = doc.querySelector('.license_paginator_next');
// Ждем 1 секунду, чтобы Steam не выдал ошибку 429
await sleep(1000);
} catch (error) {
console.error("❌ Произошла ошибка при загрузке или парсинге:", error);
break;
}
}
// Если ничего не найдено
if (allLicenses.length === 0) {
console.warn("⚠️ Лицензии не найдены! Убедитесь, что вы находитесь на странице https://store.steampowered.com/account/licenses/");
return;
}
console.log(`✅ Все страницы загружены. Формируем файл...`);
// 4. Формирование и скачивание файла с отступами "2", как в вашем старом коде
const jsonString = JSON.stringify(allLicenses, null, 2);
const blob = new Blob([jsonString], { type: "application/json" });
const url = URL.createObjectURL(blob);
const a = document.createElement('a');
a.href = url;
a.download = "steam_licenses.json";
document.body.appendChild(a);
a.click();
document.body.removeChild(a);
URL.revokeObjectURL(url);
console.log(`🎉 Сбор завершен! Найдено лицензий: ${allLicenses.length}. Скачивание файла началось...`);
return allLicenses;
})();
или кликните для выбора файла