Greasy Fork

Greasy Fork is available in English.

DGUT优学院自动阅读器

自动启读+本地保存秒数设置,刷新不用重开

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Greasemonkey 油猴子Violentmonkey 暴力猴,才能安装此脚本。

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

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

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

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

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

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

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

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

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

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

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

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

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

// ==UserScript==
// @name         DGUT优学院自动阅读器
// @namespace    http://tampermonkey.net/
// @version      0.7.1
// @description  自动启读+本地保存秒数设置,刷新不用重开
// @author       豆包、uhys
// @match        *://*/*
// @grant        none
// @run-at       document-idle
// @license MIT
// ==/UserScript==

(function() {
    'use strict';

    // 仅阅读器iframe生效
    const isTargetIframe = !!document.querySelector('#nextBtn');
    if (!isTargetIframe) return;
    if (window.__AUTO_READER_INITED__) return;
    window.__AUTO_READER_INITED__ = true;

    // 读取本地储存 / 默认30秒
    let saveSec = localStorage.getItem("autoReaderSaveSec");
    let CLICK_INTERVAL = saveSec ? Number(saveSec) * 1000 : 30000;
    const DEFAULT_SEC = saveSec || 30;

    const NEXT_BTN_SELECTOR = '#nextBtn';
    let timer = null;
    let dragOffsetX = 0, dragOffsetY = 0;
    let startBtnEl = null;
    let inputEle = null;

    // 自动翻页
    function clickNextBtn() {
        const btn = document.querySelector(NEXT_BTN_SELECTOR);
        if (btn) btn.click();
    }

    // 开始阅读
    function startAuto() {
        if (timer) return;
        timer = setInterval(clickNextBtn, CLICK_INTERVAL);
        if(startBtnEl){
            startBtnEl.innerText = "正在翻动书本";
            startBtnEl.style.background = "#28a745";
        }
    }

    // 停止阅读
    function stopAuto() {
        if (!timer) return;
        clearInterval(timer);
        timer = null;
        if(startBtnEl){
            startBtnEl.innerText = "开始阅读";
            startBtnEl.style.background = "#007bff";
        }
    }

    // 修改+保存秒数
    function updateSec(sec) {
        if (!sec || isNaN(sec) || sec <= 0) {
            alert('请输入大于0的有效数字');
            return;
        }
        // 保存到本地
        localStorage.setItem("autoReaderSaveSec", sec);
        CLICK_INTERVAL = sec * 1000;

        // 重启计时
        if (timer) { stopAuto(); startAuto(); }
        alert(`已保存:每 ${sec} 秒翻动书本,下次刷新保留设置`);
    }

    // 创建可拖动面板
    function addDragPanel() {
        if (document.getElementById('autoReaderPanel')) return;

        const panel = document.createElement('div');
        panel.id = 'autoReaderPanel';
        panel.style.cssText = `
            position: absolute; top: 60px; right: 10px;
            z-index: 999999; background: #fff;
            border: 1px solid #ccc; border-radius: 8px;
            box-shadow: 0 2px 12px rgba(0,0,0,0.15);
            font-size: 14px; padding: 10px;
            user-select: none; width: 220px;
        `;

        // 拖动标题栏
        const dragHead = document.createElement('div');
        dragHead.innerText = '📖 自动阅读器(按住拖动)';
        dragHead.style.cssText = `
            background: #007bff; color: #fff;
            padding: 6px; border-radius: 6px;
            text-align: center; cursor: move;
            margin: -10px -10px 10px -10px;
        `;

        // 秒数输入行
        const descLine = document.createElement('div');
        descLine.style.cssText = `display:flex;align-items:center;gap:6px;margin-bottom:8px;`;
        descLine.innerHTML = `<span>每</span>
            <input type="number" id="secInput" value="${DEFAULT_SEC}" style="width:60px;padding:4px;border:1px solid #ccc;border-radius:4px;">
            <span>秒翻动书本</span>`;

        // 按钮区
        const btnLine = document.createElement('div');
        btnLine.style.cssText = `display:flex;gap:6px;flex-wrap:wrap;`;

        const changeBtn = document.createElement('button');
        changeBtn.innerText = '更改秒数';
        changeBtn.style.cssText = `padding:4px 8px;background:#28a745;color:#fff;border:none;border-radius:4px;cursor:pointer;`;
        changeBtn.onclick = ()=>{
            const val = document.getElementById('secInput').value.trim();
            updateSec(Number(val));
        };

        startBtnEl = document.createElement('button');
        startBtnEl.innerText = "开始阅读";
        startBtnEl.style.cssText = `padding:4px 8px;background:#007bff;color:#fff;border:none;border-radius:4px;cursor:pointer;`;
        startBtnEl.onclick = startAuto;

        const stopBtn = document.createElement('button');
        stopBtn.innerText = "停止";
        stopBtn.style.cssText = `padding:4px 8px;background:#6c757d;color:#fff;border:none;border-radius:4px;cursor:pointer;`;
        stopBtn.onclick = stopAuto;

        btnLine.append(changeBtn, startBtnEl, stopBtn);
        panel.append(dragHead, descLine, btnLine);

        // 挂载页面
        const container = document.querySelector('#recordDiv')?.parentElement || document.body;
        container.appendChild(panel);

        // 拖拽逻辑
        dragHead.addEventListener('mousedown', e=>{
            dragOffsetX = e.clientX - panel.offsetLeft;
            dragOffsetY = e.clientY - panel.offsetTop;
            document.addEventListener('mousemove', move);
            document.addEventListener('mouseup', endDrag);
        });
        function move(e){
            panel.style.left = (e.clientX - dragOffsetX) + 'px';
            panel.style.top = (e.clientY - dragOffsetY) + 'px';
            panel.style.right = 'auto';
        }
        function endDrag(){
            document.removeEventListener('mousemove', move);
            document.removeEventListener('mouseup', endDrag);
        }
    }

    // 页面加载:自动加载面板 + 自动启动阅读
    window.addEventListener('load', ()=>{
        setTimeout(()=>{
            addDragPanel();
            startAuto(); // 刷新/进课本 直接自动读
        }, 1200);
    });
})();