Greasy Fork

来自缓存

Greasy Fork is available in English.

自动刷新脚本

自动刷新页面并允许用户自定义每个网站的刷新时间,支持快捷键开启/关闭,并显示设置页面,支持清除设置

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

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

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

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

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

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

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

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

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

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

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

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

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

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

// ==UserScript==
// @name         自动刷新脚本
// @namespace    http://example.com/your-namespace
// @version      1.0
// @description  自动刷新页面并允许用户自定义每个网站的刷新时间,支持快捷键开启/关闭,并显示设置页面,支持清除设置
// @author       Mike
// @license      MIT
// @match        *://*/*
// @grant        GM_setValue
// @grant        GM_getValue
// @grant        GM_registerMenuCommand
// ==/UserScript==
(function () {
    'use strict';

    let refreshTimeout;
    let countdownInterval;
    let remainingTime = 0;

    // 初始化
    function initialize() {
        const initialized = GM_getValue('scriptInitialized', false);
        if (!initialized) {
             alert('欢迎使用自动刷新脚本!\n\n您可以通过快捷键“*”调出设置页面,自定义刷新时间。\n\n“-”关闭刷新\n\n“+”开启刷新');
            GM_setValue('scriptInitialized', true);
            createGUI(); // 初次访问时显示设置界面
        }
    }

    // 创建GUI界面
    function createGUI() {
        // 如果设置界面已经存在则显示它
        let existingContainer = document.getElementById('autoRefreshSettings');
        if (existingContainer) {
            existingContainer.style.display = 'block';
            return;
        }

        const container = document.createElement('div');
        container.id = 'autoRefreshSettings';
        container.style.position = 'fixed';
        container.style.top = '10px';
        container.style.right = '10px';
        container.style.width = '250px';
        container.style.backgroundColor = '#f9f9f9';
        container.style.border = '1px solid #ccc';
        container.style.borderRadius = '5px';
        container.style.boxShadow = '0px 0px 10px rgba(0, 0, 0, 0.1)';
        container.style.padding = '10px';
        container.style.zIndex = 9999;
        container.style.fontFamily = 'Arial, sans-serif';

        const title = document.createElement('h4');
        title.innerText = '自动刷新设置';
        title.style.marginTop = '0';
        title.style.fontSize = '16px';
        title.style.borderBottom = '1px solid #ddd';
        title.style.paddingBottom = '5px';
        container.appendChild(title);

        const infoDiv = document.createElement('div');
        infoDiv.style.marginBottom = '10px';

        const intervalLabel = document.createElement('p');
        intervalLabel.innerText = '设定的时间:' + (GM_getValue('refreshInterval_' + window.location.hostname) || '未设置');
        intervalLabel.style.margin = '5px 0';
        infoDiv.appendChild(intervalLabel);

        const countdownLabel = document.createElement('p');
        countdownLabel.innerText = '离下次刷新还有:-- 秒';
        countdownLabel.style.margin = '5px 0';
        infoDiv.appendChild(countdownLabel);

        const statusLabel = document.createElement('p');
        const autoRefreshEnabled = GM_getValue('autoRefreshEnabled_' + window.location.hostname, false);
        statusLabel.innerText = '自动刷新状态:' + (autoRefreshEnabled ? '已开启' : '已关闭');
        statusLabel.style.margin = '5px 0';
        infoDiv.appendChild(statusLabel);

        container.appendChild(infoDiv);

        const intervalInput = document.createElement('input');
        intervalInput.type = 'number';
        intervalInput.placeholder = '秒';
        intervalInput.value = GM_getValue('refreshInterval_' + window.location.hostname) || '';
        intervalInput.style.width = '100%';
        intervalInput.style.marginBottom = '10px';
        intervalInput.style.padding = '5px';
        intervalInput.style.border = '1px solid #ccc';
        intervalInput.style.borderRadius = '3px';
        container.appendChild(intervalInput);

        const saveButton = document.createElement('button');
        saveButton.innerText = '保存';
        saveButton.style.width = '100%';
        saveButton.style.padding = '5px';
        saveButton.style.backgroundColor = '#4CAF50';
        saveButton.style.color = 'white';
        saveButton.style.border = 'none';
        saveButton.style.borderRadius = '3px';
        saveButton.style.cursor = 'pointer';
        saveButton.onclick = function () {
            const interval = parseInt(intervalInput.value, 10);
            if (isNaN(interval) || interval <= 0) {
                alert('请输入有效的时间(秒)');
                return;
            }
            GM_setValue('refreshInterval_' + window.location.hostname, interval);
            alert('设置已保存!页面将每 ' + interval + ' 秒刷新一次。');
            intervalLabel.innerText = '设定的时间:' + interval + ' 秒';
            startAutoRefresh(interval);
            statusLabel.innerText = '自动刷新状态:已开启';
        };
        container.appendChild(saveButton);

        const clearCurrentButton = document.createElement('button');
        clearCurrentButton.innerText = '清除当前网页设置';
        clearCurrentButton.style.width = '100%';
        clearCurrentButton.style.padding = '5px';
        clearCurrentButton.style.backgroundColor = '#f44336';
        clearCurrentButton.style.color = 'white';
        clearCurrentButton.style.border = 'none';
        clearCurrentButton.style.borderRadius = '3px';
        clearCurrentButton.style.cursor = 'pointer';
        clearCurrentButton.style.marginTop = '5px';
        clearCurrentButton.onclick = function () {
            GM_setValue('refreshInterval_' + window.location.hostname, null);
            GM_setValue('autoRefreshEnabled_' + window.location.hostname, false);
            alert('当前网页设置已清除!自动刷新已关闭。');
            intervalLabel.innerText = '设定的时间:未设置';
            statusLabel.innerText = '自动刷新状态:已关闭';
            stopAutoRefresh();
        };
        container.appendChild(clearCurrentButton);

        const clearAllButton = document.createElement('button');
        clearAllButton.innerText = '清除所有设置';
        clearAllButton.style.width = '100%';
        clearAllButton.style.padding = '5px';
        clearAllButton.style.backgroundColor = '#f44336';
        clearAllButton.style.color = 'white';
        clearAllButton.style.border = 'none';
        clearAllButton.style.borderRadius = '3px';
        clearAllButton.style.cursor = 'pointer';
        clearAllButton.style.marginTop = '5px';
        clearAllButton.onclick = function () {
            const confirmation = confirm('确定要清除所有设置吗?此操作将影响所有已设置的网页。');
            if (confirmation) {
                clearAllSettings();
                alert('所有设置已清除!');
                intervalLabel.innerText = '设定的时间:未设置';
                statusLabel.innerText = '自动刷新状态:已关闭';
                stopAutoRefresh();
            }
        };
        container.appendChild(clearAllButton);

        const closeButton = document.createElement('button');
        closeButton.innerText = '关闭';
        closeButton.style.width = '100%';
        closeButton.style.padding = '5px';
        closeButton.style.backgroundColor = '#999';
        closeButton.style.color = 'white';
        closeButton.style.border = 'none';
        closeButton.style.borderRadius = '3px';
        closeButton.style.cursor = 'pointer';
        closeButton.style.marginTop = '5px';
        closeButton.onclick = function () {
            container.style.display = 'none';
        };
        container.appendChild(closeButton);

        document.body.appendChild(container);

        // 更新倒计时显示
        function updateCountdown() {
            countdownLabel.innerText = '离下次刷新还有:' + remainingTime + ' 秒';
            remainingTime--;
        }

        if (autoRefreshEnabled) {
            countdownInterval = setInterval(updateCountdown, 1000);
        }
    }

    // 清除所有设置
    function clearAllSettings() {
        const keys = GM_listValues();
        keys.forEach(key => {
            if (key.startsWith('refreshInterval_') || key.startsWith('autoRefreshEnabled_')) {
                GM_deleteValue(key);
            }
        });
    }

    // 开始自动刷新
    function startAutoRefresh(interval) {
        stopAutoRefresh(); // 清除任何现有的刷新定时器
        remainingTime = interval;
        refreshTimeout = setTimeout(() => {
            location.reload();
        }, interval * 1000);
        countdownInterval = setInterval(() => {
            if (remainingTime > 0) {
                remainingTime--;
                document.getElementById('autoRefreshSettings').querySelector('p:nth-child(2)').innerText = '离下次刷新还有:' + remainingTime + ' 秒';
            }
        }, 1000);
        GM_setValue('autoRefreshEnabled_' + window.location.hostname, true);
    }

    // 停止自动刷新
    function stopAutoRefresh() {
        clearTimeout(refreshTimeout);
        clearInterval(countdownInterval);
        GM_setValue('autoRefreshEnabled_' + window.location.hostname, false);
    }

    // 检查并启动自动刷新
    function checkAndStartAutoRefresh() {
        const savedInterval = GM_getValue('refreshInterval_' + window.location.hostname, null);
        const autoRefreshEnabled = GM_getValue('autoRefreshEnabled_' + window.location.hostname, false);
        if (savedInterval && autoRefreshEnabled) {
            startAutoRefresh(savedInterval);
        }
    }

    // 监听快捷键
    document.addEventListener('keydown', function (event) {
        if (event.key === '-') {
            stopAutoRefresh();
            alert('自动刷新已关闭');
        } else if (event.key === '=') {
            const savedInterval = GM_getValue('refreshInterval_' + window.location.hostname);
            if (savedInterval) {
                startAutoRefresh(savedInterval);
                alert('自动刷新已开启,每 ' + savedInterval + ' 秒刷新一次');
            } else {
                alert('请先设置自动刷新时间!');
            }
        } else if (event.key === '*') {
            createGUI(); // 显示设置界面
        }
    });

    // 注册菜单命令
    GM_registerMenuCommand('设置自动刷新', createGUI);

    // 页面加载时检查并启动自动刷新
    checkAndStartAutoRefresh();

    // 初始化
    initialize();

})();