你的账号访问太频繁,请一分钟之后再试!
从大一开始
就用脚本在刷课
在专业课踢的只剩下一门C#的情况下
活活刷到一周的课
大二开始教务系统多了一个非常**的操作
退课池 and 访问频繁缓冲
难道,我大三下还要去学政治课咩?
虽然学政治不如敲代码
但我想毕业啊
emmmmmm
在量子力学的角度,没有抢上毛概的我只是我本体的一个属性,和我本身没有多大关系,我还是快乐敲代码吧。
0.教务系统后台登录流程
先来看一下后台账号密码在发送给服务器之前做了什么处理
这是文中的JS代码
1 j$(document).ready(function(evt){2 //初始化验证码
3 refreshImg();4 //判断操作系统是32位或64位,设置兼容性文件的下载
5 var cpu =getCPU();6 if (cpu != "x64"){7 j$("#setjw").attr("href","../custom/lodop/setjw32.zip");8 } else{9 j$("#setjw").attr("href","../custom/lodop/setjw.zip");10 }11 //Enter键转TAB
12 kutil.enter2tab("LoginForm");13 //定位焦点
14 j$("#yhmc").focus();15 })16
17 functiondoLogon() {18
19 //输入信息验证
20 if (!validate()) {21 return false;22 }23
24 //验证码正确性验证
25 var username = j$("#yhmc").val();26 var password = j$("#yhmm").val();27 var randnumber = j$("#randnumber").val();28 var passwordPolicy =kutil.isPasswordPolicy(username, password);29 var url = _webRootPath + "cas/logon.action";30 password = hex_md5(hex_md5(password)+hex_md5(randnumber.toLowerCase()));31 /**32 var params = {33 "yhmc" : username,34 "yhmm" : password,35 "randnumber": randnumber,36 "isPasswordPolicy" : passwordPolicy37 };38 */
39 var p_username = "_u"+randnumber;40 var p_password = "_p"+randnumber;41 username = base64encode(username+";;"+_sessionid);42 var params = p_username+"="+username+"&"+p_password+"="+password+"&randnumber="+randnumber+"&isPasswordPolicy="+passwordPolicy ;43 //alert("params="+params);
44 //params = getEncParams(params);
45 //alert("encparams="+params);
46 doPreLogon();47 kutil.doAjax(url, params, doPostLogon);48
49 functiondoPreLogon(){50 j$("#msg").html("正在登录......");51 j$("#login").attr("disabled", true);52 j$("#reset").attr("disabled", true);53 }54
55 functiondoPostLogon(response) {56 var data =JSON.parse(response);57 var status =data.status ;58 var message =data.message ;59 if ("200" ==status) {60 var result =data.result ;61 window.document.location.href =result ;62 } else{63 reloadScript("kingo_encypt",_webRootPath+"custom/js/SetKingoEncypt.jsp");64 if("407" ==status){65 alert(message);66 showMessage("");67 }else{68 showMessage(message);69 }70 j$("#login").attr("disabled", false);71 j$("#reset").attr("disabled", false);72 refreshImg();73 if ("401"==status) {74 j$("#randnumber").val("");75 j$("#randnumber").focus();76 } else{77 j$("#yhmc").val("");78 j$("#yhmm").val("");79 j$("#randnumber").val("");80 j$("#yhmc").focus();81 }82 }83 }84 }85
86 functionvalidate() {87 var username = j$("#yhmc").val();88 var password = j$("#yhmm").val();89 var randnumber = j$("#randnumber").val();90 if(kutil.isNull(username)) {91 showMessage("请输入用户名!");92 j$("#yhmc").focus();93 return false;94 }95 if(kutil.isNull(password)) {96 showMessage("请输入密码!");97 j$("#yhmm").focus();98 return false;99 }100 if(kutil.isNull(randnumber)) {101 showMessage("请输入验证码!");102 j$("#randnumber").focus();103 return false;104 }105 return true;106 }107
108 //重置密码为账号(找回密码)
109 functiondoReset() {110 var tourl = _webRootPath + "frame/retrievePassword.jsp";111 window.document.location.href =tourl ;112 }113
114 /**115 * 刷新验证码116 */
117 functionrefreshImg(){118 var url = _webRootPath + "cas/genValidateCode?dateTime="+(newDate());119 document.getElementById("randpic").src =url ;120 }121
122 functionshowMessage(message){123 $("msg").innerHTML =message;124 setTimeout("$('msg').innerHTML='';",15000);125 }126
127 functiongologin(e , obj){128 var e = window.event?window.event:e;129 var x=e.keyCode;130 if(x!=13) return false;131 if(x<48||x>57) e.returnValue=false;132 obj.select();133 $("login").onclick();134 }135
136 functiongetCPU()137 {138 var agent=navigator.userAgent.toLowerCase();139 if(agent.indexOf("win64")>=0 || agent.indexOf("wow64")>=0) return "x64";140 returnnavigator.cpuClass;141 }142
View Code
来分析一下每一步
1 //验证码正确性验证
2 var username = j$("#yhmc").val();3 var password = j$("#yhmm").val();4 var randnumber = j$("#randnumber").val();5 var passwordPolicy =kutil.isPasswordPolicy(username, password);6 var url = _webRootPath + "cas/logon.action";7 password = hex_md5(hex_md5(password)+hex_md5(randnumber.toLowerCase()));
这里拿到username,password,randnumber之后是通过kutil.isPasswordPolicy(username,password)来检验规范
passwordPolicy也是表单参数,一般情况为 1即可。
var url = _webRootPath + "cas/logon.action";
url是表单提交处。
password = hex_md5(hex_md5(password)+hex_md5(randnumber.toLowerCase()));
可见密码在输入后会经过一次md5加密,然后将验证码进行一次md加密,拼接到一起之后再进行一次md5加密。
再来看下一部分。
1 var p_username = "_u"+randnumber;2 var p_password = "_p"+randnumber;3 username = base64encode(username+";;"+_sessionid);4 var params = p_username+"="+username+"&"+p_password+"="+password+"&randnumber="+randnumber+"&isPasswordPolicy="+passwordPolicy ;
可以发现输入的学号(用户名)在加入表单之前会把username和sessionid字段用base64进行加密
sessionid从cookie中拿到
那么整个params结构就很清楚了。
注意在表单中键是'_p','_u'和验证码拼接的。
1.点击登录之后的表单分析
这是一份学号验证码输入正确,密码输入错误的栗子
这个是成功登录的例子
整个流程已经很明显了
emmmmm至于登录失败的Response,就是下面这个
2.使用Java进行模拟登录
可能在这之前,你会很好奇验证码怎么拿到
的确,验证码与时间有关
至于怎么拿
你可以在模拟登录之前先用最简单的爬虫知识去request登录页
下面详细来讲模拟登录的流程。
1.如何拿到jsessionid
2.表单的设置
这些就是模拟登录的核心代码了
去年写的代码
注释也是...话说...