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

简介:   你的账号访问太频繁,请一分钟之后再试! 从大一开始 就用脚本在刷课 在专业课踢的只剩下一门C#的情况下 活活刷到一周的课   大二开始教务系统多了一个非常**的操作 退课池 and 访问频繁缓冲 难道,我大三下还要去学政治课咩?    虽然学政治不如敲代码 但我想毕业啊     emmmmmm 在量子力学的角度,没有抢上毛概的我只是我本体的一个属性,和我本身没有多大关系,我还是快乐敲代码吧。

 


 

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

从大一开始

就用脚本在刷课

在专业课踢的只剩下一门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 function doLogon() {
 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" : passwordPolicy
 37                 };
 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     function doPreLogon(){
 50         j$("#msg").html("正在登录......");
 51         j$("#login").attr("disabled", true); 
 52         j$("#reset").attr("disabled", true);
 53     }
 54 
 55     function doPostLogon(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 function validate() {
 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 function doReset() {
110     var tourl = _webRootPath + "frame/retrievePassword.jsp" ;
111     window.document.location.href = tourl ;
112 }
113 
114 /**
115 * 刷新验证码
116 */            
117 function refreshImg(){
118     var url = _webRootPath + "cas/genValidateCode?dateTime="+(new Date());
119     document.getElementById("randpic").src = url ;
120 }
121 
122 function showMessage(message){
123     $("msg").innerHTML = message;
124     setTimeout("$('msg').innerHTML='';",15000);
125 }
126 
127 function gologin(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 function getCPU()
137 {
138    var agent=navigator.userAgent.toLowerCase();
139    if(agent.indexOf("win64")>=0 || agent.indexOf("wow64")>=0) return "x64";
140    return navigator.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.表单的设置

 

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

去年写的代码

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

 


 

 

 

 

 

    

 

                               

目录
相关文章
|
3月前
|
数据采集 网络协议 Java
Java爬虫框架下代理使用中的TCP连接池问题及解决方案
Java爬虫框架下代理使用中的TCP连接池问题及解决方案
|
4月前
|
数据采集 Java API
Java爬虫实战:API商品数据接口调用
随着互联网的发展,越来越多的商家开始将自己的商品数据通过API接口对外开放,以供其他开发者使用。这些API接口可以提供丰富的商品数据,包括商品名称、价格、库存、图片等信息。对于Java爬虫开发者来说,通过调用这些API接口,可以更加便捷地获取商品数据,避免了爬取网页数据的繁琐过程。本文将介绍如何使用Java调用API商品数据接口,实现商品数据的获取和处理。
|
26天前
|
数据采集 存储 Java
Java爬虫与SSL代理:实际案例分析与技术探讨
Java爬虫与SSL代理:实际案例分析与技术探讨
|
2月前
|
数据采集 Java API
百度搜索:蓝易云【Java爬虫与Python爬虫有什么区别】
综上所述,Java爬虫和Python爬虫在语言特性、代码复杂性、生态系统、并发处理和执行性能等方面存在一些区别。选择使用哪种爬虫工具取决于具体的需求、项目要求和个人技术偏好。
27 0
|
2月前
|
数据采集 JavaScript 前端开发
Java爬虫攻略:应对JavaScript登录表单
Java爬虫攻略:应对JavaScript登录表单
|
7月前
|
数据采集 Java
java随机姓名 根据网络爬虫爬取百家姓和名字
java随机姓名 根据网络爬虫爬取百家姓和名字
71 0
|
8月前
|
数据采集 Web App开发 存储
Java爬虫第五篇:使用selenium、Jsoup 抓取bing搜索图片
Java爬虫第五篇:使用selenium、Jsoup 抓取bing搜索图片
168 0
|
30天前
|
Java 调度 Windows
JAVA面试八股文之多线程基础知识
JAVA面试八股文之多线程基础知识
|
1月前
|
存储 设计模式 安全
2023春招面试专题:JAVA基础高频面试
2023春招面试专题:JAVA基础高频面试
|
2天前
|
存储 缓存 Java
面试官:什么是Java内存模型?
面试官:什么是Java内存模型?
14 0
面试官:什么是Java内存模型?