学习通助手:自动任务

发布于:2025-07-27 ⋅ 阅读:(12) ⋅ 点赞:(0)

某学习通助手:全自动任务

本文解析一个功能强大的某学习通助手脚本,支持视频自动播放、题库智能答题、任务自动处理等功能,仅供学习研究参考!

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');
    }
}

总结

本脚本通过以下技术实现自动化学习:

  1. 任务解析:从页面中提取学习任务信息
  2. 进度模拟:视频播放进度智能模拟
  3. 题库对接:通过Token验证对接AI题库
  4. 任务队列:自动顺序处理多个任务点
  5. 状态管理:实时监控任务进度

完整学习资料后台踢,欢迎在评论区交流使用体验!

注意事项

  • 使用前需获取有效Token
  • 部分功能依赖平台接口稳定性
  • 请合理使用,遵守平台规定

网站公告

今日签到

点亮在社区的每一天
去签到