Steam Auto-Click "Show More Content" (v4.1, No Delay)

Быстрая версия: автоматически нажимает "Показать еще" без задержки. Реагирует на появление кнопки и периодически проверяет её наличие.

当前为 2025-08-02 提交的版本,查看 最新版本

// ==UserScript==
// @name         Steam Auto-Click "Show More Content" (v4.1, No Delay)
// @namespace    http://tampermonkey.net/
// @version      4.1
// @description  Быстрая версия: автоматически нажимает "Показать еще" без задержки. Реагирует на появление кнопки и периодически проверяет её наличие.
// @author       Gemini & Community
// @match        https://steamcommunity.com/app/*
// @match        https://steamcommunity.com/workshop/browse/*
// @match        https://steamcommunity.com/id/*/myworkshopfiles/*
// @grant        none
// @run-at       document-idle
// @icon         https://store.steampowered.com/favicon.ico
// @license MIT 
// ==/UserScript==

(function() {
    'use strict';

    // --- НАСТРОЙКИ ---
    const MAX_CLICKS = 150; // Увеличено, так как клики происходят быстрее
    const POLL_INTERVAL_MS = 1000; // Интервал для запасной проверки (в мс)
    // --- КОНЕЦ НАСТРОЕК ---

    let clickCount = 0;
    let isClicking = false;
    let observer;
    let pollIntervalId;

    console.log("Userscript v4.1 (No Delay) запущен.");

    // Функция для очистки: отключает наблюдатель и интервал
    const cleanup = () => {
        console.log("Завершение работы скрипта. Очистка...");
        if (observer) {
            observer.disconnect();
        }
        if (pollIntervalId) {
            clearInterval(pollIntervalId);
        }
    };

    // Основная функция для обработки контента
    const processContent = () => {
        if (isClicking) return;

        const noMoreContent = document.getElementById('NoMoreContent');
        if (noMoreContent && noMoreContent.style.display !== 'none') {
            console.log("Больше контента нет. Скрипт остановлен.");
            cleanup();
            return;
        }

        if (clickCount >= MAX_CLICKS) {
            console.warn(`Достигнут лимит в ${MAX_CLICKS} кликов. Скрипт остановлен.`);
            cleanup();
            return;
        }

        const moreButton = document.getElementById('GetMoreContentBtn');
        if (moreButton && moreButton.style.display !== 'none') {
            isClicking = true;
            clickCount++;
            console.log(`Кнопка найдена. Мгновенный клик #${clickCount}...`);

            // --- ИЗМЕНЕНИЕ: Убран setTimeout, клик происходит немедленно ---
            moreButton.querySelector('a')?.click();

            // Используем requestAnimationFrame, чтобы сбросить флаг после того,
            // как браузер завершит текущую операцию. Это надежнее, чем сбрасывать его сразу.
            requestAnimationFrame(() => {
                 isClicking = false;
            });
        }
    };

    // Целевой узел для наблюдения.
    const targetNode = document.body;

    // Конфигурация для наблюдателя: следим за структурой и ИЗМЕНЕНИЕМ АТРИБУТОВ
    const config = {
        childList: true,
        subtree: true,
        attributes: true,
        attributeFilter: ['style', 'class']
    };

    // Создаем наблюдателя
    observer = new MutationObserver(() => {
        processContent();
    });

    // Начинаем наблюдение
    observer.observe(targetNode, config);

    // Запускаем периодическую проверку как надежный запасной вариант
    pollIntervalId = setInterval(processContent, POLL_INTERVAL_MS);

    // Выполняем первую проверку немедленно при запуске
    processContent();

})();