技术学得好,老婆加班少!

国庆本来打算好好休息下的,没想到第一天就被领导的电话叫醒,说微信服务挂了,抓紧修复。

mmp

这就是我老婆的第一天假期,问题修复后,老婆心有余悸,一直手动在那测试微信服务,就是往他们公众号发个消息,看是不是能够正常返回。

我看着心疼,立志要用技术手段实现微信接口的巡检。

这就是志气

我先捋了下思路,技术实现的话,大概需要解决如下几个问题:

1、微信后台接口如何测试?
2、如何用 Python 实现?
3、如何及时获取测试结果?
4、如何定时执行测试?

下面开始!

1 微信接口如何测试?

最开始,我比较闹心的就是微信接口怎么测,因为之前基本没有接触过。

我先去他们微信后台找到了配置的服务接口信息,然后又再往上各种找如何测试。

最后,找到的一个竟然是官网提供的:https://mp.weixin.qq.com/debug/cgi-bin/apiinfo?t=index&type=%E6%B6%88%E6%81%AF%E6%8E%A5%E5%8F%A3%E8%B0%83%E8%AF%95&form=%E6%96%87%E6%9C%AC%E6%B6%88%E6%81%AF

官方测试工具

于是我打开了浏览器开发者工具,查看后台请求信息:

请求详情

然后,我用我们熟悉的 Postman 进行接口测试,果然,OK!

能够得到我们想要的数据。

返回数据长这样:

返回数据

2 Python 如何实现接口测试?

经过上面的分析,如何测试接口,流程已经很清晰,我们接下来要做的就是数据解析。

由上图可见,返回的其实是一个 HTML,我们想要的数据在其中的 resultData 变量中。

resultData 变量对应的是一个 json 数据,其中的 body 是我们最想要的内容,它还是一个 XML 格式的数据。

resultData 对应的数据如下(已经过 UrlDecode):

1
2
3
4
5
6
7
8
9
10
11
12
{
"status_line": "200\tOK",
"header": ["Cache-Control: private",
"Date: Tue, 02 Oct 2018 07:50:50 GMT",
"X-Powered-By: ASP.NET",
"Set-Cookie: ASPSESSIONIDCCRCTCTQ=DPFLKAJBFOJLDAFAFNOCDDFI; path=\/",
"Server: WWW Server\/1.1",
"Content-Type: text\/html; Charset=utf-8",
"Content-Length: 270"],
"body": "<xml><ToUserName><![CDATA[xxx]]></ToUserName><FromUserName><![CDATA[xxx]]></FromUserName><CreateTime>2018/10/2 15:50:50</CreateTime><MsgType><![CDATA[text]]></MsgType><Content><![CDATA[您所查询的数码不存在,请仔细确认,谨防假冒。]]></Content></xml>",
"hint": "请求成功"
}

因此,主要需要做的工作就是:

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
2
xml_data = ET.fromstring(body)
text = xml_data.find('Content').text

这个组件在之前的文章 《Python 助你填写高考志愿》也有用过,有兴趣的可以点击查阅。

重要信息我们都获取到了,下面我们就要想怎么把接口结果发出去了。

3 如何及时获取测试结果?

这里,我首先想到的还是之前用过的 pushbear 的微信推送服务,因为实现很简单,而且也不是正式场合使用。

1
2
3
def send_wechat(tiele, text):
url = "https://pushbear.ftqq.com/sub?sendkey=xxx5&text={}&desp={}".format(tiele, text)
resp = requests.get(url)

通过上面的函数,就可以将信息推送到微信了,不懂得可以参考之前的文章:1 行代码,实现微信消息发送

4 如何定时执行接口测试?

接口测试代码也有了,消息推送也有了,下面就是如何定时执行接口测试了,比如半小时执行一次?

一种方案是使用 Linux 系统自带的 crontab 模块。

还有就是 Python 也有定时任务的模块,我找到了一个轻量级的定时任务调度的库:schedule

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
import schedule
import time

def job():
print("I'm working...")

schedule.every(10).minutes.do(job)
schedule.every().hour.do(job)
schedule.every().day.at("10:30").do(job)
schedule.every(5).to(10).days.do(job)
schedule.every().monday.do(job)
schedule.every().wednesday.at("13:15").do(job)

while True:
schedule.run_pending()
time.sleep(1)

这个栗子简单到我不需要怎么解释。而且,通过这个栗子,我们也可以知道,schedule 其实就只是个定时器。

在 while True 死循环中,schedule.run_pending() 是保持 schedule 一直运行,去查询上面那一堆的任务,在任务中,就可以设置不同的时间去运行。跟 crontab 是类似的。

我们只要把我们的测试接口方法放在上面的 job() 方法里,然后通过 schedule.every(30).minutes.do(job) 就可以实现半小时一次执行啦!

最终执行效果

总结

至此,我的任务基本完毕,虽然功能简单,也没有什么高级的架构。

但是涉及的东西还是挺多的,网络交互、XML 解析、JSON 解析、正则表达式、微信推送、定时任务等。

这次,就到这吧,大家节日快乐~

hoxis wechat
一个脱离了高级趣味的程序员,关注回复1024有惊喜~
赞赏一杯咖啡
0%