某学习通助手:全自动任务
本文解析一个功能强大的某学习通助手脚本,支持视频自动播放、题库智能答题、任务自动处理等功能,仅供学习研究参考!
1. 脚本概述与核心功能
该脚本适配学习通、学银在线等平台,主要功能包括:
// 全局配置
const setting = {
showBox: 1, // 显示脚本浮窗
tiku: 0, // 题库服务器选择
video: 1, // 自动处理视频
audio: 1, // 自动处理音频
rate: 1, // 播放倍速
work: 1, // 自动处理测验
time: 5000, // 答题时间间隔
// ...其他配置项
};
核心功能:
- 📺 视频/音频自动播放与进度上报
- 📝 测验/文档/阅读任务自动处理
- 🧠 对接AI题库实现智能答题
- 🎛️ 悬浮控制面板实时监控
- 🔁 任务自动跳转与队列处理
2. 全局配置与工具函数
2.1 关键配置项
// 题库API配置
const _host = [
"aHR0cHM6Ly9hcGkubGVtdGsueHl6",
"aHR0cHM6Ly9hcGkudmFuc2UudG9w",
"aHR0cHM6Ly9jbW9vYy5jYXUuZWR1LmNu"
][setting.tiku];
// Token管理
Object.defineProperty(setting, "token", {
get() {
return GM_getValue("lemtk_token") || "";
},
set(val) {
GM_setValue("lemtk_token", val.trim());
}
});
2.2 实用工具函数
// 获取Cookie
function getCookie(name) {
const match = document.cookie.match(new RegExp(`[;\\s+]?${name}=([^;]*)`));
return match ? match.pop() : null;
}
// 整理题目字符串
function tidyQuestion(s) {
return s.replace(/<(?!img).*?>/g, "")
.replace(/^【.*?】\s*/, "")
.replace(/\s*(\d+\.\d+分)$/, "")
.trim();
}
// 异步等待
function sleep(ms) {
return new Promise(resolve => setTimeout(resolve, ms));
}
3. UI控制面板实现
3.1 控制面板HTML结构
function showBox() {
const boxHtml = `
<div id="miaoke-box" style="position:fixed;top:20px;right:20px;width:350px;...">
<div style="background:linear-gradient(135deg,#667eea 0%,#764ba2 100%);..."
id="miaoke-header">
<h3 style="margin:0;font-size:16px;"> 小超助手 v${GM_info.script.version}</h3>
<div style="float:right;margin-top:-20px;">
<button id="miaoke-minimize">─</button>
<button id="miaoke-close">✕</button>
</div>
</div>
<div id="miaoke-content" style="padding:15px;">
<!-- Token输入区域 -->
<!-- 状态显示区域 -->
<!-- 日志输出区域 -->
</div>
</div>`;
document.body.insertAdjacentHTML('beforeend', boxHtml);
}
3.2 日志记录系统
function logger(message, type = 'info') {
const logContent = document.querySelector('#log-content');
const time = new Date().toLocaleTimeString();
const colors = {
info: '#333',
success: '#28a745',
error: '#dc3545'
};
const logItem = document.createElement('div');
logItem.innerHTML = `<span style="color: #666;">[${time}]</span>
<span style="color: ${colors[type]};">${message}</span>`;
logContent.appendChild(logItem);
logContent.scrollTop = logContent.scrollHeight;
}
4. 题库对接与答案获取
4.1 题库API请求
async function getAnswer(type, question, options) {
return new Promise((resolve, reject) => {
const tkurl = atob(_host) + "/api/v1/cx";
const uid = getCookie("_uid") || getCookie("UID");
GM_xmlhttpRequest({
method: "POST",
url: tkurl,
headers: {
"Content-type": "application/json",
"Authorization": "Bearer " + setting.token
},
data: JSON.stringify({
"question": tidyQuestion(question),
"type": type,
"options": options,
"uid": uid
}),
onload: function(xhr) {
if (xhr.status === 200) {
const obj = JSON.parse(xhr.responseText);
if (obj.code === 1000) {
resolve(obj.data.answer);
}
}
}
});
});
}
4.2 答案处理逻辑
// 在测验处理函数中调用
async function processWork(dom, task) {
if (!setting.work) return;
const questions = dom.querySelectorAll('.question');
for (const q of questions) {
const questionText = q.querySelector('.question-text').innerText;
const options = [...q.querySelectorAll('.option')]
.map(opt => opt.innerText);
try {
const answer = await getAnswer('choice', questionText, options);
// 自动选择答案逻辑...
logger(`题目: ${questionText}<br>答案: ${answer}`, 'purple');
} catch (e) {
logger(`题库请求失败: ${e}`, 'error');
}
}
}
5. 任务处理核心逻辑
5.1 任务调度系统
// 任务调度入口
function startMission() {
if (!_mlist || _mlist.length <= 0) {
logger("任务处理完毕,准备跳转页面", 'success');
return toNext();
}
const task = _mlist[0];
const dom = _domList[0];
const type = task.type || task.property?.module;
switch (type) {
case "video":
processVideo(dom, task); // 处理视频任务
break;
case "workid":
processWork(dom, task); // 处理测验任务
break;
case "document":
processDocument(dom, task); // 处理文档
break;
case "read":
processRead(dom, task); // 处理阅读
break;
}
}
5.2 视频任务处理
async function processVideo(dom, task) {
// 获取视频信息
const response = await fetch(`/ananas/status/${objectId}?k=${fid}`);
const res = await response.json();
const duration = res.duration; // 视频总时长
logger(`视频:${name} 开始播放,总时长:${duration}秒`, 'info');
// 模拟播放进度
const interval = setInterval(async () => {
playingTime += 40 * setting.rate; // 每次增加40秒进度
// 更新进度条
const progress = Math.min((playingTime / duration) * 100, 100);
updateStatus(`播放视频: ${name}`, progress);
// 上报进度到服务器
const updateResult = await updateVideoProgress(...);
// 播放完成
if (playingTime >= duration) {
clearInterval(interval);
logger(`视频:${name} 播放完毕`, 'success');
switchMission(); // 处理下一个任务
}
}, 40000); // 每40秒上报一次
}
5.3 文档任务处理
async function processDocument(dom, task) {
const jobId = task.property?.jobid;
const name = task.property?.name;
try {
const response = await fetch(`/ananas/job/document?jobid=${jobId}&...`);
const res = await response.json();
if (res.status) {
logger(`文档:${name} ${res.msg}`, 'success');
}
} catch (error) {
logger(`文档处理出错: ${error.message}`, 'error');
}
switchMission(); // 处理下一个任务
}
5.4 任务切换机制
// 任务切换函数
function switchMission() {
_mlist.splice(0, 1); // 移除已完成任务
_domList.splice(0, 1);
setTimeout(startMission, 5000); // 5秒后处理下一个
}
// 页面跳转函数
function toNext() {
setTimeout(() => {
// 自动点击"下一页"按钮
if (window.parent.document.querySelector("#mainid > .prev_next.next")) {
window.parent.document.querySelector("#mainid > .prev_next.next").click();
}
}, 5000);
}
6. 主程序入口与总结
6.1 脚本初始化
function init() {
// 显示控制面板
showBox();
// 初始化日志
logger("🎉 小超助手已加载,初始化完毕!", 'success');
// 根据URL路径执行不同处理
if (location.pathname.includes("/knowledge/cards")) {
handleStudyPage(); // 学习页面处理
} else if (location.pathname.includes("/exam/")) {
logger("检测到考试页面", 'info');
// 考试页面处理逻辑
}
}
// 页面加载完成后初始化
if (document.readyState === 'loading') {
document.addEventListener('DOMContentLoaded', init);
} else {
init();
}
6.2 学习页面处理
function handleStudyPage() {
// 获取任务参数
const params = getTaskParams();
if (!params) {
logger("无任务点可处理", 'warning');
return;
}
try {
const parsedParams = JSON.parse(params);
_mlist = parsedParams.attachments || []; // 任务列表
_defaults = parsedParams.defaults || {}; // 用户配置
// 获取DOM元素
_domList = [];
$('.wrap .ans-cc .ans-attach-ct').each((i, element) => {
_domList.push($(element).find('iframe'));
});
logger(`共计${_mlist.length}个任务,即将开始处理`, 'success');
setTimeout(startMission, 3000); // 3秒后开始处理
} catch (error) {
logger(`参数解析失败: ${error.message}`, 'error');
}
}
总结
本脚本通过以下技术实现自动化学习:
- 任务解析:从页面中提取学习任务信息
- 进度模拟:视频播放进度智能模拟
- 题库对接:通过Token验证对接AI题库
- 任务队列:自动顺序处理多个任务点
- 状态管理:实时监控任务进度
完整学习资料后台踢,欢迎在评论区交流使用体验!
注意事项:
- 使用前需获取有效Token
- 部分功能依赖平台接口稳定性
- 请合理使用,遵守平台规定