Greasy Fork

wsxy_handleExams

网上学院函数库:自动答题

目前为 2020-02-02 提交的版本。查看 最新版本

此脚本不应直接安装,它是一个供其他脚本使用的外部库。如果您需要使用该库,请在脚本元属性加入:// @require https://update.greasyfork.icu/scripts/395966/769534/wsxy_handleExams.js

// ==UserScript==
// @name          wsxy_handleExams
// @namespace     Vionlentmonkey
// @version       0.4
// @description   网上学院函数库:自动答题
// @require       https://greasyfork.org/scripts/395748-wsxy-getdata/code/wsxy_getData.js
// @grant         none
// ==/UserScript==

/** 最新知识库。
 * 年终考试题库在此公布,需要层层打开 iframe 最终获取 swf 地址,然后以 IE 打开,
 * 打印所有页,输出 PDF,二次打印输出 PDF,再用 Word 等进行 OCR。
 */
const openKnowledge = () => {
  const knowledges = document.querySelectorAll('#knowledgeType a[title][href="#"]');
  for (let knowledge of knowledges) {
    const kURL =
      location.origin +
      '/sfxzwsxy/jypxks/modules/learn/document/learn/document_learn_text.jsp?fkNodePk=' +
      knowledge
        .getAttribute('onclick')
        .split('(')[1]
        .split(')')[0];
    //console.log(kURL);
    knowledge.href = kURL;
    knowledge.onclick = '';
    knowledge.target = '_blank';
  }
};

// 清理两处“参加考试”按钮,使其点击时在新标签页打开考题及答案。
const handelExamList = async exams => {
  for (let exam of exams) {
    const examURL = location.origin + '/sfxzwsxy/' + exam.getAttribute('onclick').split("'")[1];
    exam.href = examURL;
    exam.onclick = '';
    exam.target = '_blank';
    let course_pk = '';
    let answerURL = '';
    // 在线考试 - 课程考试 iframe
    if (examURL.includes('course_pk=')) {
      coursePk = examURL.split('course_pk=')[1].split('&')[0];
      answerURL =
        location.origin +
        '/sfxzwsxy//jypxks/modules/train/course/subject_list.jsp?coursePk=' +
        coursePk +
        '&op=view';
    }
    // 首页 - 考试提醒 - 课程考试
    else if (exam.getAttribute('title')) {
      const csDataObj = await getCourseData();
      const exam_courses = csDataObj.exam_courses;
      const title = exam.getAttribute('title');
      for (let e of exam_courses) {
        if (e.course_name === title) {
          course_pk = String(e.course_pk);
          answerURL =
            location.origin +
            '/sfxzwsxy//jypxks/modules/train/course/subject_list.jsp?coursePk=' +
            course_pk +
            '&op=view';
        }
      }
    }
    exam.addEventListener('click', () => {
      GM_openInTab(answerURL, true);
      GM_notification('答案已同步在隔壁标签页打开。\n暂请考试结束后手动关闭。');
    });
  }
};

// 打开考卷后自动答题交卷
const autoExamineTest = async () => {
  // 本考试所有试题
  let topics = document.getElementsByClassName('topic-tms');
  for await (let topic of topics) {
    // 题号
    let pkid = topic.querySelector('a[pkid]').getAttribute('pkid');
    // 本题答案
    let subjectDataMap = await getSubjectData(pkid);
    // 本题选项
    let options = topic.querySelectorAll('.tms-Right-wrong > p > a');
    for (let option of options) {
      let optionText = option.textContent.trim();
      if (subjectDataMap.get('questionType') === '判断题') {
        if (option.textContent.trim() === subjectDataMap.get('judgementAnswer')) {
          option.click();
        }
      } else {
        // 选择题选项内容带着序号与空格,如“A ”,故获取第三个字符开始的子串
        if (subjectDataMap.get(optionText.substring(2)) === '是') {
          option.click();
        }
      }
    }
  }
  // 交卷
  if (document.getElementsByClassName('subline _submit').length === 1) {
    document.getElementsByClassName('subline _submit')[0].click();
  }
  // 确认
  if (document.getElementsByClassName('layui-layer-btn0').length === 1) {
    document.getElementsByClassName('layui-layer-btn0')[0].click();
  }
};