微信疫情通自动提交

 |
总阅读量


疫情期间,学校要求每天都要提交体温等相关信息(如果不按时提交就会被全院通报😳,为了写脚本付出了仅有的一次),就想着写一个脚本放到服务器上每天定时自动提交,付诸自己好几个月前的想法。在这里记录自己学习、写脚本的过程,同时可怜一下学校的服务器。

写这个脚本用到的技术,经过研究,可以用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疫情期间每日健康报送任务的自动化处理(一)