// ==UserScript== // @name 上海开大助手 // @namespace http://tampermonkey.net/ // @homepage https://101.133.228.70 // @description 提高了自己效率,希望能帮助到更多人 // @author AchieveHF // @version 1.0.2 // @match *://*.shou.org.cn/* // @icon https://www.google.com/s2/favicons?sz=64&domain=shou.org.cn // @grant GM_setValue // @grant GM_getValue // @require https://code.jquery.com/jquery-3.6.0.min.js // @require https://unpkg.com/layui@2.9.20/dist/layui.js // @license MIT // @run-at document-idle // @downloadURL none // ==/UserScript== (function () { 'use strict'; const css = document.createElement('link'); css.rel = 'stylesheet'; css.href = '//unpkg.com/layui@2.9.20/dist/css/layui.css'; document.head.appendChild(css); const apiDomain = 'https://101.133.228.70/'; // const apiDomain = 'http://127.0.0.1:8000/'; let link = parseURLDetails(); switch (link.path) { case '/study/assignment/preview.aspx': //插入工具 $.ajax({ url: apiDomain + '/api/getBody',//获取题目接口 type: 'GET', data: { path: link.path, }, success: function (data) { $('.e-q-t').append(data) } }) //监听工具使用 $('body').on('click', '.searchQuestion', function () { let q = getQuestion($(this).parent().parent()) var index = layer.load(0, {shade: false}); $.ajax({ url: apiDomain + '/api/searchQuestion',//获取题目接口 type: 'POST', data: { question: q, }, success: (res) => { layer.close(index); if (res.code == 200) { $(this).parent().find('.result').html('参考答案:' + res.data.answer) $(this).parent().parent().find('.e-a .ErichText').each((index, elem)=>{ if($(elem).text().trim().replaceAll('\n', '') == res.data.answer){ $(elem).css('background-color', '#F5C16B'); } }) layer.msg(res.msg) } else { layer.msg(res.msg) } } }) }) break; case '/scenter': setTimeout(()=>{ //学习空间首页 const personalInfo = {}; const fieldMap = { "姓名": "name", "学号": "studentId", "专业": "major", "班级": "class", "学校": "school", "毕业学分": "totalCredits", "已修学分": "earnedCredits" }; $(".info-area p").each(function () { const label = $(this).find(".info-label").text().replace(":", "").trim(); const value = $(this).text().replace($(this).find(".info-label").text(), "").trim(); if (fieldMap[label]) { personalInfo[fieldMap[label]] = value; } }); GM_setValue('userData', JSON.stringify(personalInfo)) //获取课程列表 const courseList = []; $('.el-link.el-link--default').each((index,elem)=>{ let detail = getURLDetails($(elem).attr('href')) let name = $(elem).find('.el-link__inner').text(); if(detail){ courseList.push({ courseOpenId: detail.params.courseOpenId, courseName: name }) } }) $.ajax({ url: apiDomain + '/api/getBody',//获取题目接口 type: 'POST', data: { path: link.path, user:personalInfo, courses: courseList }, success: function (data) { $('.content-left').append(data) } }) },5000) break; case '/study/assignment/history.aspx': //插入页面工具 $.ajax({ url: apiDomain + '/api/getBody',//获取题目接口 type: 'GET', data: { path: link.path, }, success: function (data) { $('.e-quest-header').before(data) } }) //监听工具动作 $('body').on('click', '.share', function () { //作业结果页面 let q_a = []; //获取所有回答正确的题 $('.e-q-t').each(function (index, element) { //大题 if ($(element).find('.e-q-quest .e-q-quest').length > 0) { if ($(element).find('.e-q-l .e-q-right').length > 0) { let topic = $(element).find('.e-q-q .ErichText').first().html() let topic_text = $(element).find('.e-q-q .ErichText').first().text().trim().replaceAll('\n', '') $(element).find('.e-q-quest .e-q-quest').each((index, elem) => { let q = { topic: topic, topic_text: topic_text, type: '', question: '', question_text: '', answer: '', answer_options: '', } q = getRightQuestion(elem, q, true); pushQuestion(q_a, q, element) // pushQuestion(q_a,q,element) }) } } else { let q = { topic: '', topic_text: '', type: '', question: '', question_text: '', answer: '', answer_options: '', } q = getRightQuestion(element, q); if (q !== false) { pushQuestion(q_a, q, element) } } }) //发送请求记录到题库 $.ajax({ url: apiDomain + '/api/saveQuestions',//记录题目接口 type: 'POST', data: { q_a: q_a, params: link.params, userData: JSON.parse(GM_getValue('userData')) }, success: function (data) { layer.msg(data.msg) } }) }) break; case '/study/assignment-preview.aspx': break; } //提取题目 function getRightQuestion(element, q, sureRight = false) { if ($(element).find('.e-checking-a').length > 0) { //判断题 q.type = '判断题'; q.question = $(element).find('.e-q-q .ErichText').html() q.question_text = $(element).find('.e-q-q .ErichText').text().trim().replaceAll('\n', '') if ($(element).find('.e-q-l .e-q-right').length > 0) { //答对的 q.answer = $(element).find('li.e-a.checked').text().trim().split(' ')[1] q.answer_options = $(element).find('li.e-a.checked').text().trim().charAt(0) } else { //答错的,记录正确答案 q.answer = $(element).find('li.e-a:not(.checked)').text().trim().split(' ')[1] q.answer_options = $(element).find('li.e-a:not(.checked)').text().trim().charAt(0) } } else if ($(element).find('.e-choice-a').length > 0 && ($(element).find('.e-q-l .e-q-right').length > 0 || sureRight)) { //答对的单选题 q.type = '选择题'; q.question = $(element).find('.e-q-q .ErichText').html() q.question_text = $(element).find('.e-q-q .ErichText').text().trim().replaceAll('\n', '') if ($(element).find('li.e-a.checked').length > 1) { //多选题 $(element).find('li.e-a.checked').each((index, elem) => { q.answer += $(elem).find('.ErichText').text().trim().replaceAll('\n', '') + '\n' q.answer_options += $(elem).contents().eq(2).text().trim().charAt(0) }) } else if ($(element).find('li.e-a.checked').length = 1) { q.answer = $(element).find('li.e-a.checked .ErichText').text().trim().replaceAll('\n', '') q.answer_options = $(element).find('li.e-a.checked').contents().eq(2).text().trim().charAt(0) } } else if ($(element).find('.e-blank-a').length > 0 && ($(element).find('.e-q-l .e-q-right').length > 0 || sureRight)) { //填空题 q.type = '填空题'; q.question = $(element).find('.e-q-q .ErichText').html() q.question_text = $(element).find('.e-q-q .ErichText').text().trim().replaceAll('\n', '') q.answer = [] $(element).find('li.e-a').each((index, elem) => { q.answer.push({ title: $(elem).find('.e-blank-e').text(), answer: $(elem).find('input').val() }) }) q.answer_options = null } else if ($(element).find('.e-short-a').length > 0 && ($(element).find('.e-q-l .e-q-right').length > 0 || sureRight)) { //排序题 q.type = '排序题'; q.question = $(element).find('.e-q-q .ErichText').html() q.question_text = $(element).find('.e-q-q .ErichText').text().trim().replaceAll('\n', '') q.answer = [] $(element).find('.am-g .am-u-sm-5').first().find('.ErichText').each((index, elem) => { q.answer.push({ title: $(elem).text().trim().replaceAll('\n', ''), answer: $(element).find('.am-g .am-u-sm-1 .e-choice-i').eq(index).text().trim().replaceAll('\n', '') }) }) q.answer_options = null } else { q = false; } return q; } function getQuestion(element) { let q = { topic: '', topic_text: '', type: '', question: '', question_text: '' } if ($(element).find('.e-checking-a').length > 0) { //判断题 q.type = '判断题'; q.question = $(element).find('.e-q-q .ErichText').html() q.question_text = $(element).find('.e-q-q .ErichText').text().trim().replaceAll('\n', '') } else if ($(element).find('.e-choice-a').length > 0) { //答对的单选题 q.type = '选择题'; q.question = $(element).find('.e-q-q .ErichText').html() q.question_text = $(element).find('.e-q-q .ErichText').text().trim().replaceAll('\n', '') } else if ($(element).find('.e-blank-a').length > 0) { //填空题 q.type = '填空题'; q.question = $(element).find('.e-q-q .ErichText').html() q.question_text = $(element).find('.e-q-q .ErichText').text().trim().replaceAll('\n', '') } else { q = false; } return q; } //题目筛查 function pushQuestion(q_a, q, element) { if (q.question === undefined || q.answer === undefined || q.answer_options === undefined) { $.ajax({ url: '/api/errorQuestion',//记录无法提取的题目接口 type: 'POST', data: { element: element.outerHTML, }, success: function (data) { return false } }) console.log('无法提取的题目已记录', element, q) } else { q_a.push(q) } } //解析页面url function parseURLDetails() { // 获取完整的 URL const fullUrl = window.location.href; // 获取页面路径(不含参数) const pathname = window.location.pathname; // 使用 URLSearchParams 解析参数 const params = new URLSearchParams(window.location.search); const queryParams = {}; // 将参数拆分为键值对 params.forEach((value, key) => { queryParams[key] = value; }); // 返回结果对象 return { url: fullUrl, // 完整的网址 path: pathname, // 页面地址 params: queryParams // 参数对象 }; } // 解析传入的 URL function getURLDetails(url) { try { // 创建一个 URL 对象 const urlObj = new URL(url); // 获取页面路径(不含参数) const pathname = urlObj.pathname; // 使用 URLSearchParams 解析参数 const params = new URLSearchParams(urlObj.search); const queryParams = {}; // 将参数拆分为键值对 params.forEach((value, key) => { queryParams[key] = value; }); // 返回结果对象 return { url: url, // 完整的网址 path: pathname, // 页面地址 params: queryParams // 参数对象 }; } catch (error) { console.error('Invalid URL:', error.message); return false; } } })();