Tampermonkey 脚本开发实战:10个JS函数实现中国大学MOOC题目一键复制
Tampermonkey脚本开发实战构建中国大学MOOC题目复制工具在当今在线教育蓬勃发展的时代中国大学MOOC作为国内领先的在线学习平台为无数学习者提供了优质课程资源。然而许多用户在学习过程中面临一个共同痛点无法便捷地复制课程测试题和选项内容。本文将带你从零开始开发一个功能完善的Tampermonkey脚本解决这一实际问题。1. 脚本开发环境准备Tampermonkey是一款强大的浏览器用户脚本管理器支持Chrome、Firefox、Safari等主流浏览器。在开始开发前我们需要做好以下准备工作安装Tampermonkey扩展Chrome用户可以通过Chrome应用商店搜索安装Firefox用户可通过Firefox附加组件商店获取其他浏览器用户可访问Tampermonkey官网下载对应版本配置开发环境// UserScript // name MOOC题目复制工具 // namespace http://your-namespace.com // version 0.1 // description 一键复制中国大学MOOC网站的测试题和选项 // author YourName // match https://www.icourse163.org/* // grant GM_setClipboard // /UserScript基础开发工具现代浏览器推荐Chrome或Firefox代码编辑器VS Code、Sublime Text等浏览器开发者工具F12打开提示在脚本开发过程中建议开启Tampermonkey的允许访问文件URL选项方便本地调试。2. 核心功能模块设计与实现2.1 DOM元素操作基础中国大学MOOC平台的题目和选项通常以特定class或id的DOM元素呈现。我们需要先掌握基本的DOM操作技术// 获取元素常用方法 const byId document.getElementById(elementId); const byClass document.getElementsByClassName(className); const bySelector document.querySelectorAll(div.question); // 删除元素示例 function removeElements(selector) { document.querySelectorAll(selector).forEach(el el.remove()); }2.2 动态按钮创建与事件绑定为用户提供直观的操作入口我们需要在页面上动态添加功能按钮function createButton(parent, text, onClick, styles {}) { const btn document.createElement(button); btn.textContent text; btn.addEventListener(click, onClick); // 应用样式 Object.assign(btn.style, { padding: 8px 12px, margin: 5px, borderRadius: 4px, cursor: pointer, ...styles }); parent.appendChild(btn); return btn; }2.3 题目内容提取与格式化提取题目内容并格式化为可复制的文本是核心功能function extractQuestions() { const questions []; const questionElements document.querySelectorAll(.question-content); questionElements.forEach((q, index) { const questionText q.textContent.trim(); const options Array.from(q.nextElementSibling.querySelectorAll(.option)) .map(opt opt.textContent.trim()); questions.push({ number: index 1, question: questionText, options: options }); }); return questions; } function formatQuestionsForCopy(questions) { return questions.map(q { const optionsText q.options.map((opt, i) ${String.fromCharCode(65 i)}. ${opt}).join(\n); return 第${q.number}题: ${q.question}\n${optionsText}\n; }).join(\n); }3. 高级功能实现与优化3.1 智能内容识别与处理不同课程可能使用不同的DOM结构我们需要更健壮的识别逻辑function smartExtractQuestions() { const possibleSelectors [ .question-content, .f-richEditorText, .qa-question, .exam-question ]; let questions []; possibleSelectors.forEach(selector { const elements document.querySelectorAll(selector); if (elements.length 0) { elements.forEach(el { // 更精细的内容提取逻辑 const text el.textContent.replace(/\s/g, ).trim(); if (text.length 10) { // 简单过滤掉太短的文本 questions.push(text); } }); } }); return questions; }3.2 剪贴板操作与用户反馈使用Tampermonkey提供的API实现安全的剪贴板操作function copyToClipboard(text) { return new Promise((resolve, reject) { GM_setClipboard(text, text, () { showToast(内容已复制到剪贴板); resolve(); }); }); } function showToast(message, duration 2000) { const toast document.createElement(div); toast.textContent message; Object.assign(toast.style, { position: fixed, bottom: 20px, left: 50%, transform: translateX(-50%), backgroundColor: rgba(0,0,0,0.7), color: white, padding: 10px 20px, borderRadius: 4px, zIndex: 9999, transition: opacity 0.3s }); document.body.appendChild(toast); setTimeout(() { toast.style.opacity 0; setTimeout(() toast.remove(), 300); }, duration); }3.3 性能优化与防冲突处理确保脚本运行高效且不影响页面原有功能// 使用MutationObserver监听DOM变化 function setupObserver() { const observer new MutationObserver(mutations { mutations.forEach(mutation { if (mutation.addedNodes.length) { initCopyButtons(); } }); }); observer.observe(document.body, { childList: true, subtree: true }); } // 防抖处理频繁操作 function debounce(func, delay) { let timeout; return function() { clearTimeout(timeout); timeout setTimeout(() func.apply(this, arguments), delay); }; }4. 工程化与可维护性提升4.1 模块化代码结构将功能拆分为独立模块提高代码可维护性mooc-copy-tool/ ├── core/ │ ├── dom.js # DOM操作相关 │ ├── utils.js # 工具函数 │ └── events.js # 事件处理 ├── ui/ │ ├── buttons.js # 按钮创建与管理 │ └── toast.js # 用户反馈 └── main.js # 主入口文件4.2 配置系统设计允许用户自定义脚本行为const defaultConfig { copyFormat: full, // full|question-only|options-only showNumbers: true, excludeTypes: [drag-drop, match], buttonPosition: top-right }; function loadConfig() { return new Promise(resolve { GM_getValue(moocCopyConfig, defaultConfig, config { resolve(config); }); }); }4.3 错误处理与日志系统健壮的错误处理机制对用户脚本尤为重要function setupErrorHandling() { window.addEventListener(error, e { logError(e.message, e.filename, e.lineno); showToast(操作失败请刷新页面重试); }); } function logError(message, file, line) { const error { timestamp: new Date().toISOString(), message, file, line, userAgent: navigator.userAgent }; console.error(MOOC Copy Error:, error); GM_setValue(lastError, error); }5. 实际应用与扩展思路5.1 与流行学习工具集成考虑与其他学习工具如Anki、Notion等集成function exportToAnki(questions) { const ankiFormat questions.map(q { return ${q.question}\t${q.options.join(br)}; }).join(\n); copyToClipboard(ankiFormat).then(() { showToast(Anki格式已复制可直接导入); }); }5.2 跨平台兼容性处理针对不同浏览器和MOOC版本进行适配平台/浏览器适配要点解决方案Chrome严格的CSP策略使用GM_* API代替原生方法Firefox不同的API实现特性检测和polyfillSafari性能差异优化DOM操作频率移动端触摸事件添加触摸支持5.3 未来功能扩展方向题目搜索功能将复制的题目自动在搜索引擎中查询本地存储保存历史题目便于复习智能分类根据题目类型自动分类OCR支持处理图片形式的题目// 伪代码题目搜索功能示例 function setupSearchButton() { createButton(container, 搜索题目, () { const currentQuestion getSelectedQuestion(); if (currentQuestion) { window.open(https://www.baidu.com/s?wd${encodeURIComponent(currentQuestion)}); } }); }通过本文介绍的方法你已经掌握了开发一个实用Tampermonkey脚本的核心技术。从基础DOM操作到高级工程化实践这些技能不仅能应用于MOOC题目复制工具也能迁移到其他浏览器自动化场景中。

相关新闻

固定报价与按小时计费的动态平衡方案

固定报价与按小时计费的动态平衡方案

1. 项目概述:为什么固定报价与按小时计费的拉锯战从未停歇 “Fixed-Bid vs. Hourly Contracts”——这八个字母组合,几乎刻在每位自由职业者、小型工作室负责人、外包团队管理者的办公桌边缘。它不是理论题,而是每天早上打开邮箱时弹出的客户…

2026/7/6 23:27:39阅读更多 →
Spring Boot集成JWT实战:从原理到微服务无状态认证

Spring Boot集成JWT实战:从原理到微服务无状态认证

1. 项目概述:为什么我们需要JWT令牌? 在构建现代Web应用或API服务时,身份验证和授权是绕不开的核心议题。传统的方案,比如基于服务器Session的认证,虽然经典,但在分布式、微服务架构下,其扩展性…

2026/7/6 23:27:39阅读更多 →
TPM2-Tools实战:5分钟实现Linux服务器文件硬件级加密

TPM2-Tools实战:5分钟实现Linux服务器文件硬件级加密

1. 项目概述:为什么是TPM2-Tools?在Linux服务器上处理敏感文件,比如配置文件、密钥或者日志,你是不是也经常感到头疼?传统的加密方式,比如用GPG或者OpenSSL,当然没问题,但它们有个共…

2026/7/6 23:27:39阅读更多 →
抖音音频批量下载终极指南:免费开源工具快速获取无水印音乐

抖音音频批量下载终极指南:免费开源工具快速获取无水印音乐

抖音音频批量下载终极指南:免费开源工具快速获取无水印音乐 【免费下载链接】douyin-downloader A practical Douyin downloader for both single-item and profile batch downloads, with progress display, retries, SQLite deduplication, and browser fallback …

2026/7/7 0:27:43阅读更多 →
MAX9744与PIC18F4455构建高效D类音频放大器方案

MAX9744与PIC18F4455构建高效D类音频放大器方案

1. 项目背景与核心价值在DIY音频设备领域,功率放大器的选择直接影响最终音质表现。传统AB类放大器虽然音质纯净,但效率低下(通常仅30%-50%),导致设备发热严重且续航时间短。而MAX9744作为一款20W立体声D类放大器&#…

2026/7/7 0:27:43阅读更多 →
DVWA暴力破解实战:从Low到Impossible的攻防演进与防御策略

DVWA暴力破解实战:从Low到Impossible的攻防演进与防御策略

1. 项目概述:从“暴力”到“优雅”的攻防博弈在网络安全的学习和实践道路上,DVWA(Damn Vulnerable Web Application)靶场几乎是每个初学者的必经之地。它就像一个精心设计的“漏洞博物馆”,将Web应用中最常见的安全问题…

2026/7/7 0:27:43阅读更多 →
每日 AI 研究简报 · 2026-07-06

每日 AI 研究简报 · 2026-07-06

(本文借助 AI 大模型及工具辅助整理) 一句话总结:今日 AI 主线在「能力」与「可控」之间加速校准——持久状态攻击面、多智能体红队工具走热,Anthropic 模型解禁与阿里把 Agent 成本压降 99% 同步发生,企业开始用更便…

2026/7/7 0:27:43阅读更多 →
如何在5分钟内掌握UE4SS:无需源码的Unreal Engine游戏修改终极指南

如何在5分钟内掌握UE4SS:无需源码的Unreal Engine游戏修改终极指南

如何在5分钟内掌握UE4SS:无需源码的Unreal Engine游戏修改终极指南 【免费下载链接】RE-UE4SS Injectable LUA scripting system, SDK generator, live property editor and other dumping utilities for UE4/5 games 项目地址: https://gitcode.com/gh_mirrors/r…

2026/7/7 0:27:43阅读更多 →
计算机Java毕设实战-基于前后端分离的保姆服务预约管理系统的设计与实现 基于 SpringBoot 的智慧家政服务平台【完整源码+LW+部署说明+演示视频,全bao一条龙等】

计算机Java毕设实战-基于前后端分离的保姆服务预约管理系统的设计与实现 基于 SpringBoot 的智慧家政服务平台【完整源码+LW+部署说明+演示视频,全bao一条龙等】

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

2026/7/7 0:22:43阅读更多 →
从GitHub安全案例解析常见漏洞与防护实践

从GitHub安全案例解析常见漏洞与防护实践

1. 项目概述:从GitHub Trending看安全实战 最近在GitHub Trending上看到一个项目,叫 skills4/skills ,它因为一些安全漏洞案例被大家讨论。这其实是一个挺典型的场景:一个旨在展示或教授某种技能的仓库,本身却成了安…

2026/7/6 4:26:20阅读更多 →
MLT 2026启示:因果推理与概率建模驱动下一代LLM应用

MLT 2026启示:因果推理与概率建模驱动下一代LLM应用

# MLT 2026启示:因果推理与概率建模驱动下一代LLM应用## 一、背景与挑战:从“黑箱预测”到“可信推理”2026年6月,第7届机器学习与趋势国际会议(MLT 2026)将在悉尼召开。会议议程中,“因果与可解释机器学习…

2026/7/6 2:48:33阅读更多 →
通达OA SQL注入漏洞深度剖析:从手工注入到自动化利用与防御

通达OA SQL注入漏洞深度剖析:从手工注入到自动化利用与防御

1. 项目概述与漏洞背景最近在梳理一些历史OA系统的安全风险时,通达OA v11.6版本中的一个老漏洞又进入了我的视线。这个漏洞位于/general/bi_design/appcenter/report_bi.func.php文件中,是一个典型的SQL注入点。虽然这个漏洞的利用方式看起来并不复杂&am…

2026/7/6 0:10:35阅读更多 →
Acunetix v24.8 深度解析:DAST漏洞扫描器核心原理与DevSecOps实践

Acunetix v24.8 深度解析:DAST漏洞扫描器核心原理与DevSecOps实践

1. 项目概述:Acunetix v24.8 高级版漏洞扫描器深度解析作为一名在网络安全领域摸爬滚打多年的老兵,我深知一款趁手的“兵器”对于安全测试工作意味着什么。今天要聊的,就是Web应用安全测试领域里一个响当当的名字——Acunetix。特别是其v24.8…

2026/7/7 0:02:41阅读更多 →
国产化信创改造:达梦/人大金仓适配与多数据库兼容方案实战(SpringBoot)

国产化信创改造:达梦/人大金仓适配与多数据库兼容方案实战(SpringBoot)

国产化信创改造:达梦/人大金仓适配与多数据库兼容方案实战(SpringBoot) 🌐 演示地址:http://ruoyioffice.com | 📦 源码1GitHub:ruoyi-office | 📦 源码2GitCode:ruoyi-o…

2026/7/7 0:02:41阅读更多 →
CentOS 7/8 SSH 连接失败:5步系统性排错流程与决策树

CentOS 7/8 SSH 连接失败:5步系统性排错流程与决策树

CentOS SSH连接故障排查:从基础检查到深度修复的完整指南引言当你尝试通过Xshell或其他SSH客户端连接CentOS服务器时,突然遭遇"Connection refused"或"Connection timed out"的错误提示,这种经历对任何运维人员或开发者来…

2026/7/7 0:02:41阅读更多 →
YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

如果你在部署 YOLOv8 时,发现推理速度只有可怜的 1-2 FPS,而别人的演示视频却能跑到 30 FPS 以上,那么问题很可能不在模型本身,而在于你的整个处理链路。很多开发者拿到一个训练好的 YOLOv8 模型后,会直接使用官方示例…

2026/7/6 4:45:01阅读更多 →
Coze与Dify对比指南:低代码AI应用开发从入门到实战

Coze与Dify对比指南:低代码AI应用开发从入门到实战

1. 从零到一:为什么你需要了解 Coze 和 Dify?如果你对 AI 应用开发感兴趣,但一看到“大模型”、“智能体”、“工作流”这些词就头疼,觉得门槛太高,那这篇文章就是为你准备的。很多开发者,包括我自己&#…

2026/7/6 4:45:01阅读更多 →
AI生图工具怎么选?2026年6月版实测对比

AI生图工具怎么选?2026年6月版实测对比

做自媒体的朋友应该都有体会:配图一直是个让人头疼的问题。2026年,AI生图工具已经非常成熟了,但工具太多反而不知道怎么选。以下是截至2026年6月我对主流AI生图工具的实测对比。Midjourney V8.1:速度之王2026年6月11日&#xff0c…

2026/7/6 4:45:03阅读更多 →