不学习何以强国fix

读文章,看视频,做习题。

  1. // ==UserScript==
  2. // @name 不学习何以强国fix
  3. // @namespace http://tampermonkey.net/
  4. // @version 2.3.2
  5. // @description 读文章,看视频,做习题。
  6. // @author 荷包蛋。+ gf2024
  7. // @license MIT
  8. // @icon data:image/jpeg;base64,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AAClSSFJEAACgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACQARAAAAAAAAAAAAAAAAAAACO5JHcEJAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFKkkKSIAAFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEgAiAAAAAAAAAAAAAAAAAAAEdySO4ISAAoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKVJIUkQAAKAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJABEAAAAAAAAAAAAAAAAAAAI7kkdwQkABQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUqSQpIgAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAASACIAAAAAAAAAAAAAAAAAAAR3JI7ghIACgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAApUkhSRAAAoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAkAEQAAAAAAAAAAAAAAAAAAAjuSR3BCQAFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABSpJCkiAABQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABIAIgAAAAAAAAAAAAAAAAAABHckjuCEgAKAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAClSSFJEAACgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/9k=
  9. // @match https://www.xuexi.cn
  10. // @match https://www.xuexi.cn/*
  11. // @match https://pc.xuexi.cn/points/login.html?ref=*
  12. // @match https://pc.xuexi.cn/points/exam-practice.html
  13. // @match https://pc.xuexi.cn/points/exam-weekly-detail.html?id=*
  14. // @match https://pc.xuexi.cn/points/exam-weekly-list.html
  15. // @match https://pc.xuexi.cn/points/exam-paper-detail.html?id=*
  16. // @match https://pc.xuexi.cn/points/exam-paper-list.html
  17. // @require https://cdn.jsdelivr.net/npm/jquery@3.5.1/dist/jquery.min.js
  18. // @require https://cdn.bootcdn.net/ajax/libs/blueimp-md5/2.9.0/js/md5.min.js
  19. // @grant GM_addStyle
  20. // @grant GM_setValue
  21. // @grant GM_getValue
  22. // @grant GM_deleteValue
  23. // @grant GM_openInTab
  24. // @grant window.close
  25. // ==/UserScript==
  26. var study_css = ".egg_study_btn{outline:0;border:0;position:fixed;top:5px;left:5px;padding:12px 20px;border-radius:10px;cursor:pointer;background-color:#fff;color:#d90609;font-size:18px;font-weight:bold;text-align:center;box-shadow:0 0 9px #666777}.egg_manual_btn{transition:0.5s;outline:none;border:none;padding:12px 20px;border-radius:10px;cursor:pointer;background-color:#e3484b;color:rgb(255,255,255);font-size:18px;font-weight:bold;text-align:center;}.egg_auto_btn{transition:0.5s;outline:none;border:none;padding:12px 20px;border-radius:10px;cursor:pointer;background-color:#666777;color:rgb(255,255,255);font-size:18px;font-weight:bold;text-align:center;}.egg_setting_box{position:fixed;top:70px;left:5px;padding:12px 20px;border-radius:10px;background-color:#fff;box-shadow:0 0 9px #666777}.egg_setting_item{margin-top:5px;height:30px;width:140px;font-size:16px;display:flex;justify-items:center;justify-content:space-between}input[type='checkbox'].egg_setting_switch{cursor:pointer;margin:0;outline:0;appearance:none;-webkit-appearance:none;-moz-appearance:none;position:relative;width:40px;height:22px;background:#ccc;border-radius:50px;transition:border-color .3s,background-color .3s}input[type='checkbox'].egg_setting_switch::after{content:'';display:inline-block;width:1rem;height:1rem;border-radius:50%;background:#fff;box-shadow:0,0,2px,#999;transition:.4s;top:3px;position:absolute;left:3px}input[type='checkbox'].egg_setting_switch:checked{background:#fd5052}input[type='checkbox'].egg_setting_switch:checked::after{content:'';position:absolute;left:55%;top:3px}.egg_qrcode_box{height:218px;width:218px;position: fixed;top: 400px;left: 5px;padding: 10px;border-radius: 10px;background-color: #fff;box-shadow: 0 0 9px #666777;}.egg_qrcode_title{padding: 5px 0 12px 0;font-size: 18px;text-align: center;color: #d90609;font-weight: bold;letter-spacing: 2px;}.egg_tip{position: fixed;z-index: 999;top: 5px;left: calc(50% - 120px);padding: 0px 20px; line-height: 44px;text-align: center; width: 200px; height: 44px;font-size: 18px;}.egg_tip_success{color: #67c23a; background-color: #f0f9eb;}.egg_tip_warning{color: #E6A23C; background-color: #fdf6ec;}.egg_tip_danger{color: #d90609; background-color: #fef0f0;}.egg_tip_info{color: #909399; background-color: #edf2fc;}";
  27. GM_addStyle(study_css);
  28. //https://www.xuexi.cn/lgdata/3uoe1tg20en0.json
  29. //查询今日完成情况
  30. const SearchSocreUrl = "https://pc-proxy-api.xuexi.cn/delegate/score/days/listScoreProgress?sence=score&deviceType=2";
  31. //重要新闻列表(主)
  32. const NewsUrl1 = "https://www.xuexi.cn/lgdata/1jscb6pu1n2.json";
  33. //学习时评新闻列表
  34. const NewsUrl2 = "https://www.xuexi.cn/lgdata/1ap1igfgdn2.json";
  35. //新闻视频列表
  36. const VideosUrl1 = "https://www.xuexi.cn/lgdata/3o3ufqgl8rsn.json";
  37. //新闻视频列表
  38. const VideosUrl2 = "https://www.xuexi.cn/lgdata/1742g60067k.json";
  39. //每日答题页面
  40. const ExamPracticeUrl = "https://pc.xuexi.cn/points/exam-practice.html";
  41. //每周答题列表API
  42. const ExamWeeklyListUrl = "https://pc-proxy-api.xuexi.cn/api/exam/service/practice/pc/weekly/more?pageNo={pageNo}&pageSize=50";
  43. //专项答题列表API
  44. const ExamPaperListUrl = "https://pc-proxy-api.xuexi.cn/api/exam/service/paper/pc/list?pageSize=50&pageNo={pageNo}";
  45. //题目API(只有每周答题和专项练习)
  46. //const ExamQueryUrl = "https://pc-proxy-api.xuexi.cn/api/exam/service/detail/queryV3?type={type}&id={id}&forced=true";//type=1专项练习,type=2每周答题
  47. //每周答题页面
  48. const ExamWeeklyUrl = "https://pc.xuexi.cn/points/exam-weekly-detail.html?id={id}";
  49. //专项测试页面
  50. const ExamPaperUrl = "https://pc.xuexi.cn/points/exam-paper-detail.html?id={id}";
  51. //文本服务器保存API
  52. const AnswerSaveUrl = "https://a6.qikekeji.com/txt/data/save/";
  53. //文本服务器获取API
  54. const AnswerDetailUrl = "https://a6.qikekeji.com/txt/data/detail/";
  55. //获取强国二维码
  56. const GetQRcodeUrl = "https://login.xuexi.cn/user/qrcode/generate";
  57. //监听是否扫码登录(不可用)成功Url qrCode: goto: https://oa.xuexi.cn pdmToken:
  58. const LisenScanQRcodeUrl = "https://login.xuexi.cn/login/login_with_qr";
  59. //在线生成二维码
  60. const GenerateQRcodeUrl = "https://tool.oschina.net/action/qrcode/generate?data={url}&output=image%2Fpng&error=L&type=0&margin=0&size=4&{time}";
  61. //获取当前日期
  62. var currDate = new Date().toISOString().split('T')[0];
  63. var newsNum = 6;
  64. var news = [];
  65. var videoNum = 6;
  66. var videos = [];
  67. //配置
  68. var settings = [];
  69. var pause = false;//是否暂停答题
  70. var hasSlideVerification = false;
  71. //每周答题当前页码
  72. var examWeeklyPageNo = 1;
  73. //每周答题总页码
  74. var examWeeklyTotalPageCount = null;
  75. //专项答题当前页码
  76. var examPaperPageNo = 1;
  77. //专项答题总页码
  78. var examPaperTotalPageCount = null;
  79. //颜色配置
  80. const Colors = { "primary": "#409EFF", "success": "#67C23A", "warning": "#E6A23C", "danger": "#d90609", "info": "#909399" };
  81. $(document).ready(function () {
  82. let itv = setInterval(() => {
  83. let divs = document.querySelectorAll("div")
  84. if (!divs || divs.length < 5) {
  85. return;
  86. }
  87. console.log('study loaded')
  88. clearInterval(itv);
  89. onHtmlLoad();
  90. }, 500);
  91. });
  92.  
  93. /** 待html全部由脚本加载完成 */
  94. function onHtmlLoad() {
  95. let url = window.location.href;
  96. if (url == "https://www.xuexi.cn" || url == "https://www.xuexi.cn/" || url == "https://www.xuexi.cn/index.html") {
  97. let ready = setInterval(function () {
  98. if (document.getElementsByClassName("text-wrap")[0]) {
  99. clearInterval(ready);//停止定时器
  100. //初始化设置
  101. initSetting();
  102. //创建"开始学习"按钮
  103. createStartButton();
  104.  
  105. var saveSettingbtn = document.querySelector("#saveSetting");
  106. //添加事件监听
  107. try {// Chrome、FireFox、Opera、Safari、IE9.0及其以上版本
  108. saveSettingbtn.addEventListener("click", saveSetting, false);
  109. } catch (e) {
  110. try {// IE8.0及其以下版本
  111. saveSettingbtn.attachEvent('onclick', saveSetting);
  112. } catch (e) {// 早期浏览器
  113. console.log("不学习何以强国error: 开始学习按钮绑定事件失败")
  114. }
  115. }
  116.  
  117. //获取完成日期
  118. // let finishDate = GM_getValue('finishDate');
  119. // if(finishDate && finishDate == new Date().getDate()){
  120. // //如果上一次完成的日期就是今天,那么不用学习了
  121. // //设置定时器,刷新页面以保持登录(不可用)状态
  122. // setTimeout(function(){
  123. // location.reload();
  124. // },30*60*1000);//30分钟刷新一次
  125. // }else{
  126. // //否则,如果没有上一次完成的日期,或者不是今天,那么就开始学习
  127. // //start();
  128. // }
  129. }
  130. }, 800);
  131. } else if (location.pathname.endsWith("login.html")) {
  132. document.querySelector(".redflagbox")?.remove();
  133. document.querySelector("audio")?.remove();
  134. document.querySelector(".oath")?.remove();
  135. } else if (url == GM_getValue("readingUrl")) {
  136. try {
  137. let settingTemp = JSON.parse(GM_getValue('studySetting'));
  138. if (!settingTemp[7]) {
  139. createTip();//创建学习提示
  140. }
  141. reading(0);
  142. } catch (e) {
  143. createTip();//创建学习提示
  144. reading(0);
  145. }
  146. } else if (url == GM_getValue("watchingUrl")) {
  147. try {
  148. let settingTemp = JSON.parse(GM_getValue('studySetting'));
  149. if (!settingTemp[7]) {
  150. createTip();//创建学习提示
  151. }
  152. } catch (e) {
  153. createTip();//创建学习提示
  154. }
  155. let randNum = 0;
  156. var checkVideoPlayingInterval = setInterval(function () {
  157. let temp = getVideoTag();
  158. if (temp.video) {
  159. if (!temp.video.muted) {
  160. temp.video.muted = true;
  161. }
  162. if (temp.video.paused) {
  163. temp.video.paused = false;
  164. console.log("正在尝试播放视频")
  165. if (randNum == 0) {//尝试使用js的方式播放
  166. try {
  167. temp.video.play();//尝试使用js的方式播放
  168. } catch (e) { }
  169. randNum++;
  170. } else {
  171. try {
  172. temp.pauseButton.click();//尝试点击播放按钮播放
  173. } catch (e) { }
  174. randNum--;
  175. }
  176. } else {
  177. console.log("成功播放")
  178. clearInterval(checkVideoPlayingInterval);
  179. reading(1);
  180. }
  181. } else {
  182. console.log("等待加载")
  183. }
  184. }, 800);
  185. } else if (url.indexOf("exam") != -1 && url.indexOf("list") == -1) {
  186. //答题页面
  187. let ready = setInterval(function () {
  188. if (document.getElementsByClassName("title")[0]) {
  189. clearInterval(ready);//停止定时器
  190. //创建“手动答题”按钮
  191. createManualButton();
  192. //开始答题
  193. doingExam();
  194.  
  195. let examInterval = setInterval(function () {
  196. if (hasSlideVerification) {
  197. clearInterval(examInterval)
  198. } else {
  199. slideVerification();
  200. }
  201. }, 1000)
  202. }
  203. }, 500);
  204. } else {//否则直接全局静音
  205. console.log('不处理页面', location.href);
  206. }
  207.  
  208. }
  209.  
  210.  
  211. //获取video标签
  212. function getVideoTag() {
  213. let iframe = document.getElementsByTagName("iframe")[0];
  214. let video = null;
  215. let pauseButton = null;
  216. if (iframe) {
  217. //如果有iframe,说明外面的video标签是假的
  218. video = iframe.contentWindow.document.getElementsByTagName("video")[0];
  219. pauseButton = iframe.contentWindow.document.getElementsByClassName("prism-play-btn")[0];
  220. } else {
  221. //否则这个video标签是真的
  222. video = document.getElementsByTagName("video")[0];
  223. pauseButton = document.getElementsByClassName("prism-play-btn")[0];
  224. }
  225. return {
  226. "video": video,
  227. "pauseButton": pauseButton
  228. }
  229. }
  230.  
  231. //读新闻或者看视频
  232. //type:0为新闻,1为视频
  233. async function reading(type) {
  234. //看文章或者视频
  235. let time = parseInt(Math.random() * (90 - 75 + 1) + 75, 10);//75-90秒后关闭页面
  236. let firstTime = time - 2;
  237. let secendTime = 12;
  238. let scrollLength = document.body.scrollHeight / 2;
  239. var readingInterval = setInterval(function () {
  240. time--;
  241. $("#studyTip").text(time + " 秒后关闭页面");
  242. if (time <= firstTime) {
  243. try {
  244. $("html,body").animate({ scrollTop: 394 }, 1000);
  245. } catch (e) {
  246. window.scrollTo(0, 394);
  247. }
  248. firstTime = -1;
  249. }
  250. if (time <= secendTime) {
  251. try {
  252. $("html,body").animate({ scrollTop: scrollLength / 3 }, 1000);
  253. } catch (e) {
  254. window.scrollTo(0, scrollLength / 3);
  255. }
  256. secendTime = -1;
  257. }
  258. if (time <= 0) {
  259. if (type == 0) {
  260. GM_setValue('readingUrl', null);
  261. } else {
  262. GM_setValue('watchingUrl', null);
  263. }
  264. clearInterval(readingInterval);
  265. window.close();
  266. }
  267. }, 1000);
  268. //关闭文章或视频页面
  269. }
  270. //创建学习提示
  271. function createTip() {
  272. let tipInfo = document.createElement("div");
  273. //添加样式
  274. tipInfo.setAttribute("id", "studyTip");
  275. tipInfo.innerText = "正在初始化....";
  276. tipInfo.style.position = "fixed";
  277. tipInfo.style.bottom = "15px";
  278. tipInfo.style.left = "5px";
  279. tipInfo.style.padding = "12px 14px";
  280. tipInfo.style.border = "none";
  281. tipInfo.style.borderRadius = "10px";
  282. tipInfo.style.backgroundColor = "#222222";
  283. tipInfo.style.color = "#ffffff";
  284. tipInfo.style.fontSize = "14px";
  285. tipInfo.style.fontWeight = "bold";
  286. //插入节点
  287. let body = document.getElementsByTagName("body")[0];
  288. body.append(tipInfo)
  289. }
  290. //等待窗口关闭
  291. function waitingClose(newPage) {
  292. return new Promise(resolve => {
  293. let doing = setInterval(function () {
  294. if (newPage.closed) {
  295. clearInterval(doing);//停止定时器
  296. resolve('done');
  297. }
  298. }, 1000);
  299. });
  300. }
  301. //阅读文章
  302. async function readNews() {
  303. await getNews();
  304. for (let i = 0; i < news.length; i++) {
  305. GM_setValue('readingUrl', news[i].url);
  306. console.log("正在看第" + (i + 1) + "个新闻");
  307. let newPage = GM_openInTab(news[i].url, { active: true, insert: true, setParent: true });
  308. await waitingClose(newPage);
  309. await waitingTime(1500);
  310. }
  311. }
  312. //获取新闻列表
  313. function getNews() {
  314. return new Promise(resolve => {
  315. news = new Array();
  316. let n = 6;
  317. if (newsNum < 6) {//如果需要学习的新闻数量不到6,也就是已经学过了,但是积分不够,补的
  318. n = newsNum;
  319. }
  320. console.log("还需要看" + n + "个新闻")
  321. //新闻数量是否足够
  322. let enough = true;
  323. //获取重要新闻
  324. $.ajax({
  325. type: "GET",
  326. url: NewsUrl1,
  327. dataType: "json",
  328. success: function (data) {
  329. let j = 0;
  330. if (n == 6) {//如果今天还没学过,则优先找今天的新闻
  331. for (let i = 0; i < n; i++) {
  332. //如果有当天日期的,则加入
  333. if (data[j].auditTime.indexOf(currDate) != -1) {
  334. news.push(data[j]);
  335. j++;
  336. } else {//否则跳出循环
  337. break;
  338. }
  339. }
  340. }
  341. for (j; j < n; j++) {
  342. let temp = parseInt(Math.random() * (data.length + 1), 10);
  343. news.push(data[temp]);
  344. }
  345. resolve('done');
  346. },
  347. error: function () {
  348. news = null;
  349. resolve('done');
  350. }
  351. });
  352. });
  353. }
  354. //获取视频列表
  355. function getVideos() {
  356. return new Promise(resolve => {
  357. videos = new Array();
  358. let n = 6;
  359. if (videoNum < 6) {//如果需要学习的视频数量不到6,也就是已经学过了,但是积分不够,补的
  360. n = videoNum;
  361. }
  362. console.log("还需要看" + n + "个视频")
  363. $.ajax({
  364. type: "GET",
  365. url: VideosUrl1,
  366. dataType: "json",
  367. success: function (data) {
  368. let j = 0;
  369. if (n == 6) {
  370. for (let i = 0; i < n; i++) {
  371. //如果有当天日期的,则加入
  372. if (data[j].auditTime.indexOf(currDate) != -1) {
  373. videos.push(data[j]);
  374. j++;
  375. } else {//否则跳出循环
  376. break;
  377. }
  378. }
  379. }
  380. for (j; j < n; j++) {
  381. let temp = parseInt(Math.random() * (data.length + 1), 10);
  382. videos.push(data[temp]);
  383. }
  384. resolve('done');
  385. },
  386. error: function () {
  387. videos = [];
  388. resolve('done');
  389. }
  390. });
  391. });
  392. }
  393. //看学习视频
  394. async function watchVideo() {
  395. await getVideos();
  396. for (let i = 0; i < videos.length; i++) {
  397. GM_setValue('watchingUrl', videos[i].url);
  398. console.log("正在观看第" + (i + 1) + "个视频");
  399. let newPage = GM_openInTab(videos[i].url, { active: true, insert: true, setParent: true })
  400. await waitingClose(newPage);
  401. await waitingTime(1500);
  402. }
  403. }
  404. //做每日答题
  405. function doExamPractice() {
  406. return new Promise(resolve => {
  407. console.log("正在完成每日答题")
  408. let newPage = GM_openInTab(ExamPracticeUrl, { active: true, insert: true, setParent: true });
  409. let doing = setInterval(function () {
  410. if (newPage.closed) {
  411. clearInterval(doing);//停止定时器
  412. resolve('done');
  413. }
  414. }, 1000);
  415. });
  416. }
  417. //获取专项答题列表
  418. function getExamPaper() {
  419. return new Promise(function (resolve) {
  420. $.ajax({
  421. type: "GET",
  422. url: ExamPaperListUrl.replace("{pageNo}", examPaperPageNo),
  423. xhrFields: {
  424. withCredentials: true //如果没有这个请求失败
  425. },
  426. dataType: "json",
  427. success: function (data) {
  428. console.log(data)
  429. data = data.data_str;
  430. if (data.indexOf("-") != -1) {
  431. data = data.replace(/-/g, "+");
  432. }
  433. if (data.indexOf("_") != -1) {
  434. data = data.replace(/_/g, "/");
  435. }
  436. data = decodeURIComponent(escape(window.atob(data)));
  437. //JSON格式化
  438. data = JSON.parse(data);
  439. resolve(data);
  440. },
  441. error: function () {
  442. resolve(new Array());
  443. }
  444. });
  445. })
  446. }
  447. //查询专项答题列表看看还有没有没做过的,有则返回id
  448. async function findExamPaper() {
  449. var continueFind = true;
  450. var examPaperId = null;
  451. console.log("正在寻找未完成的专项答题")
  452. while (continueFind) {
  453. await getExamPaper().then(data => {
  454. if (data) {
  455. if (examPaperTotalPageCount == null) {
  456. //如果总页码没初始化,则初始化
  457. examPaperTotalPageCount = data.totalPageCount;
  458. }
  459. let examPapers = data.list;//获取专项答题的列表
  460. for (let j = 0; j < examPapers.length; j++) {
  461. //遍历查询有没有没做过的
  462. if (examPapers[j].status != 2) {//status: 1为"开始答题" , 2为"重新答题"
  463. //如果不是"重新答题",则可以做
  464. examPaperId = examPapers[j].id;
  465. continueFind = false;
  466. break;
  467. }
  468. }
  469. if (!continueFind) {
  470. } else {
  471. //增加页码
  472. examPaperPageNo++;
  473. if (examPaperTotalPageCount == null || examPaperPageNo > examPaperTotalPageCount) {
  474. //已经找完所有页码,还是没找到,不再继续查找
  475. continueFind = false;
  476. }
  477. }
  478. } else {
  479. continueFind = false;
  480. }
  481. })
  482. //频繁请求可能导致出错,所以等一等
  483. await waitingTime(1000);
  484. }
  485. return examPaperId;
  486. }
  487. //做专项答题
  488. function doExamPaper() {
  489. return new Promise(function (resolve) {
  490. //查找有没有没做过的专项答题,有则返回ID
  491. findExamPaper().then(examPaperId => {
  492. if (examPaperId != null) {
  493. console.log("正在做专项答题")
  494. let newPage = GM_openInTab(ExamPaperUrl.replace("{id}", examPaperId), { active: true, insert: true, setParent: true });
  495. let doing = setInterval(function () {
  496. if (newPage.closed) {
  497. clearInterval(doing);//停止定时器
  498. resolve('done');
  499. }
  500. }, 1000);
  501. } else {
  502. console.log("没有找到未完成的专项答题,跳过")
  503. resolve('noTest');
  504. }
  505. });
  506. })
  507. }
  508. //获取每周答题列表
  509. function getExamWeekly() {
  510. return new Promise(function (resolve) {
  511. $.ajax({
  512. type: "GET",
  513. url: ExamWeeklyListUrl.replace("{pageNo}", examWeeklyPageNo),
  514. xhrFields: {
  515. withCredentials: true //如果没有这个请求失败
  516. },
  517. dataType: "json",
  518. success: function (data) {
  519. console.log(data)
  520. data = data.data_str;
  521. if (data.indexOf("-") != -1) {
  522. data = data.replace(/-/g, "+");
  523. }
  524. if (data.indexOf("_") != -1) {
  525. data = data.replace(/_/g, "/");
  526. }
  527. data = decodeURIComponent(escape(window.atob(data)));
  528. //JSON格式化
  529. data = JSON.parse(data);
  530. resolve(data);
  531. },
  532. error: function () {
  533. resolve(new Array());
  534. }
  535. });
  536. })
  537. }
  538. //查询每周答题列表看看还有没有没做过的,有则返回id
  539. async function findExamWeekly() {
  540. var continueFind = true;
  541. var examWeeklyId = null;
  542. console.log("正在寻找未完成的每周答题")
  543. while (continueFind) {
  544. await getExamWeekly().then(data => {
  545. if (data) {
  546. if (examWeeklyTotalPageCount == null) {
  547. //如果总页码没初始化,则初始化
  548. examWeeklyTotalPageCount = data.totalPageCount;
  549. }
  550. for (let i = 0; i < data.list.length; i++) {
  551. let examWeeks = data.list[i].practices;//获取每周的测试列表
  552. for (let j = 0; j < examWeeks.length; j++) {
  553. //遍历查询有没有没做过的
  554. if (examWeeks[j].status != 2) {//status: 1为"开始答题" , 2为"重新答题"
  555. //如果不是"重新答题",则可以做
  556. examWeeklyId = examWeeks[j].id;
  557. continueFind = false;
  558. break;
  559. }
  560. }
  561. if (!continueFind) {
  562. //如果已经找到了,则退出循环
  563. break;
  564. }
  565. }
  566. if (!continueFind) {
  567. } else {
  568. //增加页码
  569. examWeeklyPageNo++;
  570. if (examWeeklyTotalPageCount == null || examWeeklyPageNo > examWeeklyTotalPageCount) {
  571. //已经找完所有页码,还是没找到,不再继续查找
  572. continueFind = false;
  573. }
  574. }
  575. } else {
  576. continueFind = false;
  577. }
  578. })
  579. //频繁请求可能导致出错,所以等一等
  580. await waitingTime(1000);
  581. }
  582. return examWeeklyId;
  583. }
  584. //做每周答题
  585. function doExamWeekly() {
  586. return new Promise(function (resolve) {
  587. //查找有没有没做过的每周测试,有则返回ID
  588. //examWeeklyId = 147;//测试题目
  589. findExamWeekly().then(examWeeklyId => {
  590. if (examWeeklyId != null) {
  591. console.log("正在做每周答题")
  592. let newPage = GM_openInTab(ExamWeeklyUrl.replace("{id}", examWeeklyId), { active: true, insert: true, setParent: true });
  593. let doing = setInterval(function () {
  594. if (newPage.closed) {
  595. clearInterval(doing);//停止定时器
  596. resolve('done');
  597. }
  598. }, 1000);
  599. } else {
  600. console.log("没有找到未完成的每周答题,跳过")
  601. resolve('noTest');
  602. }
  603. });
  604. })
  605. }
  606. //获取答题按钮
  607. function getNextButton() {
  608. return new Promise(function (resolve) {
  609. let nextInterVal = setInterval(() => {
  610. let nextAll = document.querySelectorAll(".ant-btn");
  611. let next = nextAll[0];
  612. if (nextAll.length == 2) {
  613. next = nextAll[1];
  614. }
  615. if (next.textContent) {
  616. clearInterval(nextInterVal);//停止定时器
  617. resolve(next);
  618. }
  619. }, 800);
  620. })
  621. }
  622. //暂停锁
  623. function doingPause() {
  624. return new Promise(function (resolve) {
  625. let doing = setInterval(function () {
  626. if (!pause) {
  627. clearInterval(doing);//停止定时器
  628. resolve('done');
  629. } else {
  630. console.log("等待")
  631. }
  632. }, 500);
  633. })
  634. }
  635.  
  636. //滑动验证
  637. async function slideVerification() {
  638. let xc_window = document.querySelector("#nc_1_n1t");
  639. if (xc_window) {
  640. pause = true;//先暂停
  641. hasSlideVerification = true;
  642. //先关掉
  643. document.querySelector("#J-risk-close-btn").click();
  644. await waitingTime(1000);
  645. //回到上一题
  646. document.querySelector(".pre-btn").click();
  647. await waitingTime(1000);
  648. //回到这题
  649. document.querySelector(".next-btn").click();
  650. await waitingTime(1000);
  651. //提交答题
  652. document.querySelector(".next-btn").click();
  653. await waitingTime(1000);
  654.  
  655. console.log("滑动验证");
  656. let btn = document.querySelector(".btn_slide");
  657. let mousedown = document.createEvent("MouseEvents");
  658. let rect = btn.getBoundingClientRect();
  659. let x = rect.x || rect.left;
  660. let y = rect.y || rect.top;
  661. let w = 300;
  662. //点击滑块
  663. try {
  664. mousedown.initMouseEvent("mousedown", true, true, unsafeWindow, 0, x, y, x, y, false, false, false, false, 0, null);
  665. } catch (e) {
  666. mousedown = new MouseEvent("mousedown", {
  667. bubbles: true,
  668. cancelable: true,
  669. view: unsafeWindow,//控制台用window,脚本要用unsafeWindow
  670. detail: 0,
  671. screenX: 0,
  672. screenY: 0,
  673. clientX: 0,
  674. clientY: 0,
  675. ctrlKey: false,
  676. altKey: false,
  677. shiftKey: false,
  678. metaKey: false,
  679. button: 0,
  680. relatedTarget: null,
  681. });
  682. }
  683. console.log("点击滑块");
  684. btn.dispatchEvent(mousedown);
  685.  
  686. let dx = 0;
  687. let dy = 0;
  688.  
  689. //滑动滑块
  690. let intervaltimer = setInterval(function () {
  691. var mousemove = document.createEvent("MouseEvents");
  692. var _x = x + dx;
  693. var _y = y + dy;
  694. //滑动滑块
  695. try {
  696. mousemove.initMouseEvent("mousemove", true, true, unsafeWindow, 0, _x, _y, _x, _y, false, false, false, false, 0, null);
  697. } catch (e) {
  698. mousemove = new MouseEvent("mousemove", {
  699. bubbles: true,
  700. cancelable: true,
  701. view: unsafeWindow,//控制台用window,脚本要用unsafeWindow
  702. detail: 0,
  703. screenX: _x,
  704. screenY: _y,
  705. clientX: _x,
  706. clientY: _y,
  707. ctrlKey: false,
  708. altKey: false,
  709. shiftKey: false,
  710. metaKey: false,
  711. button: 0,
  712. relatedTarget: null,
  713. });
  714. }
  715. console.log("滑动滑块");
  716. btn.dispatchEvent(mousemove);
  717.  
  718. if (_x - x >= w) {
  719. clearInterval(intervaltimer);
  720. var mouseup = document.createEvent("MouseEvents");
  721. try {
  722. mouseup.initMouseEvent("mouseup", true, true, unsafeWindow, 0, _x, _y, _x, _y, false, false, false, false, 0, null);
  723. } catch (e) {
  724. mouseup = new MouseEvent("mouseup", {
  725. bubbles: true,
  726. cancelable: true,
  727. view: unsafeWindow,//控制台用window,脚本要用unsafeWindow
  728. detail: 0,
  729. screenX: _x,
  730. screenY: _y,
  731. clientX: _x,
  732. clientY: _y,
  733. ctrlKey: false,
  734. altKey: false,
  735. shiftKey: false,
  736. metaKey: false,
  737. button: 0,
  738. relatedTarget: null,
  739. });
  740. }
  741. console.log("松开滑块");
  742. btn.dispatchEvent(mouseup);
  743. pause = false;
  744. }
  745. else {
  746. dx += parseInt(Math.random() * (209 - 199) + 199) / 33;
  747. console.log(x, y, _x, _y, dx);
  748. }
  749. }, 30);
  750. }
  751. }
  752.  
  753. //答题过程(整合)
  754. async function doingExam() {
  755. let nextButton = null;
  756. let qNum = 0;//题号,第一题从0开始算
  757. let shouldSaveAnswer = false;
  758. while (true) {
  759. //先等等再开始做题
  760. await waitingTime(2500);
  761. await doingPause();
  762. nextButton = await getNextButton();
  763. if (nextButton.textContent == "再练一次" || nextButton.textContent == "再来一组" || nextButton.textContent == "查看解析") {
  764. break;
  765. }
  766. try {
  767. document.querySelector(".tips").click();
  768. } catch (e) {
  769. console.log(e);
  770. }
  771. //所有提示
  772. var allTips = document.querySelectorAll("font[color=red]");
  773. await waitingTime(1500);
  774. //选项按钮
  775. var allbuttons = document.querySelectorAll(".q-answer");
  776. //获取所有填空
  777. var blanks = document.querySelectorAll("input[type=text]");
  778. try {
  779. //获取问题类型
  780. var questionType = document.querySelector(".q-header").textContent;
  781. questionType = questionType.substr(0, 3)
  782. } catch (e) {
  783. }
  784. var results = [];
  785. switch (questionType) {
  786. case "填空题": {
  787. //第几个填空
  788. var inputBubblesEvent = new Event('input', { bubbles: true });
  789. if (blanks.length > 1) {//如果有多个填空
  790. if (allTips.length == 0) {//如果没有提示,先获取看看有没有答案
  791. try {//尝试点击视频播放按钮,播不播都没关系
  792. document.getElementsByClassName("outter")[0].click();
  793. } catch (e) { }
  794. //生成秘钥
  795. let key = getKey();
  796. //尝试获取答案
  797. let answerData = await getAnswer(key);
  798. if (answerData.status == 0 || answerData == "error") {//没有答案
  799. for (let i = 0; i < blanks.length; i++) {//没答案,随便填点东西
  800. blanks[i].setAttribute("value", i);
  801. //必须要阻止事件,不然无效
  802. blanks[i].dispatchEvent(inputBubblesEvent);
  803. }
  804. shouldSaveAnswer = true;//答完保存答案
  805. } else {//获取到了答案
  806. //格式化
  807. answerData = JSON.parse(answerData.data.txt_content);
  808. answerData = answerData[0].content;
  809. //因为有多个空,所以有多个答案,先切割
  810. answerData = answerData.split(";");
  811. for (let i = 0; i < answerData.length; i++) {//将答案填入
  812. blanks[i].setAttribute("value", answerData[i]);
  813. blanks[i].dispatchEvent(inputBubblesEvent);
  814. }
  815. }
  816. } else if (allTips.length == blanks.length) {
  817. //如果填空数量和提示数量一致
  818. for (let i = 0; i < allTips.length; i++) {
  819. //将答案填写到对应的空中
  820. let answer = allTips[i].textContent;
  821. if (answer && answer.length > 0) {
  822. blanks[i].setAttribute("value", answer);
  823. blanks[i].dispatchEvent(inputBubblesEvent);
  824. } else {
  825. //发生了错误,只好随便填一下
  826. blanks[i].setAttribute("value", i);
  827. blanks[i].dispatchEvent(inputBubblesEvent);
  828. }
  829. }
  830. } else if (allTips.length > blanks.length) {
  831. //若提示数量比填空的数量多
  832. //直接将所有答案整合填进去
  833. let answer = "";
  834. for (let i = 0; i < allTips.length; allTips++) {
  835. answer += allTips[i].textContent();
  836. }
  837. for (let j = 0; j < blanks.length; j++) {
  838. blanks[j].setAttribute("value", answer);
  839. blanks[j].dispatchEvent(inputBubblesEvent);
  840. }
  841. } else {
  842. //一般不会跑到这,如果到这了输出一下,表示惊讶
  843. console.log("居然跑到了这里")
  844. }
  845. } else if (blanks.length == 1) {//只有一个空,直接把所有tips合并。
  846. let answer = "";
  847. if (allTips.length != 0) {//如果有提示
  848. for (let i = 0; i < allTips.length; i++) {
  849. answer += allTips[i].textContent;
  850. }
  851. } else {
  852. try {//尝试点击视频播放按钮,不过播不播都没关系
  853. document.querySelector('video').play();
  854. } catch (e) { }
  855. let key = getKey();
  856. let answerData = await getAnswer(key);
  857. if (answerData.status == 0 || answerData == "error") {
  858. //没有获取到答案
  859. answer = "不知道";
  860. //没有其他人做过这道视频题,所以需要答完保存答案,这样其他人遇到就能做对
  861. shouldSaveAnswer = true;
  862. } else {
  863. //有答案
  864. answerData = JSON.parse(answerData.data.txt_content);
  865. answer = answerData[0].content;
  866. }
  867. }
  868. blanks[0].setAttribute("value", answer);
  869. blanks[0].dispatchEvent(inputBubblesEvent);
  870. break;
  871. }
  872. else {
  873. //怕有没空白的情况。
  874. }
  875. break;
  876. }
  877. case "多选题": {
  878. results = [];
  879. let hasButton = false;
  880. for (let i = 0; i < allTips.length; i++) {
  881. let tip = allTips[i];
  882. let answer = tip.textContent;
  883. if (answer && answer.length > 0) {
  884. for (let j = 0; j < allbuttons.length; j++) {
  885. //获取按钮
  886. let selectButton = allbuttons[j];
  887. //获取按钮的上的答案
  888. let buttonAnswer = selectButton.textContent;
  889. if (buttonAnswer == answer || buttonAnswer.indexOf(answer) != -1 || answer.indexOf(buttonAnswer) != -1) {
  890. hasButton = true;
  891. if (!$(selectButton).hasClass("chosen")) {
  892. selectButton.click();
  893. }
  894. break;
  895. }
  896. }
  897. }
  898. }
  899. if (!hasButton) {
  900. //没找到按钮,随便选一个
  901. allbuttons[0].click();
  902. }
  903. break;
  904. }
  905. case "单选题": {
  906. let results = [];
  907. let answer = "";
  908. for (let i = 0; i < allTips.length; i++) {
  909. answer += allTips[i].textContent;
  910. }
  911. if (answer && answer.length > 0) {
  912. let answerButton = null;
  913. for (let i = 0; i < allbuttons.length; i++) {
  914. let buttonAnswer = allbuttons[i].textContent;
  915. //对比答案,如果完全一样,那么肯定是
  916. if (buttonAnswer == answer) {
  917. answerButton = allbuttons[i];
  918. break;
  919. } else if (buttonAnswer.indexOf(answer) != -1 || answer.indexOf(buttonAnswer) != -1) {
  920. //如果只是包含答案的部分内容,则可能是,还需要继续找
  921. answerButton = allbuttons[i];
  922. continue;
  923. }
  924. }
  925. if (answerButton) {
  926. answerButton.click();
  927. } else {
  928. //没找到按钮,随便选一个
  929. allbuttons[0].click();
  930. }
  931. } else {
  932. //没答案,随便选一个
  933. allbuttons[0].click();
  934. }
  935. break;
  936. }
  937. default:
  938. break;
  939. }
  940. qNum++;
  941. nextButton = await getNextButton();
  942. if (nextButton.textContent != "再练一次" && nextButton.textContent != "再来一组" && nextButton.textContent != "查看解析") {
  943. nextButton.click();
  944. if (shouldSaveAnswer) {//如果应该保存答案
  945. let key = getKey();//获取key
  946. let answerTemp = document.getElementsByClassName("answer")[0].innerText;
  947. let reg = new RegExp(' ', "g")
  948. let answer = "";
  949. try {//从字符串中拿出答案
  950. answer = answerTemp.split(":")[1];
  951. answer = answer.replace(reg, ";");
  952. } catch (e) {
  953. answer = answerTemp;
  954. }
  955. await saveAnswer(key, answer);
  956. shouldSaveAnswer = false;
  957. }
  958. } else {
  959. //已经做完,跳出循环
  960. break;
  961. }
  962. }
  963. window.close();
  964. }
  965. //获取关键字
  966. function getKey() {
  967. //获取题目的文本内容
  968. let key = document.getElementsByClassName("q-body")[0].innerText;
  969. //外部引用md5加密
  970. key = md5(key);
  971. console.log(key)
  972. return key;
  973. }
  974. //保存答案
  975. function saveAnswer(key, value) {
  976. return new Promise(function (resolve) {
  977. value = [{ "title": key, "content": value }];
  978. value = JSON.stringify(value);
  979. $.ajax({
  980. type: "POST",
  981. url: AnswerSaveUrl,
  982. data: {
  983. txt_name: key,
  984. txt_content: value,
  985. password: "",
  986. v_id: ""
  987. },
  988. dataType: "json",
  989. success: function (data) {
  990. resolve(data);
  991. },
  992. error: function () {
  993. resolve("error");
  994. }
  995. });
  996. })
  997. }
  998. //获取答案
  999. function getAnswer(key) {
  1000. return new Promise(function (resolve) {
  1001. $.ajax({
  1002. type: "POST",
  1003. url: AnswerDetailUrl,
  1004. data: {
  1005. txt_name: key,
  1006. password: ""
  1007. },
  1008. dataType: "json",
  1009. success: function (data) {
  1010. resolve(data);
  1011. },
  1012. error: function () {
  1013. resolve("error");
  1014. }
  1015. });
  1016. })
  1017. }
  1018. //等待时间工具函数
  1019. function waitingTime(time) {
  1020. if (!Number.isInteger(time)) {
  1021. time = 1000;
  1022. }
  1023. time += 2 + Math.floor(Math.random() * 3000);
  1024. return new Promise(resolve => {
  1025. setTimeout(function () {
  1026. resolve('done');
  1027. }, time);
  1028. });
  1029. }
  1030. //查询今日完成情况
  1031. function getToday() {
  1032. return new Promise(function (resolve) {
  1033. $.ajax({
  1034. type: "GET",
  1035. url: SearchSocreUrl,
  1036. xhrFields: {
  1037. withCredentials: true //如果没有这个请求失败
  1038. },
  1039. dataType: "json",
  1040. success: function (temp) {
  1041. //console.log(temp);
  1042. resolve(temp.data.taskProgress);
  1043. },
  1044. error: function () {
  1045. resolve(new Array());
  1046. }
  1047. });
  1048. })
  1049. }
  1050. //初始化配置
  1051. function initSetting() {
  1052. if (GM_getValue("studyVersion")) {
  1053. try {
  1054. let settingTemp = JSON.parse(GM_getValue('studySetting'));
  1055. if (settingTemp != null) {
  1056. settings = settingTemp;
  1057. } else {
  1058. settings = [true, true, true, true, false];
  1059. }
  1060. } catch (e) {
  1061. //没有则直接初始化
  1062. settings = [true, true, true, true, false];
  1063. }
  1064. } else {
  1065. GM_setValue("studyVersion", "2.3")
  1066. settings = [true, true, true, true, false];
  1067. GM_setValue('studySetting', JSON.stringify(settings));
  1068. }
  1069. }
  1070. //创建“手动答题”按钮
  1071. function createManualButton() {
  1072. let title = document.getElementsByClassName("title")[0];
  1073. let manualButton = document.createElement("button");
  1074. manualButton.setAttribute("id", "manualButton");
  1075. manualButton.innerText = "关闭自动答题";
  1076. manualButton.className = "egg_auto_btn";
  1077. //添加事件监听
  1078. try {// Chrome、FireFox、Opera、Safari、IE9.0及其以上版本
  1079. manualButton.addEventListener("click", clickManualButton, false);
  1080. } catch (e) {
  1081. try {// IE8.0及其以下版本
  1082. manualButton.attachEvent('onclick', clickManualButton);
  1083. } catch (e) {// 早期浏览器
  1084. console.log("不学习何以强国error: 手动答题按钮绑定事件失败")
  1085. }
  1086. }
  1087. //插入节点
  1088. title.parentNode.insertBefore(manualButton, title.nextSibling);
  1089. }
  1090. //点击手动学习按钮
  1091. function clickManualButton() {
  1092. let manualButton = document.getElementById("manualButton");
  1093. if (manualButton.innerText == "关闭自动答题") {
  1094. manualButton.innerText = "开启自动答题";
  1095. manualButton.className = "egg_manual_btn";
  1096. pause = true;
  1097. } else {
  1098. manualButton.innerText = "关闭自动答题";
  1099. manualButton.className = "egg_auto_btn";
  1100. pause = false;
  1101. }
  1102. }
  1103. //创建“开始学习”按钮和配置
  1104. function createStartButton() {
  1105. let base = document.createElement("div");
  1106. var baseInfo = "";
  1107. baseInfo += "<form id=\"settingData\" class=\"egg_menu\" action=\"\" target=\"_blank\" onsubmit=\"return false\"><div class=\"egg_setting_box\"><div class=\"egg_setting_item\"><label>新闻<\/label><input class=\"egg_setting_switch\" type=\"checkbox\" name=\"0\" " + (settings[0] ? 'checked' : '') + " \/><\/div><div class=\"egg_setting_item\"> <label>视频<\/label> <input class=\"egg_setting_switch\" type=\"checkbox\" name=\"1\" " + (settings[1] ? 'checked' : '') + " \/><\/div><div class=\"egg_setting_item\"> <label>每日答题<\/label> <input class=\"egg_setting_switch\" type=\"checkbox\" name=\"3\" " + (settings[3] ? 'checked' : '') + " \/><\/div> <hr \/> <div title='Tip:开始学习后,隐藏相关页面和提示(不隐藏答题中的关闭自动答题按钮)' class=\"egg_setting_item\"> <label>运行隐藏<\/label> <input class=\"egg_setting_switch\" type=\"checkbox\" name=\"4\"" + (settings[4] ? 'checked' : '') + "/></div><div id='saveSetting' style=\"color:#d90609;border: solid 2px;justify-content:center;align-items: center;border-radius:20px;cursor: pointer;margin: 12px 0;font-size:14px;\" class=\"egg_setting_item\"><label style=\"cursor: pointer;\">保存配置<\/label><\/div><a style=\"text-decoration: none;\" title=\"视频不自动播放?点此查看解决办法\" target=\"blank\" href=\"https://docs.qq.com/doc/DZllGcGlJUG1qT3Vx\"><div style=\"color:#5F5F5F;font-size:14px; \"class=\"egg_setting_item\"><label style=\"cursor:pointer;\">视频不自动播放?<\/label><\/div><\/a><\/div><\/form>";
  1108. base.innerHTML = baseInfo;
  1109. let body = document.getElementsByTagName("body")[0];
  1110. body.append(base)
  1111. let startButton = document.createElement("button");
  1112. startButton.setAttribute("id", "startButton");
  1113.  
  1114. startButton.innerText = logged() ? "开始学习" : "登录(不可用)学习";
  1115. startButton.className = "egg_study_btn egg_menu";
  1116.  
  1117. //获取上一次学习完成的日期
  1118. // let finishDate = GM_getValue('finishDate');
  1119. // if(finishDate && finishDate == new Date().getDate()){
  1120. // //如果上一次完成的日期就是今天,那么不用学习了
  1121. // startButton.innerText = "已完成";
  1122. // startButton.className = "egg_study_btn egg_menu";
  1123. // startButton.style.color = "#c7c7c7";
  1124. // startButton.style.cursor = "default";
  1125. // startButton.setAttribute("disabled",true);
  1126. // }else{
  1127. // //否则需要学习
  1128. // startButton.innerText = "开始学习";
  1129. // startButton.className = "egg_study_btn egg_menu";
  1130. // }
  1131.  
  1132.  
  1133. //添加事件监听
  1134. try {// Chrome、FireFox、Opera、Safari、IE9.0及其以上版本
  1135. startButton.addEventListener("click", start, false);
  1136. } catch (e) {
  1137. try {// IE8.0及其以下版本
  1138. startButton.attachEvent('onclick', start);
  1139. } catch (e) {// 早期浏览器
  1140. console.log("不学习何以强国error: 开始学习按钮绑定事件失败")
  1141. }
  1142. }
  1143. //插入节点
  1144. body.append(startButton)
  1145. }
  1146.  
  1147. //显示提示
  1148. function showTip(title, type = "success", time = 1000) {
  1149. let tipBox = document.createElement("div");
  1150. let baseInfo = "";
  1151. if (type == null) {
  1152. type = "success";
  1153. }
  1154. baseInfo += "<div class='egg_tip egg_tip_" + type + "'>" + title + "</div>";
  1155. tipBox.innerHTML = baseInfo;
  1156. let body = document.getElementsByTagName("body")[0];
  1157. body.append(tipBox);
  1158. if (time == null) {
  1159. time = 1000;
  1160. }
  1161. //经过一定时间后,取消显示提示
  1162. setTimeout(function () {
  1163. tipBox.remove();
  1164. }, time);
  1165. }
  1166.  
  1167. //保存配置
  1168. function saveSetting() {
  1169. let form = document.getElementById("settingData");
  1170. let formData = new FormData(form);
  1171. settings[0] = (formData.get('0') != null);//文章
  1172. settings[1] = (formData.get('1') != null);//视频
  1173. settings[3] = (formData.get('3') != null);//每日答题
  1174. console.log("保存配置")
  1175. GM_setValue('studySetting', JSON.stringify(settings));
  1176. showTip("保存成功");
  1177. }
  1178.  
  1179.  
  1180. //是否显示目录
  1181. function showMenu(isShow = true) {
  1182. let items = document.getElementsByClassName("egg_menu");
  1183. for (let i = 0; i < items.length; i++) {
  1184. items[i].style.display = isShow ? "block" : "none";
  1185. }
  1186. }
  1187.  
  1188. //获取二维码的ID
  1189. function getQRcodeId() {
  1190. return new Promise(function (resolve) {
  1191. $.ajax({
  1192. type: "GET",
  1193. url: GetQRcodeUrl,
  1194. dataType: "json",
  1195. success: function (temp) {
  1196. console.log(temp);
  1197. if (temp.success) {
  1198. resolve(temp.result);
  1199. } else {
  1200. resolve(null);
  1201. }
  1202. },
  1203. error: function () {
  1204. resolve(null);
  1205. }
  1206. });
  1207. })
  1208. }
  1209.  
  1210. function logged() {
  1211. let loggedBox = document.querySelectorAll("a[class='logged-link']")[0];
  1212. return loggedBox && loggedBox.innerText
  1213. }
  1214. //开始
  1215. async function start() {
  1216. console.log("初始化...");
  1217. console.log("检查是否登录(不可用)...")
  1218. if (logged()) {
  1219. let startButton = document.getElementById("startButton");
  1220. startButton.innerText = "正在学习";
  1221. startButton.style.cursor = "default";
  1222. startButton.setAttribute("disabled", true);
  1223. if (settings[4]) {
  1224. showMenu(false);
  1225. }
  1226. let taskProgress = null;
  1227. let continueToDo = true;
  1228. let tasks = [false, false, false]
  1229. while (continueToDo) {
  1230. //查询今天还有什么任务没做完
  1231. console.log("检查今天还有什么任务没做完")
  1232. taskProgress = await getToday();
  1233. console.log(taskProgress)
  1234. if (taskProgress != null) {
  1235. console.log("开始学习")
  1236.  
  1237. //检查文章
  1238. if (settings[0] && taskProgress[0].currentScore != taskProgress[0].dayMaxScore) {
  1239. tasks[0] = false;//只要还有要做的,就当做没完成
  1240. newsNum = taskProgress[0].dayMaxScore - taskProgress[0].currentScore;//还需要看多少个新闻
  1241. console.log("1.看新闻");
  1242. await readNews();
  1243. } else {
  1244. tasks[0] = true;
  1245. }
  1246.  
  1247. //检查视频
  1248. let temp = parseInt(taskProgress[1].dayMaxScore - taskProgress[1].currentScore);
  1249. if (settings[1] && temp != 0) {
  1250. tasks[1] = false;//只要还有要做的,就当做没完成
  1251. videoNum = temp;//还需要看多少个视频
  1252. console.log("2.看视频");
  1253. await watchVideo();
  1254. } else {
  1255. tasks[1] = true;
  1256. }
  1257.  
  1258. //检查每日答题
  1259. if (settings[3] && taskProgress[3].currentScore != taskProgress[3].dayMaxScore) {
  1260. tasks[2] = false;//只要还有要做的,就当做没完成
  1261. console.log("3.做每日答题");
  1262. await doExamPractice();
  1263. } else {
  1264. tasks[2] = true;
  1265. }
  1266.  
  1267. if (tasks[0] && tasks[1] && tasks[2]) {
  1268. //如果检查都做完了,就不用继续了
  1269. continueToDo = false;
  1270. }
  1271. } else {
  1272. alert("发生意外错误")
  1273. continueToDo = false;
  1274. }
  1275. console.log("continueToDo : " + continueToDo)
  1276. }
  1277. console.log("已完成")
  1278. startButton.innerText = "已完成";
  1279. startButton.style.color = "#c7c7c7";
  1280. if (settings[4]) {
  1281. showMenu()
  1282. }
  1283. //设置完成日期
  1284. // GM_setValue('finishDate',new Date().getDate());
  1285. // setTimeout(function(){
  1286. // location.reload();
  1287. // },5000);//5秒后刷新页面
  1288. } else {
  1289. //提醒登录(不可用)
  1290. console.log("未登录(不可用)");
  1291. top.location.href = "https://pc.xuexi.cn/points/login.html?ref=https%3A%2F%2Fwww.xuexi.cn%2Findex.html";
  1292. }
  1293. return false;
  1294. }

QingJ © 2025

镜像随时可能失效,请加Q群300939539或关注我们的公众号极客氢云获取最新地址