最近在工作中遇到一项新需求,项目需要对接小程序内容安全接口,该接口可根据用户发送的请求自动检测、审核内容,主要用于过滤涉政、不健康言论和鉴别黄图。官方有三个内容安全接口,分别是imgSecCheck(图片信息)、mediaCheckAsync(语音图片)语音、msgSecCheck(文字信息),结合项目实际,这里着重讲解图片接口。
首先我们看微信小程序官方文档给出的DEMO(一行php代码),过于简洁,完全让人摸不着头绪。
其次来看参数结构,怎么样,FormData是不是很陌生啊,查询到的资料也是和前端相关,这也是本文要讲的重点,咱们先不管它。下面直接开始码代码。
具体实现:
1. 读取图片转换为字节数组
System.IO.FileStream fsm = new FileStream ();
fsm = File.OpenRead(ImageUrl);
byte[] formdata = ConvertStreamToByteBuffer(fsm);
2. 构造请求方法CheckImg,按照官方文档可以返回一个Json字符串
/// <summary>
/// 微信内容图片安全检测
/// </summary>
/// <param name="formdata">图片字节数组</param>
/// <param name="imageUrl">图片路径</param>
/// <returns></returns>
public static string CheckImg(byte[] formdata,string imageUrl)
{
var token = GetAccessToken();
string url = "https://api.weixin.qq.com/wxa/img_sec_check?access_token=" + token;
WebClient httpHelper = new WebClient();
MultipartForm multipart = new MultipartForm();
multipart.AddFlie("media", imageUrl, formdata, formdata.Length);
string result = httpHelper.Post(url, multipart);
var json = JObject.Parse(result);
return json.ToString();
}
这样就是整个实现方法了,现在我们再来理清FormData的问题。什么是FormData?FormData就是表单数据,它以键值对的形式向服务器发送,这个过程是浏览器自动完成的。在这里我们服务端要对前端浏览器的发送方式进行模拟。其中WebClient和MultipartForm类是关键。
WebClinet用来发送POST请求
MultipartForm用来构造POST的请求标头并把图片数据写入body
注意:name="media”是与官方文档约定好的键值,此处不可更改,不然会找不到请求中的文件数据。