NeumoocStar,neumooc,东软慕课,东软学院,自动完成视频+课后作业

东软慕课+课后作业,借鉴了NeumoocBBQ,目前有近代史,毛泽东思想,马克思主义如果你有答案可联系我添加。

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

  1. // ==UserScript==
  2. // @name NeumoocStar,neumooc,东软慕课,东软学院,自动完成视频+课后作业
  3. // @namespace http://tampermonkey.net/
  4. // @version 0.7
  5. // @description 东软慕课+课后作业,借鉴了NeumoocBBQ,目前有近代史,毛泽东思想,马克思主义如果你有答案可联系我添加。
  6. // @author Aisen
  7. // @match http://mooc.neumooc.com/course/play/*
  8. // @run-at document-end
  9. // @grant unsafeWindow
  10. // @grant GM_xmlhttpRequest
  11. // @grant GM_addStyle
  12. // @grant GM_download
  13. // @connect neu.aisencode.cn
  14. // @requier https://code.jquery.com/jquery-3.1.1.min.js
  15. // @license MIT
  16. // ==/UserScript==
  17.  
  18.  
  19. var window = unsafeWindow;
  20. var $ = unsafeWindow.jQuery;
  21. var setting = {
  22. time: 5e3, // 默认响应速度为5秒,不建议小于3秒
  23. answers: {}, //如果有答案则会从服务器获取,如果没有则为空,如果自己有答案可加入
  24. //格式为 {"outl_D247C619659A4B12987B5E5D148E8065": "B B C","outl_6C746E61867D457FAA6218C73AAF5AC3": "C C B"}
  25. doTest: true, //默认开启做题
  26. justDoTest: false //只做题不看视频,默认关闭,开启为true
  27.  
  28. };
  29.  
  30.  
  31.  
  32. $(function() {
  33. logger('info', 'Init: Neumooc injected.');
  34. pannel();
  35. getAnswer();
  36. if (isVideo() && !setting.justDoTest) {
  37. var tryInitTime = 0;
  38. var initInterval = setInterval(function() {
  39. is_500();
  40. if (isPlayerReady()) {
  41. clearInterval(initInterval);
  42. logger('info', 'Init: Success find video player.');
  43. disableBlurPause();
  44. waitVideo();
  45. } else {
  46. tryInitTime++;
  47. logger('info', 'Init: Waiting video player.');
  48. if ($(".fp-ui")) $(".fp-ui").click();
  49. if (tryInitTime >= 6) {
  50. clearInterval(initInterval);
  51. logger('warn', 'Init: Can not find player, next outline.');
  52. doTest();
  53. }
  54. }
  55. }, 1000)
  56. } else {
  57. logger('info', 'Init: justDoTest is true or this is test.');
  58. doTest();
  59. }
  60. })
  61.  
  62. function is_500() {
  63. //<div class="error-text-2 bounceInDown animated">
  64. // <img src="/resources/img/500_bg.png">
  65. // </div>
  66. var err = $('.error-text-2');
  67. if (err.length != 0) {
  68. logger('warn', 'is_500: the web is 500.');
  69. window.location.reload();
  70.  
  71. }
  72. }
  73.  
  74. // Logger
  75. function logger(type, msg) {
  76. $(".info").text(msg);
  77. msg = "[NsumoocStar] " + msg;
  78. switch (type) {
  79. case 'warn':
  80. console.warn(msg);
  81. break;
  82. case 'log':
  83. console.log(msg);
  84. break;
  85. case 'info':
  86. console.info(msg);
  87. break;
  88. }
  89. }
  90. //面板
  91. function pannel() {
  92. GM_addStyle('.mypanel {position: fixed;overflow: hidden;top: 100px;right: 10px; width: 300px;height: 200px;background-color: rgba(70, 196, 38, 0.6);z-index: 999999;border-radius: 5%;}');
  93. GM_addStyle('.answers, .askMe, .info {height: 70px;line-height: 70px;flote:left;padding-left: 10px;;border-bottom: rgba(0, 0, 0, .2) dashed 2px;font-size: 13px;color:#fff}');
  94. GM_addStyle('.askMe {display: none; }');
  95. GM_addStyle('.askMe a {color:red !important}');
  96. var html = '<div class="mypanel">'
  97. html += '<div class="answers">answers</div>'
  98. html += '<div class="askMe">'
  99. html += '<a href="http://wpa.qq.com/msgrd?v=3&uin=201826658&site=qq&menu=yes" target="_blank">如果你有答案!点我联系作者添加。</a>'
  100. html += '</div>'
  101. html += '<div class="info">info</div>'
  102. html += '</div>'
  103. $("body").append(html);
  104.  
  105.  
  106.  
  107. }
  108.  
  109. //获取答案
  110. function getAnswer() {
  111. var courseId = window.location.href.match(/courseId=(\S*)/)[1].split("&")[0];
  112. if (localStorage.getItem('NeumoocCourseId=' + courseId)) {
  113. setting.answers = localStorage.getItem('NeumoocCourseId=' + courseId);
  114. setting.answers = JSON.parse(setting.answers);
  115. logger('info', 'getAnswer: Success find answers form the local.');
  116. $(".answers").text('该课程有答案。');
  117. } else {
  118. GM_xmlhttpRequest({
  119. method: "GET",
  120. url: "http://neu.aisencode.cn/answer.php",
  121. headers: {
  122. "Content-Type": "application/json"
  123. },
  124. onload: function(res) {
  125. if (res.status == 200) {
  126. var json = JSON.parse(res.responseText);
  127. if (json[courseId]) {
  128. setting.answers = json[courseId].answers;
  129. var strAnswer = JSON.stringify(json[courseId].answers);
  130. localStorage.setItem('NeumoocCourseId=' + courseId, strAnswer);
  131. logger('info', 'getAnswer: Success find answers form the server.');
  132.  
  133. } else {
  134. logger('info', 'getAnswer: not find answers form the server.');
  135. $(".answers").text('暂时没有该课程的答案。');
  136. $(".askMe").show();
  137. }
  138.  
  139.  
  140. } else {
  141. logger('warn', 'getAnswer: can not find the server');
  142.  
  143. setting.answers = {};
  144. setting.doTest = false;
  145. }
  146. }
  147. });
  148. }
  149. }
  150.  
  151. //测试是否通过
  152. function testHasPassed() {
  153. var maxCorrectRate = Number($('#maxCorrectRate').text().slice(0, -1));
  154. if (maxCorrectRate >= 80) {
  155. return true;
  156. } else {
  157. return false;
  158. }
  159.  
  160.  
  161.  
  162. }
  163. //测试
  164. function doTest() {
  165. var outlineId = $("li[class ^= 'childLi'][style = 'background-color:#eee;']")[0].classList[1];
  166. //console.log(outlineId);
  167. var seq = $(".seq_html");
  168. if (setting.answers[outlineId] && setting.doTest) {
  169. if (seq) {
  170. seq.click();
  171. setTimeout(function() {
  172. if (!testHasPassed()) {
  173. var answers = setting.answers[outlineId].split(' ');
  174. $(".answers").text('该课程有答案。');
  175. logger('info', 'doTest: will do test in ' + setting.time + 'ms');
  176. setTimeout(function() {
  177. logger('info', 'doTest: test is doing.');
  178. var btn = $(".btn-primary")[0];
  179. btn.click();
  180. var num = 0;
  181. $(".answers").text('本题答案为:' + answers[num]);
  182. var timer = setInterval(function() {
  183. is_500();
  184. chooseAnswer(answers[num]);
  185. num++;
  186. var btnNext = $('.btn-primary:last');
  187. btnNext.click()
  188. if (num == answers.length) {
  189. clearInterval(timer);
  190. var btnOk = $('.ui-dialog_art-autofocus');
  191. var btnClose = $('.ui-dialog_art-button').children('button');
  192. setTimeout(function() { btnOk.click(); }, setting.time);
  193. setTimeout(function() {
  194. btnClose.click();
  195. logger('info', 'doTest: Finished, will go next Outline in ' + setting.time + 'ms');
  196. //5s后点击下一节
  197. setTimeout(function() { nextOutline() }, setting.time);
  198. }, setting.time + 1000);
  199.  
  200. } else {
  201. $(".answers").text('本题答案为:' + answers[num]);
  202.  
  203. }
  204. }, setting.time);
  205. }, setting.time);
  206.  
  207.  
  208.  
  209. } else {
  210.  
  211. logger('info', 'doTest: the test already passed, will go next Outline in ' + setting.time + 'ms');
  212. //5s后点击下一节
  213. setTimeout(function() { nextOutline() }, setting.time);
  214.  
  215. }
  216. }, 2000);
  217.  
  218. }
  219. } else {
  220. logger('info', 'doTest: dotest is closed or not a test, will go next Outline in ' + setting.time + 'ms');
  221. //5s后点击下一节
  222. setTimeout(function() { nextOutline() }, setting.time);
  223. }
  224.  
  225.  
  226.  
  227. }
  228.  
  229. //选择
  230. function chooseAnswer(answers) {
  231.  
  232. var btns = $("input[name='optionSelect']");
  233. var btn;
  234. for (var i = 0; i < answers.length; i++) {
  235. try {
  236. switch (answers[i]) {
  237. case 'A':
  238. btn = btns[0];
  239. break;
  240. case 'B':
  241. btn = btns[1];
  242. break;
  243. case 'C':
  244. btn = btns[2];
  245. break;
  246. case 'D':
  247. btn = btns[3];
  248. break;
  249. case 'E':
  250. btn = btns[4];
  251. break;
  252. case 'F':
  253. btn = btns[5];
  254. break;
  255. case 'G':
  256. btn = btns[6];
  257. break;
  258. case 'H':
  259. btn = btns[7];
  260. break;
  261. }
  262. } catch (err) {
  263. btn = btns[0];
  264. }
  265. btn.click();
  266. }
  267. }
  268.  
  269. //是否为视频
  270. function isVideo() {
  271. if ($('.fp-player').length >= 1) {
  272. return true;
  273. } else {
  274. return false;
  275.  
  276. }
  277.  
  278. }
  279.  
  280. // 视频是否加载完成
  281. function isPlayerReady() {
  282.  
  283. if (window.flowPlayerObj) {
  284. //console.log(window.flowPlayerObj);
  285. return window.flowPlayerObj
  286. } else {
  287. return false;
  288. }
  289. }
  290.  
  291. //解锁暂停
  292. function disableBlurPause() {
  293. logger('info', 'disableBlurPause: disableBlurPause service started.');
  294. var disableBlurPauseTimer = setInterval(function() {
  295. try {
  296. window.flowPlayerObj.play();
  297. } catch (e) {
  298. clearInterval(disableBlurPauseTimer);
  299. logger('warn', 'Can not find player.');
  300. }
  301. }, 500)
  302. }
  303. //等待视频完成
  304. function waitVideo() {
  305. logger('info', 'waitVideo: waitVideo service started.');
  306. var nextInterval = setInterval(function() {
  307. //如果播放完成
  308. if (isFinished()) {
  309. clearInterval(nextInterval);
  310. doTest();
  311.  
  312. } else {
  313. logger('info', 'waitVideo: Waiting video finish.');
  314. }
  315. }, 1000)
  316. }
  317.  
  318. // 跟进播放进度
  319. function isFinished() {
  320. return window.flowPlayerObj.finished;
  321. }
  322.  
  323. // 跳转到下节课
  324. function nextOutline() {
  325. var outlineId = $("input#outlineId").val();
  326. var currentOutline = $('ul li.outl_' + outlineId); // 当前课程li
  327. var nextOutline;
  328.  
  329. var next = currentOutline.nextAll();
  330. if (next.length != 0) {
  331. nextOutline = $(next[0]);
  332.  
  333. } else {
  334. var nextAll = currentOutline.parent('ul').parent('li').nextAll();
  335. if (nextAll.length != 0) {
  336. nextOutline = $($(nextAll[0]).children("ul").children('li')[0]);
  337. }
  338.  
  339. }
  340. var text = nextOutline.find('font').text();
  341. var nextOutlineUrl = nextOutline.children("a").attr('href');
  342. nextOutlineUrl ? window.location.href = nextOutlineUrl : logger('warn', 'Can not find next Outline or had finished.');
  343. }