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

腾讯课堂、超星自动签到

目前為 2020-05-29 提交的版本,檢視 最新版本

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

QingJ © 2025

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