Steam Auto-Click "Show More Content" (v4.2, with Pause Button)

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

您需要先安装一个扩展,例如 篡改猴Greasemonkey暴力猴,之后才能安装此脚本。

You will need to install an extension such as Tampermonkey to install this script.

您需要先安装一个扩展,例如 篡改猴暴力猴,之后才能安装此脚本。

您需要先安装一个扩展,例如 篡改猴Userscripts ,之后才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。

您需要先安装用户脚本管理器扩展后才能安装此脚本。

(我已经安装了用户脚本管理器,让我安装!)

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

(我已经安装了用户样式管理器,让我安装!)

// ==UserScript==
// @name         Steam Auto-Click "Show More Content" (v4.2, with Pause Button)
// @namespace    http://tampermonkey.net/
// @version      4.2
// @description  Быстрая версия: автоматически нажимает "Показать еще" без задержки. Добавлена плавающая кнопка для паузы/возобновления работы.
// @author       Gemini & Community
// @match        https://steamcommunity.com/app/*
// @match        https://steamcommunity.com/workshop/browse/*
// @match        https://steamcommunity.com/id/*/myworkshopfiles/*
// @grant        GM_addStyle
// @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 isPaused = false; // Новая переменная состояния паузы
    let observer;
    let pollIntervalId;
    let pauseButton; // Переменная для кнопки паузы

    console.log("Userscript v4.2 (with Pause Button) запущен.");

    // Функция для создания и управления кнопкой паузы
    const createPauseButton = () => {
        pauseButton = document.createElement('button');
        pauseButton.id = 'tm-pause-button';
        pauseButton.textContent = 'Пауза';

        // Применяем стили через GM_addStyle для большей совместимости
        GM_addStyle(`
            #tm-pause-button {
                position: fixed;
                bottom: 20px;
                right: 20px;
                z-index: 9999;
                padding: 10px 15px;
                background-color: #4CAF50; /* Зеленый - работает */
                color: white;
                border: none;
                border-radius: 5px;
                cursor: pointer;
                font-size: 14px;
                box-shadow: 0 2px 5px rgba(0,0,0,0.2);
                transition: background-color 0.3s;
            }
            #tm-pause-button:hover {
                opacity: 0.9;
            }
        `);

        pauseButton.addEventListener('click', () => {
            isPaused = !isPaused; // Инвертируем состояние паузы
            if (isPaused) {
                pauseButton.textContent = 'Возобновить';
                pauseButton.style.backgroundColor = '#f44336'; // Красный - на паузе
                console.log("Скрипт поставлен на паузу.");
            } else {
                pauseButton.textContent = 'Пауза';
                pauseButton.style.backgroundColor = '#4CAF50'; // Зеленый - работает
                console.log("Скрипт возобновлен.");
                // Сразу после возобновления пытаемся кликнуть
                processContent();
            }
        });

        document.body.appendChild(pauseButton);
    };


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

    // Основная функция для обработки контента
    const processContent = () => {
        // Если скрипт на паузе, ничего не делаем
        if (isPaused || 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}...`);

            // --- Клик происходит немедленно ---
            moreButton.querySelector('a')?.click();

            requestAnimationFrame(() => {
                 isClicking = false;
            });
        }
    };

    // --- ЗАПУСК СКРИПТА ---

    // Создаем кнопку паузы при старте
    createPauseButton();

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

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

    // Создаем наблюдателя
    observer = new MutationObserver(() => {
        // Проверяем паузу перед обработкой мутаций
        if (isPaused) return;
        processContent();
    });

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

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

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

})();