现在的课表软件,广告真滴太多了,于是潜心想弄一个既简单又美观的课表。
目前已经实现的功能
- 获取cookie
- 获取课表
- 获取成绩
- 信息处理以及发送
开始工作
您需要准备一个python环境以及可以联网且自备火狐或者谷歌浏览器
第一大步 获取cookie
一、客户端加密处理
- 直接用我校的教务做例教务地址。
- 按下F12打开开发者工具选择“Network”选项,并勾选“Preserve log”。
- 点击地址栏左边的“不安全”,将已存储的cookie删除并按下F5或者 Crtl + R刷新界面
- 可以在界面看到第一个GET请求里包含服务器在相应头里面的Set-Cookie
- 我们继续往下看发现了验证码的请求信息
发现其有效cookie和get请求地址是
// Cookie和它的好朋友Request URL
Cookie: JSESSIONID=9680988439B17ECD5CA38A2CA3720A0A; SERVERID=122
Request URL: http://jw.wfu.edu.cn/verifycode.servlet
-
不难发现与第一个Get请求的Set-Cookie值相同,而且还舍去了无关值
无关项: Path=/; HttpOnly path=/
第一次get请求服务器给的Set-Cookie:
验证码的Cookie: -
随便在账号和密码输入“123456789”和正确的验证码,发现有两条关于登陆的请求:
-
先看第一个请求由此可见其Cookie与第一此所得的Set-Cookie相同,并且是向http://jw.wfu.edu.cn/Logon.do?method=logon&flag=sess这个地址发送了post请求,先试着访问该网址,看看会返回什么返回了一堆字符串,先留个影响应该是与登陆数据加密有关,继续看下一个请求Cookie不变,也是post请求不过这次带上四个参数,分别是userAccount,userPassword,RANDOMCODE和encoded。不难看出分别代表账户、密码、随机码以及编码。前两个值为空我们在接下来的处理直接留空即可,再看随机码也就是验证码可以直接读验证码即可,最重要的是encoded的值是如何来的,接下来开始分析网页源码找到与encoded有关的再看看。
-
在开发者工具里选择“Sources”,按下Crtl + F 输入“encoded”寻找相关信息不难看出,这是encoded的源头,点击左侧行号加入一些断点,再在账号密码里面输入“123456789”输入正确的验证码点击提交看其如何变化提交后,分析其加密原理不难看出,其dataStr其实就是之前post其http://jw.wfu.edu.cn/Logon.do?method=logon&flag=sess点击前往所返回的字符串,利用#将dataStr一分为二,左边的值为scode,右边的值为sxh。而code则是我们之前输入的账号与“%%%”再与密码拼接而成的。
//拿上图的数据举例
dataStr = "0u392G8aeR59otA1jAqEL84e9N4802352L8G1788#13121331331232313121"
scode = "0u392G8aeR59otA1jAqEL84e9N4802352L8G1788"
sxh = "13121331331232313121"
code = "123456789%%%123456789"
encoded = ""
- 继续往下走不难发现,当i<20时,按照其语句来分析就是encoded = encoded + code的第i个字符 + scode取第一个到第sxh的第i个的数字,如果i>20,直接把code剩下的拼接到encoded即可。再往下走,看看是否如此:然而结果就是这样
//拿上图的数据举例
dataStr = "0u392G8aeR59otA1jAqEL84e9N4802352L8G1788#13121331331232313121"
scode = "0u392G8aeR59otA1jAqEL84e9N4802352L8G1788"
sxh = "13121331331232313121"
code = "123456789%%%123456789"
encoded = "102u39324G85a6eR579ot8A91jA%qEL%8%4e19N42803235425L8G61778889"
- 用Python实现encoded算法如下:
dataStr = "0u392G8aeR59otA1jAqEL84e9N4802352L8G1788#13121331331232313121" # 客户端获取的dataStr
usr = "123456789" # 账户
psw = "123456789" # 密码
split_str_data = dataStr.split("#") # 用"#"分开彼此
scode = split_str_data[0] # 获取scode
sxh = split_str_data[1] # 获取sxh
code = usr + "%%%" + psw # 获取code
lang = 0
for b in code: # 计算长度
lang += 1
encoded = ""
b = 0
for a in range(lang): # 遍历实现encoded算法
if a < 20:
encoded = encoded + code[a]
for c in range(int(sxh[a])): # 再次遍历实现scode长度相加
encoded = encoded + scode[b]
b += 1
else:
encoded = encoded + code[20:] # i > 20 直接把余下的code拼接
break
print(encoded) # 打印结果
# 结果
102u39324G85a6eR579ot8A91jA%qEL%8%4e19N42803235425L8G61778889
2021年5月13日14:18:38先写到这儿,还有些事儿要处理,明后再更新cookie章节