疫情期间,学校要求每天都要提交体温等相关信息(如果不按时提交就会被全院通报😳,为了写脚本付出了仅有的一次),就想着写一个脚本放到服务器上每天定时自动提交,付诸自己好几个月前的想法。在这里记录自己学习、写脚本的过程,同时可怜一下学校的服务器。
写这个脚本用到的技术,经过研究,可以用Python的selenim库或者urllib、requests库,但是后者需要更多的Web相关背景知识,由于我用进废退,脑中残存的Web相关知识只剩那些最基础的了,还是在实践中增长知识吧。
1. 尝试用selenium库
这个库的学习成本极其低,一篇博客就可以入门了。selenium教程。看完之后就着手写脚本了。疫情通的整个填报动作分解如下:
登录->获取地理位置->提交->确认提交
但是在脚本写完后却遇到了两个致命的问题,使我不得不转向使用urllib或requests库。
- 问题1:Windows系统获取地理位置信息具有不稳定性,每次脚本运行到获取地理位置时大多数都是要么定位失败,要么定位不准,在这种情况下只能放弃这个方法了。
- 问题2:js里面弹出的确认框wapconfirm并不能被识别,好了,一朝回到解放前。

2.尝试用requests库
i. 分析整个表单的提交过程
据我现有的Web知识,从登录界面开始分析:
根据观察,在登录界面点击登录之前该网站下只有1个Cookie,
点击登录后,会将username和password用ajax技术通过post方式提交到验证登录网站,

验证通过后,该网站下的cookies由1个变成了4个,

接着跳转向填报界面,在填报界面根据新增的Cookie,后台获取该用户的前一天的填报信息并填好,留下地理位置需要手动获取。获取位置信息后,将之以post方式提交到服务器。
ii. 大致思路
1)尝试直接复制出整个data包,以post方式提交至目标地址。
经过观察,data包算是解析出来了,但是这个数据命名实在是惨不忍睹(变量每个汉字拼音的首字母,现在是知道了阅读变量命令不清晰的程序的感觉,口吐芬芳)。用Notepad++的Compare插件对比 def(今天要提交的数据) 和 oldInfo(昨天的数据),发现多了后面4行数据,在页面找了一番后无果,索性在处理了一下def数据包,直接提交至目标网址,但服务器响应返回的却是整个填报系统的登录入口页面,说明在提交时,可能服务器还对提交者的身份进行验证,具体应该是通过验证请求头的Cookie,最终还是要进行模拟登录。
2)进行模拟登陆,获取cookies后再提交信息,最后编写接口程序
经过分析,整个脚本流程图绘制如下:
完整代码见我的github明月光
邮箱授权码获取方法如下图:
参考资料:
提取用户昨天提交的信息的正则表达式来自以下大佬博客,自己也该好好学一学正则表达式了。其中发送邮件方法也来自这篇博客,丰富了我的见识:
记一次SCU疫情期间每日健康报送任务的自动化处理(一)