Python中使用微信内容安全接口
因为小程序没有内容检测所以审核被微信卡了,就准备在后端添加内容检测的接口
环境
python3.8
flask
准备阶段
先去看了一下微信的官方文档https://developers.weixin.qq.com/miniprogram/dev/api-backend/open-api/sec-check/security.msgSecCheck.html,里面提及了服务器端如何使用内容检测接口
首先需要获取后台接口调用凭据access_token(注意是get)
GET https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET
获取成功后再使用内容检测接口(注意是post)
POST https://api.weixin.qq.com/wxa/msg_sec_check?access_token=ACCESS_TOKEN
内容检测接口除了access_token,就是要发送需要检测的内容了,微信官方给的文档里是这么写的
那么我理解就是发送json包了(postman测试的时候别的格式也可以,我就没在代码里实现了),json包的格式为
{"content":"xxx"}
主要麻烦的地方就是我服务器端本来就接受的是JSON包,需要将传回来的数据转换成字符串放到新的json里然后传送过去,过程中尝试了许多方法,比如直接接受json字符串,但会碰到编码方面的问题,解析json包后再直接用str方法转换,会出现转义符(主要是 " )的问题,最后没办法了,只能暴力解决。。。
遍历解析好的json包(也就是dict),把key,value都取出来拼接成一个字符串
最终实现
获取access_token
APPID,SECRET是小程序的参数,接着用requests.get方法获取access_token_url,虽然文档里说如果成功errcode=0,但我实测的时候成功的时候没有返回errcode值,所以直接用if判断即可,毕竟不管是0还是没有发送都不会触发raise异常,AccessToken则是我自己的异常标识了,大家可以自行修改
access_token_url = 'https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential' \
'&appid={appid}&secret={secret}'.format(appid=APPID, secret=SECRET)
access_token_res = requests.get(access_token_url)
if access_token_res.json().get('errcode'):
raise AccessToken()
获取前端的json包并转换
第一句获取json包解析没啥好说的
接着遍历字典然后拼接,注意value要用str转换一下,然后我在中间加了个空格
下面就是我调试最多的地方了,首先json.dumps把字典转换成json格式,一开始我做完这一步就直接把代码传到微信的api里了,结果测试微信的测试用例的之后没有报错,断点发现x的编码是乱码,于是就加了utf-8解析,结果微信的接口又只支持latin1编码(也可能是request的问题),于是再反解析即可
data = request.get_json(silent=True)
x = ''
for key in data:
x = x + ' ' + key + ' ' + str(data[key])
x = json.dumps({"content": x}, ensure_ascii=False).encode("utf-8").decode("latin1")
传输数据到接口
注意是post方法即可
msgSecCheck_res = requests.post(url=msgSecCheck_url, data=x)
if msgSecCheck_res.json().get('errcode'):
raise MsgSecCheck()
代码汇总
access_token_url = 'https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential' \
'&appid={appid}&secret={secret}'.format(appid=APPID, secret=SECRET)
access_token_res = requests.get(access_token_url)
if access_token_res.json().get('errcode'):
raise AccessToken()
data = request.get_json(silent=True)
x = ''
for key in data:
x = x + ' ' + key + ' ' + str(data[key])
x = json.dumps({"content": x}, ensure_ascii=False).encode("utf-8").decode("latin1")
msgSecCheck_res = requests.post(url=msgSecCheck_url, data=x)
if msgSecCheck_res.json().get('errcode'):
raise MsgSecCheck()
暂时没想到更好的处理的方法,想到了再来更新吧