// ==UserScript==
// @name 🫧404小站 — 学习通阅读助手
// @namespace https://scriptcat.org/users/yyy404
// @version 2.1.0
// @description 超星学习通阅读助手:逐段/整页/像素滚动(随机步长/间隔/停顿);资料页course目录;浮动自嘲熊控件;K/Z/S/R 或点熊操作
// @author yyy404
// @homepage https://scriptcat.org/zh-CN/script-show-page/3990
// @supportURL https://scriptcat.org/zh-CN/script-show-page/3990/comment
// @icon https://pan-yz.chaoxing.com/favicon.ico
// @icon https://pan-yz.neauce.com/favicon.ico
// @match *://*.chaoxing.com/*
// @match *://mooc1-*.chaoxing.com/*
// @connect s1.aigei.com
// @connect aigei.com
// @grant GM_getValue
// @grant GM_setValue
// @grant GM_getResourceURL
// @resource bearRun https://s1.aigei.com/src/img/gif/33/332524b9bbe34f029fc0f2744ebcfd27.gif?e=2051020800&token=P7S2Xpzfz11vAkASLTkfHN7Fw-oOZBecqeJaxypL:zufjktQMAvjjC6hhOdGSlI_oXsY=
// @resource bearEat https://s1.aigei.com/src/img/gif/ad/adc5c174b4a94e93b67702a76adb63d4.gif?imageMogr2/auto-orient/thumbnail/!282x282r/gravity/Center/crop/282x282/quality/85/%7CimageView2/2/w/282&e=2051020800&token=P7S2Xpzfz11vAkASLTkfHN7Fw-oOZBecqeJaxypL:JhiMrZ_DLfOiBqibRnWMMHtUN6U=
// @run-at document-end
// ==/UserScript==
(function() {
'use strict';
// 全局状态管理(跨页面保持)
window.readingAssistantGlobalState = window.readingAssistantGlobalState || {
isRunning: false,
isPaused: false,
scrollPosition: 0,
manuallyPaused: false,
startTime: 0,
chapterElapsed: 0,
timerInterval: null
};
// 防重复跳转锁
let hasAutoJump = false;
// 配置
const BEAR_URL = {
run: (typeof GM_getResourceURL === 'function' ? GM_getResourceURL('bearRun') : '') ||
'https://s1.aigei.com/src/img/gif/33/332524b9bbe34f029fc0f2744ebcfd27.gif?e=2051020800&token=P7S2Xpzfz11vAkASLTkfHN7Fw-oOZBecqeJaxypL:zufjktQMAvjjC6hhOdGSlI_oXsY=',
eat: (typeof GM_getResourceURL === 'function' ? GM_getResourceURL('bearEat') : '') ||
'https://s1.aigei.com/src/img/gif/ad/adc5c174b4a94e93b67702a76adb63d4.gif?imageMogr2/auto-orient/thumbnail/!282x282r/gravity/Center/crop/282x282/quality/85/%7CimageView2/2/w/282&e=2051020800&token=P7S2Xpzfz11vAkASLTkfHN7Fw-oOZBecqeJaxypL:JhiMrZ_DLfOiBqibRnWMMHtUN6U='
};
const REWARD_QR = 'data:image/jpeg;base64,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';
const CONFIG = {
scrollSpeed: parseFloat(GM_getValue('scrollSpeed', 1.0)),
scrollMode: GM_getValue('scrollMode', 'paragraph'), // paragraph, page, pixel
scrollPixel: parseInt(GM_getValue('scrollPixel', 300)),
scrollJitter: GM_getValue('scrollJitter', true) !== false,
scrollIntervalJitter: GM_getValue('scrollIntervalJitter', true) !== false,
randomPauseEnabled: GM_getValue('randomPauseEnabled', true) !== false,
randomPauseEveryMin: parseInt(GM_getValue('randomPauseEveryMin', 3), 10) || 3,
randomPauseEveryMax: parseInt(GM_getValue('randomPauseEveryMax', 8), 10) || 8,
randomPauseMsMin: parseInt(GM_getValue('randomPauseMsMin', 1000), 10) || 1000,
randomPauseMsMax: parseInt(GM_getValue('randomPauseMsMax', 5000), 10) || 5000,
autoStart: GM_getValue('autoStart', true),
showTips: GM_getValue('showTips', true),
showFloatBear: GM_getValue('showFloatBear', true) !== false,
bearIconSize: parseInt(GM_getValue('bearIconSize', 77), 10) || 77,
highlightMode: GM_getValue('highlightMode', true) !== false,
loopMode: GM_getValue('loopMode', true), // 循环阅读模式
targetMinutes: parseInt(GM_getValue('readingTargetMinutes', 0), 10) || 0,
showChapterTimer: GM_getValue('readingShowChapterTimer', true) !== false
};
const TASK_ELAPSED_PREFIX = 'readingTaskSec_';
const GOAL_NOTIFIED_PREFIX = 'readingGoalDone_';
const SESSION_TASK_KEY = 'readingAssistantTabTaskKey';
let resolvedReadingTaskKey = null;
// 状态
const STATE = {
get isRunning() { return window.readingAssistantGlobalState.isRunning; },
set isRunning(value) { window.readingAssistantGlobalState.isRunning = value; },
get isPaused() { return window.readingAssistantGlobalState.isPaused; },
set isPaused(value) { window.readingAssistantGlobalState.isPaused = value; },
get currentScrollTop() { return window.readingAssistantGlobalState.scrollPosition; },
set currentScrollTop(value) { window.readingAssistantGlobalState.scrollPosition = value; },
get manuallyPaused() { return window.readingAssistantGlobalState.manuallyPaused; },
set manuallyPaused(value) { window.readingAssistantGlobalState.manuallyPaused = value; },
contentElements: [],
currentIndex: 0,
scrollTimer: null,
pixelScrollCount: 0,
nextPauseAt: 0
};
let bearClickTimer = null;
let bearLongPressTimer = null;
let bearLongPressFired = false;
let catalogJumpObserver = null;
let catalogJumpTimeout = null;
const CONTENT_ROOT_SELECTORS = ['.read_content', '.article', '.content', '#content', '.node-content', '.chapter-content', '.ans-cc', 'main'];
const CONTENT_EXCLUDE_SELECTOR = '#reading-bear-float,#reading-tips,#reading-settings-modal,#reading-toast,.ztop,.zt_center,.zt_user,.zt_u_abs,header,nav,.header,.nav';
// 日志
function log(msg) {
console.log(`[学习通阅读助手] ${msg}`);
}
// 格式化时间(秒 → 00:00:00)
function formatTime(seconds) {
const h = String(Math.floor(seconds / 3600)).padStart(2, '0');
const m = String(Math.floor((seconds % 3600) / 60)).padStart(2, '0');
const s = String(seconds % 60).padStart(2, '0');
return `${h}:${m}:${s}`;
}
// 解析 URL 参数(键名小写)
function parseUrlParams(url) {
try {
const u = new URL(url, location.origin);
const p = {};
u.searchParams.forEach(function (v, k) { p[k.toLowerCase()] = v; });
return p;
} catch (e) {
return {};
}
}
function sanitizeTaskKeyPart(s) {
return String(s || '').replace(/[^\w.-]/g, '_').slice(0, 64);
}
function readTabTaskKeyHint() {
try {
return sessionStorage.getItem(SESSION_TASK_KEY) || '';
} catch (e) {
return '';
}
}
function writeTabTaskKeyHint(key) {
try {
if (key) sessionStorage.setItem(SESSION_TASK_KEY, key);
} catch (e) {}
}
// 阅读任务目录页 → 任务键(含 query,区分同课多任务)
function computeCatalogTaskKey(url) {
url = url || location.href;
let path;
try {
path = new URL(url, location.origin).pathname;
} catch (e) {
path = location.pathname;
}
const m = path.match(/\/course\/(\d+)\.html/i);
const params = parseUrlParams(url);
if (m) {
const qIdx = url.indexOf('?');
const q = qIdx >= 0 ? url.slice(qIdx + 1, qIdx + 81) : '';
return 'rd_c' + m[1] + (q ? '_' + sanitizeTaskKeyPart(q) : '');
}
if (path.indexOf('/zt/portal') !== -1) {
return 'rd_p' + sanitizeTaskKeyPart(params.id || params.courseid || params.jobid || path.replace(/\W/g, '_'));
}
const qIdx = url.indexOf('?');
const qs = qIdx >= 0 ? url.slice(qIdx + 1, qIdx + 81) : 'x';
return 'rd_' + sanitizeTaskKeyPart(path.replace(/\W/g, '_')) + '_' + sanitizeTaskKeyPart(qs);
}
function isReadingChapterFlip() {
const ref = document.referrer || '';
return ref.indexOf('/ztnodedetailcontroller/visitnodedetail') !== -1;
}
// 阅读正文页 → 从 URL 算任务键(仅 cardid/cfid,不含章节级参数)
function computeReadingPageTaskKey(url) {
url = url || location.href;
const p = parseUrlParams(url);
const cid = p.courseid || p.coursid || p.clazzid || '';
const taskPart = p.cardid || p.cfid || '';
if (cid && taskPart) {
return 'rd_' + sanitizeTaskKeyPart(cid) + '_' + sanitizeTaskKeyPart(taskPart);
}
if (taskPart) {
return 'rd_t_' + sanitizeTaskKeyPart(taskPart);
}
return '';
}
function computeReadingPageWeakKey(url) {
url = url || location.href;
const qIdx = url.indexOf('?');
const qs = qIdx >= 0 ? url.slice(qIdx + 1) : '';
if (qs) {
return 'rd_q_' + sanitizeTaskKeyPart(qs.slice(0, 120));
}
try {
return 'rd_path_' + sanitizeTaskKeyPart(new URL(url, location.origin).pathname.replace(/\W/g, '_'));
} catch (e) {
return '';
}
}
function resolveReadingPageTaskKey() {
const tabHint = readTabTaskKeyHint();
// 同任务内翻章:沿用本标签已确定的任务键,避免章节 URL 变化导致计时归零
if (tabHint && isReadingChapterFlip()) {
return tabHint;
}
const fromUrl = computeReadingPageTaskKey(location.href);
if (fromUrl) return fromUrl;
if (tabHint) return tabHint;
const ref = document.referrer || '';
if (ref && (ref.indexOf('/mooc-ans/course/') !== -1 || ref.indexOf('/zt/portal') !== -1)) {
return computeCatalogTaskKey(ref);
}
const weak = computeReadingPageWeakKey(location.href);
if (weak) return weak;
return 'rd_unknown_' + sanitizeTaskKeyPart(location.href.slice(-120));
}
// 当前阅读任务键(按任务隔离;阅读页仅用本页 URL / 本标签 sessionStorage)
function getReadingTaskKey() {
if (resolvedReadingTaskKey) return resolvedReadingTaskKey;
if (isReadingTaskPage()) {
resolvedReadingTaskKey = computeCatalogTaskKey(location.href);
writeTabTaskKeyHint(resolvedReadingTaskKey);
return resolvedReadingTaskKey;
}
if (isReadingPage()) {
resolvedReadingTaskKey = resolveReadingPageTaskKey();
writeTabTaskKeyHint(resolvedReadingTaskKey);
return resolvedReadingTaskKey;
}
resolvedReadingTaskKey = 'rd_unknown';
return resolvedReadingTaskKey;
}
function getTaskSavedElapsed() {
return GM_getValue(TASK_ELAPSED_PREFIX + getReadingTaskKey(), 0);
}
function saveTaskSavedElapsed(seconds) {
GM_setValue(TASK_ELAPSED_PREFIX + getReadingTaskKey(), Math.max(0, Math.floor(seconds)));
}
function getTaskDisplayElapsed() {
return getTaskSavedElapsed() + (window.readingAssistantGlobalState.chapterElapsed || 0);
}
function formatTarget(minutes) {
if (!minutes || minutes <= 0) return '无';
return formatTime(minutes * 60);
}
function getGoalStatus() {
const targetMin = CONFIG.targetMinutes;
if (!targetMin || targetMin <= 0) return 'none';
return getTaskDisplayElapsed() >= targetMin * 60 ? 'done' : 'pending';
}
function renderGoalBadge() {
const status = getGoalStatus();
if (status === 'none') return '';
if (status === 'done') {
return ' ✓ 已达标';
}
const pct = Math.min(100, Math.floor(getTaskDisplayElapsed() / (CONFIG.targetMinutes * 60) * 100));
return ' ✗ 未达标 ' + pct + '%';
}
function ensureReadingTipsStyle() {
if (document.getElementById('reading-tips-style')) return;
const s = document.createElement('style');
s.id = 'reading-tips-style';
s.textContent = [
'.reading-goal-badge{display:inline-block;margin-left:6px;padding:2px 8px;border-radius:10px;font-size:11px;font-weight:600;vertical-align:middle;}',
'.reading-goal-pending{background:rgba(244,67,54,0.22);color:#ffb4ab;}',
'.reading-goal-ok{background:rgba(76,175,80,0.28);color:#b9f6ca;}',
'.reading-goal-pop{animation:readingGoalPop 0.55s ease;}',
'@keyframes readingGoalPop{0%{transform:scale(1)}45%{transform:scale(1.12)}100%{transform:scale(1)}}'
].join('');
document.head.appendChild(s);
}
function showReadingToast(msg, durationMs) {
durationMs = durationMs || 5000;
let el = document.getElementById('reading-toast');
if (el) el.remove();
el = document.createElement('div');
el.id = 'reading-toast';
el.textContent = msg;
el.style.cssText = 'position:fixed;top:20px;left:50%;transform:translateX(-50%);' +
'background:rgba(40,40,40,0.92);color:#fff;padding:12px 20px;border-radius:8px;' +
'font-size:14px;z-index:10000;max-width:90%;text-align:center;line-height:1.5;';
document.body.appendChild(el);
setTimeout(function () { if (el.parentNode) el.remove(); }, durationMs);
}
function checkReadingGoal() {
if (getGoalStatus() !== 'done') return;
const notifyKey = GOAL_NOTIFIED_PREFIX + getReadingTaskKey();
if (GM_getValue(notifyKey, false)) return;
GM_setValue(notifyKey, true);
log('本任务已达目标时长 ' + CONFIG.targetMinutes + ' 分钟');
const badge = document.getElementById('reading-goal-badge');
if (badge) badge.classList.add('reading-goal-pop');
}
// 本章时长累加到本任务
function flushChapterToTask() {
const ch = window.readingAssistantGlobalState.chapterElapsed || 0;
if (ch > 0) {
saveTaskSavedElapsed(getTaskSavedElapsed() + ch);
window.readingAssistantGlobalState.chapterElapsed = 0;
window.readingAssistantGlobalState.startTime = 0;
}
}
// 启动计时(当前章)
function startTimer() {
if (window.readingAssistantGlobalState.timerInterval) return;
window.readingAssistantGlobalState.startTime = Date.now() - window.readingAssistantGlobalState.chapterElapsed * 1000;
window.readingAssistantGlobalState.timerInterval = setInterval(function () {
window.readingAssistantGlobalState.chapterElapsed = Math.floor((Date.now() - window.readingAssistantGlobalState.startTime) / 1000);
updateTips();
}, 1000);
}
// 停止计时
function stopTimer() {
if (window.readingAssistantGlobalState.timerInterval) {
clearInterval(window.readingAssistantGlobalState.timerInterval);
window.readingAssistantGlobalState.timerInterval = null;
}
}
// 重置当前章时长
function resetChapterTimer() {
stopTimer();
window.readingAssistantGlobalState.chapterElapsed = 0;
window.readingAssistantGlobalState.startTime = 0;
}
// R 键:重置当前阅读任务计时
function resetTaskTimer() {
const taskKey = getReadingTaskKey();
saveTaskSavedElapsed(0);
GM_setValue(GOAL_NOTIFIED_PREFIX + taskKey, false);
resetChapterTimer();
updateTips();
log('本任务阅读时长已重置');
showReadingToast('本任务阅读时长已重置');
}
// 更新提示栏(本任务 + 目标 + 本章)
function updateTips() {
const tips = document.getElementById('reading-tips');
if (!tips) return;
const taskSec = getTaskDisplayElapsed();
const chapter = window.readingAssistantGlobalState.chapterElapsed;
let line2 = '本任务 ' + formatTime(taskSec) + ' / ' + formatTarget(CONFIG.targetMinutes);
if (CONFIG.showChapterTimer) {
line2 += ' · 本章 ' + formatTime(chapter);
}
line2 += renderGoalBadge();
tips.innerHTML = 'K开始 Z暂停 S设置 R重置 · 点熊切换/双击设置/长按重置
' + line2;
checkReadingGoal();
updateBearIcon();
}
function randomBetween(min, max) {
const lo = Math.min(min, max);
const hi = Math.max(min, max);
return lo + Math.floor(Math.random() * (hi - lo + 1));
}
function getRandomPixelStep() {
const base = CONFIG.scrollPixel;
if (!CONFIG.scrollJitter) return base;
return Math.max(30, Math.round(base * (0.7 + Math.random() * 0.6)));
}
function getRandomIntervalMs(baseMs) {
if (!CONFIG.scrollIntervalJitter) return baseMs;
return Math.max(200, Math.round(baseMs * (0.75 + Math.random() * 0.5)));
}
function scheduleNextPauseAt() {
const min = Math.min(CONFIG.randomPauseEveryMin, CONFIG.randomPauseEveryMax);
const max = Math.max(CONFIG.randomPauseEveryMin, CONFIG.randomPauseEveryMax);
STATE.nextPauseAt = randomBetween(min, max);
STATE.pixelScrollCount = 0;
}
function isBearRunningVisual() {
return STATE.isRunning && !STATE.isPaused;
}
function updateBearIcon() {
const img = document.getElementById('reading-bear-img');
if (!img) return;
img.src = isBearRunningVisual() ? BEAR_URL.run : BEAR_URL.eat;
img.title = isBearRunningVisual() ? '阅读中(单击暂停)' : '已停止(单击开始)';
}
function toggleReadingByBear() {
if (!isReadingPage()) {
showReadingToast('请先进入阅读章节,再点熊开始');
return;
}
if (isBearRunningVisual()) {
pauseReading();
} else {
resumeReading();
}
updateBearIcon();
}
function bindBearPointer(el) {
const clearLongPress = function () {
if (bearLongPressTimer) {
clearTimeout(bearLongPressTimer);
bearLongPressTimer = null;
}
};
const startLongPress = function () {
clearLongPress();
bearLongPressFired = false;
bearLongPressTimer = setTimeout(function () {
bearLongPressFired = true;
if (bearClickTimer) {
clearTimeout(bearClickTimer);
bearClickTimer = null;
}
if (!isReadingPage()) {
showReadingToast('请在阅读章节页长按重置');
return;
}
resetTaskTimer();
updateBearIcon();
}, 600);
};
el.addEventListener('mousedown', startLongPress);
el.addEventListener('mouseup', clearLongPress);
el.addEventListener('mouseleave', clearLongPress);
el.addEventListener('touchstart', function (e) {
startLongPress();
}, { passive: true });
el.addEventListener('touchend', clearLongPress);
el.addEventListener('touchcancel', clearLongPress);
el.addEventListener('click', function (e) {
e.preventDefault();
e.stopPropagation();
if (bearLongPressFired) {
bearLongPressFired = false;
return;
}
if (bearClickTimer) {
clearTimeout(bearClickTimer);
bearClickTimer = null;
showSettings();
return;
}
bearClickTimer = setTimeout(function () {
bearClickTimer = null;
toggleReadingByBear();
}, 280);
});
}
function showFloatBear() {
if (!CONFIG.showFloatBear) return;
if (!isReadingPage() && !isReadingTaskPage()) return;
if (document.getElementById('reading-bear-float')) return;
const size = Math.max(40, Math.min(96, CONFIG.bearIconSize));
const wrap = document.createElement('div');
wrap.id = 'reading-bear-float';
wrap.style.cssText = 'position:fixed;left:12px;bottom:12px;z-index:9999;' +
'width:' + size + 'px;height:' + size + 'px;cursor:pointer;user-select:none;' +
'-webkit-user-select:none;touch-action:manipulation;';
const img = document.createElement('img');
img.id = 'reading-bear-img';
img.draggable = false;
img.style.cssText = 'width:100%;height:100%;display:block;object-fit:contain;pointer-events:none;';
wrap.appendChild(img);
document.body.appendChild(wrap);
bindBearPointer(wrap);
updateBearIcon();
}
// 页面检测(兼容新旧目录页)
function isReadingTaskPage() {
if (location.href.includes('/mooc-ans/zt/portal/')) return true;
if (location.href.includes('/mooc-ans/course/') && location.href.includes('.html')) return true;
try {
return /\/course\/\d+\.html/i.test(new URL(location.href, location.origin).pathname);
} catch (e) {
return /\/course\/\d+\.html/i.test(location.pathname);
}
}
function isReadingPage() {
return location.href.includes('/ztnodedetailcontroller/visitnodedetail');
}
function disconnectCatalogObserver() {
if (catalogJumpObserver) {
catalogJumpObserver.disconnect();
catalogJumpObserver = null;
}
if (catalogJumpTimeout) {
clearTimeout(catalogJumpTimeout);
catalogJumpTimeout = null;
}
}
function cleanupReadingSession() {
clearTimeout(STATE.scrollTimer);
STATE.scrollTimer = null;
stopTimer();
flushChapterToTask();
disconnectCatalogObserver();
if (bearClickTimer) {
clearTimeout(bearClickTimer);
bearClickTimer = null;
}
if (bearLongPressTimer) {
clearTimeout(bearLongPressTimer);
bearLongPressTimer = null;
}
}
function bindPageLifecycle() {
if (window.readingAssistantPageLifecycleBound) return;
window.addEventListener('pagehide', cleanupReadingSession);
window.readingAssistantPageLifecycleBound = true;
}
function getContentSearchRoot() {
for (let i = 0; i < CONTENT_ROOT_SELECTORS.length; i++) {
const el = document.querySelector(CONTENT_ROOT_SELECTORS[i]);
if (el && el.querySelector('p, h1, h2, h3, h4, h5, h6')) return el;
}
return document.body;
}
function isExcludedContentElement(el) {
if (!el || !el.closest) return true;
if (el.id === 'reading-bear-img') return true;
try {
if (el.closest(CONTENT_EXCLUDE_SELECTOR)) return true;
} catch (_) { }
return false;
}
// 自动跳转到阅读页面
function autoJumpToReading() {
if (hasAutoJump) return;
if (!isReadingTaskPage()) return;
getReadingTaskKey();
log('检测到阅读任务目录页面,准备跳转');
disconnectCatalogObserver();
catalogJumpObserver = new MutationObserver(function () {
const readingLink = document.querySelector(
'a[href*="/ztnodedetailcontroller/visitnodedetail"],.catalog_detail a,.chapter_item a,.nodeItem a,.posCatalog_name a'
); //感谢用户:ᦸᐝSᴗhi꧂的反馈
if (readingLink) {
log('找到阅读章节,正在跳转');
readingLink.click();
hasAutoJump = true;
disconnectCatalogObserver();
}
});
catalogJumpObserver.observe(document.body, { childList: true, subtree: true });
catalogJumpTimeout = setTimeout(function () {
disconnectCatalogObserver();
log('目录页等待阅读链接超时,已停止监听');
}, 60000);
}
// 收集内容元素
function collectContent() {
const root = getContentSearchRoot();
const selectors = ['p', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'img', 'video'];
STATE.contentElements = [];
selectors.forEach(function (selector) {
root.querySelectorAll(selector).forEach(function (el) {
if (isExcludedContentElement(el)) return;
if (el.offsetHeight <= 20 || el.offsetWidth <= 20) return;
if (selector === 'p') {
const text = String(el.textContent || '').trim();
if (text.length < 4) return;
}
STATE.contentElements.push(el);
});
});
STATE.contentElements.sort(function (a, b) {
return a.getBoundingClientRect().top - b.getBoundingClientRect().top;
});
log('找到 ' + STATE.contentElements.length + ' 个内容元素');
}
// 清除高亮
function clearHighlight() {
document.querySelectorAll('.reading-highlight').forEach(el => {
el.classList.remove('reading-highlight');
el.style.outline = '';
});
}
// 段落阅读
function scrollToNext() {
if (STATE.isPaused || STATE.currentIndex >= STATE.contentElements.length) {
completeReading();
return;
}
const element = STATE.contentElements[STATE.currentIndex];
if (CONFIG.highlightMode) {
clearHighlight();
element.classList.add('reading-highlight');
element.style.outline = '4px solid #00FF00';
element.style.transition = 'outline 0.3s ease';
}
element.scrollIntoView({ behavior: 'smooth', block: 'center' });
STATE.currentIndex++;
const baseMs = CONFIG.scrollSpeed * 1000;
STATE.scrollTimer = setTimeout(scrollToNext, getRandomIntervalMs(baseMs));
}
// 整页阅读
function pageScroll() {
const totalHeight = document.documentElement.scrollHeight - window.innerHeight - 50;
const scrollStep = totalHeight / (CONFIG.scrollSpeed * 10);
if (!STATE.currentScrollTop) {
STATE.currentScrollTop = 0;
}
const scroll = () => {
if (STATE.isPaused) return;
STATE.currentScrollTop += scrollStep;
if (STATE.currentScrollTop >= totalHeight) {
completeReading();
} else {
window.scrollTo({ top: STATE.currentScrollTop, behavior: 'smooth' });
STATE.scrollTimer = setTimeout(scroll, getRandomIntervalMs(100));
}
};
scroll();
}
// 像素滚动
function pixelScroll() {
const totalHeight = document.documentElement.scrollHeight - window.innerHeight - 50;
if (!STATE.currentScrollTop) {
STATE.currentScrollTop = window.pageYOffset || document.documentElement.scrollTop;
}
if (!STATE.nextPauseAt) scheduleNextPauseAt();
const scroll = () => {
if (STATE.isPaused) return;
if (CONFIG.randomPauseEnabled) {
STATE.pixelScrollCount += 1;
if (STATE.pixelScrollCount >= STATE.nextPauseAt) {
scheduleNextPauseAt();
const pauseMs = randomBetween(CONFIG.randomPauseMsMin, CONFIG.randomPauseMsMax);
STATE.scrollTimer = setTimeout(scroll, pauseMs);
return;
}
}
STATE.currentScrollTop += getRandomPixelStep();
if (STATE.currentScrollTop >= totalHeight) {
completeReading();
} else {
window.scrollTo({ top: STATE.currentScrollTop, behavior: 'smooth' });
STATE.scrollTimer = setTimeout(scroll, getRandomIntervalMs(CONFIG.scrollSpeed * 1000));
}
};
scroll();
}
// 完成阅读
function completeReading() {
STATE.isRunning = false;
STATE.isPaused = false;
clearHighlight();
clearTimeout(STATE.scrollTimer);
flushChapterToTask();
resetChapterTimer();
updateBearIcon();
log('阅读完成');
setTimeout(function () {
const nextSelectors = [
'.nodeItem.r a', '.nodeItem.r i', 'a[title="下一章"]', 'a[title="下一节"]',
'.next_btn', '.nextBtn', 'a.next', '.pager_next a', '.next_chapter a'
];
let nextBtn = null;
for (let i = 0; i < nextSelectors.length; i++) {
nextBtn = document.querySelector(nextSelectors[i]);
if (nextBtn) break;
}
if (nextBtn) {
log('找到下一章按钮,正在跳转');
nextBtn.click();
} else if (CONFIG.loopMode) {
log('未找到下一章按钮,循环模式开启,准备跳转到第一章');
setTimeout(() => {
jumpToFirstChapter();
}, 1000);
} else {
log('未找到下一章按钮,阅读结束');
}
}, 2000);
}
// 跳转到第一章
function jumpToFirstChapter() {
log('开始寻找第一章...');
const firstChapterSelectors = [
'.posCatalog_select:first-child a',
'.posCatalog_name:first-child a',
'.catalog_points_yi:first-child a',
'.catalog_title:first-child a',
'.nodeItem:first-child a',
'.catalogDetail:first-child a',
'.catalog_sectionLevel1:first-child a',
'a[href*="/ztnodedetailcontroller/visitnodedetail"]'
];
let firstChapterLink = null;
for (const selector of firstChapterSelectors) {
const links = document.querySelectorAll(selector);
if (links.length > 0) {
firstChapterLink = links[0];
log(`通过选择器 ${selector} 找到第一章链接`);
break;
}
}
if (firstChapterLink) {
log('找到第一章链接,正在跳转...');
firstChapterLink.click();
return;
}
log('尝试返回上级页面...');
if (window.history.length > 1) {
window.history.back();
} else {
const currentUrl = location.href;
const urlParts = currentUrl.split('/');
if (urlParts.length > 3) {
const rootUrl = urlParts.slice(0, 4).join('/');
log(`跳转到根目录: ${rootUrl}`);
location.href = rootUrl;
}
}
}
// 开始阅读
function startReading() {
if (STATE.scrollTimer) clearTimeout(STATE.scrollTimer);
if (STATE.isRunning) return;
startTimer();
STATE.isRunning = true;
STATE.isPaused = false;
STATE.currentIndex = 0;
log(`开始${CONFIG.scrollMode}阅读`);
updateBearIcon();
switch(CONFIG.scrollMode) {
case 'paragraph':
collectContent();
if (STATE.contentElements.length > 0) {
scrollToNext();
} else {
log('未找到段落内容,切换整页模式');
pageScroll();
}
break;
case 'page':
pageScroll();
break;
case 'pixel':
pixelScroll();
break;
}
}
// 暂停阅读
function pauseReading() {
if (STATE.isRunning) {
stopTimer();
STATE.isPaused = true;
STATE.manuallyPaused = true;
GM_setValue('manuallyPaused', true);
clearTimeout(STATE.scrollTimer);
log('阅读已暂停');
updateBearIcon();
}
}
// 继续阅读
function resumeReading() {
if (!STATE.isRunning) {
STATE.manuallyPaused = false;
GM_setValue('manuallyPaused', false);
startTimer();
startReading();
updateBearIcon();
} else {
STATE.isPaused = false;
STATE.manuallyPaused = false;
GM_setValue('manuallyPaused', false);
startTimer();
log('继续阅读');
updateBearIcon();
switch(CONFIG.scrollMode) {
case 'paragraph':
scrollToNext();
break;
case 'page':
pageScroll();
break;
case 'pixel':
pixelScroll();
break;
}
}
}
// 显示阅读器设置面板
function showSettings() {
const existingModal = document.getElementById('reading-settings-modal');
if (existingModal) {
existingModal.remove();
return;
}
const modal = document.createElement('div');
modal.id = 'reading-settings-modal';
modal.style.cssText = `
position: fixed; top: 50%; left: 50%; transform: translate(-50%, -50%);
background: white; padding: 20px; border-radius: 8px;
box-shadow: 0 4px 20px rgba(0,0,0,0.3); z-index: 9999;
font-family: Arial, sans-serif; min-width: 400px;
border: 1px solid #ddd;
`;
modal.innerHTML = `
单击切换
双击设置
长按重置
小猫 or 小狗