Greasy Fork is available in English.
网上学院函数库:登录后获取解析数据
当前为
此脚本不应直接安装。它是供其他脚本使用的外部库,要使用该库请加入元指令 // @require https://update.greasyfork.icu/scripts/395748/770220/wsxy_getData.js
// ==UserScript==
// @name wsxy_getData
// @namespace Vionlentmonkey
// @version 0.3.1
// @description 网上学院函数库:登录后获取解析数据
// @require http://greasyfork.icu/scripts/395959-binary2text/code/binary2Text.js
// @require http://greasyfork.icu/scripts/395958-htmltoelements/code/htmlToElements.js
// @grant GM_xmlhttpRequest
// ==/UserScript==
const csPk2applyPk = async csPk => {
const exam_courses = JSON.parse(localStorage.getItem('exam_courses'));
const required_courses = JSON.parse(localStorage.getItem('required_courses'));
let applyPk = '';
for (let e of exam_courses) {
if (e.course_pk === Number(csPk)) {
applyPk = String(e.apply_pk);
return applyPk;
}
}
for (let r of required_courses) {
if (r.course_pk === Number(csPk)) {
applyPk = String(r.apply_pk);
return applyPk;
}
}
};
// 课程学分学时等信息
const getCourseInfo = async coursePk => {
let viewURL = `${location.origin}/sfxzwsxy//jypxks/modules/train/course/course_view.jsp?coursePk=${coursePk}`;
let response = await fetch(viewURL, {
method: 'POST',
body: 'blob'
});
let blob = await response.blob();
let csInfoHtml = await binary2Text(blob);
let elements = htmlToElements(csInfoHtml);
let courseCredit = Number(elements.querySelectorAll('#subjectInfo td')[7].textContent.trim());
let courseTime = Number(elements.querySelectorAll('#extendInfo td')[3].textContent.trim());
let courseInfo = {
courseCredit: courseCredit,
courseTime: courseTime
};
return courseInfo;
};
// 获取课程对应的 iframe 资源地址,为获取播放器类型做准备。
const getFrameURL = async applyPk => {
let trainURL =
location.origin +
'/sfxzwsxy/jypxks/modules/train/ware/course_ware_view.jsp?applyPk=' +
applyPk +
'&courseType=1';
let response = await fetch(trainURL, {
method: 'POST',
body: 'blob'
});
let blob = await response.blob();
let csInfoHtml = await binary2Text(blob);
let elements = htmlToElements(csInfoHtml);
let warePath = elements.getElementById('warePath').value;
let iframeURL = 'http://218.94.1.181:5088/unzipapp/project/ware' + warePath;
//console.log('iframeURL: ' + iframeURL);
return iframeURL;
};
// 部分少见的新型播放器会弹出 confirm,避开为宜。
const skipNewVideoPlayerType = async (applyPk, callback) => {
// 未报名课程 applyPk === ''
if (applyPk) {
let iframeVideoPlayerType = {
method: 'POST',
// Fetch 不能获取跨域数据
url: await getFrameURL(applyPk),
onload: response => {
let csInfoHtml = response.responseText;
let elements = htmlToElements(csInfoHtml);
let isNewPlayer = elements.getElementById('video');
// return 永远为 undefined,以回调处理
callback(isNewPlayer, applyPk);
}
};
GM_xmlhttpRequest(iframeVideoPlayerType);
}
};
const getSubjectData = async subjectPk => {
let subjectURL = `${location.origin}/sfxzwsxy//jypxks/modules/train/course/subject_view.jsp?subjectPk=${subjectPk}`;
let response = await fetch(subjectURL, {
method: 'POST',
body: 'blob'
});
let blob = await response.blob();
let subjectHtml = await binary2Text(blob);
let elements = htmlToElements(subjectHtml);
// https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Map
let subjectDataMap = new Map();
// 题目类型:判断题/单选题/多选题
let questionType = elements
.querySelectorAll('table')[0]
.querySelectorAll('tr')[0]
.querySelectorAll('td')[1]
.textContent.trim();
subjectDataMap.set('questionType', questionType);
// 题目内容:string
let questionContent = elements
.querySelectorAll('table')[0]
.querySelectorAll('tr')[1]
.querySelectorAll('td')[1]
.textContent.trim();
// 判断题答案,选择题此处为空值
let judgementAnswer = elements
.querySelectorAll('table')[0]
.querySelectorAll('tr')[2]
.querySelectorAll('td')[1]
.textContent.trim();
subjectDataMap.set('questionContent', questionContent);
if (questionType === '判断题') {
subjectDataMap.set('judgementAnswer', judgementAnswer);
} else {
// 选择题答案表格第一行为标题:序号 选项内容 类型 是否为标准答案
// 此表格中答案选项与试题选项顺序打乱,序号没有意义,类型已获取也没有意义
let options = elements.querySelectorAll('table')[1].querySelectorAll('tr');
for (let option of options) {
let optionContent = option.querySelectorAll('td')[1].textContent.trim();
let optionAnswer = option.querySelectorAll('td')[3].textContent.trim();
if (optionContent !== '选项内容' && optionAnswer !== '是否为标准答案') {
subjectDataMap.set(optionContent, optionAnswer);
}
}
}
//console.log(subjectDataMap.get('questionContent'));
//console.log(subjectDataMap);
return subjectDataMap;
};