网页实时网速监控

按 Alt+N 显示/隐藏当前网页的实时上下行速度

// ==UserScript==
// @name         网页实时网速监控
// @namespace    http://tampermonkey.net/
// @version      1.0
// @description  按 Alt+N 显示/隐藏当前网页的实时上下行速度
// @author       myncdw
// @match        *://*/*
// @grant        none
// @license      MIT
// ==/UserScript==

(function() {
    'use strict';

    let monitorDiv = null;
    let isMonitoring = false;
    let lastTime = Date.now();
    let lastDownload = 0;
    let lastUpload = 0;

    // 创建显示面板
    function createMonitorPanel() {
        const div = document.createElement('div');
        div.id = 'network-speed-monitor';
        div.style.cssText = `
            position: fixed;
            bottom: 20px;
            right: 20px;
            background: rgba(0, 0, 0, 0.85);
            color: #00ff00;
            padding: 15px 20px;
            border-radius: 8px;
            font-family: 'Courier New', monospace;
            font-size: 14px;
            z-index: 999999;
            box-shadow: 0 4px 12px rgba(0, 0, 0, 0.5);
            min-width: 200px;
            display: none;
        `;
        div.innerHTML = `
            <div style="margin-bottom: 8px; font-weight: bold; color: #fff; border-bottom: 1px solid #444; padding-bottom: 5px;">网速监控</div>
            <div style="margin: 5px 0;">
                <span style="color: #66ccff;">↓ 下载:</span>
                <span id="download-speed" style="margin-left: 10px; font-weight: bold;">0.00 Mbps</span>
            </div>
            <div style="margin: 5px 0;">
                <span style="color: #ff9966;">↑ 上传:</span>
                <span id="upload-speed" style="margin-left: 10px; font-weight: bold;">0.00 Mbps</span>
            </div>
            <div style="margin-top: 8px; padding-top: 5px; border-top: 1px solid #444; font-size: 11px; color: #999;">
                按 Alt+N 关闭
            </div>
        `;
        document.body.appendChild(div);
        return div;
    }

    // 格式化速度显示(仅显示 Mbps)
    function formatSpeed(bytesPerSecond) {
        const mbps = (bytesPerSecond * 8) / (1024 * 1024); // 转换为 Mbps
        return mbps.toFixed(2) + ' Mbps';
    }

    // 更新速度显示
    function updateSpeed() {
        if (!isMonitoring) return;

        const now = Date.now();
        const timeDiff = (now - lastTime) / 1000; // 转换为秒

        if (window.performance && window.performance.getEntries) {
            const entries = window.performance.getEntries();
            let totalDownload = 0;
            let totalUpload = 0;

            entries.forEach(entry => {
                if (entry.transferSize) {
                    totalDownload += entry.transferSize;
                }
                if (entry.encodedBodySize) {
                    totalUpload += entry.encodedBodySize * 0.1; // 估算上传(通常较小)
                }
            });

            const downloadSpeed = (totalDownload - lastDownload) / timeDiff;
            const uploadSpeed = (totalUpload - lastUpload) / timeDiff;

            document.getElementById('download-speed').textContent = formatSpeed(downloadSpeed);
            document.getElementById('upload-speed').textContent = formatSpeed(uploadSpeed);

            lastDownload = totalDownload;
            lastUpload = totalUpload;
        }

        lastTime = now;
    }

    // 切换监控状态
    function toggleMonitor() {
        if (!monitorDiv) {
            monitorDiv = createMonitorPanel();
        }

        isMonitoring = !isMonitoring;

        if (isMonitoring) {
            monitorDiv.style.display = 'block';
            lastTime = Date.now();
            lastDownload = 0;
            lastUpload = 0;

            // 清空性能记录以重新开始计算
            if (window.performance && window.performance.clearResourceTimings) {
                window.performance.clearResourceTimings();
            }

            // 每秒更新一次
            window.monitorInterval = setInterval(updateSpeed, 1000);
        } else {
            monitorDiv.style.display = 'none';
            if (window.monitorInterval) {
                clearInterval(window.monitorInterval);
            }
        }
    }

    // 监听键盘事件
    document.addEventListener('keydown', function(e) {
        // Alt + N
        if (e.altKey && e.key.toLowerCase() === 'n') {
            e.preventDefault();
            toggleMonitor();
        }
    });

    console.log('网速监控脚本已加载,按 Alt+N 开启/关闭监控');
})();