基于Selenuim+Easyconnect的自动请假实现
前言
校园企业微信上的请假平台不够智能,每次请假外出需要填写一系列信息,且信息不能用做下一次请假,十分不便,为此,笔者实现了自动请假功能。通过搭建在私人服务器上的Python程序实现每天自动请次日的外出假。
难点1:数据包的获取
在企业微信中,无法像浏览器一样获得请假系统的url地址,cookie等信息,因此,使用手机的HttpCanary工具进行APK抓包,得到了提交请假的数据包。另一种方法是,通过企业微信的“通过浏览器打开”功能拿到url,再通过PC端浏览器访问该URL,,同时借助BurpSuite等抓包工具也可以获得http请求信息。
难点2:Cookie持久化
通过Python中的HttpHackRequest可以直接对BurpSuite的抓包内容进行重放,毕竟请假需要提交的信息太多,改成Cookie字典形式提交略微麻烦。通过重放请求,可以实现请假信息的提交,但是,往往过了一段时间之后Cookie便失效了此时还需要重新手动填写请假信息重新抓包,十分麻烦,因此,十分有必要实现一个自动登录的功能,每次获取新的Cookie,来支持提交请假信息的操作。
难点3:登录页前端加密绕过
所谓的登录页前端加密,其实是在通过学生账号密码登录获取个人权限的时候,提交的数据包中的password是被前端的js加密的,几乎不可能逆向加密过程,那么就无法通过直接通过http请求提交登录用户名密码实现登录,为此,需要使用Selenium的Webdriver通过模拟浏览器的形式实现这个登录功能。
难点4:Chrome 和 Chromedriver 的适配
因为程序要实现每天的请假,一定是托管在服务器上,在笔者的Linux CentOS 8 上,配置Chrome和ChromeDriver下了一些功夫。由于官方版本发布时间存在滞后,自动下载官方公布的最新的稳定版Chrome(116.0.xxx.xxx)和ChromeDriver(114.0.xxx.xxx)并不匹配,这就造成了程序报错,解决办法是找到一个比较新的开发版https://commondatastorage.googleapis.com/chromium-browser-snapshots/index.html?prefix=Linux_x64/1135580/,挑选对应的Driver手动下载,再从Python里指定好对应的Chrome和ChromeDriver的位置。
难点5:校园外部环境的访问
刚刚解决了上述问题后发现,在服务器上访问不到请假系统的登录页,仔细想想才发现服务器是在校园网环境外面的,平时我们在校外情况下连接校园网渠道是Webvpn或者是easyconnect,经过比较,后者更容易实现。因此,要在服务器上搭建一个easyconnect客户端,给Python程序提供代理,实现校园外部环境的访问。经过手机APP端的信息搜集,本校的Easyconnect服务器版本号是7.6.8,在服务器上通过docker技术实现了对应版本客户端的搭建。
https://github.com/Hagb/docker-easyconnect#start-of-content
难点5:登录按钮的定位
终于,可以看到校园内网认证登录页的信息了,通过Webdriver获取到的html信息中,可以看到username和password输入框都是有element id的,可以直接捕获到,但是登录框并没有,这里使用:
browser.find_element_by_xpath("//button[contains(text(), 'Sign in')]")
来定位登录按钮。
难点6:日期的控制和计划任务
来到这里,遇到的问题基本上已经解决差不多了。笔者的需求是每天晚上九点钟自动提交次日白天(7点到22点)的外出假请求。
对于次日日期字符串形式的获取,通过Python的datetime来实现:
import datetime now = datetime.datetime.now()
from datetime import timedelta next_day = now + timedelta(days=1) date = next_day.strftime("%Y-%m-%d")
这样就是能确保日期上不会算错。接着是好用的crontab,也就是Linux的计划任务功能,每天晚上九点自动执行该脚本,通过crontab -e命令,设置的规则是:
0 21 0 * * * root python3 ./AskForLeave.py
总结
从最开始的初浅想法,再到行动起来着手,最后到成功实现,这个过程中遇到了太多意想不到的困难,触及到了很多的知识盲区,但是也正是因为对代码的热爱和执念,最后终于解决了所有的问题。在生活中总会存在些许繁琐不便的地方,我们固然可以包容忍受,但是若通过技术的力量把它征服,所收获的成就感是无可替代的。