python构造自定义数据包_Python模拟登录华工新版教务系统选课 (PyExecJS)

75be57758dd2e2f8d13281d2bd6d6054.png

之前学校用的是老版正方教务系统,也写过文章,而最近学校更换了教务系统,作为计算机的学生,当然还是看看能不能写个脚本抢下课啦。

小苏打:用Python实现模拟登录正方教务系统抢课​zhuanlan.zhihu.com

模拟登录请求

第一步是登录一次教务系统,然后抓包看看数据包的构成

bc638ef9b33ca6f378aec1260e9be280.png

我们发现数据包由 rsa,ul,pl,it,execution,_eventid构成,我们一一在Chrome Network左侧搜索,我们很容易能够找到lt,execution,这在html里面就有,而这个数据是变化的,所以必须每次请求获得。

6c3b54dceab59b34a62d888f8b2b3997.png

然后我们搜索rsa,rsa这个一看就知道是已加密的内容,所以必定在js里面出现,我们很快就能找到rsa,并且得知ul和pl是用户名和密码的长度信息,所以我们就只用得到rsa即可完成模拟登录了。

e3373cc32bdc380583cbe2516aa84da1.png

5d58c4d4af63e12c22a7e64ef14fc778.png

然而这个加密是在另外一个名叫des.js的文件完成的,这个函数名为strEnc,第一个参数为用户名、密码和lt值的拼接,并且我初步观察了加密的流程,是比较复杂的,根据平常爬虫的思路,我们有两种办法:

1.用Python直接模拟加密过程

2.用selenium

第一种方法显然是比较复杂的,所以我尝试了些许时间就放弃了,而第二种方法由于运行速度比较慢,所以也被我排除了。

于是我就想到能不能运行js文件来获得同样的效果,所以我用了一个名为 PyExecJS 的Python库来运行js文件,我们首先把des.js这个文件下载到本地,然后再操作。

所以到这里,我们的登录流程差不多已经理好思路了,开始写代码了。

登录代码

我们获得一个Session对象,我们选课的核心即是获取登录成功的Cookie值,请求一次登录页面然后用正则表达式获取这两个数据的值。

headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.22 Safari/537.36 SE 2.X MetaSr 1.0'
}

session = requests.Session()
r = session.get('https://sso.scut.edu.cn/cas/login?service=http%3A%2F%2Fxsjw2018.scuteo.com%2Fjwglxt%2F%2Fdriotlogin',headers=headers)
lt = re.findall('id="lt" name="lt" value="(.*?)"',r.text)[0]
execution = re.findall('name="execution" value="(.*?)"',r.text)[0]

随后利用PyexecJS这个库运行js代码获得rsa值,首先compile des.js代码,然后利用call方法调用strEnc函数获得rsa的值。

with open('des.js')as f:
    ctx = execjs.compile(f.read())
s = user+pw+lt
rsa = ctx.call('strEnc',user+pw+lt,'1','2','3')

获得到rsa值以后,就可以构造登录的数据包进行登录了

login_data = {
    'rsa':rsa,
    'ul':len(user),
    'pl':len(pw),
    'lt':lt,
    'execution':execution,
    '_eventId':'submit'
}
r = session.post('https://sso.scut.edu.cn/cas/login?service=http%3A%2F%2Fxsjw2018.scuteo.com%2Fjwglxt%2Fdriotlogin',data=login_data,headers=headers)

选课过程

多选几门课,进行抓包,然后分析数据包的构成,根据分析,主要是前三项数据决定了是哪门课程,而这些信息都在html里面有,所以就不细说了,不过需要注意的是一直要用我们首先创建的Session对象才能正常发送请求。

270566989c9f92089c35bf0143eeebfc.png
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值