1. 程式人生 > >Java爬蟲模擬登錄——不給我毛概二的H某大學

Java爬蟲模擬登錄——不給我毛概二的H某大學

new AR 核心 md5加密 畢業 logon AC value jsession


你的賬號訪問太頻繁,請一分鐘之後再試!

從大一開始

就用腳本在刷課

在專業課踢的只剩下一門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.表單的設置

技術分享圖片

這些就是模擬登錄的核心代碼了

去年寫的代碼

註釋也是...話說...



技術分享圖片

    

                              

Java爬蟲模擬登錄——不給我毛概二的H某大學