国庆本来打算好好休息下的,没想到第一天就被领导的电话叫醒,说微信服务挂了,抓紧修复。
mmp
这就是我老婆的第一天假期,问题修复后,老婆心有余悸,一直手动在那测试微信服务,就是往他们公众号发个消息,看是不是能够正常返回。
我看着心疼,立志要用技术手段实现微信接口的巡检。
我先捋了下思路,技术实现的话,大概需要解决如下几个问题:
1、微信后台接口如何测试?
2、如何用 Python 实现?
3、如何及时获取测试结果?
4、如何定时执行测试?
下面开始!
1 微信接口如何测试?
最开始,我比较闹心的就是微信接口怎么测,因为之前基本没有接触过。
我先去他们微信后台找到了配置的服务接口信息,然后又再往上各种找如何测试。
于是我打开了浏览器开发者工具,查看后台请求信息:
然后,我用我们熟悉的 Postman 进行接口测试,果然,OK!
能够得到我们想要的数据。
返回数据长这样:
2 Python 如何实现接口测试?
经过上面的分析,如何测试接口,流程已经很清晰,我们接下来要做的就是数据解析。
由上图可见,返回的其实是一个 HTML,我们想要的数据在其中的 resultData 变量中。
resultData 变量对应的是一个 json 数据,其中的 body
是我们最想要的内容,它还是一个 XML 格式的数据。
resultData 对应的数据如下(已经过 UrlDecode):
1 | { |
因此,主要需要做的工作就是:
1、从返回数据中解析出 resultData 对应的数据;
2、从 body 数据中解析出 <Content>
标签对应的内容;
## 解析 resultData
本来打算用 BeautifulSoup 解析返回的 HTML 数据,但是 resultData 其实是其中 js 代码中的一个变量,我不知道怎么处理,于是想到了用正则直接解析字符串。
需要做的就是用正则匹配出 resultData =
和 }
之间的内容。
参考正则:匹配两个字符串 A 与 B 中间的字符串包含 A 但是不包含 B:
表达式: A.*?(?=B)
写出来我们的正则就是:
1 | pattern = re.compile(r'(?<=resultData = ).*?}') |
看着有点懵吧,正则的一大头疼问题就是难看,难懂!
body 内容的解析
resultData 对应数据解析完成后,我们得到了一个 json 数据,然后很容易可以获取到 body 数据。
接下来就是解析 body 对应的 xml 数据了。
这里,我们使用的是 xml.etree.ElementTree
,解析 xml 非常简单:
1 | xml_data = ET.fromstring(body) |
这个组件在之前的文章 《Python 助你填写高考志愿》也有用过,有兴趣的可以点击查阅。
重要信息我们都获取到了,下面我们就要想怎么把接口结果发出去了。
3 如何及时获取测试结果?
这里,我首先想到的还是之前用过的 pushbear 的微信推送服务,因为实现很简单,而且也不是正式场合使用。
1 | def send_wechat(tiele, text): |
通过上面的函数,就可以将信息推送到微信了,不懂得可以参考之前的文章:1 行代码,实现微信消息发送。
4 如何定时执行接口测试?
接口测试代码也有了,消息推送也有了,下面就是如何定时执行接口测试了,比如半小时执行一次?
一种方案是使用 Linux 系统自带的 crontab
模块。
还有就是 Python 也有定时任务的模块,我找到了一个轻量级的定时任务调度的库:schedule
。
1 | import schedule |
这个栗子简单到我不需要怎么解释。而且,通过这个栗子,我们也可以知道,schedule 其实就只是个定时器。
在 while True 死循环中,schedule.run_pending()
是保持 schedule
一直运行,去查询上面那一堆的任务,在任务中,就可以设置不同的时间去运行。跟 crontab 是类似的。
我们只要把我们的测试接口方法放在上面的 job() 方法里,然后通过 schedule.every(30).minutes.do(job)
就可以实现半小时一次执行啦!
总结
至此,我的任务基本完毕,虽然功能简单,也没有什么高级的架构。
但是涉及的东西还是挺多的,网络交互、XML 解析、JSON 解析、正则表达式、微信推送、定时任务等。
这次,就到这吧,大家节日快乐~