// ==UserScript== // @name 腾讯课堂、超星自动签到(临时解决方案) // @description 腾讯课堂、超星自动签到 // @namespace CX&TXKT_auto_sign // @author 涛之雨 // @version 0.1.1 // @grant none // @run-at document-start // @require https://libs.baidu.com/jquery/2.1.4/jquery.min.js // @match *://ke.qq.com/webcourse/index.html* // @match *://mobilelearn.chaoxing.com/widget/pcpick/stu/index* // @match *://*.chaoxing.com/visit/interaction* // @license GPL-3.0-only // @icon https://i.loli.net/2020/03/04/D3h1iWSFeyc8AKG.png // @home-url https://greasyfork.org/zh-CN/scripts/401115 // @downloadURL none // ==/UserScript== /* * 更新: * V0.1.1 * 修复了签到子页面无法自动刷新的bug * * V0.1.0 * 删掉了我垃圾小站的图标(虽然用广告拦截器一拦截就好了。。。),去掉68行无用代码。。。 * 把自定义参数放到开头,方便用户进行自定义修改(没有基础请勿修改其他部分!) * * 腾讯课堂部分: * 对签到适配更加精准,不会误点 * 增加随机选择题的功能 * (未经测试。。。。开启请慎重!) * (严重的bug倒不会至于。主要可能不是预期效果) * * 超星部分: * 对课程信息进行重新分组 * 对签到的流程进行优化 * 增加签到成功和特殊的签到类型的判断及弹窗提醒,下个版本考虑增加对于微信的对接(太麻烦,懒得,此外本人不看微信。。。。) * */ //个人小站:https://taozhiyu.gitee.io(虽然啥都没有。。。) //吾爱主页:https://www.52pojie.cn/home.php?mod=space&uid=879080 //CSDN主页:https://blog.csdn.net/weixin_44352049(虽然也是啥都没有) //使用说明:https://greasyfork.org/zh-CN/scripts/401115 //吾爱说明:https://www.52pojie.cn/thread-1163575-1-1.html //CSDN说明: //未做混淆或加密, //按F12打开console即可看到日志 //懂js可以自行DIY try{ /*=================================================配置开始====================================================*/ //这里是配置! //如果不懂如何更改请不要自行改动,以免出错 /*==========超星相关配置================*/ var 超星主页自动签到=true; //可填true/false //当值为true的时候,将会在您打开主页 //(形如http://i.mooc.chaoxing.com/) //的时候自动对所有的课程进行签到检测 //否则不会。 //如果您的电脑性能较差,请慎重考虑是否需要打开 var 超星签到等待时间=30000; //上面的数字部分是超星每次检测后等待的时长,单位为毫秒 //上述时间为30秒 //注:切勿设置过短,否则打开主页是有几率因同时操作数过大而卡死!!! //推荐设置为十几秒到一分钟() var 超星签到最大检测次数=20; //上面的数字部分是超星检测的最大等待次数, //建议设置等待时间*等待时长为十几分钟,以防浏览器崩溃 //上述设置为最大20次,即检测10分钟。 //设置为0则不限制 /*==========超星相关配置================*/ /*========腾讯课堂相关配置==============*/ var 腾讯课堂签到等待时长=5000; //解释同上,不过此处推荐设置的稍微短一些比如几秒钟。 //因为课堂上的签到时间较短,而且当前仅有一处, //不会出现好几个签到任务,不会影响使用 //上述设置为每5秒钟检测一次 //值为0表示关闭该功能 var 辅助作答开关=false; //警告!本开关仅供临时离身救急使用!! //可填true/false //默认关闭,选择true后会根据您的配置,作出相应的选项 //(如在最后5秒的时候如果没有选择答案将自动选择) //可配合下面的【随机选则】【辅助作答时机】使用 //请注意!当您选择true的时候,即视为您已经知晓风险!恕不另行告知! var 随机选择=true; //仅当【辅助作答开关】为true的时候生效。 //顾名思义,打开后会在选项中随机选择任意一个作为答案提交。 //如果关闭,将每次都选择第一个(A)选项 var 辅助作答时机=-20; //仅当【辅助作答开关】为true的时候生效。 //辅助作答的时机,单位:秒 //例如检测到作答窗口后20秒钟(非上述例子)后如果您没有自行提交答案,将会自动选择选项, //当数值为负数的时候表示还剩5秒的时候如果没有提交,将会自动选择选项。(推荐) //数值为0表示检测到答题窗口立即作答(不推荐) //注:选择的选项和【随机选择的开关有关】 /*========腾讯课堂相关配置==============*/ /*=================================================配置结束====================================================*/ }catch(e){ alert("您的设置存在问题!\n将会按照原来内置的设置运行"); var iserror=1; } (function() { 'use strict'; function b64en(str) { return btoa(encodeURIComponent(str)); } function b64de(str) { return decodeURIComponent(atob(str)); } //=================超星主页================= if (location.href.match(/visit\/interaction/) !== null) { 超星主页自动签到?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;"); if(!超星主页自动签到){//关闭主页自动签到 return; } window.onload = function () { console.group("$$课程信息$$(点我收起/展开)"); console.log("一共有%c"+$(".ulDiv .clearfix").length+"%c门课:","color:blue","color:black"); $(".ulDiv .clearfix").each(function(){ var that=this; var coursename=$(that)[0].children[0].innerHTML; var courseID=$(that)[0].children[0].href.match(/courseId=\d+/g)[0].match(/\d+/g)[0]; 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"); 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]; var tmp = document.createElement("iframe"); tmp.id = 'loginframe_'+$(that)[0].children[0].href.match(/courseId=\d+/g)[0].match(/\d+/g)[0]; tmp.src = sign_url; tmp.style = "display:none;width: 0px;height: 0px;position: fixed;left: 0px;bottom: 0px;z-index: -99;"; $("body")[0].append(tmp); // $("#loginframe_"+$(that)[0].children[0].href.match(/courseId=\d+/g)[0].match(/\d+/g)[0]).load(function () { // }); }); console.groupEnd("$$课程信息$$(点我收起/展开)"); } return; } if(location.href.match(/mobilelearn/) !== null){ var waite4time=iserror==1?30000:Number(超星签到等待时间)<100?100:Number(超星签到等待时间); var url_sign=location.href.match(/tao_auto_refresh_time=\d+/g); var coursename=""; try{ coursename=location.href.match(/coursename=[A-Za-z0-9/\+=]+/g)[0].substring(11); }catch(e){} var waitingTimes=Number((url_sign===null)?0:url_sign[0].match(/\d+/g)[0]),MAX_waittingTimes=Number(超星签到最大检测次数); $(document).ready(function () { try{ var getmsg=$(".qdhover").parent().parent().parent()[0].getAttributeNode("onclick").nodeValue.match(/\d+/g); if(getmsg[1]==2){//普通签到 var activeId=getmsg[0]; var courseId = $("#courseId").val(); var classId = $("#classId").val(); var fid = $("#fid").val(); var url="/widget/sign/pcStuSignController/signIn?activeId="+activeId+"&classId="+classId+"&coursename="+coursename+"&fid="+fid+"&courseId="+courseId; var tmp = document.createElement("iframe"); tmp.id = 'loginframe'; tmp.src = url; tmp.style = "display:none;width: 0px;height: 0px;position: fixed;left: 0px;bottom: 0px;z-index: -99;"; $("body")[0].append(tmp); $("#loginframe").load(function () { window.frames[0].$("title")[0].text.match("成功")!==""? (top.location==self.location?( console.log("%c【当前课程】签到成功!","color:white;font-size:30px;background-color:green"), $(this).remove()):( console.log("%c【%s】签到成功!","color:white;font-size:30px;background-color:green",b64de(coursename)) ) ):alert("未知错误!请手动签到!"); }); }else{//不支持 alert("【"+coursename===""?"当前课程":b64de(coursename)+"】出现非支持签到模式!请手动签到!!!"); } }catch(e){ if(MAX_waittingTimes&&++waitingTimes>=MAX_waittingTimes){ console.log("%c【%s】%c已达尝试上限%s,已停止","color:red",b64de(coursename),"color:black",MAX_waittingTimes); return; }else{ console.log("%c【%s】%c第"+waitingTimes+"次尝试,\n暂无签到任务,%sms后自动再次尝试","color:red",top.location==self.location?"当前课程":b64de(coursename),"color:black",waite4time?waite4time:60000); setTimeout(function () { 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); },waite4time?waite4time:60000); } } }); return; } //===============腾讯课堂签到=============== if(location.href.match(/ke.qq.com/) !== null){ if(top.location==self.location){ $(document).ready(function () { function auto_sign(timeout=5000){ var sign_times=0; var timeouting = setInterval(function () { try{ if($(".tip")[0].innerText.match(/签到/)){ var tx_timeout=$(".xq_num")[0].innerHTML;//00:05 var timeout_min=Number(tx_timeout.match(/\d{2}/g)[0]); var timeout_sec=Number(tx_timeout.match(/\d{2}/g)[1]); var timeout_all=timeout_min*60+timeout_sec-1;//提前一秒,防止误差 console.log("签到:==%s==\n"+timeout_all,(new Date().toLocaleTimeString())); } }catch(e){} }, 1000); var auto_sign_interval = setInterval(function () { try{ if($(".tip")[0].innerText.match(/签到/)){ if($(".btn-group")[0]!==undefined){ $(".btn-group")[0].children[0].click(); setTimeout(function () { $(".btn-group")[0].children[0].click(); 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"); },1000); } } }catch(e){} }, timeout); } function auto_Answer(timeout=1000){ var sign_times=0; var tx_timeout,timeout_min,timeout_sec,timeout_all,checkout_times=0; var isbackingtime=辅助作答时机<0?true:false; var timeout_def=Math.abs(辅助作答时机) var getrandomchoice=function(totalnumber=2){ return Math.floor((Math.random()*totalnumber)+1)-1; } var answering=function(israndom=true){ console.log("开始答题") var anser_type=$(".head-text")[0].innerHTML; console.info("anser_type:"+anser_type); $(".s-f-rc-item")[随机选择?getrandomchoice($(".s-f-rc-item").length):0].click() //关闭按钮没找到,上面的点击未进行测试!QAQ //尝鲜请慎重 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"); } console.group("$$辅助作答模块$$(点我收起/展开)"); var auto_sign_interval = setInterval(function () { try{ if($(".head-text").length){//单选题、多选题、(未知) if($(".head-text")[0].match(/选题/)){ tx_timeout=$(".xq_num")[0].innerHTML; timeout_min=Number(tx_timeout.match(/\d{2}/g)[0]); timeout_sec=Number(tx_timeout.match(/\d{2}/g)[1]); timeout_all=timeout_min*60+timeout_sec-1; console.log("答题辅助:==%s==\n"+timeout_all,(new Date().toLocaleTimeString())); if($(".drag-handler").length!="0"){//存在答题窗口 checkout_times>=timeout_def?(console.log("时间到!开始执行辅助作答\n随机选择:%c%s","color:red",随机选择?"开":"关"),console.groupEnd("$$辅助作答模块$$(点我收起/展开)"),answering(随机选择)):(isbackingtime?"":checkout_times++,console.log("监视中,剩余等待时间:%c%s%c秒","color:red",(timeout_all-timeout_def),"color:black")); } } }else{ checkout_times=0;//没有签到窗口 } }catch(e){ checkout_times=0;//没有签到窗口 } }, timeout); } 腾讯课堂签到等待时长?(console.log("%c【腾讯课堂自动签到】%c功能已%c开启","color:red","color:black","background-color:green;color:white;"),auto_sign(iserror?"":Number(腾讯课堂签到等待时长))):console.log("%c【腾讯课堂自动签到】%c功能已%c关闭","color:red","color:black","background-color:red;color:white;"); 辅助作答开关?(console.log("%c【腾讯课堂辅助作答】%c功能已%c开启","color:red","color:black","background-color:green;color:white;"),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"),auto_Answer()):console.log("%c【腾讯课堂辅助作答】%c功能已%c关闭","color:red","color:black","background-color:red;color:white;"); }); } return; } })();