• 记录使用Python登录浙江大学统一身份认证


    背景

    现在每天要进行健康情况上报,但是因为经常睡过头忘记打卡,于是想着写一个程序来自动打卡。

    统一身份认证

    访问健康情况上报页面(https://healthreport.zju.edu.cn/ncov/wap/default/index)后会先跳转到登录界面
    登陆页面

    输入账号密码登陆以后会发送一个post请求
    post请求
    表单里一共有五项内容
    在这里插入图片描述
    在这里插入图片描述
    可以看到,username就是学号,password不是密码的明文,可能是经过了哈希或者加密,authcode一项为空不用管,_eventId应该是提交的意思,而最长的execution看不出有什么含义。
    通过查看网页源代码,可以看到登录表单中有一项
    在这里插入图片描述
    就是execution的内容,可以看出,每次请求页面的时候会返回execution,在登录时带着这一项提交,作用可能是防止csrf攻击(猜的)。

    那么就只剩下密码这一个参数了。
    如果前端通过js加密密码,必然要先从input框中先获取密码的内容,于是先找到密码框的html代码
    在这里插入图片描述
    然后在source中全文搜索password关键字,发现login.js中有一段这样的代码
    在这里插入图片描述
    点开看看
    在这里插入图片描述
    可以看到这段代码先进行一些字段检查,再把密码加密填写回password,最后再执行submit提交到后台。
    继续搜索加密中用到的RSAUtils
    在这里插入图片描述
    发现代码都放在security.js中,继续打开看看
    这个文件包含了加密需要的代码,其中的算法我不太了解,不过好在Python有pyexecjs这个神器,直接把代码扒下来调用就好了。
    在这里插入图片描述
    但是图中需要的public_exponentModulus两个参数还没有找到,考虑到每次登录提交的密码内容都不一样,所以猜测这两个可能是通过时间戳生成或者请求来的?继续搜索
    在这里插入图片描述

    在这里插入图片描述
    原来是通过ajax请求了这两个参数,再在network里找,果然找到了这个请求
    在这里插入图片描述

    应该是通过cookie将这次的登录表单和这对参数联系起来,好奇后台是通过什么算法验证的。

    代码实现

    现在整个登录的流程已经梳理清楚了,开始使用代码实现

    1. 先访问页面并提取execution
      sess = requests.session()
      r = sess.get('https://healthreport.zju.edu.cn/ncov/wap/default/index')
      execution = re.search('name="execution" value="(.*?)"', r.text).group(1)
      
    2. 获取密码加密需要的参数
      r = sess.get('https://zjuam.zju.edu.cn/cas/v2/getPubKey')
      modulus = r.json()['modulus']
      exponent = r.json()['exponent']
      
    3. 加密密码
      ctx = execjs.compile(jscode)
      encrypted_password = ctx.call('encrypt', username, password)
      
    4. 发送登录请求
      data = {
      			'username': username,
      			'password': encrypted_password,
      			'authcode': ''
      			'execution': execution,
      			'_eventId': 'submit'
      		}
      
      r = sess.post(post_url, data=data)
      

    之后就可以进行自动打卡的操作了。

  • 相关阅读:
    Electron dialog 对话框的使用
    Electron BrowserView 的使用
    自动化测试相关
    使用chrome开发者工具中的performance面板解决性能瓶颈
    Electron window.open 函数 和 Browser-window-proxy 对象的使用
    Electron webview 标签
    Electron File对象
    Electron 进程
    JAVA日报
    JAVA日报
  • 原文地址:https://www.cnblogs.com/jrjrzivvv/p/13513766.html
Copyright © 2020-2023  润新知