当前位置 博文首页 > 小冯挺忙:校园门户登录

    小冯挺忙:校园门户登录

    作者:小冯挺忙 时间:2021-06-06 18:26

    最近一年多受疫情影响,学校一直在组织健康打卡,出发点是好的,但是总觉得每天提交任务是在太繁琐。因此就利用接口进行代打开。
    中间校方针对业务也前前后后进行几次调整,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

    好家伙白给了

    bk