校园门户登录
序
最近一年多受疫情影响,学校一直在组织健康打卡,出发点是好的,但是总觉得每天提交任务是在太繁琐。因此就利用接口进行代打开。
中间校方针对业务也前前后后进行几次调整,python模拟登录代价越来越高,近几天要返校参加毕业典礼,所以又重操旧业,把程序代码再改一改。
实现思路
这里主要还是借鉴了之前在网上看到的一篇博客,因为年代久远找不到链接了这里不再引用出处,大致思路如下:
- 利用python模拟用户登录(之前的博客采用cookie),但是后来操作发现cookie是会过期的。
- 通过打开接口模拟打卡请求。
- 通过阿里云计算函数递交python代码,实现定时打卡。
登录实现
由于提到了cookie过期,所以在此就只能通过模拟登录方式去获取cookie。
那看下目前来讲登录过程网站要做哪些事情
准备登录需要的参数
首先打开登录网站 然后F12开始抓包,这个想必就不用多说了。
其实在登录过程中只输入了账号密码,可是登录请求密码是密文传输的还多了许多参数,比较难办的是需要获得lt及加密方式,没办法只能老老实实去看js了。
值得庆幸的是我在网页里看到这个LT的数据项
大胆猜测一下 ,后面njqn应该南京地区吧,然后1622明显是时间戳,剩下的就没搞懂啥意思,不过网页上带的,就等于白给嘛
剩下的就是密码加密了,这里被坑了好久。
提交按钮绑定事件监听,进入看看在哪加密的
可以查找函数名或者打断点让他带你走一遍流程去找
万恶之源应该是这没错了
断点看看啥参数,这个_p1没搞懂是啥,不过大致有了眉目,函数最终返回的是_gas的结果其中主要是_rds(64) 拼上密码,p1,rds(16),再看看rds是啥
显然这个函数根据字符集随机生成指定长度字符串,因为是随机生成的我们用一个已经生成的没多大问题,剩下就是_p1了
看了看函数调用,这玩意应该也来自网页,下面就只要仿照他完成加密即可,看一看_gas到底干了啥吧
emm ,问题不大,直接放代码 AES加密 CBC模式
def pkcs7padding(text):
"""
明文使用PKCS7填充
最终调用AES加密方法时,传入的是一个byte数组,要求是16的整数倍,因此需要对明文进行处理
:param text: 待加密内容(明文)
:return:
"""
bs = AES.block_size # 16
length = len(text)
bytes_length = len(bytes(text, encoding='utf-8'))
# tips:utf-8编码时,英文占1个byte,而中文占3个byte
padding_size = length if(bytes_length == length) else bytes_length
padding = bs - padding_size % bs
# tips:chr(padding)看与其它语言的约定,有的会使用'\0'
padding_text = chr(padding) * padding
return text + padding_text
def aes_encode(key, content):
"""
AES加密
key,iv使用同一个
模式cbc
填充pkcs7
:param key: 密钥
:param content: 加密内容
:return:
"""
key0 = re.sub(r'/(^\s+)|(\s+$)', "", key)
key_bytes = bytes(key0, encoding='utf-8')
iv =bytes("QDj3eQfnPmTzCXN6",encoding='utf-8')
cipher = AES.new(key_bytes, AES.MODE_CBC, iv)
# 处理明文
content_padding = pkcs7padding(content)
# 加密
aes_encode_bytes = cipher.encrypt(bytes(content_padding, encoding='utf-8'))
# 重新编码
result = str(base64.b64encode(aes_encode_bytes), encoding='utf-8')
return result
aes_encode(key,date)
iv是随机生成的就是rds(16) kye0 从网页获取 按照函数处理流程同样进行处理 这里date可以打断点抓取,因为是随机生成+密码拼接直接用也没啥问题,这也登录的问题是解决了。
登录302
3次请求重定向,面对重定向问题采用session解决把每次请求的cookie都带上,丢了页面路由就会从头开始,代码解决如下:
首先requests中将重定向跳转设置false 每次手动从header中获取重定向地址
最后输出页面内容可以看到主页的内容,成功登录了
然鹅事情往往并没有那么简单 当我尝试跳转到打卡界面的时候
此处说明登录是分pc和手机的,需要在登录时明确身份。