Python模拟登录WUST教务处

code

import requests
import json


def main():
    """第一次请求,获取加密的dataStr,以及cookie
        url1生成一段加密字符串
        url2登录的界面
        获取响应头的cookie, 需要注意的是响应头是一个 <class 'requests.structures.CaseInsensitiveDict'>
        需要转换为字典然后取出对应的cookie
    """
    url1 = 'http://bkjx.wust.edu.cn//Logon.do?method=logon&flag=sess'
    url2 = 'http://bkjx.wust.edu.cn/Logon.do?method=logon'
    r1 = requests.get(url1)
    print(r1.headers)
    cookie = dict(r1.headers)['Set-Cookie']
    dataStr = r1.text
    # 按照登录页面上的JS代码进行模拟获取加密的encoded
    scode = dataStr.split('#')[0]
    sxh = dataStr.split('#')[1]
    username = '账号'
    password = '密码'
    code = username + '%%%' + password
    encode = ''
    i = 0
    while i < len(code):
        if i < 20:
            encode += code[i:i + 1] + scode[0:int(sxh[i:i + 1])]
            scode = scode[int(sxh[i:i + 1]):len(scode)]
        else:
            encode += code[i:len(code)]
            break
        i += 1
    print(encode)
    # 接下来, 请求实际的Post url
    data = {
        'userAccount': '',
        'userPassword': '',
        'encoded': encode
    }
    headers = {
        'Cookie': cookie
    }
    r2 = requests.post(url2, data=data, headers=headers)
    print(r2.text)
   #  print(r2.url)
    # var scode=dataStr.split("#")[0];
    # 		     	var sxh=dataStr.split("#")[1];
    # 		     	var code=document.getElementById("userAccount").value+"%%%"+document.getElementById("userPassword").value;
    # 			 	var encoded="";
    # 				for(var i=0;i<code.length;i++){
    # 					if(i<20){
    # 						encoded=encoded+code.substring(i,i+1)+scode.substring(0,parseInt(sxh.substring(i,i+1)));
    # 					    scode = scode.substring(parseInt(sxh.substring(i,i+1)),scode.length);
    # 					}else{
    # 					    encoded=encoded+code.substring(i,code.length);
    # 					    i=code.length;
    # 					}
    # 				}


if __name__ == '__main__':
    main()

教务处的登录加密的方法,写在了登录界面的js中:

	$.ajax( {
		url:strUrl,
  		type:"post",
  		cache:false,
		dataType:"text",
		success:function(dataStr) {
			if(dataStr=="no"){
				return false;
	 		}else{
	 			var scode=dataStr.split("#")[0];
		     	var sxh=dataStr.split("#")[1];
		     	var code=document.getElementById("userAccount").value+"%%%"+document.getElementById("userPassword").value;
			 	var encoded="";
				for(var i=0;i<code.length;i++){
					if(i<20){
						encoded=encoded+code.substring(i,i+1)+scode.substring(0,parseInt(sxh.substring(i,i+1)));
					    scode = scode.substring(parseInt(sxh.substring(i,i+1)),scode.length);
					}else{
					    encoded=encoded+code.substring(i,code.length);
					    i=code.length;
					}
				}
				document.getElementById("encoded").value=encoded;
				if("logon"!="logonLdap"){
					document.getElementById("userPassword").value="";
					document.getElementById("userAccount").value="";
				}
				document.getElementById("loginForm").submit();
	 		}
		},
		error:function() {
	 		alert("计算异常!");
		}
  	});

所以我们可以写一个类似的函数,然后得到我们需要的加密encode,同时这个界面还会返回给我们一个cookie,然后我们登录的时候只需要带着cookie和encoded

就可以实现成功登录了。