校园门户登录

最近一年多受疫情影响,学校一直在组织健康打卡,出发点是好的,但是总觉得每天提交任务是在太繁琐。因此就利用接口进行代打开。
中间校方针对业务也前前后后进行几次调整,python模拟登录代价越来越高,近几天要返校参加毕业典礼,所以又重操旧业,把程序代码再改一改。

实现思路

这里主要还是借鉴了之前在网上看到的一篇博客,因为年代久远找不到链接了这里不再引用出处,大致思路如下:

  1. 利用python模拟用户登录(之前的博客采用cookie),但是后来操作发现cookie是会过期的。
  2. 通过打开接口模拟打卡请求。
  3. 通过阿里云计算函数递交python代码,实现定时打卡。

当前版本问题

由于提到了cookie过期,所以在此就只能通过模拟登录方式去获取cookie。

那看下目前来讲登录过程网站要做哪些事情

准备登录需要的参数

首先打开登录网站 然后F12开始抓包,这个想必就不用多说了。
image
其实在登录过程中只输入了账号密码,可是登录请求密码是密文传输的还多了许多参数,比较难办的是需要获得lt及加密方式,没办法只能老老实实去看js了。

值得庆幸的是我在网页里看到这个LT的数据项
image
大胆猜测一下 ,后面njqn应该南京地区吧,然后1622明显是时间戳,剩下的就没搞懂啥意思,不过网页上带的,就等于白给嘛
剩下的就是密码加密了,这里被坑了好久。
image
提交按钮绑定事件监听,进入看看在哪加密的
image
可以查找函数名或者打断点让他带你走一遍流程去找
image
万恶之源应该是这没错了
image
断点看看啥参数,这个_p1没搞懂是啥,不过大致有了眉目,函数最终返回的是_gas的结果其中主要是_rds(64) 拼上密码,p1,rds(16),再看看rds是啥
image
显然这个函数根据字符集随机生成指定长度字符串,因为是随机生成的我们用一个已经生成的没多大问题,剩下就是_p1了
image
看了看函数调用,这玩意应该也来自网页,下面就只要仿照他完成加密即可,看一看_gas到底干了啥吧
image
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

image
3次请求重定向,面对重定向问题采用session解决把每次请求的cookie都带上,丢了页面路由就会从头开始,代码解决如下:
image
首先requests中将重定向跳转设置false 每次手动从header中获取重定向地址
image
最后输出页面内容可以看到主页的内容,成功登录了

然鹅事情往往并没有那么简单 当我尝试跳转到打卡界面的时候

image

好家伙白给了