Python中使用微信内容安全接口

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()

暂时没想到更好的处理的方法,想到了再来更新吧

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值