// ==UserScript== // @name 江西继续医学教育-91华医网-掌上华医-刷课助手 // @namespace http://tampermonkey.net/ // @version 1.1 // @description 91华医网刷课助手,支持Polyv+CC双播放器、视频自动播放、静音、自动切换、问答屏蔽,客服微信wkds995 // @author wkds995 // @license AGPL License // @match *://*.91huayi.com/course_ware/course_ware_polyv.aspx?* // @match *://*.91huayi.com/course_ware/course_ware_cc.aspx* // @match *://*.91huayi.com/pages/exam.aspx?* // @match *://*.91huayi.com/pages/exam_result.aspx?* // @match *://*.91huayi.com/* // @exclude *://guideline.91huayi.com/* // @exclude *://gdkjpt.91huayi.com/kjptwsw // @exclude *://gdkjpt.91huayi.com/kjptwsw/* // @exclude *://gdkjpt.91huayi.com/kjpt2/personel/* // @grant none // ==/UserScript== var newupdate = "整理:去除重复脚本体,清理旧代码"; // @author wkds995 基于华医网助手2026改造 (function () { 'use strict'; var submitTime = 6100;//交卷时间控制 var reTryTime = 2100;//重考,视频进入考试延时控制 var examTime = 10000;//听课完成进入考试延时 var randomX = 5000;//随机延时上限 var autoSkip = false; //一个可能会封号的功能。 //记录字段 var keyPlayRate = "JJ_Playrate"; var keyTest = "JJ_Test"; var keyResult = "JJ_Result"; var keyThisTitle = "JJ_ThisTitle"; var keyTestAnswer = "JJ_TestAnswer"; var keyRightAnswer = "JJ_RightAnswer"; var keyAllAnswer = "JJ_AllAnswer"; //按钮样式 var btstyleB = "font-size: 12px;font-weight: 300;text-decoration: none;text-align: center;line-height: 20px;height: 20px;padding: 0 5px;display: inline-block;appearance: none;cursor: pointer;border: none;box-sizing: border-box;transition-property: all;transition-duration: .3s;background-color: #4cb0f9;border-color: #4cb0f9;border-radius: 4px;margin: 5px;color: #FFF;"; //页面判别 var urlInfos = window.location.href.split("/"); var urlTip = urlInfos[urlInfos.length - 1].split("?")[0]; var huayi = getHuayi(); var nspeed = 0; var clock = null; advis(); document.querySelector("span[id='tixing']").innerHTML = "当前网址已适配"; if (urlTip == "course_ware_polyv.aspx") { //保利威播放器视频页面 console.log("当前任务: 华医看视频"); document.querySelector("div[id='Div1']").style.top = "40px"; huayi.seeVideo(1); } else if (urlTip == "course_ware_cc.aspx") { //CC播放器视频页面 console.log("当前任务: 华医看视频"); document.querySelector("div[id='Div1']").style.top = "40px"; huayi.seeVideo(2); } else if (urlTip == "exam.aspx") { //考试页面 console.log("当前任务: 华医考试"); huayi.doTest(); } else if (urlTip == "course.aspx" || urlTip == "cme.aspx") { //课程列表页面 console.log("当前任务: 课程列表"); huayi.courseList(); } else if (urlTip == "exam_result.aspx") { //考试结果页面 console.log("当前任务: 华医考试结果审核"); huayi.doResult(); } else { console.log("其它情况"); try { document.querySelector("span[id='tixing']").innerHTML = "此页面非视频、考试或未适配"; } catch (error) { }; }; //网页中存在子页面的检测,导致存在多个Div1 // 全局试错函数(动态 maxLetter) function getChoiceCode(an) { var charin = an || "A"; return charin.charCodeAt(0) - "A".charCodeAt(0); }; function getNextChoice(an, maxLetter = 'D') { var code = an.charCodeAt(0) + 1; var maxCode = maxLetter.charCodeAt(0); if (code > maxCode) code = "A".charCodeAt(0); return String.fromCharCode(code); }; function getHuayi() { return { courseList: function () { addAnwserCopybtn(); DelAllAnwser(); }, seeVideo: function (e) { // 倍速已被华医网禁用,固定为 1 倍速 var playRateNow = 1; cleanKeyStorage(); asynckillsendQuestion();//屏蔽课堂问答的函数; killsendQuestion2();//屏蔽课堂问答的函数2; killsendQuestion3(); //循环检测问答对话框是否弹出。 addinfo();//脚本信息 changelayout(); window.onload = function () { localStorage.setItem(keyThisTitle, JSON.stringify(window.document.title));//储存章节标题 ratechg(playRateNow); if (autoSkip == true) {//秒过功能,签完别尝试 setTimeout(function () { skipVideo(); }, (submitTime + Math.ceil(Math.random() * randomX))); console.log("秒过了!"); }; // ==================== 新增:单刷模式下隐藏考试按钮 ==================== var mode = localStorage.getItem("华医mode") || "1"; if (mode == "1") { var examBtn = document.querySelector("#jrks"); // 考试按钮ID,根据实际页面调整 if (examBtn) { examBtn.style.display = "none"; console.log("单刷模式:已隐藏考试按钮"); } } // ==================== 新增结束 ==================== var videoObj = document.querySelector("video"); // 视频结束时检查 videoObj.onended = function () { console.log("视频 ended 事件触发,2秒后检查状态"); setTimeout(function () { examherftest(); }, 2000); }; // 原有静音和播放逻辑保持不变... switch (e) { case 1: // 保利威:静音 + 尽快开始播放。player 未就绪时调用 SDK 会抛错, // 所以静音优先用