// ==UserScript==
// @name 2024华医公需课:百县千镇万村
// @namespace http://tampermonkey.net/
// @version 1.7
// @description 2024年公需课:<<“百县千镇万村高质量发展工程”与城乡区域协调发展>> 自动听课和自动考试脚本.华医的其它课程可以自动听课,但没有自动考试.
// @author han2ee
// @include http://cme*.91huayi.com/*
// @include https://cme*.91huayi.com/*
// @run-at document-start
// @grant GM_xmlhttpRequest
// @grant GM.setValue
// @grant GM.getValue
// @grant unsafeWindow
// @license MIT
// ==/UserScript==
(function() {
'use strict';
var courseInterID = 0;
let first = true;
const requestAsync = function(url, data) {
// console.log(data);
return new Promise((resolve, reject) => {
var reportAJAX_Error = (rspObj) => {
console.error (`Request error: ${data}`);
reject(`Request => Error ${data} RES ${rspObj.status}! ${rspObj.statusText}`);
}
var processJSON_Response = (rspObj) => {
if (rspObj.status != 200 && rspObj.status != 304) {
reportAJAX_Error (rspObj);
} else {
resolve(rspObj.responseText);
}
};
GM_xmlhttpRequest ( {
method: "GET",
url: url,
timeout: 6000,
headers: {
"Referer": document.location.href,
"Content-Type": "application/x-www-form-urlencoded"
},
//data: data,
responseType: "text/html",
onload: processJSON_Response,
onabort: reportAJAX_Error,
onerror: reportAJAX_Error,
ontimeout: reportAJAX_Error
});
});
}
const getUrlParameter = function getUrlParameter(sParam) {
var sPageURL = window.location.search.substring(1),
sURLVariables = sPageURL.split('&'),
sParameterName,
i;
for (i = 0; i < sURLVariables.length; i++) {
sParameterName = sURLVariables[i].split('=');
if (sParameterName[0] === sParam) {
return typeof sParameterName[1] === undefined ? true : decodeURIComponent(sParameterName[1]);
}
}
return false;
};
const findFirstLesson = function(studyImgArr) {
if (studyImgArr) {
for (let i = 0; i < studyImgArr.length; i++) {
if (studyImgArr[i].src.endsWith("anniu_01a.gif")) {
return i;
}
}
}
return -1;
}
const nextLesson = async function(cwid) {
let cid = await GM.getValue('cid');
console.log("CID", cid);
let hrefs = await GM.getValue(cid);
for (let i = 0; i < hrefs.length - 1; i++) {
if (hrefs[i].indexOf(cwid) != -1) {
window.location.href = hrefs[i + 1];
}
}
}
const wait = ms => new Promise(resolve => setTimeout(resolve, ms));
function isPromise(obj) {
return !!obj && ((typeof obj === 'object' && typeof obj.then === 'function') || (typeof obj === 'function' && typeof obj().then === 'function'));
}
/**
* Wait Resource.
*
* @param {Function} resourceFn pred function to check resource
* @param {Object} options
* @returns Promise
*/
function waitResource(resourceFn, options) {
var optionsRes = Object.assign(
{
interval: 3000,
max: 10
},
options
);
var current = 0;
return new Promise((resolve, reject) => {
var timer = setInterval(() => {
if (isPromise(resourceFn)) {
resourceFn().then(res => {
if(res) {
clearInterval(timer);
resolve();
}
});
} else if (resourceFn()) {
clearInterval(timer);
resolve();
}
current++;
if (current >= optionsRes.max) {
clearInterval(timer);
reject('Time out');
}
}, optionsRes.interval);
});
}
const ANSWER_DICT = {
// 2023年公需课:中国式现代化
'ddee620c-ac96-43e2-9d06-aff90121781e': ['0ff5544a-4d25-43cf-9d9e-aff900eae98e', '25758f91-972a-45f6-a135-aff900eae98e', '5651f5b3-c847-4045-82bf-aff900eae98e', '84e4d37a-969b-4169-a403-aff900eae98e'],
'4e1c7118-9108-46d3-aca9-affc00d86542': ['4b6b56c4-bb00-4fe4-973e-affc00bcc77f', '96f72670-7e03-4b6b-86bc-affc00bcc77f'],
'c33575cc-0a15-4f0f-9360-affc00d86542': ['4463a024-c9b2-4e49-853b-affc00bd18d0'],
'078e605a-3f69-49a1-9749-affc00d86542': ['918fae00-d0f7-46d3-a96b-affc00bd4d31', '3ee1c077-7a3b-46a0-a2c6-affc00bd4d31'],
'0f36cd4f-7d7f-4acb-b1f5-affc00d86542': ['783664c0-6111-4cb9-8a3b-affc00bd949a', 'a8df96e6-d777-46f1-88da-afff00ffc4b6', '659c599d-e586-4ca2-8375-affc00bd949a', '371dd57b-1af7-4523-937e-affc00bd949a'],
'c0dd53ad-94a7-49f5-9742-affc00d886e6': ['000a5cd4-fa70-44c0-b498-affc00bdab65', 'fad10e9e-7777-44e8-903b-affc00bdab65', '49ca7888-235d-4f48-bebe-affc00bdab65'],
'f5203053-b963-40a4-aedf-affc00d886e6': ['c6a87262-3ce8-4f51-9c26-afff00d84597', '8cfb3061-bd84-461c-9c88-afff00d84597'],
'af3c2ca3-75fb-4327-8954-affc00d8a75f': ['ef839812-8512-42be-a509-affc00bdcf6b', '036a06d9-feeb-40a8-b29f-affc00bdcf6b', '20be6957-649f-4468-be62-affc00bdcf6b', 'bd7006ed-8ab6-40a7-9af5-affc00bdcf6b'],
'3e6c7a75-e375-4665-8b19-affc00d8a75f': ['6eb3a551-3519-45a0-aea9-affc00be1efb'],
'376df62a-43c3-40e5-9cfc-affc00d8a75f': ['4a0668c7-4152-49df-be3a-affc00be40f9'],
'0bcf45d7-c046-4ed7-b3f7-affc00d8a75f': ['c2b68bea-c317-41f5-8182-affc00be5786'],
'c488e001-e7e1-4633-a3f6-affc01048f4d': ['492b8e9b-cb22-4a92-98e9-affc00a485d6', '631e79e2-a42b-4ebe-b9c3-affc00a4edac', 'aa05d0b1-694b-40b4-9f03-affc00a53b44'],
'9cf36193-de49-4aa3-a91d-affc01048f4d': ['e160227f-baab-4334-86d4-affc00a5eb09', '244bd73b-22dc-40c0-8307-affc00a61359', '46dc2b90-aa16-4488-a42a-affc00a7cfa9', 'cdc8fbd6-d6aa-4a26-b12d-affc00a5b5c0'],
'e22ff203-538d-4091-910d-affc00d8dcf7': ['7492d7cb-bd5b-4041-bea0-affc00be76a9', '1ce3be38-809a-47a7-a1a6-affc00be76a9', '8a765422-9f02-44b9-9a33-affc00be76a9', 'bb467e50-8332-49e9-9040-affc00be76a9', '860d6aac-b1da-447d-a9bc-affc00be76a9'],
'b99a8833-fc93-4713-baa6-affc00d8dcf7': ['d5790e51-80cc-419a-a590-affc00be8548', '3d3f9352-cfba-4b48-825c-affc00be8548'],
'bad4558f-9eb9-49c9-8b4a-affc00d91d4a': ['7ec5a1e1-1150-4ea8-baff-affc00d80dbc'],
'b9fb464b-1342-4aa5-8a1b-affc00d91d4a': ['abda38f1-2ea4-46c1-b524-affc00d82753'],
'abc76d76-3163-4116-8d96-affc0104aaf8': ['fe4e11ad-5f3e-4c42-948e-affc00b2b425', 'bdffb758-d122-4417-b620-affc00ad3c9b', '41c0cf79-2e1b-433b-bc89-affc00b24455', '6c93329c-dfa7-464e-90a1-affc00b269e5'],
'd33ca9c4-f9f5-4a48-a19a-affc0104aaf8': ['60029738-3499-4376-b9ee-affc00af9c7c', 'a032a325-80d1-4e1b-a957-affc00b3b380'],
'dc85878b-8b69-403e-8b22-affc0104aaf8': ['8d8e1955-c301-4973-80ee-affc00b0c167', 'db174c11-f75b-4f17-8d5c-affc00b015a6'],
'9a899000-928d-4225-ba71-affc0104aaf8': ['0588720f-314e-4202-8e6d-affc00b10b70'],
'f9daf4f0-0efe-44ef-b354-affc0104b8cf': ['56cd4f15-a418-48f9-86ad-affc00b76e89', 'ebca4def-3c35-45c9-bd92-affc00b7ad55', '1fd325a7-4927-47d7-b72d-affc00b7f432'],
'257e115b-c3b2-4aaf-a16b-affc0104b8cf': ['96791a8b-72de-487e-91e2-affc00b961a1', 'a017938e-8091-4e10-adcd-affc00b931b7'],
'17489175-e920-4283-94b4-affc0104b8cf': ['4347dc60-3433-4f67-846e-affc00b8ba54', '4d9f5ab4-b6ff-4b9a-aa19-affc00b8de44'],
'3bfca4f4-b863-41ad-bff8-affc0104b8cf': ['f67d3b75-07d6-45bc-bc38-affc00b8458e', '9b83d361-2f59-47db-901c-affc00b8715d'],
'1f58a6c9-7db7-4510-89a5-affc0104c80e': ['906c554c-82d1-43d6-b0ab-affc00bc9b42', '395b52e7-f30a-4ab6-962a-affc00bcc90a'],
'935670d2-b227-4915-a4c6-affc0104c80e': ['3898624d-cf7e-426d-b32b-affc00bd4896', '511e3d54-ed47-4f66-90aa-affc00bd02c0'],
'2d246198-f75a-4314-b05c-affc0104c80e': ['94fcaebe-0027-46f3-aa45-affc00e44fb6', 'd66db5d6-96dd-4dd4-9344-affc00e4775b'],
'97cf5b31-e2d6-4fba-9fbc-affc0104c80e': ['1b012366-d516-4858-8f4b-affc00e4e364', '607c2d53-b636-4423-a384-affc00e4ba03'],
'0d3f3b3e-11b6-4e18-8b60-affc0101c473': ['54776828-1c63-40e6-89b1-affc00f08924', '61eab494-9e0c-423e-affc-affc00f08924'],
'83ee0f1b-305d-4f4f-b668-affc0101c473': ['4e1611a5-5439-4afe-94c8-affc00f0a0c3', '70913527-86df-4782-bc39-affc00f0a0c3', 'aff3941a-32ad-4169-a0bd-affc00f0a0c3', '9b743dc9-4dde-4d5b-b4a2-affc00f0a0c3', 'b92ff6bf-7b09-49a4-9289-affc00f0a0c3'],
// 2024年公需课:“百县千镇万村高质量发展工程”与城乡区域协调发展
'3b1a3ece-f378-4d36-9986-b16b00e6fdb6': ['f165a244-4e02-48d0-a215-b169012b5f80', '574d2df2-f95a-460f-98ba-b169012b5f80', '815bd9c0-8e80-41f5-a062-b169012b5f80', '69e04f4d-24ef-4686-a5ba-b169012b5f80'],
'a1b5247f-9886-49ad-8eff-b16b00e49da8': ['26859b07-a91f-469f-b841-b16a0119cbb5'],
'bc7f1f2e-eca9-41f1-bf88-b16b00e49da8': ['c8cfe096-53e1-42cd-b9ed-b16a0119e47a'],
'9168cbab-b03b-41ca-a9b2-b16b00e49da8': ['cae6c76d-6206-46ee-b857-b16a011a3254'],
'2795f469-be56-4e2e-b5e2-b16b00e49da8': ['ad3b9e5f-fcf8-44fc-8112-b16a011a4683'],
'1a9123af-7d1b-4f4e-9395-b16b00e4abab': ['42b39277-208a-43ef-9da2-b16a011a59fa'],
'452d1c6c-76e5-44bd-9a09-b16b00e4abab': ['23b0cc7b-7b29-4522-9c92-b16a011a72e6'],
'f670baa2-d165-4317-b2ca-b16b00e4bae0': ['fb0474ce-b639-4a49-8630-b16c0118bb73', 'f8727505-1669-427a-87f7-b16c0118bb73'],
'0dda685a-7324-4e8a-857b-b16b00e4abab': ['09615a55-cee7-4b52-a82c-b16a011a898c'],
'ae56f8d0-e7c5-448a-9f07-b16b00e4abab': ['0813346a-6607-49df-8859-b16a011a9f45'],
'657c8efa-3291-4196-ba3a-b16b00e4bae0': ['b5adb467-f33f-4b40-9ea3-b16c0119cc37', 'ebdfa592-60f7-4b77-bfdb-b16c0119cc37', '2fe3d4f8-24f3-4597-b0c1-b16c0119cc37'],
'c23686db-ac34-40b9-95ff-b16b00e4bae0': ['36eb21d1-3e56-4936-98c6-b16a011aeb1d'],
'02e1acd3-3c5b-4df0-b0da-b16b00e4cb16': ['6dbe03dc-ec31-4ac2-88b9-b16c011bcb8f', '4ed22733-6c5f-4052-a483-b16c011bcb8f', '506df3cc-7c06-4e85-8682-b16c011bcb8f'],
'b7c39b62-d760-4ce5-a8f1-b16b00e4cb16': ['c7f98c36-648a-4790-ad44-b16c011cf4f9', '2e0c15a1-22f8-4140-a101-b16c011cf4f9'],
'cbf51a55-2cba-4b93-9904-b16b00e4cb16': ['11071ff2-0703-495e-8739-b16a011b2341'],
'd5023032-7465-4a2a-a834-b16b00e4cb16': ['052be890-a475-46e8-ac65-b16a011b350f'],
'ab93eb00-8443-4aa9-ab85-b16b00e4d941': ['2a5cedb5-2ce7-4417-a8a5-b16a011b465b'],
'97a529c3-1ccc-4932-bac9-b16b00e4d941': ['09124584-dd71-4f0e-8ec3-b16a011b5783'],
'bf64f8fa-3afc-42b1-a274-b16b00e4d941': ['0257004c-b25e-46a1-9ea6-b16a011b67a1'],
'20b79b3e-bc11-410b-b79e-b16b00e4d941': ['a8be41c3-64af-418f-a5bf-b16a011b783f'],
'84c2348b-33bd-4e4b-89ae-b16b00e4e547': ['f9304af9-7501-4c18-906e-b16a011b8933'],
'c08172d3-1b93-4688-a975-b16b00e4e547': ['f0a167e0-dcda-42cf-b7cf-b16a011b9c24'],
'e2ce2f9f-dde3-46c3-9204-b16b00e4e547': ['853da226-df48-469a-83f0-b16a011bad8a'],
'0bbacf92-eb4c-41db-85f7-b16b00e4f682': ['761f1d80-98b3-4217-911e-b16c01255691', '276fa66c-ae48-4c20-ba10-b17000b5976d', '7becb0e1-3e40-4c8e-a77e-b16c01255691', 'e38c7cc9-32d7-43c6-bbd1-b16c01255691', '6d9a3c50-c7c2-405d-8ed5-b16c01255691'],
'f5069d7a-7e44-42ea-b94e-b16b00e4f682': ['516d8f88-02c8-4ef9-a5e7-b16a011c4eee'],
'90419ef2-0d8e-4804-8ffd-b16b00e4f682': ['61b3d86e-0daf-4800-addc-b16a011c3e31'],
'531953c7-7e3f-4a55-ba30-b16b00e4f682': ['df71b2c5-7f08-486e-b501-b16a011c2a13'],
'c3107439-f923-47fc-9146-b16b00e50852': ['ddc8a5ea-0061-4d39-81da-b19600ad8898', '0fab0c07-152f-47d7-aeae-b16c0126dd3f'],
'cc37530d-def0-4bb3-aed6-b16b00e50852': ['fa19f1c9-b885-45f0-a977-b16c012750ea', '1fe2df38-334d-4642-b9e1-b16c0127986d'],
'b3606225-bc35-4eea-8d61-b16b00e50852': ['2ef3169c-2416-4a69-b05a-b16a011be852'],
'811693e1-6160-4682-aecb-b16b00e50852': ['8330099f-a2fa-44ea-bbb9-b16c0128873d', '91153778-00f9-4857-9f33-b16c01281e61'],
};
// intercept alert window
if (getUrlParameter('cwid') || getUrlParameter('cid')) {
let alrtScope;
if (typeof unsafeWindow === "undefined") {
alrtScope = window;
} else {
alrtScope = unsafeWindow;
}
alrtScope.alert = function (str) {
console.log ("Greasemonkey intercepted alert: ", str);
};
}
if (window.top !== window.self) {
return;
}
// 单个课程页面
if (window.location.pathname == '/course_ware/course_ware_polyv.aspx') {
console.log("单个课程页面");
/*
// 修改播放器init参数 倍速:'speed': true 可拖动'ban_seek': false
let scriptIndex = 0;
new MutationObserver(function(mutations) {
// check at least two H1 exist using the extremely fast getElementsByTagName
// which is faster than enumerating all the added nodes in mutations
let scriptList = document.getElementsByTagName('script');
if (scriptList.length > 10) {
this.disconnect(); // disconnect the observer
}
for (; scriptIndex < scriptList.length; scriptIndex++) {
let scriptEle = scriptList[scriptIndex];
if (scriptEle.innerHTML && scriptEle.innerHTML.indexOf("'speed': false")) {
scriptEle.innerHTML = scriptEle.innerHTML.replace("'speed': false", "'speed': true").replace("'ban_seek': banSeek", "'ban_seek': false");
console.log("REPLACE");
this.disconnect();
break;
}
}
}).observe(document, {childList: true, subtree: true});
*/
// 拦截first,不让加载视频中间的问题
let inter = setInterval(function() {
try {
if (first && typeof player !== "undefined") {
first = false;
console.log("FIRST:", first);
player.sendQuestion = function(data) {};
clearInterval(inter);
}
} catch (err) {
console.log(err);
}
}, 10);
let initRateFlag = true;
let lastTime = 0;
courseInterID = setInterval(async function() {
if (first) { // mare sure the player.sendQuestion is empty function
console.log("sendQuestion should be empty function");
return;
}
if (typeof closeProcessbarTip === "function") { // close the warning
closeProcessbarTip();
}
if (!$("#jrks")[0].getAttribute('disabled')) { // finish lesson
let cwid = getUrlParameter('cwid');
if (ANSWER_DICT[cwid]) {
try {
let examHref = $("#jrks")[0].href;
if (examHref && examHref.indexOf("exam.aspx") != -1) {
let content = await requestAsync(examHref, {});
if (content.indexOf("请进行课件观看学习完成后再进行考试") != -1) {
window.location.reload(); // 重听
clearInterval(courseInterID);
} else {
window.location = $("#jrks")[0].href; // 跳到考试
clearInterval(courseInterID);
}
}
} catch (err) {
console.error(err);
}
} else { // jump to next
await nextLesson(cwid);
clearInterval(courseInterID);
}
}
await GM.setValue("curCWID", getUrlParameter('cwid'));
// Resume video
let curTime = player.j2s_getCurrentTime();
if (curTime === lastTime && curTime < player.j2s_getDuration()) {
console.log(curTime, "try to resume");
// resume
player.j2s_setVolume(0); // avoid the "user didn't interact with doc" error
player.j2s_resumeVideo();
console.log("resume successfully");
}
lastTime = curTime;
if (initRateFlag) {
let rate = await GM.getValue('rate', 1);
if (player) {
player.changeRate(rate);
initRateFlag = false;
}
} else {
await GM.setValue('rate', player.currentRate);
}
}, 3000);
}
if (window.location.pathname == '/pages/noplay.aspx') {
setTimeout(async function() {
let cwid = await GM.getValue("curCWID");
window.location.href = "/course_ware/course_ware.aspx?cwid=" + cwid;
// document.querySelector(".yes").click();
}, 5000);
}
// 考试页面
if (window.location.pathname == '/pages/exam.aspx') {
setTimeout(async function() {
await waitResource(() => !!document.querySelector("#btn_submit"));
let cwid = getUrlParameter('cwid');
console.log("CWID:", cwid);
let answer = ANSWER_DICT[cwid];
if (answer) {
for (let item of answer) {
if (item.startsWith('gvQuestion')){
$('#' + item).click();
} else {
$(`[value=${item}]`).click();
}
await wait(200);
}
$('#btn_submit').click();
}
}, 3000);
}
// 考试结果页面
if (window.location.pathname == '/pages/exam_result.aspx') {
setTimeout(async function() {
let cwid = getUrlParameter('cwid');
await nextLesson(cwid);
}, 3000);
}
// 目录页面
if (window.location.pathname == '/pages/course.aspx') {
console.log("目录面");
let interId = setInterval(async function() {
let hrefs = document.querySelectorAll(".course h3 a");
let vals = [];
for (let i = 0; i < hrefs.length; i++) {
// if (hrefs[i].children[0].src.endsWith("anniu_01a.gif")) {
vals.push(hrefs[i].href);
// }
}
// console.log(vals);
let cid = getUrlParameter('cid')
await GM.setValue(cid, vals);
await GM.setValue('cid', cid);
console.log("Course list have been set.");
clearInterval(interId);
}, 3000);
}
})();