腾讯课堂、超星自动签到(基本完整)

腾讯课堂、超星自动签到

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

  1. // ==UserScript==
  2. // @name 腾讯课堂、超星自动签到(基本完整)
  3. // @description 腾讯课堂、超星自动签到
  4. // @namespace CX&TXKT_auto_sign
  5. // @author 涛之雨
  6. // @version 0.2.4
  7. // @grant GM_getValue
  8. // @grant GM_setValue
  9. // @grant GM_registerMenuCommand
  10. // @grant GM_addStyle
  11. // @run-at document-start
  12. // @require https://libs.baidu.com/jquery/2.1.4/jquery.min.js
  13. // @match *://ke.qq.com/webcourse/index.html*
  14. // @match *://mobilelearn.chaoxing.com/widget/pcpick/stu/index*
  15. // @match *://*.chaoxing.com/visit/interaction*
  16. // @match *://i.mooc.chaoxing.com/*
  17. // @license GPL-3.0-only
  18. // @icon https://i.loli.net/2020/03/04/D3h1iWSFeyc8AKG.png
  19. // @home-url https://gf.qytechs.cn/zh-CN/scripts/401115
  20. // ==/UserScript==
  21.  
  22.  
  23. /*
  24. * 更新:
  25. * V0.2.4
  26. * 修复了选择等待时间错误
  27. * 修复了TTS发音部分参数错误
  28. * 修复了插件更新设置后会多个线程同时执行的BUG
  29. * 如果有懂一点js,会js的朋友如果老师有发起选择题的时候给个样本或是解决方案呗
  30. * 我们这里都要结束了,都没有老师再发起选择题。。。
  31. * 此外还更新了啥我忘了。。。
  32. *
  33. * V0.2.3
  34. * 修复:腾讯课堂无法自动选择(好不容易老师发起一次我还错过了)
  35. * 修复更改设置后许刷新才生效的bug
  36. * 删除会引起错误的调试代码(对于脚本无影响)
  37. *
  38. * V0.2.2
  39. * 【重大更新】修复严重bug(凌晨两点果然脑子就不好了。。。。)
  40. * 增加了双击悬浮球回复默认设置
  41. *
  42. * V0.2.1
  43. * 【重大更新】增加插件设置界面,便于管理
  44. * 【重大更新】增加TTS语音播报功能
  45. * (默认开启,有需要请到支持的页面配置)
  46. * 剩余优化时间的显示
  47. * 优化算法和数据处理,增加插件的稳定性
  48. *
  49. * V0.1.2
  50. * 修复了已知bug(选择题功能尚未测试)
  51. *
  52. * V0.1.1
  53. * 修复了签到子页面无法自动刷新的bug
  54. *
  55. * V0.1.0
  56. * 删掉了我垃圾小站的图标(虽然用广告拦截器一拦截就好了。。。),去掉68行无用代码。。。
  57. * 把自定义参数放到开头,方便用户进行自定义修改(没有基础请勿修改其他部分!)
  58. *
  59. * 腾讯课堂部分:
  60. * 对签到适配更加精准,不会误点
  61. * 增加选择题的随机选择功能
  62. * (未经测试。。。。开启请慎重!)
  63. * (严重的bug倒不会至于。主要可能不是预期效果)
  64. *
  65. * 超星部分:
  66. * 对课程信息进行重新分组
  67. * 对签到的流程进行优化
  68. * 增加签到成功和特殊的签到类型的判断及弹窗提醒,下个版本考虑增加对于微信的对接(太麻烦,懒得,此外本人不看微信。。。。)
  69. *
  70. */
  71.  
  72. //个人小站:https://taozhiyu.gitee.io(虽然啥都没有。。。)
  73. //吾爱主页:https://www.52pojie.cn/home.php?mod=space&uid=879080
  74. //CSDN主页:https://blog.csdn.net/weixin_44352049(虽然也是啥都没有)
  75.  
  76. //使用说明:https://gf.qytechs.cn/zh-CN/scripts/401115
  77. //吾爱说明:https://www.52pojie.cn/thread-1163575-1-1.html
  78. //CSDN说明:https://blog.csdn.net/weixin_44352049/article/details/106031114
  79.  
  80. //未做混淆或加密,
  81. //按F12打开console即可看到日志
  82. //懂js可以自行DIY
  83.  
  84. (function() {
  85. 'use strict';
  86. let AutoSignConfig = {};
  87. let DefaultConfig = {
  88. TTS_IsOpen:true,
  89. TTS_Volce:5,
  90. TTS_Speed:7,
  91. CX_IsOpen:true,
  92. CX_WaitingTime:30,
  93. CX_MaxWaitingCount:20,
  94. TXKT_Signing_WaitingTime:5000,
  95. TXKT_Ansering_IsOpen:false,
  96. TXKT_Ansering_IsRandom:true,
  97. TXKT_Ansering_WaitingTime:-20
  98. };
  99.  
  100. Promise.all([GM_getValue("CXAndTXKTConfig")]).then(function (data) {
  101. if (data[0] !== undefined) {
  102. try{
  103. AutoSignConfig = JSON.parse(data[0]);
  104. }catch (e) {
  105. AutoSignConfig = data[0];
  106. }
  107. } else {
  108. AutoSignConfig = DefaultConfig;
  109. }
  110. for(var key in DefaultConfig){
  111. if(typeof(AutoSignConfig[key]) == "undefined"){
  112. AutoSignConfig[key] = DefaultConfig[key];
  113. }
  114. }
  115. // 初始化完成之后才能调用正常函数
  116. MainFunction();
  117. }).catch(function (except) {
  118. console.log(except);
  119. });
  120.  
  121. window.T2S=function (TXT){
  122. if(!AutoSignConfig.TTS_IsOpen){
  123. return;
  124. }
  125. if(TXT===undefined){
  126. TXT="我有参数呢,播报的内容您还没填呢。填写后才能读出你想要的文字呢,亲!";
  127. }
  128. var tmp = document.createElement("div");
  129. tmp.innerHTML = '<iframe src="data:audio/mpeg;base64,x==" allow="autoplay" style="position:fixed;z-index:-999999999;top:-120px;left:-100px;width:10px;height:10px" autoplay></iframe>';
  130. tmp.id="taoSignAudioTEST";
  131. document.getElementsByTagName("body")[0].append(tmp);
  132. tmp=document.getElementById('taoSignAudio');
  133. if(tmp){
  134. tmp.src = "http://tts.baidu.com/text2audio?cuid=baiduid&per=4&vol="+AutoSignConfig.TTS_Volce+"&pit=6&lan=zh&spd="+AutoSignConfig.TTS_Speed+"&ctp=1&pdt=311&ie=UTF-8&tex="+TXT;
  135. }else{
  136. tmp = document.createElement("audio");
  137. tmp.id = 'taoSignAudio';
  138. tmp.src = "http://tts.baidu.com/text2audio?cuid=baiduid&per=4&vol="+AutoSignConfig.TTS_Volce+"&pit=6&lan=zh&spd="+AutoSignConfig.TTS_Speed+"&ctp=1&pdt=311&ie=UTF-8&tex="+TXT;
  139. document.getElementsByTagName("body")[0].append(tmp);
  140. }
  141. try{
  142. document.getElementById('taoSignAudio').play();
  143. }catch(e){
  144. console.log("error:==>"+e);}
  145. document.getElementById('taoSignAudioTEST').remove();
  146. };
  147. GM_registerMenuCommand('插件设置', function () {
  148. document.querySelector("#AutoSignSettingIconMain").style.top =0;
  149. setTimeout(function(){
  150. alert("看见没?设置在这里,\n鼠标移动到上面的设置图标就会显示出来了");
  151. },200);
  152. });
  153.  
  154.  
  155. function MainFunction(){
  156.  
  157. var UPDETE_timeout=0;
  158. function UpdateSettings(){
  159. if(UPDETE_timeout){
  160. clearTimeout(UPDETE_timeout);
  161. }
  162. UPDETE_timeout=setTimeout(function(){
  163. GM_setValue("CXAndTXKTConfig", JSON.stringify(AutoSignConfig));
  164. //=================超星主页=================
  165.  
  166. AutoSignConfig.TTS_IsOpen?console.log("%c【语音播报】%c功能已%c开启","color:red","color:black","background-color:green;color:white;"):console.log("%c【语音播报】%c功能已%c关闭","color:red","color:black","background-color:red;color:white;");
  167.  
  168. if (location.href.match(/visit\/interaction/) !== null) {
  169. window.location.reload();
  170. return;
  171. }
  172.  
  173. if(location.href.match(/mobilelearn/) !== null){
  174. cx_main();
  175. return;
  176. }
  177.  
  178. //===============腾讯课堂签到===============
  179. if(location.href.match(/ke.qq.com/) !== null){
  180. if(top.location==self.location){
  181. ke();
  182. }
  183. return;
  184. }
  185.  
  186. },3000);
  187. }
  188. if(top.location==self.location){
  189. AutoSignConfig.TTS_IsOpen?console.log("%c【语音播报】%c功能已%c开启","color:red","color:black","background-color:green;color:white;"):console.log("%c【语音播报】%c功能已%c关闭","color:red","color:black","background-color:red;color:white;");
  190.  
  191. $(document).ready(function () {
  192.  
  193. GM_addStyle(`
  194. .TaoMain{
  195. color:aliceblue;
  196. }
  197. #AutoSignSettingIconMain:hover+.TaoMain>.TaoTotal {
  198. display: block;
  199. }
  200. #AutoSignSettingIconMain {
  201. position: fixed;
  202. left: 50%;
  203. top: -40px;
  204. margin-left: -30px;
  205. z-index: 99999999999;
  206. cursor: pointer;
  207. background-size: 100% 100%;
  208. -webkit-box-sizing: border-box;
  209. box-sizing: border-box;
  210. -webkit-transition: 0.7s;
  211. -webkit-transition-delay: 1s;
  212. -o-transition: 0.7s;
  213. -o-transition-delay: 1s;
  214. transition: 0.7s;
  215. transition-delay: 1s;
  216. padding: 0;
  217. }
  218. #AutoSignSettingIconMain:hover {
  219. -webkit-transition: 0.7s;
  220. -o-transition: 0.7s;
  221. transition: 0.7s;
  222. top: 0;
  223. padding-bottom: 40px;
  224. padding-right: 300px;
  225. }
  226. #AutoSignSettingIcon {
  227. width: 60px;
  228. height: 60px;
  229. border: 4px solid #00bdff96;
  230. border-radius: 50%;
  231. background-size: 100% 100%;
  232. -webkit-box-sizing: border-box;
  233. box-sizing: border-box;
  234. background: url('https://i.loli.net/2020/05/07/6xDftH98IO15MoF.png') no-repeat center center;
  235. -webkit-transition: 0.7s;
  236. -o-transition: 0.7s;
  237. transition: 0.7s;
  238. -webkit-transform: rotate(0deg);
  239. -ms-transform: rotate(0deg);
  240. transform: rotate(0deg);
  241. }
  242. #AutoSignSettingIcon:hover {
  243. -webkit-transition: 0.7s;
  244. -o-transition: 0.7s;
  245. transition: 0.7s;
  246. -webkit-transform: rotate(180deg);
  247. -ms-transform: rotate(180deg);
  248. transform: rotate(180deg);
  249. }
  250. .Setting_ul {
  251. margin: 5px;
  252. padding-left: 15px;
  253. }
  254. .Setting_btn {
  255. border-radius: 50%;
  256. width: 20px;
  257. height: 20px;
  258. border: none;
  259. }
  260. .Setting_On {
  261. background-color: green;
  262. }
  263. .Setting_Off {
  264. background-color: red;
  265. }
  266. .TaoTotal:hover {
  267. display: block;
  268. }
  269. .TaoMain{
  270. z-index: 9999999999;
  271. position: fixed;
  272. top: 65px;
  273. left: 50%;
  274. }
  275. .TaoTotal {
  276. margin-left: -30px;
  277. display:none;
  278. border-radius: 3px;
  279. border: 1px solid #A0A0A0;
  280. -webkit-box-shadow: -2px 2px 5px rgba(0,0,0,0.3);
  281. box-shadow: -2px 2px 5px rgba(0,0,0,0.3);
  282. background-image: url("https://i.loli.net/2020/05/10/zdRfwIuHav5kpi9.jpg");
  283. width: -webkit-fit-content;
  284. width: -moz-fit-content;
  285. width: fit-content;
  286. padding: 15px;
  287. overflow-y:hidden ;
  288. }
  289. .TaoTotal>fieldset {
  290. margin: auto;
  291. display: -webkit-box;
  292. display: -ms-flexbox;
  293. display: flex;
  294. -webkit-box-orient: vertical;
  295. -webkit-box-direction: normal;
  296. justify-content: space-around;
  297. -ms-flex-direction: column;
  298. flex-direction: column;
  299. -ms-flex-pack: distribute;
  300. items-align: center;
  301. margin: auto;
  302. }
  303. .SettingTitle {
  304. font-size: 15px;
  305. -webkit-transition: 0.5s;
  306. -o-transition: 0.5s;
  307. transition: 0.5s;
  308. }
  309. #fieldsetAll>fieldset:hover>div {
  310. -o-transition: height 0.5s;
  311. transition: height 0.5s;
  312. -webkit-transition: height 0.5s;
  313. height: 55px;
  314. }
  315. #fieldsetAll{
  316. max-height: 350px;
  317. overflow-y:hidden ;
  318. }
  319. #fieldsetAll>fieldset>div {
  320. -o-transition: height 0.5s;
  321. -o-transition-delay: 0.5s;
  322. transition: height 0.5s;
  323. transition-delay: 0.5s;
  324. -webkit-transition: height 0.5s;
  325. -webkit-transition-delay: 0.5s;
  326. height: 0;
  327. overflow: hidden;
  328. }
  329. .SettingTitle:hover {
  330. color: red;
  331. font-size: 18px;
  332. cursor: help;
  333. -webkit-transition: 0.7s;
  334. -webkit-transition-duration: 0.7s;
  335. -o-transition: 0.7s;
  336. -o-transition-duration: 0.7s;
  337. transition: 0.7s;
  338. transition-duration: 0.7s;
  339. }
  340. .Setting_Choice>label {
  341. margin: auto;
  342. }
  343. input.Setting_input {
  344. text-align: center;
  345. -moz-text-align-last: center;
  346. text-align-last: center;
  347. margin: 0 2px;
  348. vertical-align: middle;
  349. }
  350. input.Setting_input[type="number"] {
  351. width: 70px;
  352. color:blue;
  353. }
  354. #fieldsetAll>fieldset {
  355. margin: 5px;
  356. }
  357. hr.MyScript {
  358. margin: 0 auto;
  359. border: groove;
  360. }
  361. `);
  362. createSettingsWindow();
  363. });
  364.  
  365. function updateUI(){
  366. return "<div id='AutoSignSettingIconMain'>\n"+
  367. "<div id='AutoSignSettingIcon' title='双击清除已有设置'></div>\n"+
  368. "</div>\n"+
  369. "<div class='TaoMain'>\n"+
  370. "<div class='TaoTotal'>\n"+
  371. "<fieldset id='fieldsetAll'>\n"+
  372. "<legend style='text-align: right;'><a href='https://gf.qytechs.cn/zh-CN/scripts/401115'>涛之雨制作|前往脚本发布地址</a>\n"+
  373. "</legend>\n"+
  374. "<fieldset id='fieldsetTotal'>\n"+
  375. "<legend class='SettingTitle' title='百度语音TTS接入,语音方式提醒'> <font>TTS(语音)设置</font>\n"+
  376. "</legend>\n"+
  377. "<ul class='Setting_ul'>\n"+
  378. "<li class='Setting_Choice'>\n"+
  379. "<label style='height: 20px;' title='是否开启语音提醒功能(推荐开启)'>是否开启\n"+
  380. "<input id='TTS_IsOpen' type='button' class='Setting_input Setting_btn "+(AutoSignConfig.TTS_IsOpen?"Setting_On":"Setting_Off")+"'>\n"+
  381. "</label>\n"+
  382. "</li>\n"+
  383. "</ul>\n"+
  384. "<div id='TTS_div'>\n"+
  385. "<ul class='Setting_ul'>\n"+
  386. "<li>\n"+
  387. "<label title='范围:[0,9],5为中速'>语速设置\n"+
  388. "<input class='Setting_input' id='TTS_Speed' type='number' max='9' min='0' value='"+AutoSignConfig.TTS_Speed+"'>\n"+
  389. "</label>\n"+
  390. "</li>\n"+
  391. "</ul>\n"+
  392. "<ul class='Setting_ul'>\n"+
  393. "<li>\n"+
  394. "<label title='范围:[0,15],5为中音量'>音量设置\n"+
  395. "<input class='Setting_input' id='TTS_Volce' type='number' max='15' min='0' value='"+AutoSignConfig.TTS_Volce+"'>\n"+
  396. "</label>\n"+
  397. "</li>\n"+
  398. "</ul>\n"+
  399. "</div>\n"+
  400. "</fieldset>\n"+
  401. "<fieldset id='fieldsetCX'>\n"+
  402. "<legend class='SettingTitle' title='超星学习通的相关功能,如自动签到,延时,检测等'><font>超星相关 设置</font>\n"+
  403. "</legend>\n"+
  404. "<ul class='Setting_ul'>\n"+
  405. "<li class='Setting_Choice'>\n"+
  406. "<label title='是否开启自动签到功能(推荐开启)'>自动签到\n"+
  407. "<input id='CX_IsOpen' type='button' class='Setting_input Setting_btn "+(AutoSignConfig.CX_IsOpen?"Setting_On":"Setting_Off")+"'>\n"+
  408. "</label>\n"+
  409. "</li>\n"+
  410. "</ul>\n"+
  411. "<div id='CX_div'>\n"+
  412. "<ul class='Setting_ul'>\n"+
  413. "<li>\n"+
  414. "<label title='每隔多长时间监视一次'>监视时间\n"+
  415. "<input class='Setting_input' id='CX_WaitingTime' type='number' min='0' value='"+AutoSignConfig.CX_WaitingTime+"'>秒</label>\n"+
  416. "</li>\n"+
  417. "</ul>\n"+
  418. "<ul class='Setting_ul'>\n"+
  419. "<li>\n"+
  420. "<label title='最大检测次数,超过限制停止。值为0则无限制'>最多检测\n"+
  421. "<input class='Setting_input' id='CX_MaxWaitingCount' type='number' min='0' value='"+AutoSignConfig.CX_MaxWaitingCount+"'>次</label>\n"+
  422. "</li>\n"+
  423. "</ul>\n"+
  424. "</div>\n"+
  425. "</fieldset>\n"+
  426. "<fieldset id='fieldsetCX'>\n"+
  427. "<legend class='SettingTitle' title='腾讯课堂的相关功能,如自动辅助答题,随机选择,辅助的时机等'> <font>腾讯课堂 设置</font>\n"+
  428. "</legend>\n"+
  429. "<ul class='Setting_ul'>\n"+
  430. "<li>\n"+
  431. "<label title='签到的监视时间,可以填理论任意数值。(因为不会发生多层同时出现,可以考虑1000毫秒)'>签到监视\n"+
  432. "<input id='TXKT_Signing_WaitingTime' class='Setting_input' type='number' min='0' value='"+AutoSignConfig.TXKT_Signing_WaitingTime+"'>毫秒</label>\n"+
  433. "</li>\n"+
  434. "</ul>\n"+
  435. "<hr class='MyScript' />\n"+
  436. "<ul class='Setting_ul'>\n"+
  437. "<li class='Setting_Choice'>\n"+
  438. "<label title='是否开启随机选择选项功能(如关闭则每次都选择第一个选项)'>随机选择\n"+
  439. "<input id='TXKT_Ansering_IsRandom' type='button' class='Setting_input Setting_btn "+(AutoSignConfig.TXKT_Ansering_IsRandom?"Setting_On":"Setting_Off")+"'>\n"+
  440. "</label>\n"+
  441. "</li>\n"+
  442. "</ul>\n"+
  443. "<div id='TTS_div'>\n"+
  444. "<ul class='Setting_ul'>\n"+
  445. "<li class='Setting_Choice'>\n"+
  446. "<label title='是否开启辅助作答功能(尚不完善,不推荐开启)'>辅助作答\n"+
  447. "<input type='button' id='TXKT_Ansering_IsOpen' class='Setting_input Setting_btn "+(AutoSignConfig.TXKT_Ansering_IsOpen?"Setting_On":"Setting_Off")+"'>\n"+
  448. "</label>\n"+
  449. "</li>\n"+
  450. "</ul>\n"+
  451. "<ul class='Setting_ul'>\n"+
  452. "<li>\n"+
  453. "<label title='辅助作答的时间,整数为等待选择时长后作答,负数为倒计时剩余填入时长的时作答'>作答时机\n"+
  454. "<input class='Setting_input' id='TXKT_Ansering_WaitingTime' type='number' value='"+AutoSignConfig.TXKT_Ansering_WaitingTime+"'>秒</label>\n"+
  455. "</li>\n"+
  456. "</ul>\n"+
  457. "</div>\n"+
  458. "</fieldset>\n"+
  459. "</fieldset>\n"+
  460. "</div>\n"+
  461. "</div>";
  462. }
  463. var auto_sign_interval=0,auto_answer_interval=0;
  464. function createSettingsWindow(){
  465. if (document.body != null && document.querySelector("#AutoSignSettingFrame") == null) {
  466.  
  467. let Container = document.createElement('div');
  468. Container.id = "AutoSignSettingFrame";
  469. Container.innerHTML=updateUI();
  470. document.body.appendChild(Container);
  471. var T2S_timeout=0;
  472. $("#TTS_IsOpen").on('click',function(e){
  473. var IsOpen=!!!$(e.target).attr("class").match(/Setting_On/g);
  474. $(e.target).addClass(!IsOpen?"Setting_Off":"Setting_On");
  475. $(e.target).removeClass(!IsOpen?"Setting_On":"Setting_Off");
  476. AutoSignConfig.TTS_IsOpen=IsOpen;
  477. UpdateSettings();
  478. if(T2S_timeout){
  479. clearTimeout(T2S_timeout);
  480. }
  481. T2S_timeout=setTimeout(function(){
  482. T2STEST();
  483. },1000);
  484. });
  485. $("#TTS_Volce").on('input',function(e){
  486. var Tmp=Number(e.target.value);
  487. Tmp=Tmp>15?15:Tmp<0?0:Tmp;
  488. AutoSignConfig.TTS_Volce=Tmp;
  489. $("#TTS_Volce").val(Tmp);
  490. UpdateSettings();
  491. if(T2S_timeout){
  492. clearTimeout(T2S_timeout);
  493. }
  494. T2S_timeout=setTimeout(function(){
  495. T2STEST();
  496. },1000);
  497. });
  498. $("#TTS_Speed").on('input',function(e){
  499. var Tmp=Number(e.target.value);
  500. Tmp=Tmp>9?9:Tmp<0?0:Tmp;
  501. AutoSignConfig.TTS_Speed=Tmp;
  502. $("#TTS_Speed").val(Tmp);
  503. UpdateSettings();
  504. if(T2S_timeout){
  505. clearTimeout(T2S_timeout);
  506. }
  507. T2S_timeout=setTimeout(function(){
  508. T2STEST();
  509. },1000);
  510. });
  511. $("#CX_IsOpen").on('click',function(e){
  512. var IsOpen=!!!$(e.target).attr("class").match(/Setting_On/g);
  513. $(e.target).addClass(!IsOpen?"Setting_Off":"Setting_On");
  514. $(e.target).removeClass(!IsOpen?"Setting_On":"Setting_Off");
  515. AutoSignConfig.CX_IsOpen=IsOpen;
  516. UpdateSettings();
  517. });
  518. $("#CX_WaitingTime").on('input',function(e){
  519. AutoSignConfig.CX_WaitingTime=Number(e.target.value);
  520. UpdateSettings();
  521. });
  522. $("#CX_MaxWaitingCount").on('input',function(e){
  523. AutoSignConfig.CX_MaxWaitingCount=Number(e.target.value);
  524. UpdateSettings();
  525. });
  526. $("#TXKT_Signing_WaitingTime").on('input',function(e){
  527. AutoSignConfig.TXKT_Signing_WaitingTime=Number(e.target.value);
  528. UpdateSettings()
  529. });
  530. $("#TXKT_Ansering_IsRandom").on('click',function(e){
  531. var IsOpen=!!!$(e.target).attr("class").match(/Setting_On/g);
  532. $(e.target).addClass(!IsOpen?"Setting_Off":"Setting_On");
  533. $(e.target).removeClass(!IsOpen?"Setting_On":"Setting_Off");
  534. AutoSignConfig.TXKT_Ansering_IsRandom=IsOpen;
  535. UpdateSettings()
  536. });
  537. $("#TXKT_Ansering_IsOpen").on('click',function(e){
  538. var IsOpen=!!!$(e.target).attr("class").match(/Setting_On/g);
  539. $(e.target).addClass(!IsOpen?"Setting_Off":"Setting_On");
  540. $(e.target).removeClass(!IsOpen?"Setting_On":"Setting_Off");
  541. AutoSignConfig.TXKT_Ansering_IsOpen=IsOpen;
  542. UpdateSettings()
  543. });
  544. $("#TXKT_Ansering_WaitingTime").on('input',function(e){
  545. AutoSignConfig.TXKT_Ansering_WaitingTime=Number(e.target.value);
  546. UpdateSettings();
  547. });
  548. $("#AutoSignSettingIcon").on('dblclick',function(e){
  549. if(window.confirm('你确定要删除已有设置吗?')){
  550. //alert("确定");
  551. AutoSignConfig = DefaultConfig;
  552. UpdateSettings();
  553. alert("清除成功!即刻生效");
  554. createSettingsWindow();
  555. return true;
  556. }else{
  557. //alert("取消");
  558. return false;
  559. }
  560. });
  561. }else{
  562. document.getElementById("AutoSignSettingFrame").innerHTML=updateUI();
  563. }
  564. }
  565. }
  566. function b64en(str) {
  567. return btoa(encodeURIComponent(str));
  568. }
  569.  
  570. function b64de(str) {
  571. return decodeURIComponent(atob(str));
  572. }
  573. window.T2STEST=function (){
  574. T2S("这里是语音测试,如果声音大小,或是语速不合适请修改参数。Power By 涛之雨");
  575. }
  576.  
  577. //=================超星主页=================
  578.  
  579. if (location.href.match(/visit\/interaction/) !== null) {
  580. window.onload = function () {
  581. cx_sign();
  582. }
  583. return;
  584. }
  585.  
  586. if(location.href.match(/mobilelearn/) !== null){
  587.  
  588. $(document).ready(function () {
  589. cx_main();
  590. });
  591. return;
  592. }
  593.  
  594.  
  595.  
  596.  
  597. //===============腾讯课堂签到===============
  598. if(location.href.match(/ke.qq.com/) !== null){
  599. if(top.location==self.location){
  600. $(document).ready(function () {
  601. ke();
  602. });
  603. }
  604. return;
  605. }
  606.  
  607. function ke(){
  608.  
  609. function auto_sign(timeout=5000){
  610. var sign_times=0;
  611. if(auto_sign_interval){
  612. clearInterval(auto_sign_interval);
  613. }
  614. auto_sign_interval = setInterval(function () {
  615. try{
  616. if($(".tip")[0].innerText.match(/签到/)){
  617. if($(".btn-group")[0]!==undefined){
  618. $(".btn-group")[0].children[0].click();
  619. setTimeout(function () {
  620. $(".btn-group")[0].children[0].click();
  621. T2S("自动签到插件,签到成功!本节课累积已为您签到,%c"+(++sign_times)+"次。");
  622. console.log("%c【腾讯课堂自动签到插件】%c\n于 %s %c签到成功!\n本节课累积已为您签到%c"+sign_times+"次%c!","color:white;background-color:blue;font-size:20px","color:red;font-size:20px",(new Date().toLocaleTimeString()),"color:black","color:red;font-size:20px","color:black");
  623. },1000);
  624. }
  625. }
  626. }catch(e){}
  627. }, timeout);
  628. }
  629.  
  630. function auto_Answer(timeout=1000){
  631. var answer_times=0;
  632. var isfristtime=true;
  633. var tx_timeout,timeout_min,timeout_sec,timeout_all,tmp_timeout=0,checkout_times=0;
  634. var isbackingtime=AutoSignConfig.TXKT_Ansering_WaitingTime<0?true:false;
  635. if(AutoSignConfig.TXKT_Ansering_WaitingTime===0){
  636. return;
  637. }
  638. var timeout_def=Math.abs(AutoSignConfig.TXKT_Ansering_WaitingTime);
  639. var getrandomchoice=function(totalnumber=2){
  640. return Math.floor((Math.random()*totalnumber)+1)-1;
  641. }
  642. var answering=function(israndom=true){
  643. console.log("开始答题")
  644. var anser_type=$(".head-text")[0].innerHTML;
  645. console.info("anser_type:"+anser_type);
  646. $(".s-f-rc-item")[AutoSignConfig.TXKT_Ansering_IsRandom?getrandomchoice($(".s-f-rc-item").length):0].click()
  647. //关闭按钮没找到,上面的点击未进行测试!QAQ
  648. //尝鲜请慎重
  649. T2S("辅助答题插件,答题成功!本节课累积已为您辅助,"+(++answer_times)+"次。");
  650. console.log("%c【腾讯课堂自动签到插件】%c\n%s %c辅助答题成功!\n本节课累积已为您答题%c"+answer_times+"次%c!","color:white;background-color:blue;font-size:20px","color:red;font-size:20px",(new Date().toLocaleTimeString()),"color:black","color:red;font-size:20px","color:black");
  651. }
  652. if(auto_answer_interval){
  653. clearInterval(auto_answer_interval);
  654. }
  655. auto_answer_interval = setInterval(function () {
  656.  
  657. try{
  658.  
  659. if($(".head-text").length){//单选题、多选题、(未知)
  660. if($(".head-text")[0].innerHTML.match(/选题/)){
  661. if(isfristtime){
  662. isfristtime=false;
  663. T2S("检测到答题窗口,正在密切监视中。。。");
  664. }
  665. tx_timeout=$(".xq_num")[0].innerHTML;
  666. timeout_min=Number(tx_timeout.match(/\d{2}/g)[0]);
  667. timeout_sec=Number(tx_timeout.match(/\d{2}/g)[1]);
  668. timeout_all=timeout_min*60+timeout_sec-1;//当前答题的剩余时间
  669.  
  670. console.log("答题辅助:==%s==\n"+timeout_all,(new Date().toLocaleTimeString()));
  671. if($(".drag-handler").length!="0"){//存在答题窗口
  672. if(isbackingtime){
  673. checkout_times=timeout_all
  674. checkout_times<=timeout_def?(
  675. console.log("时间到!开始执行辅助作答\n随机选择:%c%s",(AutoSignConfig.TXKT_Ansering_IsRandom?"color:green":"color:red"),(AutoSignConfig.TXKT_Ansering_IsRandom?"开":"关")),
  676. answering(AutoSignConfig.TXKT_Ansering_IsRandom)
  677. ):(
  678. console.log("监视中,剩余等待时间:%c%s%c秒","color:red",(timeout_all-timeout_def),"color:black")
  679. );
  680. }else{
  681. checkout_times>=timeout_def?(
  682. console.log("时间到!开始执行辅助作答\n随机选择:%c%s",(AutoSignConfig.TXKT_Ansering_IsRandom?"color:green":"color:red"),(AutoSignConfig.TXKT_Ansering_IsRandom?"开":"关")),
  683. answering(AutoSignConfig.TXKT_Ansering_IsRandom)
  684. ):(
  685. checkout_times++,
  686. console.log("监视中,剩余等待时间:%c%s%c秒","color:red",(timeout_def-checkout_times),"color:black")
  687. );
  688. }
  689. }
  690. }
  691. }else{
  692. checkout_times=0;//没有签到窗口
  693. isfristtime=true;
  694. }
  695. }catch(e){
  696. checkout_times=0;//未知错误吧。。。。
  697. isfristtime=true;
  698. console.error("err====>>",e);
  699. }
  700. }, timeout);
  701. }
  702. AutoSignConfig.TXKT_Signing_WaitingTime?(
  703. console.log("%c【腾讯课堂自动签到】%c功能已%c开启","color:red","color:black","background-color:green;color:white;"),
  704. auto_sign(Number(AutoSignConfig.TXKT_Signing_WaitingTime))
  705. ):console.log("%c【腾讯课堂自动签到】%c功能已%c关闭","color:red","color:black","background-color:red;color:white;");
  706.  
  707. AutoSignConfig.TXKT_Ansering_IsOpen?(
  708. console.log("%c【腾讯课堂辅助作答】%c功能已%c开启","color:red","color:black","background-color:green;color:white;"),
  709. console.warn("%c辅助作答为测试功能!!!请勿信任该功能!!!!\n\n%c如果出现未知错误请立即\n把%c【腾讯课堂中的辅助作答】%c改成%cfalse%c并%c立即刷新%c!","background-color:red;color:white;","background-color;color;","background-color:red;color:white;font-size:30px","background-color;color;font-size;","color:red;font-size:30px","color;font-size","color:blue;font-size:30px","background-color;color;font-size"),
  710. auto_Answer(AutoSignConfig.TXKT_Signing_WaitingTime)
  711. ):console.log("%c【腾讯课堂辅助作答】%c功能已%c关闭","color:red","color:black","background-color:red;color:white;");
  712. }
  713. function cx_sign(){
  714.  
  715.  
  716. if(!AutoSignConfig.CX_IsOpen){//关闭主页自动签到
  717. return;
  718. }
  719. AutoSignConfig.CX_IsOpen?console.log("%c【超星·主页签到】%c功能已%c开启","color:red","color:black","background-color:green;color:white;"):console.log("%c【超星·主页签到】%c功能已%c关闭","color:red","color:black","background-color:red;color:white;");
  720.  
  721. var wait4time=Number(AutoSignConfig.CX_WaitingTime);
  722. var wait_format=(parseInt(wait4time/60)?(parseInt(wait4time/60)+"分钟"):"")+
  723. (parseInt(wait4time%60)?parseInt(wait4time%60)+"秒":"");
  724. console.group("$$课程信息$$(点我收起/展开)");
  725. console.log("一共有%c"+$(".ulDiv .clearfix").length+"%c门课程:","color:blue","color:black");
  726. T2S("签到插件开启,一共有"+$(".ulDiv .clearfix").length+"门课程。监视时长,"+wait_format+"。");
  727. $(".ulDiv .clearfix").each(function(){
  728. var that=this;
  729. var coursename=$(that)[0].children[0].innerHTML;
  730. var courseID=$(that)[0].children[0].href.match(/courseId=\d+/g)[0].match(/\d+/g)[0];
  731. console.log("专业:%c%s\n%ccourseID:%c"+courseID+"\n%cclassID为:%c"+$(that)[0].children[0].href.match(/clazzid=\d+/g)[0].match(/\d+/g)[0],"color:red",coursename,"color:black","color:red","color:black","color:red");
  732. var sign_url="https://mobilelearn.chaoxing.com/widget/pcpick/stu/index?courseId="+$(that)[0].children[0].href.match(/courseId=\d+/g)[0].match(/\d+/g)[0]+"&coursename="+b64en(coursename)+"&jclassId="+$(that)[0].children[0].href.match(/clazzid=\d+/g)[0].match(/\d+/g)[0];
  733.  
  734. var tmp = document.createElement("iframe");
  735. tmp.id = 'loginframe_'+$(that)[0].children[0].href.match(/courseId=\d+/g)[0].match(/\d+/g)[0];
  736. tmp.src = sign_url;
  737. tmp.style = "display:none;width: 0px;height: 0px;position: fixed;left: 0px;bottom: 0px;z-index: -99;";
  738. $("body")[0].append(tmp);
  739. });
  740. console.groupEnd("$$课程信息$$(点我收起/展开)");
  741. }
  742. function cx_main(){
  743.  
  744. if(!AutoSignConfig.CX_IsOpen){//关闭主页自动签到
  745. return;
  746. }
  747. var wait4time=Number(AutoSignConfig.CX_WaitingTime);
  748. var wait_format=(parseInt(wait4time/60)?(parseInt(wait4time/60)+"分钟"):"")+
  749. (parseInt(wait4time%60)?parseInt(wait4time%60)+"秒":"");
  750. wait4time*=1000;
  751. var url_sign=location.href.match(/tao_auto_refresh_time=\d+/g);
  752. var coursename="";
  753. try{
  754. coursename=location.href.match(/coursename=[A-Za-z0-9/\+=]+/g)[0].substring(11);
  755. }catch(e){}
  756. var waitingTimes=Number((url_sign===null)?0:url_sign[0].match(/\d+/g)[0]),MAX_waittingTimes=Number(AutoSignConfig.CX_MaxWaitingCount);
  757. waitingTimes++;
  758. try{
  759. if($(".qdhover").length!==0){
  760. var getmsg=$(".qdhover").parent().parent().parent()[0].getAttributeNode("onclick").nodeValue.match(/\d+/g);
  761. if(getmsg[1]==2){//普通签到
  762. var activeId=getmsg[0];
  763. var courseId = $("#courseId").val();
  764. var classId = $("#classId").val();
  765. var fid = $("#fid").val();
  766. var url="/widget/sign/pcStuSignController/signIn?activeId="+activeId+"&classId="+classId+"&coursename="+coursename+"&fid="+fid+"&courseId="+courseId;
  767. var tmp = document.createElement("iframe");
  768. tmp.id = 'loginframe';
  769. tmp.src = url;
  770. tmp.style = "display:none;width: 0px;height: 0px;position: fixed;left: 0px;bottom: 0px;z-index: -99;";
  771. $("body")[0].append(tmp);
  772. $("#loginframe").load(function () {
  773. window.frames[0].$("title")[0].text.match("成功")!==""?
  774. (top.location==self.location?(
  775. T2S("当前课程,签到成功"),
  776. console.log("%c【当前课程】签到成功!","color:white;font-size:30px;background-color:green"),
  777. $(".qdhover").parent().parent().parent().children().children()[1].innerHTML+="<font style='color:white;font-size:30px;background-color:green;line-height: 30px;'> 签到成功!</font>",
  778. $(this).remove()
  779. ):(
  780. T2S(b64de(coursename)+",签到成功"),
  781. console.log("%c【%s】签到成功!","color:white;font-size:30px;background-color:green",b64de(coursename))
  782. )
  783. ):(
  784. T2S("未知错误!请手动签到!"),
  785. alert("未知错误!请手动签到!"));
  786. });
  787. }else{//不支持
  788. T2S(top.location==self.location?"当前课程":b64de(coursename)+",出现非支持签到模式!请手动签到!!!");
  789. alert("【"+top.location==self.location?"当前课程":b64de(coursename)+"】出现非支持签到模式!请手动签到!!!");
  790. }
  791. }else{
  792. if(MAX_waittingTimes&&waitingTimes>=MAX_waittingTimes){
  793. T2S(top.location==self.location?"当前课程":b64de(coursename)+"已达尝试上限"+MAX_waittingTimes+"次,已停止");
  794. console.log("%c【%s】%c已达尝试上限%s次,已停止","color:red",top.location==self.location?"当前课程":b64de(coursename),"color:black",MAX_waittingTimes);
  795. return;
  796. }else{
  797. console.log("%c【%s】%c第"+waitingTimes+"次尝试,\n暂无签到任务,%s后自动再次尝试","color:red",top.location==self.location?"当前课程":b64de(coursename),"color:black",wait_format);
  798. setTimeout(function () {
  799. window.location.href=location.href.indexOf("tao_auto_refresh_time") > -1 ? (location.href.replace(new RegExp("tao_auto_refresh_time=\\d+",'g'),"tao_auto_refresh_time="+waitingTimes)) :( location.href + (location.href.indexOf("?") > -1 ? "&" : "?") + "tao_auto_refresh_time=" + waitingTimes);
  800. },wait4time);
  801. }
  802. }
  803. }catch(e){
  804. console.log(e);
  805. }
  806. }
  807. }
  808. })();

QingJ © 2025

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