hnrcscExam

storehouse

Ezt a szkriptet nem ajánlott közvetlenül telepíteni. Ez egy könyvtár más szkriptek számára, amik tartalmazzák a // @require https://update.greasyfork.org/scripts/496824/1387535/hnrcscExam.js hivatkozást.

  1. (function() {
  2. 'use strict';
  3. /* globals jQuery, $, waitForKeyElements */
  4. unsafeWindow.GM_getValue = GM_getValue
  5. unsafeWindow.GM_deleteValue = GM_deleteValue
  6. unsafeWindow.GM_xmlhttpRequest = GM_xmlhttpRequest
  7.  
  8. // 检查当前窗口是否为顶层窗口
  9. if (window.self === window.top) {
  10. if(window.location.href.split('?')[0].toString() != 'https://admin.hnpxw.org/learner/examine/openPaper.do'){
  11. return;// 如果是顶层窗口,则不执行脚本
  12. }
  13. }
  14.  
  15. // 创建一个新的 script 标签
  16. var script = document.createElement('script');
  17. script.textContent = 'console.log("Script injected by Tampermonkey!");';
  18.  
  19. // 将 script 标签插入到页面的 head 中
  20. document.head.appendChild(script);
  21.  
  22. let btn1=GM_registerMenuCommand ("\u4f5c\u8005\uff1a\ud83c\udf49\u897f\u74dc\u8981\u5927\u7684\ud83c\udf49", function(){
  23. confirm("Hello,\u611f\u8c22\u4f7f\u7528\ud83c\udf49\u897f\u74dc\u5237\u8bfe\u52a9\u624b\ud83c\udf49\uff01\u591a\u591a\u53cd\u9988\u54e6");
  24. GM_unregisterMenuCommand(btn1);
  25. }, "");
  26. let btn2=GM_registerMenuCommand ("\u4ed8\u8d39\u5185\u5bb9", function(){
  27. alert("\u9650\u65f6\u514d\u8d39\uff0c\u5168\u529b\u5f00\u53d1\u4e2d...");
  28. }, "p");
  29.  
  30. var ddds3 = null;
  31. var addMessage = null;
  32.  
  33. const panel = function(){
  34. var container = $('<div id="gm-interface"></div>');
  35. var titleBar = $('<div id="gm-title-bar">\ud83c\udf49\u897f\u74dc\u7f51\u8bfe\u52a9\u624b\ud83c\udf49</div>');
  36. var minimizeButton = $('<div title="\u6536\u8d77" style="display:black"><svg id="gm-minimize-button" class="bi bi-dash-square" viewBox="0 0 16 16" fill="currentColor" xmlns="http://www.w3.org/2000/svg"><path fill-rule="evenodd" d="M14 1H2a1 1 0 0 0-1 1v12a1 1 0 0 0 1 1h12a1 1 0 0 0 1-1V2a1 1 0 0 0-1-1zM2 0a2 2 0 0 0-2 2v12a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V2a2 2 0 0 0-2-2H2z"/><path fill-rule="evenodd" d="M3.5 8a.5.5 0 0 1 .5-.5h8a.5.5 0 0 1 0 1H4a.5.5 0 0 1-.5-.5z"/></svg></div>');
  37. var maxButton = $('<div title="\u5c55\u5f00" style="display:none"><svg id="gm-minimize-button" class="bi bi-plus-square" viewBox="0 0 16 16" fill="currentColor" xmlns="http://www.w3.org/2000/svg"><path fill-rule="evenodd" d="M8 3.5a.5.5 0 0 1 .5.5v4a.5.5 0 0 1-.5.5H4a.5.5 0 0 1 0-1h3.5V4a.5.5 0 0 1 .5-.5z"/><path fill-rule="evenodd" d="M7.5 8a.5.5 0 0 1 .5-.5h4a.5.5 0 0 1 0 1H8.5V12a.5.5 0 0 1-1 0V8z"/><path fill-rule="evenodd" d="M14 1H2a1 1 0 0 0-1 1v12a1 1 0 0 0 1 1h12a1 1 0 0 0 1-1V2a1 1 0 0 0-1-1zM2 0a2 2 0 0 0-2 2v12a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V2a2 2 0 0 0-2-2H2z"/></svg></div>');
  38. var content = $('<div id="gm-content"></div>');
  39. var tips = $('<div class="tip" style="display:none;">\u957f\u6309\u62d6\u62fd</div>');
  40. var scrollText = $('<marquee>').text('\u4e7e\u5764\u672a\u5b9a\uff0c\u4f60\u6211\u7686\u662f\u9ed1\u9a6c----\u4f5c\u8005\uff1a\u897f\u74dc\u8981\u5927\u7684\uff08\u611f\u8c22\u652f\u6301\uff01\uff09').css({
  41. 'position': 'absolute',
  42. 'top': '15%',
  43. 'left': '50%',
  44. 'transform': 'translate(-50%, -50%)',
  45. 'width': '90%',
  46. 'height': '25px',
  47. 'font-size': '16px',
  48. 'line-height': '1.5',
  49. 'white-space': 'nowrap'
  50. }).appendTo(content);
  51. //var ddds1 = $('<div style="position: absolute;top: 20%;width:90%;height:10%;padding: 3px;background: #ffedf0;border-radius: 5px;">\u70b9\u51fb\u542f\u52a8\uff1a<button id="startxg" style="position: absolute;width:48px;right: 10px;background-color: #ffe5e5;border-radius: 4px;border-color: #ffc0c0;color: grey;">\u542f\u52a8</button></div>');
  52. //var ddds5 = $('<div style="position: absolute;top: 35%;width:90%;height:10%;padding: 3px;background: #ffedf0;border-radius: 5px;">\u70b9\u51fb\u542f\u52a8\uff1a<button id="stopxg" style="position: absolute;width:48px;right: 10px;background-color: #ffe5e5;border-radius: 4px;border-color: #ffc0c0;color: grey;">暂停</button></div>');
  53. //var ddds2 = $('<div style="position: absolute;top: 50%;width:90%;height:10%;padding: 3px;background: #ffedf0;border-radius: 5px;">\u89c6\u9891\u500d\u901f\uff1a<button id="speedxg" style="position: absolute;width:48px;right: 10px;background-color: #ffe5e5;border-radius: 4px;border-color: #ffc0c0;color: grey;">X16</button></div>');
  54. ddds3 = $('<div id="message-container" style="position: absolute;display: grid;align-content: baseline;justify-content: center;top: 20%;width:94%;height:62%;max-height:62%;overflow-y:auto;padding: 3px;background: #ffffff;border-radius: 5px;"></div>');
  55. var ddds4 = $('<div style="position: absolute;top: 85%;width:94%;height:10%;padding: 3px;background: #ffedf0;border-radius: 5px;"><button id="saveExam" style="position: absolute;width:69;right: 356px;background-color: #ffe5e5;border-radius: 4px;border-color: #ffc0c0;color: grey;">录入</button><button id="beginExam" style="position: absolute;width:69;right: 306px;background-color: #ffe5e5;border-radius: 4px;border-color: #ffc0c0;color: grey;">考试</button><button id="delExam" style="position: absolute;width:69;right: 256px;background-color: #ffe5e5;border-radius: 4px;border-color: #ffc0c0;color: grey;">删除</button><a href="http://8.130.116.135/?article/" style="position: absolute;right: 10px;text-decoration: none;color: pink;">\u003e\u003e\u003e\u8054\u7cfb\u003a\u0031\u0039\u0030\u0038\u0032\u0034\u0035\u0033\u0030\u0032\u0040\u0071\u0071\u002e\u0063\u006f\u006d</a></div>');
  56.  
  57. container.append(titleBar);
  58. //content.append(ddds1);
  59. //content.append(ddds5);
  60. //content.append(ddds2);
  61. content.append(ddds3);
  62. content.append(ddds4);
  63. container.append(content);
  64. container.append(maxButton);
  65. container.append(minimizeButton);
  66. $('body').append(container);
  67. $('body').append(tips);
  68.  
  69. GM_addStyle(`
  70. #gm-interface {
  71. position: fixed;
  72. top: 10%;
  73. left: 70%;
  74. border-radius: 5px;
  75. background-color: white;
  76. z-index: 9999;
  77. }
  78.  
  79. #gm-title-bar {
  80. padding: 5px;
  81. background-color: #ffc0c0;
  82. border: 1px solid black;
  83. border-radius: 5px;
  84. cursor: grab;
  85. }
  86.  
  87. #gm-minimize-button {
  88. position: absolute;
  89. top: 2px;
  90. right: 2px;
  91. width: 30px;
  92. height: 30px;
  93. border-radius: 5px;
  94. padding: 0;
  95. font-weight: bold;
  96. background-color: #ffc0c0;
  97. cursor: pointer;
  98. }
  99.  
  100. #gm-content {
  101. padding: 10px;
  102. border: 1px solid black;
  103. border-radius: 2px 2px 5px 5px;
  104. background-color: #ffe5e5;
  105. width: 400px;
  106. height: 300px;
  107. }
  108. .tip{
  109. font-family: "黑体";
  110. color: black;
  111. -webkit-transform: scale(0.8);
  112. position:absolute;
  113. padding: 6px 5px;
  114. background-color:#ffe8f0;
  115. border-radius: 4px;
  116. z-index: 9999;
  117. }
  118. `);
  119.  
  120. titleBar.on('mousemove',function(e){
  121. tips.attr("style", "display:black;");
  122. var top = e.pageY+5;
  123. var left = e.pageX+5;
  124. tips.css({
  125. 'top' : top + 'px',
  126. 'left': left+ 'px'
  127. });
  128. });
  129.  
  130. titleBar.on('mouseout',function(){
  131. tips.hide();
  132. });
  133.  
  134. titleBar.on('mousedown', function(e) {
  135. var startX = e.pageX - container.offset().left + window.scrollX;
  136. var startY = e.pageY - container.offset().top + window.scrollY;
  137.  
  138. $(document).on('mousemove', function(e) {
  139. e.preventDefault();
  140. var newX = e.pageX - startX;
  141. var newY = e.pageY - startY;
  142. container.css({ left: newX, top: newY });
  143. });
  144.  
  145. $(document).on('mouseup', function() {
  146. $(document).off('mousemove');
  147. $(document).off('mouseup');
  148. });
  149. });
  150.  
  151.  
  152. $("#beginExam").on('click',function(){
  153. ddds3.children().remove();
  154. let examName = $('<div id="tableForm"><div><input type="text" id="xgExamName" placeholder="请输入考试课程名称"></div><button id="xgSelect" style="width:88px;background-color: #ffe5e5;border-radius: 4px;border-color: #ffc0c0;color: grey;">开始</button></div>');
  155. examName.appendTo(ddds3);
  156.  
  157. $("#xgSelect").on('click',function(){
  158. let ju = getAnswerByName();
  159. if(!ju){
  160. return;
  161. }
  162.  
  163. ddds3.children().remove();
  164. addMessage('开始答题:'+ju);
  165. document.querySelector("#insertPaper").children[1].children[0].children[2].click();
  166. let danxuanCount = document.querySelector("#insertPaper").children[2].childElementCount;
  167. nowAnswer = ju;
  168. beginExam(danxuanCount);
  169. });
  170.  
  171. pintOldData();
  172. });
  173.  
  174. $('#saveExam').on('click',function(){
  175. ddds3.children().remove();
  176. let tableForm = $('<div id="tableForm"><div><input type="text" id="xgExamName" placeholder="请输入考试课程名称"></div><div><textarea type="text" id="xgAnswer" placeholder="请输入答案集"></textarea></div><button id="xgSave" style="width:88px;background-color: #ffe5e5;border-radius: 4px;border-color: #ffc0c0;color: grey;">保存</button></div>');
  177. tableForm.appendTo(ddds3);
  178.  
  179. $("#xgSave").on('click',function(){
  180. let xgExamName = $("#xgExamName").val();
  181. let xgAnswer = $("#xgAnswer").val();
  182. if(xgExamName === '' || xgExamName === null || xgExamName === undefined){
  183. alert("考试课程不可为空!");
  184. }
  185. else if(xgAnswer === '' || xgAnswer === null || xgAnswer === undefined){
  186. alert("答案集不可为空!");
  187. }
  188. else{
  189. console.log(xgAnswer);
  190. let aw = xgAnswer.split(',');
  191. saveAnswer(xgExamName,aw);
  192. alert('保存成功:('+JSON.stringify(aw)+'),刷新页面即可自启动');
  193. }
  194. });
  195.  
  196. pintOldData();
  197. });
  198.  
  199. $("#delExam").on('click',function(){
  200. ddds3.children().remove();
  201. // GM_deleteValue('answerList');
  202. addMessage("未获取删除权限");
  203. });
  204.  
  205. minimizeButton.on('click', function() {
  206. minimizeButton.attr("style", "display:none;");
  207. maxButton.attr("style", "display:black;");
  208. content.slideToggle(0);
  209. container.css({ width: 200 });
  210. });
  211.  
  212. maxButton.on('click', function() {
  213. minimizeButton.attr("style", "display:black;");
  214. maxButton.attr("style", "display:none;");
  215. content.slideToggle(0);
  216. container.css({ width: 422 });
  217. });
  218.  
  219. ddds3.on('mousewheel', function(event) {
  220. event.preventDefault();
  221. var scrollTop = ddds3.scrollTop();
  222. ddds3.scrollTop(scrollTop + event.originalEvent.deltaY);
  223. });
  224.  
  225. addMessage = function(message){
  226. if (ddds3.children().length >= 288) {
  227. ddds3.children().first().remove();
  228. }
  229. var messageElement = $('<div class="message"></div>').text(message).css({
  230. 'margin-bottom': '10px'
  231. }).appendTo(ddds3);
  232. }
  233.  
  234. }
  235.  
  236. function pintOldData(){
  237. addMessage('保存记录:');
  238. getAnswer().forEach(obj => {
  239. for (let key in obj) {
  240. addMessage(key);
  241. }
  242. });
  243. }
  244.  
  245. function getAnswerByName(){
  246. let xgExamName = $("#xgExamName").val();
  247.  
  248. if(xgExamName === '' || xgExamName === null || xgExamName === undefined){
  249. alert("考试课程不可为空!");
  250. return false;
  251. }
  252.  
  253. let data = getAnswer();
  254.  
  255. let result = data.reduce((accumulator,obj) => {
  256. if(xgExamName in obj){
  257. return obj[xgExamName];
  258. }
  259. return accumulator;
  260. },undefined);
  261.  
  262. if(!result){
  263. addMessage('没有此考试数据!');
  264. return false;
  265. }
  266. return result;
  267. }
  268.  
  269. function getAnswer(){
  270. let oldData = GM_getValue('answerList');
  271.  
  272. if(Array.isArray(oldData)){
  273. return oldData;
  274. }
  275.  
  276. return [];
  277. }
  278.  
  279. function saveAnswer(name,content){
  280. let answer = getAnswer();
  281.  
  282. let existIndex = answer.findIndex(obj => name in obj);
  283.  
  284. if (existIndex !== -1) {
  285. // 更新值为['1','2','3']
  286. answer[existIndex][name] = content;
  287. } else {
  288. // push新集合
  289. let tempMap = {};
  290. tempMap[name] = content;
  291. answer.push(tempMap);
  292. }
  293.  
  294. GM_setValue('answerList',answer);
  295. }
  296.  
  297. panel();
  298. addMessage("》》》》》辅助工具");
  299.  
  300.  
  301. var wait = null;
  302. var overlay;
  303. function startSetInt(){
  304. wait = setInterval(function (){
  305. ddds3.children().remove();
  306. addMessage("考试");
  307. if(window.location.href.split('?')[0].toString() === 'https://admin.hnpxw.org/learner/examine/openPaper.do'){
  308. try{
  309. tipsWin().then((result) => {
  310. if(!result){
  311. // ddds3.children().remove();
  312. addMessage("启动");
  313. setTimeout(function(){
  314.  
  315. },1000);
  316. }else{
  317. addMessage("取消");
  318. }
  319. });
  320. }catch(e){
  321. addMessage(e);
  322. }
  323. }
  324. else{
  325. addMessage("当前状态无法使用");
  326. }
  327. stopTimer();
  328. }, 900);
  329. }
  330.  
  331. // 手动停止定时器
  332. function stopTimer() {
  333. clearInterval(wait);
  334. }
  335.  
  336. function tipsWin(){
  337. return new Promise((resolve, reject) => {
  338.  
  339. var popup = document.createElement('div');
  340. popup.id = 'customPopup';
  341. popup.style.display = 'none';
  342. popup.style.position = 'fixed';
  343. popup.style.top = '50%';
  344. popup.style.left = '50%';
  345. popup.style.transform = 'translate(-50%, -50%)';
  346. popup.style.backgroundColor = '#fff';
  347. popup.style.padding = '20px';
  348. popup.style.border = '1px solid #ccc';
  349. popup.style.boxShadow = '0 2px 4px rgba(0, 0, 0, 0.2)';
  350. popup.style.zIndex = '9999';
  351. popup.innerHTML = `
  352. <p id="timeCount">5秒后执行脚本?</p>
  353. <button id="confirmButton">是</button>
  354. <button id="cancelButton">否</button>
  355. `;
  356.  
  357. document.body.appendChild(popup);
  358.  
  359. var confirmButton = document.getElementById('confirmButton');
  360. var cancelButton = document.getElementById('cancelButton');
  361. var confirmed = false;
  362. let juNext = false;
  363.  
  364. popup.style.display = 'block';
  365.  
  366. confirmButton.addEventListener('click', function() {
  367. confirmed = true;
  368. closePopup();
  369. resolve(false);
  370. });
  371.  
  372. cancelButton.addEventListener('click', function() {
  373. ddds3.children().remove();
  374. addMessage("刷新页面即可重启");
  375. confirmed = true;
  376. closePopup();
  377. resolve(true);
  378. });
  379.  
  380. function ju(time){
  381. if(!confirmed){
  382. if(time < 1){
  383. popup.innerHTML = ` <p>时间到了! 脚本启动.</p>`;
  384. setTimeout(function() {
  385. closePopup();
  386. resolve(false);
  387.  
  388. }, 1000);
  389. }
  390. else{
  391. document.getElementById('timeCount').innerText = time+'秒后执行脚本?';
  392. }
  393.  
  394. setTimeout(function(){
  395. ju(--time)
  396. },1000);
  397.  
  398. }
  399. }
  400.  
  401. ju(5);
  402.  
  403. function closePopup() {
  404. popup.style.display = 'none';
  405. }
  406. });
  407.  
  408. }
  409.  
  410. function toggleOverlay(show) {
  411. if (show) {
  412. overlay = document.createElement('div');
  413. overlay.style.position = 'fixed';
  414. overlay.style.top = '0';
  415. overlay.style.left = '0';
  416. overlay.style.width = '100%';
  417. overlay.style.height = '100%';
  418. overlay.style.backgroundColor = 'rgba(0, 0, 0, 0.5)';
  419. overlay.style.zIndex = '9999';
  420.  
  421. overlay.addEventListener('click', function(event) {
  422. event.stopPropagation();
  423. event.preventDefault();
  424. });
  425.  
  426. document.body.appendChild(overlay);
  427. } else {
  428. if (overlay) {
  429. overlay.parentNode.removeChild(overlay);
  430. overlay = null;
  431. }
  432. }
  433. }
  434.  
  435. startSetInt();
  436.  
  437. var nowAnswer = null;
  438. var questionIndex = 3;
  439. var answerIndex = 0;
  440. function beginExam(count){
  441. if(questionIndex < count){
  442. console.log();
  443. inputRadio(0,nowAnswer[answerIndex],count,2);
  444. }
  445. else{
  446. addMessage('单选结束');
  447. nowAnswer.splice(0,count/4);
  448. questionIndex = 3;
  449. answerIndex = 0;
  450.  
  451. document.querySelector("#insertPaper").children[1].children[0].children[3].click();
  452. let duoxuanCount = document.querySelector("#insertPaper").children[3].childElementCount;
  453.  
  454. setTimeout(function(){
  455. beginExamTow(duoxuanCount);
  456. },1000);
  457. }
  458. }
  459.  
  460. function beginExamTow(count){
  461.  
  462. if(questionIndex < count){
  463. inputRadio(0,nowAnswer[answerIndex],count,3);
  464. }
  465. else{
  466. addMessage('多选结束');
  467. nowAnswer.splice(0,count/4);
  468. questionIndex = 3;
  469. answerIndex = 0;
  470.  
  471. document.querySelector("#insertPaper").children[1].children[0].children[4].click();
  472. let duoxuanCount = document.querySelector("#insertPaper").children[4].childElementCount;
  473.  
  474. setTimeout(function(){
  475. beginExamThree(duoxuanCount);
  476. },1000);
  477. }
  478. }
  479.  
  480. function beginExamThree(count){
  481.  
  482. if(questionIndex < count){
  483. inputRadio(0,nowAnswer[answerIndex],count,4);
  484. }
  485. else{
  486. addMessage('答题完毕'+nowAnswer.length);
  487. nowAnswer.splice(0,count/4);
  488. questionIndex = 3;
  489. answerIndex = 0;
  490. }
  491. }
  492.  
  493. function inputRadio(index,answer,count,page){
  494. let tempAW = answer;
  495. let tempCount = count;
  496. let tempPage = page;
  497. console.log(index,answer,count,page);
  498. if(index < tempAW.length){
  499. switch(answer[index])
  500. {
  501. case 'A':
  502. console.log("第"+(answerIndex+1)+"题选","A");
  503. radioOk(0,page);
  504. break;
  505. case 'B':
  506. console.log("第"+(answerIndex+1)+"题选","B");
  507. radioOk(1,page);
  508. break;
  509. case 'C':
  510. console.log("第"+(answerIndex+1)+"题选","C");
  511. radioOk(2,page);
  512. break;
  513. case 'D':
  514. console.log("第"+(answerIndex+1)+"题选","D");
  515. radioOk(3,page);
  516. break;
  517. case 'E':
  518. console.log("第"+(answerIndex+1)+"题选","E");
  519. radioOk(4,page);
  520. break;
  521. case '√':
  522. console.log("第"+(answerIndex+1)+"题选","是");
  523. radioOk(0,page);
  524. break;
  525. case '×':
  526. console.log("第"+(answerIndex+1)+"题选","否");
  527. radioOk(1,page);
  528. break;
  529. }
  530.  
  531. setTimeout(function(){
  532. inputRadio(++index,tempAW,tempCount,tempPage)
  533. },200);
  534. }else{
  535. console.log("第"+(answerIndex+1)+"题结束");
  536. setTimeout(function(){
  537. questionIndex+=4;
  538. answerIndex++;
  539.  
  540. switch(page)
  541. {
  542. case 2:
  543. beginExam(count);
  544. break;
  545. case 3:
  546. beginExamTow(count);
  547. break;
  548. case 4:
  549. beginExamThree(count);
  550. break;
  551. }
  552. },333);
  553. }
  554. }
  555.  
  556. function radioOk(index,page){
  557. if(!document.querySelector("#insertPaper").children[page].children[questionIndex].getElementsByTagName('input')[index].checked){
  558. document.querySelector("#insertPaper").children[page].children[questionIndex].getElementsByTagName('input')[index].click();
  559. }
  560. else{
  561. console.log('无需重复选择');
  562. }
  563. }
  564. })();