Greasy Fork is available in English.

医博士网站自动练一练提交答案

try to take over the world!

  1. // ==UserScript==
  2. // @name 医博士网站自动练一练提交答案
  3. // @namespace http://tampermonkey.net/
  4. // @version 1.1
  5. // @description try to take over the world!
  6. // @author Lvhailong
  7. // @match http://www.yiboshi.com/usercenter/index
  8. // @icon https://lovbe-lvyiclub.oss-cn-beijing.aliyuncs.com/pic/c.png
  9. // @grant none
  10. // ==/UserScript==
  11.  
  12. (function() {
  13. 'use strict';
  14.  
  15. // Your code here...
  16.  
  17. var jqueryScript=document.createElement('script');//创建script标签节点
  18. jqueryScript.setAttribute('type','text/javascript');//设置script类型
  19. jqueryScript.setAttribute('src','http://libs.baidu.com/jquery/2.0.0/jquery.min.js');//设置js地址
  20. document.body.appendChild(jqueryScript);//将js追加为body的子标签
  21.  
  22. //判断jqueryScript是否加载成功
  23. jqueryScript.onload=jqueryScript.onreadystatechange=function(){
  24. //如果jqueryScript加载成功则创建script2引入,这样就不会由于后面的js依赖前面的js导致后面的js先加载而导致程序报错
  25. if(!this.readyState||this.readyState=='loaded'||this.readyState=='complete'){
  26. $(document).ready(function(){
  27. //alert("你好");
  28. // 刷新页面或重新加载时先清除缓存信息
  29. window.sessionStorage.clear();
  30. // 先从sessionStorage中获取用户信息,如果没有则发起异步请求
  31. var userId = window.sessionStorage.getItem("userId");
  32. var token = "";
  33. // 获取我的课程计划分类,同样先从缓存中取
  34. var subList = JSON.parse(window.sessionStorage.getItem("subList"));
  35. // 定义当前分类训练的id和name
  36. var curTrainId = "";
  37. var curTrainName = "";
  38. var projectList;
  39. if(userId === undefined || userId === null || userId.length === 0){
  40. // 说明没有缓存,进行异步请求然后放进缓存中
  41. // 从localStorage中获取用户的token信息
  42. var tokenString = window.localStorage.getItem("www_5HGGWrXN_token");
  43. // 去掉两头的双引号然后再拼接OAuth2.0认证的token类型Bearer
  44. token = tokenString.substring(0,tokenString.length-1);
  45. token = tokenString.substring(1,tokenString.length);
  46. token = "Bearer " + token;
  47. $.ajax
  48. ({
  49. type: "POST",
  50. async: false,
  51. url: "https://apicloud.yiboshi.com/gw/v1/authorizations/jwt",
  52. beforeSend: function (xhr) {
  53. xhr.setRequestHeader('Authorization',token);
  54. },
  55. success: function(data) {
  56. userId = data.userInfo.id;
  57. // 同时放进缓存中
  58. window.sessionStorage.setItem("userId",userId);
  59. // 如果课程分类在缓存中获取不到继续ajax请求获取
  60. if(subList === undefined || subList === null || subject.length === 0){
  61. getSubList();
  62. }
  63. }
  64. });
  65. }
  66.  
  67.  
  68. /**
  69. * 定义提交分数的方法
  70. */
  71. window.submitScore = function (courseName){
  72. // 先利用projectName获取到具体的projectId和courseId
  73. for(var i = 0;i < projectList.length; i++){
  74. var project = projectList[i];
  75. for(var j = 0;j < project.courseList.length; j++){
  76. var course = (project.courseList)[j];
  77. if(course.name === courseName){
  78. // 找到正主,发送ajax请求直接保存分数
  79. // 判断下是否已经看了检测到异常
  80. if(course.ybsCourseState === undefined || course.ybsCourseState.courseState == 0){
  81. alert("请先看完视频再提交练习分数");
  82. return false;
  83. }
  84. $.ajax
  85. ({
  86. type: "GET",
  87. async: false,
  88. url: "https://api.yiboshi.com/api/WebApp/commitCoursePracticeScore?" +
  89. "trainingId="+ curTrainId +
  90. "&projectId="+ project.id +
  91. "&userId="+ userId +
  92. "&courseId="+ course.id +
  93. "&score=100&versionId=3.1&courseFieldId="+ course.courseFieldID +
  94. "&examStartTime="+ new Date().getTime() +
  95. "&questionNum=10&correctQuestionNum=0",
  96. beforeSend: function (xhr) {
  97. xhr.setRequestHeader('Authorization',token);
  98. },
  99. success: function(data) {
  100. alert("提交成功,刷新即可显示最新结果");
  101. }
  102. });
  103. return false;
  104. }
  105. }
  106. }
  107. }
  108. /**
  109. * 定义获取课程分类列表的ajax请求
  110. */
  111. function getSubList(){
  112. $.ajax
  113. ({
  114. type: "GET",
  115. async: false,
  116. url: "https://api.yiboshi.com/api/study/student/listStudentTrainingApp?userId="+userId+"&excludeExpire=true&trainingWay=1",
  117. beforeSend: function (xhr) {
  118. xhr.setRequestHeader('Authorization',token);
  119. },
  120. success: function(data) {
  121. subList = data.data.list;
  122. // 放进缓存,这一这里需要序列化
  123. var subListstr = JSON.stringify(subList);
  124. window.sessionStorage.setItem("subList",subListstr);
  125. }
  126. });
  127. }
  128. /**
  129. * 方法定义
  130. * 当选择不同的课程分类时自动触发选择当前的课程分类id,然后异步查询当前课程分类下的所有课程列表
  131. * 数据同样放到缓存中
  132. */
  133. function onChoseSub(){
  134. curTrainName = $("div[class='nupt_main'] a[class='nupt_main_sel']").html();
  135. // 遍历课程分类,找出对应的trainId
  136. for(var i = 0;i < subList.length; i++){
  137. if(subList[i].name === curTrainName){
  138. curTrainId = subList[i].id;
  139. break;
  140. }
  141. }
  142. // 这里先判断当前分类的课程有没有存进缓存,如果没有再进行ajax请求
  143. projectList = JSON.parse(window.sessionStorage.getItem("projectList" + curTrainId));
  144. if(projectList === undefined || projectList === null || projectList.length === 0){
  145. $.ajax
  146. ({
  147. type: "GET",
  148. async: false,
  149. url: "https://api.yiboshi.com/api/study/student/listStudentProjCourseInfoAndStatus?userId=" + userId + "&trainingId=" + curTrainId + "&courseState=&compulsory=&keyword=",
  150. beforeSend: function (xhr) {
  151. xhr.setRequestHeader('Authorization',token);
  152. },
  153. success: function(data) {
  154. projectList = data.data.list;
  155. // 放进缓存,先进行序列化
  156. var projectListstr = JSON.stringify(projectList);
  157. window.sessionStorage.setItem("projectList" + curTrainId, projectListstr);
  158. }
  159. });
  160. }
  161. // 遍历DOM树,添加自动练一练
  162. var projectTR = $("tbody tr:not(:first-child)");
  163. for(var x = 0;x < projectTR.length;x++){
  164. // 为每一个tr元素添加自动练一练按钮
  165. var curprojectTR = projectTR[x];
  166. var curprojectTD = curprojectTR.children[4];
  167. if(curprojectTD.innerHTML === "课程状态"){
  168. continue;
  169. }
  170. var curProjectName = curprojectTR.children[1].innerText;
  171. // 先创建td标签,然后再内嵌a标签,然后再给td标签设置一个点击事件
  172. //var newTD = document.createElement("td");
  173. //var a = document.createElement("a");
  174. //var text = document.createTextNode(curprojectTD.innerHTML);
  175. //a.appendChild(text);
  176. //newTD.appendChild(a);
  177. curprojectTD.setAttribute("title","快速练一练");
  178. curprojectTD.setAttribute("style","background:rgba(73, 199, 185, 0.85);");
  179. curprojectTD.setAttribute("onclick","submitScore('"+ curProjectName +"')");
  180. //curprojectTR.replaceChild(newTD ,curprojectTD);
  181. }
  182. };
  183. // 这里页面进来默认调用一次,获取课程列表
  184. //onChoseSub();
  185. setTimeout(() => {
  186. onChoseSub();
  187. }, 5000)
  188. // 给课程分类元素绑定点击事件,自动更新当前课程分类和名称以及课程列表
  189. $("div[class='nupt_main']").on("click", "a", function() {
  190. // 这里需要延时等待页面加载完成,要不然获取不到当前课程分类的dom元素,如果依然不能生成快速练一练按钮,可将这里的时间调大一点
  191. setTimeout(function () {
  192. projectList = undefined;
  193. onChoseSub();
  194. }, 800);
  195. });
  196. });
  197. }
  198. }
  199. })();