Java爬虫模拟登录——不给我毛概二的H某大学


你的账号访问太频繁,请一分钟之后再试!

从大一开始

就用脚本在刷课

在专业课踢的只剩下一门C#的情况下

活活刷到一周的课

Java爬虫模拟登录——不给我毛概二的H某大学

大二开始教务系统多了一个非常**的操作

退课池 and 访问频繁缓冲

难道,我大三下还要去学政治课咩?


虽然学政治不如敲代码

但我想毕业啊

Java爬虫模拟登录——不给我毛概二的H某大学

emmmmmm

在量子力学的角度,没有抢上毛概的我只是我本体的一个属性,和我本身没有多大关系,我还是快乐敲代码吧。


0.教务系统后台登录流程

先来看一下后台账号密码在发送给服务器之前做了什么处理

Java爬虫模拟登录——不给我毛概二的H某大学

这是文中的JS代码

 j$(document).ready(function(evt){
// 初始化验证码
refreshImg();
// 判断操作系统是32位或64位,设置兼容性文件的下载
var cpu = getCPU();
if (cpu != "x64"){
j$("#setjw").attr("href","../custom/lodop/setjw32.zip");
} else {
j$("#setjw").attr("href","../custom/lodop/setjw.zip");
}
// Enter键转TAB
kutil.enter2tab("LoginForm");
// 定位焦点
j$("#yhmc").focus();
}) function doLogon() { // 输入信息验证
if (!validate()) {
return false;
} // 验证码正确性验证
var username = j$("#yhmc").val();
var password = j$("#yhmm").val();
var randnumber = j$("#randnumber").val();
var passwordPolicy = kutil.isPasswordPolicy(username, password);
var url = _webRootPath + "cas/logon.action";
password = hex_md5(hex_md5(password)+hex_md5(randnumber.toLowerCase()));
/**
var params = {
"yhmc" : username,
"yhmm" : password,
"randnumber": randnumber,
"isPasswordPolicy" : passwordPolicy
};
*/
var p_username = "_u"+randnumber;
var p_password = "_p"+randnumber;
username = base64encode(username+";;"+_sessionid);
var params = p_username+"="+username+"&"+p_password+"="+password+"&randnumber="+randnumber+"&isPasswordPolicy="+passwordPolicy ;
//alert("params="+params);
//params = getEncParams(params);
//alert("encparams="+params);
doPreLogon();
kutil.doAjax(url, params, doPostLogon); function doPreLogon(){
j$("#msg").html("正在登录......");
j$("#login").attr("disabled", true);
j$("#reset").attr("disabled", true);
} function doPostLogon(response) {
var data = JSON.parse(response);
var status = data.status ;
var message = data.message ;
if ("200" == status) {
var result = data.result ;
window.document.location.href = result ;
} else {
reloadScript("kingo_encypt",_webRootPath+"custom/js/SetKingoEncypt.jsp");
if("407" == status){
alert(message);
showMessage("");
}else{
showMessage(message);
}
j$("#login").attr("disabled", false);
j$("#reset").attr("disabled", false);
refreshImg();
if ("401"==status) {
j$("#randnumber").val("");
j$("#randnumber").focus();
} else {
j$("#yhmc").val("");
j$("#yhmm").val("");
j$("#randnumber").val("");
j$("#yhmc").focus();
}
}
}
} function validate() {
var username = j$("#yhmc").val();
var password = j$("#yhmm").val();
var randnumber = j$("#randnumber").val();
if (kutil.isNull(username)) {
showMessage("请输入用户名!");
j$("#yhmc").focus();
return false;
}
if (kutil.isNull(password)) {
showMessage("请输入密码!");
j$("#yhmm").focus();
return false;
}
if (kutil.isNull(randnumber)) {
showMessage("请输入验证码!");
j$("#randnumber").focus();
return false;
}
return true;
} // 重置密码为账号(找回密码)
function doReset() {
var tourl = _webRootPath + "frame/retrievePassword.jsp" ;
window.document.location.href = tourl ;
} /**
* 刷新验证码
*/
function refreshImg(){
var url = _webRootPath + "cas/genValidateCode?dateTime="+(new Date());
document.getElementById("randpic").src = url ;
} function showMessage(message){
$("msg").innerHTML = message;
setTimeout("$('msg').innerHTML='';",15000);
} function gologin(e , obj){
var e = window.event?window.event:e;
var x=e.keyCode;
if(x!=13) return false;
if(x<48||x>57) e.returnValue=false;
obj.select();
$("login").onclick();
} function getCPU()
{
var agent=navigator.userAgent.toLowerCase();
if(agent.indexOf("win64")>=0 || agent.indexOf("wow64")>=0) return "x64";
return navigator.cpuClass;
}

来分析一下每一步

     // 验证码正确性验证
var username = j$("#yhmc").val();
var password = j$("#yhmm").val();
var randnumber = j$("#randnumber").val();
var passwordPolicy = kutil.isPasswordPolicy(username, password);
var url = _webRootPath + "cas/logon.action";
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加密。

再来看下一部分。

    var p_username = "_u"+randnumber;
var p_password = "_p"+randnumber;
username = base64encode(username+";;"+_sessionid);
var params = p_username+"="+username+"&"+p_password+"="+password+"&randnumber="+randnumber+"&isPasswordPolicy="+passwordPolicy ;

可以发现输入的学号(用户名)在加入表单之前会把username和sessionid字段用base64进行加密

sessionid从cookie中拿到

那么整个params结构就很清楚了。

注意在表单中键是'_p','_u'和验证码拼接的。


1.点击登录之后的表单分析

这是一份学号验证码输入正确,密码输入错误的栗子

Java爬虫模拟登录——不给我毛概二的H某大学

这个是成功登录的例子

Java爬虫模拟登录——不给我毛概二的H某大学

整个流程已经很明显了

emmmmm至于登录失败的Response,就是下面这个

Java爬虫模拟登录——不给我毛概二的H某大学


2.使用Java进行模拟登录

  可能在这之前,你会很好奇验证码怎么拿到

Java爬虫模拟登录——不给我毛概二的H某大学

的确,验证码与时间有关

至于怎么拿

你可以在模拟登录之前先用最简单的爬虫知识去request登录页

Java爬虫模拟登录——不给我毛概二的H某大学

下面详细来讲模拟登录的流程。

1.如何拿到jsessionid

Java爬虫模拟登录——不给我毛概二的H某大学

2.表单的设置

Java爬虫模拟登录——不给我毛概二的H某大学

这些就是模拟登录的核心代码了

去年写的代码

注释也是...话说...


Java爬虫模拟登录——不给我毛概二的H某大学

    

                              

上一篇:双重校验锁实现单例模式


下一篇:《第一行代码》学习笔记28-内容提供器Content Provider(1)